]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD/mapillary-js/mapillary.js
Update to iD v2.19.0
[rails.git] / vendor / assets / iD / iD / mapillary-js / mapillary.js
index bcc3d7325d826ce689a5b55a68bdaaef934ed430..2f5ed53516c93df077c2ee17c443a2c48406cb4f 100644 (file)
@@ -1,4 +1,269 @@
 (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Mapillary = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+'use strict';
+
+var Queue = require('tinyqueue');
+
+module.exports = polylabel;
+module.exports.default = polylabel;
+
+function polylabel(polygon, precision, debug) {
+    precision = precision || 1.0;
+
+    // find the bounding box of the outer ring
+    var minX, minY, maxX, maxY;
+    for (var i = 0; i < polygon[0].length; i++) {
+        var p = polygon[0][i];
+        if (!i || p[0] < minX) minX = p[0];
+        if (!i || p[1] < minY) minY = p[1];
+        if (!i || p[0] > maxX) maxX = p[0];
+        if (!i || p[1] > maxY) maxY = p[1];
+    }
+
+    var width = maxX - minX;
+    var height = maxY - minY;
+    var cellSize = Math.min(width, height);
+    var h = cellSize / 2;
+
+    // a priority queue of cells in order of their "potential" (max distance to polygon)
+    var cellQueue = new Queue(null, compareMax);
+
+    if (cellSize === 0) return [minX, minY];
+
+    // cover polygon with initial cells
+    for (var x = minX; x < maxX; x += cellSize) {
+        for (var y = minY; y < maxY; y += cellSize) {
+            cellQueue.push(new Cell(x + h, y + h, h, polygon));
+        }
+    }
+
+    // take centroid as the first best guess
+    var bestCell = getCentroidCell(polygon);
+
+    // special case for rectangular polygons
+    var bboxCell = new Cell(minX + width / 2, minY + height / 2, 0, polygon);
+    if (bboxCell.d > bestCell.d) bestCell = bboxCell;
+
+    var numProbes = cellQueue.length;
+
+    while (cellQueue.length) {
+        // pick the most promising cell from the queue
+        var cell = cellQueue.pop();
+
+        // update the best cell if we found a better one
+        if (cell.d > bestCell.d) {
+            bestCell = cell;
+            if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
+        }
+
+        // do not drill down further if there's no chance of a better solution
+        if (cell.max - bestCell.d <= precision) continue;
+
+        // split the cell into four cells
+        h = cell.h / 2;
+        cellQueue.push(new Cell(cell.x - h, cell.y - h, h, polygon));
+        cellQueue.push(new Cell(cell.x + h, cell.y - h, h, polygon));
+        cellQueue.push(new Cell(cell.x - h, cell.y + h, h, polygon));
+        cellQueue.push(new Cell(cell.x + h, cell.y + h, h, polygon));
+        numProbes += 4;
+    }
+
+    if (debug) {
+        console.log('num probes: ' + numProbes);
+        console.log('best distance: ' + bestCell.d);
+    }
+
+    return [bestCell.x, bestCell.y];
+}
+
+function compareMax(a, b) {
+    return b.max - a.max;
+}
+
+function Cell(x, y, h, polygon) {
+    this.x = x; // cell center x
+    this.y = y; // cell center y
+    this.h = h; // half the cell size
+    this.d = pointToPolygonDist(x, y, polygon); // distance from cell center to polygon
+    this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
+}
+
+// signed distance from point to polygon outline (negative if point is outside)
+function pointToPolygonDist(x, y, polygon) {
+    var inside = false;
+    var minDistSq = Infinity;
+
+    for (var k = 0; k < polygon.length; k++) {
+        var ring = polygon[k];
+
+        for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
+            var a = ring[i];
+            var b = ring[j];
+
+            if ((a[1] > y !== b[1] > y) &&
+                (x < (b[0] - a[0]) * (y - a[1]) / (b[1] - a[1]) + a[0])) inside = !inside;
+
+            minDistSq = Math.min(minDistSq, getSegDistSq(x, y, a, b));
+        }
+    }
+
+    return (inside ? 1 : -1) * Math.sqrt(minDistSq);
+}
+
+// get polygon centroid
+function getCentroidCell(polygon) {
+    var area = 0;
+    var x = 0;
+    var y = 0;
+    var points = polygon[0];
+
+    for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) {
+        var a = points[i];
+        var b = points[j];
+        var f = a[0] * b[1] - b[0] * a[1];
+        x += (a[0] + b[0]) * f;
+        y += (a[1] + b[1]) * f;
+        area += f * 3;
+    }
+    if (area === 0) return new Cell(points[0][0], points[0][1], 0, polygon);
+    return new Cell(x / area, y / area, 0, polygon);
+}
+
+// get squared distance from a point to a segment
+function getSegDistSq(px, py, a, b) {
+
+    var x = a[0];
+    var y = a[1];
+    var dx = b[0] - x;
+    var dy = b[1] - y;
+
+    if (dx !== 0 || dy !== 0) {
+
+        var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
+
+        if (t > 1) {
+            x = b[0];
+            y = b[1];
+
+        } else if (t > 0) {
+            x += dx * t;
+            y += dy * t;
+        }
+    }
+
+    dx = px - x;
+    dy = py - y;
+
+    return dx * dx + dy * dy;
+}
+
+},{"tinyqueue":243}],2:[function(require,module,exports){
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Ported from Webkit
+ * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h
+ */
+
+module.exports = UnitBezier;
+
+function UnitBezier(p1x, p1y, p2x, p2y) {
+    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
+    this.cx = 3.0 * p1x;
+    this.bx = 3.0 * (p2x - p1x) - this.cx;
+    this.ax = 1.0 - this.cx - this.bx;
+
+    this.cy = 3.0 * p1y;
+    this.by = 3.0 * (p2y - p1y) - this.cy;
+    this.ay = 1.0 - this.cy - this.by;
+
+    this.p1x = p1x;
+    this.p1y = p2y;
+    this.p2x = p2x;
+    this.p2y = p2y;
+}
+
+UnitBezier.prototype.sampleCurveX = function(t) {
+    // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
+    return ((this.ax * t + this.bx) * t + this.cx) * t;
+};
+
+UnitBezier.prototype.sampleCurveY = function(t) {
+    return ((this.ay * t + this.by) * t + this.cy) * t;
+};
+
+UnitBezier.prototype.sampleCurveDerivativeX = function(t) {
+    return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;
+};
+
+UnitBezier.prototype.solveCurveX = function(x, epsilon) {
+    if (typeof epsilon === 'undefined') epsilon = 1e-6;
+
+    var t0, t1, t2, x2, i;
+
+    // First try a few iterations of Newton's method -- normally very fast.
+    for (t2 = x, i = 0; i < 8; i++) {
+
+        x2 = this.sampleCurveX(t2) - x;
+        if (Math.abs(x2) < epsilon) return t2;
+
+        var d2 = this.sampleCurveDerivativeX(t2);
+        if (Math.abs(d2) < 1e-6) break;
+
+        t2 = t2 - x2 / d2;
+    }
+
+    // Fall back to the bisection method for reliability.
+    t0 = 0.0;
+    t1 = 1.0;
+    t2 = x;
+
+    if (t2 < t0) return t0;
+    if (t2 > t1) return t1;
+
+    while (t0 < t1) {
+
+        x2 = this.sampleCurveX(t2);
+        if (Math.abs(x2 - x) < epsilon) return t2;
+
+        if (x > x2) {
+            t0 = t2;
+        } else {
+            t1 = t2;
+        }
+
+        t2 = (t1 - t0) * 0.5 + t0;
+    }
+
+    // Failure.
+    return t2;
+};
+
+UnitBezier.prototype.solve = function(x, epsilon) {
+    return this.sampleCurveY(this.solveCurveX(x, epsilon));
+};
+
+},{}],3:[function(require,module,exports){
 'use strict'
 
 exports.byteLength = byteLength
@@ -34,22 +299,22 @@ function placeHoldersCount (b64) {
 
 function byteLength (b64) {
   // base64 is 4/3 + up to two characters of the original data
-  return b64.length * 3 / 4 - placeHoldersCount(b64)
+  return (b64.length * 3 / 4) - placeHoldersCount(b64)
 }
 
 function toByteArray (b64) {
-  var i, j, l, tmp, placeHolders, arr
+  var i, l, tmp, placeHolders, arr
   var len = b64.length
   placeHolders = placeHoldersCount(b64)
 
-  arr = new Arr(len * 3 / 4 - placeHolders)
+  arr = new Arr((len * 3 / 4) - placeHolders)
 
   // if there are placeholders, only get up to the last complete 4 chars
   l = placeHolders > 0 ? len - 4 : len
 
   var L = 0
 
-  for (i = 0, j = 0; i < l; i += 4, j += 3) {
+  for (i = 0; i < l; i += 4) {
     tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
     arr[L++] = (tmp >> 16) & 0xFF
     arr[L++] = (tmp >> 8) & 0xFF
@@ -114,9 +379,9 @@ function fromByteArray (uint8) {
   return parts.join('')
 }
 
-},{}],2:[function(require,module,exports){
+},{}],4:[function(require,module,exports){
 
-},{}],3:[function(require,module,exports){
+},{}],5:[function(require,module,exports){
 /*!
  * Cross-Browser Split 1.1.1
  * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
@@ -224,276 +489,86 @@ module.exports = (function split(undef) {
   return self;
 })();
 
-},{}],4:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
+},{}],6:[function(require,module,exports){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <https://feross.org>
+ * @license  MIT
+ */
+/* eslint-disable no-proto */
 
-// cached from whatever global is present so that test runners that stub it
-// don't break things.  But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals.  It's inside a
-// function because try/catches deoptimize in certain engines.
+'use strict'
 
-var cachedSetTimeout;
-var cachedClearTimeout;
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
 
-function defaultSetTimout() {
-    throw new Error('setTimeout has not been defined');
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+var K_MAX_LENGTH = 0x7fffffff
+exports.kMaxLength = K_MAX_LENGTH
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ *   === true    Use Uint8Array implementation (fastest)
+ *   === false   Print warning and recommend using `buffer` v4.x which has an Object
+ *               implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * We report that the browser does not support typed arrays if the are not subclassable
+ * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
+ * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
+ * for __proto__ and has a buggy typed array implementation.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
+
+if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
+    typeof console.error === 'function') {
+  console.error(
+    'This browser lacks typed array (Uint8Array) support which is required by ' +
+    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
+  )
 }
-function defaultClearTimeout () {
-    throw new Error('clearTimeout has not been defined');
+
+function typedArraySupport () {
+  // Can typed array instances can be augmented?
+  try {
+    var arr = new Uint8Array(1)
+    arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
+    return arr.foo() === 42
+  } catch (e) {
+    return false
+  }
 }
-(function () {
-    try {
-        if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-        } else {
-            cachedSetTimeout = defaultSetTimout;
-        }
-    } catch (e) {
-        cachedSetTimeout = defaultSetTimout;
-    }
-    try {
-        if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-        } else {
-            cachedClearTimeout = defaultClearTimeout;
-        }
-    } catch (e) {
-        cachedClearTimeout = defaultClearTimeout;
-    }
-} ())
-function runTimeout(fun) {
-    if (cachedSetTimeout === setTimeout) {
-        //normal enviroments in sane situations
-        return setTimeout(fun, 0);
-    }
-    // if setTimeout wasn't available but was latter defined
-    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-        cachedSetTimeout = setTimeout;
-        return setTimeout(fun, 0);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedSetTimeout(fun, 0);
-    } catch(e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-        } catch(e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-        }
-    }
 
+Object.defineProperty(Buffer.prototype, 'parent', {
+  enumerable: true,
+  get: function () {
+    if (!Buffer.isBuffer(this)) return undefined
+    return this.buffer
+  }
+})
+
+Object.defineProperty(Buffer.prototype, 'offset', {
+  enumerable: true,
+  get: function () {
+    if (!Buffer.isBuffer(this)) return undefined
+    return this.byteOffset
+  }
+})
 
-}
-function runClearTimeout(marker) {
-    if (cachedClearTimeout === clearTimeout) {
-        //normal enviroments in sane situations
-        return clearTimeout(marker);
-    }
-    // if clearTimeout wasn't available but was latter defined
-    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-        cachedClearTimeout = clearTimeout;
-        return clearTimeout(marker);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedClearTimeout(marker);
-    } catch (e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-        } catch (e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-        }
-    }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
-    if (!draining || !currentQueue) {
-        return;
-    }
-    draining = false;
-    if (currentQueue.length) {
-        queue = currentQueue.concat(queue);
-    } else {
-        queueIndex = -1;
-    }
-    if (queue.length) {
-        drainQueue();
-    }
-}
-
-function drainQueue() {
-    if (draining) {
-        return;
-    }
-    var timeout = runTimeout(cleanUpNextTick);
-    draining = true;
-
-    var len = queue.length;
-    while(len) {
-        currentQueue = queue;
-        queue = [];
-        while (++queueIndex < len) {
-            if (currentQueue) {
-                currentQueue[queueIndex].run();
-            }
-        }
-        queueIndex = -1;
-        len = queue.length;
-    }
-    currentQueue = null;
-    draining = false;
-    runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
-    var args = new Array(arguments.length - 1);
-    if (arguments.length > 1) {
-        for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-        }
-    }
-    queue.push(new Item(fun, args));
-    if (queue.length === 1 && !draining) {
-        runTimeout(drainQueue);
-    }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
-    this.fun = fun;
-    this.array = array;
-}
-Item.prototype.run = function () {
-    this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-
-process.binding = function (name) {
-    throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
-    throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],5:[function(require,module,exports){
-(function (global){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * @license  MIT
- */
-/* eslint-disable no-proto */
-
-'use strict'
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-var isArray = require('isarray')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- *   === true    Use Uint8Array implementation (fastest)
- *   === false   Use Object implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * Due to various browser bugs, sometimes the Object implementation will be used even
- * when the browser supports typed arrays.
- *
- * Note:
- *
- *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
- *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
- *
- *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
- *
- *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
- *     incorrect length in some situations.
-
- * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
- * get the Object implementation, which is slower but behaves correctly.
- */
-Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
-  ? global.TYPED_ARRAY_SUPPORT
-  : typedArraySupport()
-
-/*
- * Export kMaxLength after typed array support is determined.
- */
-exports.kMaxLength = kMaxLength()
-
-function typedArraySupport () {
-  try {
-    var arr = new Uint8Array(1)
-    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
-    return arr.foo() === 42 && // typed array instances can be augmented
-        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
-        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
-  } catch (e) {
-    return false
-  }
-}
-
-function kMaxLength () {
-  return Buffer.TYPED_ARRAY_SUPPORT
-    ? 0x7fffffff
-    : 0x3fffffff
-}
-
-function createBuffer (that, length) {
-  if (kMaxLength() < length) {
-    throw new RangeError('Invalid typed array length')
-  }
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    that = new Uint8Array(length)
-    that.__proto__ = Buffer.prototype
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    if (that === null) {
-      that = new Buffer(length)
-    }
-    that.length = length
-  }
-
-  return that
+function createBuffer (length) {
+  if (length > K_MAX_LENGTH) {
+    throw new RangeError('The value "' + length + '" is invalid for option "size"')
+  }
+  // Return an augmented `Uint8Array` instance
+  var buf = new Uint8Array(length)
+  buf.__proto__ = Buffer.prototype
+  return buf
 }
 
 /**
@@ -507,44 +582,77 @@ function createBuffer (that, length) {
  */
 
 function Buffer (arg, encodingOrOffset, length) {
-  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
-    return new Buffer(arg, encodingOrOffset, length)
-  }
-
   // Common case.
   if (typeof arg === 'number') {
     if (typeof encodingOrOffset === 'string') {
-      throw new Error(
-        'If encoding is specified then the first argument must be a string'
+      throw new TypeError(
+        'The "string" argument must be of type string. Received type number'
       )
     }
-    return allocUnsafe(this, arg)
+    return allocUnsafe(arg)
   }
-  return from(this, arg, encodingOrOffset, length)
+  return from(arg, encodingOrOffset, length)
+}
+
+// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+if (typeof Symbol !== 'undefined' && Symbol.species != null &&
+    Buffer[Symbol.species] === Buffer) {
+  Object.defineProperty(Buffer, Symbol.species, {
+    value: null,
+    configurable: true,
+    enumerable: false,
+    writable: false
+  })
 }
 
 Buffer.poolSize = 8192 // not used by this implementation
 
-// TODO: Legacy, not needed anymore. Remove in next major version.
-Buffer._augment = function (arr) {
-  arr.__proto__ = Buffer.prototype
-  return arr
-}
+function from (value, encodingOrOffset, length) {
+  if (typeof value === 'string') {
+    return fromString(value, encodingOrOffset)
+  }
+
+  if (ArrayBuffer.isView(value)) {
+    return fromArrayLike(value)
+  }
+
+  if (value == null) {
+    throw TypeError(
+      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+      'or Array-like Object. Received type ' + (typeof value)
+    )
+  }
+
+  if (isInstance(value, ArrayBuffer) ||
+      (value && isInstance(value.buffer, ArrayBuffer))) {
+    return fromArrayBuffer(value, encodingOrOffset, length)
+  }
 
-function from (that, value, encodingOrOffset, length) {
   if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number')
+    throw new TypeError(
+      'The "value" argument must not be of type number. Received type number'
+    )
   }
 
-  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
-    return fromArrayBuffer(that, value, encodingOrOffset, length)
+  var valueOf = value.valueOf && value.valueOf()
+  if (valueOf != null && valueOf !== value) {
+    return Buffer.from(valueOf, encodingOrOffset, length)
   }
 
-  if (typeof value === 'string') {
-    return fromString(that, value, encodingOrOffset)
+  var b = fromObject(value)
+  if (b) return b
+
+  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
+      typeof value[Symbol.toPrimitive] === 'function') {
+    return Buffer.from(
+      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
+    )
   }
 
-  return fromObject(that, value)
+  throw new TypeError(
+    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+    'or Array-like Object. Received type ' + (typeof value)
+  )
 }
 
 /**
@@ -556,44 +664,36 @@ function from (that, value, encodingOrOffset, length) {
  * Buffer.from(arrayBuffer[, byteOffset[, length]])
  **/
 Buffer.from = function (value, encodingOrOffset, length) {
-  return from(null, value, encodingOrOffset, length)
+  return from(value, encodingOrOffset, length)
 }
 
-if (Buffer.TYPED_ARRAY_SUPPORT) {
-  Buffer.prototype.__proto__ = Uint8Array.prototype
-  Buffer.__proto__ = Uint8Array
-  if (typeof Symbol !== 'undefined' && Symbol.species &&
-      Buffer[Symbol.species] === Buffer) {
-    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
-    Object.defineProperty(Buffer, Symbol.species, {
-      value: null,
-      configurable: true
-    })
-  }
-}
+// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
+// https://github.com/feross/buffer/pull/148
+Buffer.prototype.__proto__ = Uint8Array.prototype
+Buffer.__proto__ = Uint8Array
 
 function assertSize (size) {
   if (typeof size !== 'number') {
-    throw new TypeError('"size" argument must be a number')
+    throw new TypeError('"size" argument must be of type number')
   } else if (size < 0) {
-    throw new RangeError('"size" argument must not be negative')
+    throw new RangeError('The value "' + size + '" is invalid for option "size"')
   }
 }
 
-function alloc (that, size, fill, encoding) {
+function alloc (size, fill, encoding) {
   assertSize(size)
   if (size <= 0) {
-    return createBuffer(that, size)
+    return createBuffer(size)
   }
   if (fill !== undefined) {
     // Only pay attention to encoding if it's a string. This
     // prevents accidentally sending in a number that would
     // be interpretted as a start offset.
     return typeof encoding === 'string'
-      ? createBuffer(that, size).fill(fill, encoding)
-      : createBuffer(that, size).fill(fill)
+      ? createBuffer(size).fill(fill, encoding)
+      : createBuffer(size).fill(fill)
   }
-  return createBuffer(that, size)
+  return createBuffer(size)
 }
 
 /**
@@ -601,132 +701,114 @@ function alloc (that, size, fill, encoding) {
  * alloc(size[, fill[, encoding]])
  **/
 Buffer.alloc = function (size, fill, encoding) {
-  return alloc(null, size, fill, encoding)
+  return alloc(size, fill, encoding)
 }
 
-function allocUnsafe (that, size) {
+function allocUnsafe (size) {
   assertSize(size)
-  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) {
-    for (var i = 0; i < size; ++i) {
-      that[i] = 0
-    }
-  }
-  return that
+  return createBuffer(size < 0 ? 0 : checked(size) | 0)
 }
 
 /**
  * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
  * */
 Buffer.allocUnsafe = function (size) {
-  return allocUnsafe(null, size)
+  return allocUnsafe(size)
 }
 /**
  * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
  */
 Buffer.allocUnsafeSlow = function (size) {
-  return allocUnsafe(null, size)
+  return allocUnsafe(size)
 }
 
-function fromString (that, string, encoding) {
+function fromString (string, encoding) {
   if (typeof encoding !== 'string' || encoding === '') {
     encoding = 'utf8'
   }
 
   if (!Buffer.isEncoding(encoding)) {
-    throw new TypeError('"encoding" must be a valid string encoding')
+    throw new TypeError('Unknown encoding: ' + encoding)
   }
 
   var length = byteLength(string, encoding) | 0
-  that = createBuffer(that, length)
+  var buf = createBuffer(length)
 
-  var actual = that.write(string, encoding)
+  var actual = buf.write(string, encoding)
 
   if (actual !== length) {
     // Writing a hex string, for example, that contains invalid characters will
     // cause everything after the first invalid character to be ignored. (e.g.
     // 'abxxcd' will be treated as 'ab')
-    that = that.slice(0, actual)
+    buf = buf.slice(0, actual)
   }
 
-  return that
+  return buf
 }
 
-function fromArrayLike (that, array) {
+function fromArrayLike (array) {
   var length = array.length < 0 ? 0 : checked(array.length) | 0
-  that = createBuffer(that, length)
+  var buf = createBuffer(length)
   for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
+    buf[i] = array[i] & 255
   }
-  return that
+  return buf
 }
 
-function fromArrayBuffer (that, array, byteOffset, length) {
-  array.byteLength // this throws if `array` is not a valid ArrayBuffer
-
+function fromArrayBuffer (array, byteOffset, length) {
   if (byteOffset < 0 || array.byteLength < byteOffset) {
-    throw new RangeError('\'offset\' is out of bounds')
+    throw new RangeError('"offset" is outside of buffer bounds')
   }
 
   if (array.byteLength < byteOffset + (length || 0)) {
-    throw new RangeError('\'length\' is out of bounds')
+    throw new RangeError('"length" is outside of buffer bounds')
   }
 
+  var buf
   if (byteOffset === undefined && length === undefined) {
-    array = new Uint8Array(array)
+    buf = new Uint8Array(array)
   } else if (length === undefined) {
-    array = new Uint8Array(array, byteOffset)
+    buf = new Uint8Array(array, byteOffset)
   } else {
-    array = new Uint8Array(array, byteOffset, length)
+    buf = new Uint8Array(array, byteOffset, length)
   }
 
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    that = array
-    that.__proto__ = Buffer.prototype
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    that = fromArrayLike(that, array)
-  }
-  return that
+  // Return an augmented `Uint8Array` instance
+  buf.__proto__ = Buffer.prototype
+  return buf
 }
 
-function fromObject (that, obj) {
+function fromObject (obj) {
   if (Buffer.isBuffer(obj)) {
     var len = checked(obj.length) | 0
-    that = createBuffer(that, len)
+    var buf = createBuffer(len)
 
-    if (that.length === 0) {
-      return that
+    if (buf.length === 0) {
+      return buf
     }
 
-    obj.copy(that, 0, 0, len)
-    return that
+    obj.copy(buf, 0, 0, len)
+    return buf
   }
 
-  if (obj) {
-    if ((typeof ArrayBuffer !== 'undefined' &&
-        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
-      if (typeof obj.length !== 'number' || isnan(obj.length)) {
-        return createBuffer(that, 0)
-      }
-      return fromArrayLike(that, obj)
-    }
-
-    if (obj.type === 'Buffer' && isArray(obj.data)) {
-      return fromArrayLike(that, obj.data)
+  if (obj.length !== undefined) {
+    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
+      return createBuffer(0)
     }
+    return fromArrayLike(obj)
   }
 
-  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
+  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
+    return fromArrayLike(obj.data)
+  }
 }
 
 function checked (length) {
-  // Note: cannot use `length < kMaxLength()` here because that fails when
+  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
   // length is NaN (which is otherwise coerced to zero.)
-  if (length >= kMaxLength()) {
+  if (length >= K_MAX_LENGTH) {
     throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                         'size: 0x' + kMaxLength().toString(16) + ' bytes')
+                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
   }
   return length | 0
 }
@@ -739,12 +821,17 @@ function SlowBuffer (length) {
 }
 
 Buffer.isBuffer = function isBuffer (b) {
-  return !!(b != null && b._isBuffer)
+  return b != null && b._isBuffer === true &&
+    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
 }
 
 Buffer.compare = function compare (a, b) {
+  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
+  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
   if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError('Arguments must be Buffers')
+    throw new TypeError(
+      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
+    )
   }
 
   if (a === b) return 0
@@ -785,7 +872,7 @@ Buffer.isEncoding = function isEncoding (encoding) {
 }
 
 Buffer.concat = function concat (list, length) {
-  if (!isArray(list)) {
+  if (!Array.isArray(list)) {
     throw new TypeError('"list" argument must be an Array of Buffers')
   }
 
@@ -805,6 +892,9 @@ Buffer.concat = function concat (list, length) {
   var pos = 0
   for (i = 0; i < list.length; ++i) {
     var buf = list[i]
+    if (isInstance(buf, Uint8Array)) {
+      buf = Buffer.from(buf)
+    }
     if (!Buffer.isBuffer(buf)) {
       throw new TypeError('"list" argument must be an Array of Buffers')
     }
@@ -818,16 +908,19 @@ function byteLength (string, encoding) {
   if (Buffer.isBuffer(string)) {
     return string.length
   }
-  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
-      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
     return string.byteLength
   }
   if (typeof string !== 'string') {
-    string = '' + string
+    throw new TypeError(
+      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
+      'Received type ' + typeof string
+    )
   }
 
   var len = string.length
-  if (len === 0) return 0
+  var mustMatch = (arguments.length > 2 && arguments[2] === true)
+  if (!mustMatch && len === 0) return 0
 
   // Use a for loop to avoid recursion
   var loweredCase = false
@@ -839,7 +932,6 @@ function byteLength (string, encoding) {
         return len
       case 'utf8':
       case 'utf-8':
-      case undefined:
         return utf8ToBytes(string).length
       case 'ucs2':
       case 'ucs-2':
@@ -851,7 +943,9 @@ function byteLength (string, encoding) {
       case 'base64':
         return base64ToBytes(string).length
       default:
-        if (loweredCase) return utf8ToBytes(string).length // assume utf8
+        if (loweredCase) {
+          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
+        }
         encoding = ('' + encoding).toLowerCase()
         loweredCase = true
     }
@@ -929,8 +1023,12 @@ function slowToString (encoding, start, end) {
   }
 }
 
-// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
-// Buffer instances.
+// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
+// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
+// reliably in a browserify context because there could be multiple different
+// copies of the 'buffer' package in use. This method works even for Buffer
+// instances that were created from another copy of the `buffer` package.
+// See: https://github.com/feross/buffer/issues/154
 Buffer.prototype._isBuffer = true
 
 function swap (b, n, m) {
@@ -977,12 +1075,14 @@ Buffer.prototype.swap64 = function swap64 () {
 }
 
 Buffer.prototype.toString = function toString () {
-  var length = this.length | 0
+  var length = this.length
   if (length === 0) return ''
   if (arguments.length === 0) return utf8Slice(this, 0, length)
   return slowToString.apply(this, arguments)
 }
 
+Buffer.prototype.toLocaleString = Buffer.prototype.toString
+
 Buffer.prototype.equals = function equals (b) {
   if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
   if (this === b) return true
@@ -992,16 +1092,20 @@ Buffer.prototype.equals = function equals (b) {
 Buffer.prototype.inspect = function inspect () {
   var str = ''
   var max = exports.INSPECT_MAX_BYTES
-  if (this.length > 0) {
-    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
-    if (this.length > max) str += ' ... '
-  }
+  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
+  if (this.length > max) str += ' ... '
   return '<Buffer ' + str + '>'
 }
 
 Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+  if (isInstance(target, Uint8Array)) {
+    target = Buffer.from(target, target.offset, target.byteLength)
+  }
   if (!Buffer.isBuffer(target)) {
-    throw new TypeError('Argument must be a Buffer')
+    throw new TypeError(
+      'The "target" argument must be one of type Buffer or Uint8Array. ' +
+      'Received type ' + (typeof target)
+    )
   }
 
   if (start === undefined) {
@@ -1080,8 +1184,8 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
   } else if (byteOffset < -0x80000000) {
     byteOffset = -0x80000000
   }
-  byteOffset = +byteOffset  // Coerce to Number.
-  if (isNaN(byteOffset)) {
+  byteOffset = +byteOffset // Coerce to Number.
+  if (numberIsNaN(byteOffset)) {
     // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
     byteOffset = dir ? 0 : (buffer.length - 1)
   }
@@ -1110,8 +1214,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
     return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
   } else if (typeof val === 'number') {
     val = val & 0xFF // Search for a byte value [0-255]
-    if (Buffer.TYPED_ARRAY_SUPPORT &&
-        typeof Uint8Array.prototype.indexOf === 'function') {
+    if (typeof Uint8Array.prototype.indexOf === 'function') {
       if (dir) {
         return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
       } else {
@@ -1204,16 +1307,14 @@ function hexWrite (buf, string, offset, length) {
     }
   }
 
-  // must be an even number of digits
   var strLen = string.length
-  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
 
   if (length > strLen / 2) {
     length = strLen / 2
   }
   for (var i = 0; i < length; ++i) {
     var parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (isNaN(parsed)) return i
+    if (numberIsNaN(parsed)) return i
     buf[offset + i] = parsed
   }
   return i
@@ -1252,15 +1353,14 @@ Buffer.prototype.write = function write (string, offset, length, encoding) {
     offset = 0
   // Buffer#write(string, offset[, length][, encoding])
   } else if (isFinite(offset)) {
-    offset = offset | 0
+    offset = offset >>> 0
     if (isFinite(length)) {
-      length = length | 0
+      length = length >>> 0
       if (encoding === undefined) encoding = 'utf8'
     } else {
       encoding = length
       length = undefined
     }
-  // legacy write(string, encoding, offset, length) - remove in v0.13
   } else {
     throw new Error(
       'Buffer.write(string, encoding, offset[, length]) is no longer supported'
@@ -1336,8 +1436,8 @@ function utf8Slice (buf, start, end) {
     var codePoint = null
     var bytesPerSequence = (firstByte > 0xEF) ? 4
       : (firstByte > 0xDF) ? 3
-      : (firstByte > 0xBF) ? 2
-      : 1
+        : (firstByte > 0xBF) ? 2
+          : 1
 
     if (i + bytesPerSequence <= end) {
       var secondByte, thirdByte, fourthByte, tempCodePoint
@@ -1459,7 +1559,7 @@ function utf16leSlice (buf, start, end) {
   var bytes = buf.slice(start, end)
   var res = ''
   for (var i = 0; i < bytes.length; i += 2) {
-    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
+    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
   }
   return res
 }
@@ -1485,18 +1585,9 @@ Buffer.prototype.slice = function slice (start, end) {
 
   if (end < start) end = start
 
-  var newBuf
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    newBuf = this.subarray(start, end)
-    newBuf.__proto__ = Buffer.prototype
-  } else {
-    var sliceLen = end - start
-    newBuf = new Buffer(sliceLen, undefined)
-    for (var i = 0; i < sliceLen; ++i) {
-      newBuf[i] = this[i + start]
-    }
-  }
-
+  var newBuf = this.subarray(start, end)
+  // Return an augmented `Uint8Array` instance
+  newBuf.__proto__ = Buffer.prototype
   return newBuf
 }
 
@@ -1509,8 +1600,8 @@ function checkOffset (offset, ext, length) {
 }
 
 Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
   if (!noAssert) checkOffset(offset, byteLength, this.length)
 
   var val = this[offset]
@@ -1524,8 +1615,8 @@ Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert)
 }
 
 Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
   if (!noAssert) {
     checkOffset(offset, byteLength, this.length)
   }
@@ -1540,21 +1631,25 @@ Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert)
 }
 
 Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 1, this.length)
   return this[offset]
 }
 
 Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 2, this.length)
   return this[offset] | (this[offset + 1] << 8)
 }
 
 Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 2, this.length)
   return (this[offset] << 8) | this[offset + 1]
 }
 
 Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 4, this.length)
 
   return ((this[offset]) |
@@ -1564,6 +1659,7 @@ Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
 }
 
 Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 4, this.length)
 
   return (this[offset] * 0x1000000) +
@@ -1573,8 +1669,8 @@ Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
 }
 
 Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
   if (!noAssert) checkOffset(offset, byteLength, this.length)
 
   var val = this[offset]
@@ -1591,8 +1687,8 @@ Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
 }
 
 Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
   if (!noAssert) checkOffset(offset, byteLength, this.length)
 
   var i = byteLength
@@ -1609,24 +1705,28 @@ Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
 }
 
 Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 1, this.length)
   if (!(this[offset] & 0x80)) return (this[offset])
   return ((0xff - this[offset] + 1) * -1)
 }
 
 Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 2, this.length)
   var val = this[offset] | (this[offset + 1] << 8)
   return (val & 0x8000) ? val | 0xFFFF0000 : val
 }
 
 Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 2, this.length)
   var val = this[offset + 1] | (this[offset] << 8)
   return (val & 0x8000) ? val | 0xFFFF0000 : val
 }
 
 Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 4, this.length)
 
   return (this[offset]) |
@@ -1636,6 +1736,7 @@ Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
 }
 
 Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 4, this.length)
 
   return (this[offset] << 24) |
@@ -1645,21 +1746,25 @@ Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
 }
 
 Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 4, this.length)
   return ieee754.read(this, offset, true, 23, 4)
 }
 
 Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 4, this.length)
   return ieee754.read(this, offset, false, 23, 4)
 }
 
 Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 8, this.length)
   return ieee754.read(this, offset, true, 52, 8)
 }
 
 Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+  offset = offset >>> 0
   if (!noAssert) checkOffset(offset, 8, this.length)
   return ieee754.read(this, offset, false, 52, 8)
 }
@@ -1672,8 +1777,8 @@ function checkInt (buf, value, offset, ext, max, min) {
 
 Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
   value = +value
-  offset = offset | 0
-  byteLength = byteLength | 0
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
   if (!noAssert) {
     var maxBytes = Math.pow(2, 8 * byteLength) - 1
     checkInt(this, value, offset, byteLength, maxBytes, 0)
@@ -1691,8 +1796,8 @@ Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength,
 
 Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
   value = +value
-  offset = offset | 0
-  byteLength = byteLength | 0
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
   if (!noAssert) {
     var maxBytes = Math.pow(2, 8 * byteLength) - 1
     checkInt(this, value, offset, byteLength, maxBytes, 0)
@@ -1710,89 +1815,57 @@ Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength,
 
 Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
   this[offset] = (value & 0xff)
   return offset + 1
 }
 
-function objectWriteUInt16 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
-    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
-      (littleEndian ? i : 1 - i) * 8
-  }
-}
-
 Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
+  this[offset] = (value & 0xff)
+  this[offset + 1] = (value >>> 8)
   return offset + 2
 }
 
 Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
+  this[offset] = (value >>> 8)
+  this[offset + 1] = (value & 0xff)
   return offset + 2
 }
 
-function objectWriteUInt32 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffffffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
-    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
-  }
-}
-
 Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset + 3] = (value >>> 24)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 1] = (value >>> 8)
-    this[offset] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
+  this[offset + 3] = (value >>> 24)
+  this[offset + 2] = (value >>> 16)
+  this[offset + 1] = (value >>> 8)
+  this[offset] = (value & 0xff)
   return offset + 4
 }
 
 Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
+  this[offset] = (value >>> 24)
+  this[offset + 1] = (value >>> 16)
+  this[offset + 2] = (value >>> 8)
+  this[offset + 3] = (value & 0xff)
   return offset + 4
 }
 
 Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) {
-    var limit = Math.pow(2, 8 * byteLength - 1)
+    var limit = Math.pow(2, (8 * byteLength) - 1)
 
     checkInt(this, value, offset, byteLength, limit - 1, -limit)
   }
@@ -1813,9 +1886,9 @@ Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, no
 
 Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) {
-    var limit = Math.pow(2, 8 * byteLength - 1)
+    var limit = Math.pow(2, (8 * byteLength) - 1)
 
     checkInt(this, value, offset, byteLength, limit - 1, -limit)
   }
@@ -1836,9 +1909,8 @@ Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, no
 
 Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
   if (value < 0) value = 0xff + value + 1
   this[offset] = (value & 0xff)
   return offset + 1
@@ -1846,58 +1918,42 @@ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
 
 Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
+  this[offset] = (value & 0xff)
+  this[offset + 1] = (value >>> 8)
   return offset + 2
 }
 
 Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
+  this[offset] = (value >>> 8)
+  this[offset + 1] = (value & 0xff)
   return offset + 2
 }
 
 Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 3] = (value >>> 24)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
+  this[offset] = (value & 0xff)
+  this[offset + 1] = (value >>> 8)
+  this[offset + 2] = (value >>> 16)
+  this[offset + 3] = (value >>> 24)
   return offset + 4
 }
 
 Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
   value = +value
-  offset = offset | 0
+  offset = offset >>> 0
   if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
   if (value < 0) value = 0xffffffff + value + 1
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
+  this[offset] = (value >>> 24)
+  this[offset + 1] = (value >>> 16)
+  this[offset + 2] = (value >>> 8)
+  this[offset + 3] = (value & 0xff)
   return offset + 4
 }
 
@@ -1907,6 +1963,8 @@ function checkIEEE754 (buf, value, offset, ext, max, min) {
 }
 
 function writeFloat (buf, value, offset, littleEndian, noAssert) {
+  value = +value
+  offset = offset >>> 0
   if (!noAssert) {
     checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
   }
@@ -1923,6 +1981,8 @@ Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert)
 }
 
 function writeDouble (buf, value, offset, littleEndian, noAssert) {
+  value = +value
+  offset = offset >>> 0
   if (!noAssert) {
     checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
   }
@@ -1940,6 +2000,7 @@ Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert
 
 // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
 Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
   if (!start) start = 0
   if (!end && end !== 0) end = this.length
   if (targetStart >= target.length) targetStart = target.length
@@ -1954,7 +2015,7 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
   if (targetStart < 0) {
     throw new RangeError('targetStart out of bounds')
   }
-  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
   if (end < 0) throw new RangeError('sourceEnd out of bounds')
 
   // Are we oob?
@@ -1964,22 +2025,19 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
   }
 
   var len = end - start
-  var i
 
-  if (this === target && start < targetStart && targetStart < end) {
+  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
+    // Use built-in when available, missing from IE11
+    this.copyWithin(targetStart, start, end)
+  } else if (this === target && start < targetStart && targetStart < end) {
     // descending copy from end
-    for (i = len - 1; i >= 0; --i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
-    // ascending copy from start
-    for (i = 0; i < len; ++i) {
+    for (var i = len - 1; i >= 0; --i) {
       target[i + targetStart] = this[i + start]
     }
   } else {
     Uint8Array.prototype.set.call(
       target,
-      this.subarray(start, start + len),
+      this.subarray(start, end),
       targetStart
     )
   }
@@ -2002,18 +2060,20 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
       encoding = end
       end = this.length
     }
-    if (val.length === 1) {
-      var code = val.charCodeAt(0)
-      if (code < 256) {
-        val = code
-      }
-    }
     if (encoding !== undefined && typeof encoding !== 'string') {
       throw new TypeError('encoding must be a string')
     }
     if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
       throw new TypeError('Unknown encoding: ' + encoding)
     }
+    if (val.length === 1) {
+      var code = val.charCodeAt(0)
+      if ((encoding === 'utf8' && code < 128) ||
+          encoding === 'latin1') {
+        // Fast path: If `val` fits into a single byte, use that numeric value.
+        val = code
+      }
+    }
   } else if (typeof val === 'number') {
     val = val & 255
   }
@@ -2040,8 +2100,12 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
   } else {
     var bytes = Buffer.isBuffer(val)
       ? val
-      : utf8ToBytes(new Buffer(val, encoding).toString())
+      : Buffer.from(val, encoding)
     var len = bytes.length
+    if (len === 0) {
+      throw new TypeError('The value "' + val +
+        '" is invalid for argument "value"')
+    }
     for (i = 0; i < end - start; ++i) {
       this[i + start] = bytes[i % len]
     }
@@ -2053,11 +2117,13 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
 // HELPER FUNCTIONS
 // ================
 
-var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
+var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
 
 function base64clean (str) {
+  // Node takes equal signs as end of the Base64 encoding
+  str = str.split('=')[0]
   // Node strips out invalid characters like \n and \t from the string, base64-js does not
-  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
+  str = str.trim().replace(INVALID_BASE64_RE, '')
   // Node converts strings with length < 2 to ''
   if (str.length < 2) return ''
   // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
@@ -2067,11 +2133,6 @@ function base64clean (str) {
   return str
 }
 
-function stringtrim (str) {
-  if (str.trim) return str.trim()
-  return str.replace(/^\s+|\s+$/g, '')
-}
-
 function toHex (n) {
   if (n < 16) return '0' + n.toString(16)
   return n.toString(16)
@@ -2194,16 +2255,210 @@ function blitBuffer (src, dst, offset, length) {
   return i
 }
 
-function isnan (val) {
-  return val !== val // eslint-disable-line no-self-compare
+// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
+// the `instanceof` check but they should be treated as of that type.
+// See: https://github.com/feross/buffer/issues/166
+function isInstance (obj, type) {
+  return obj instanceof type ||
+    (obj != null && obj.constructor != null && obj.constructor.name != null &&
+      obj.constructor.name === type.name)
+}
+function numberIsNaN (obj) {
+  // For IE11 support
+  return obj !== obj // eslint-disable-line no-self-compare
 }
 
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"base64-js":3,"ieee754":17}],7:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
 
-},{"base64-js":1,"ieee754":15,"isarray":19}],6:[function(require,module,exports){
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],8:[function(require,module,exports){
 'use strict';
 
 module.exports = earcut;
+module.exports.default = earcut;
 
 function earcut(data, holeIndices, dim) {
 
@@ -2214,9 +2469,9 @@ function earcut(data, holeIndices, dim) {
         outerNode = linkedList(data, 0, outerLen, dim, true),
         triangles = [];
 
-    if (!outerNode) return triangles;
+    if (!outerNode || outerNode.next === outerNode.prev) return triangles;
 
-    var minX, minY, maxX, maxY, x, y, size;
+    var minX, minY, maxX, maxY, x, y, invSize;
 
     if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
 
@@ -2234,11 +2489,12 @@ function earcut(data, holeIndices, dim) {
             if (y > maxY) maxY = y;
         }
 
-        // minX, minY and size are later used to transform coords into integers for z-order calculation
-        size = Math.max(maxX - minX, maxY - minY);
+        // minX, minY and invSize are later used to transform coords into integers for z-order calculation
+        invSize = Math.max(maxX - minX, maxY - minY);
+        invSize = invSize !== 0 ? 1 / invSize : 0;
     }
 
-    earcutLinked(outerNode, triangles, dim, minX, minY, size);
+    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
 
     return triangles;
 }
@@ -2274,7 +2530,7 @@ function filterPoints(start, end) {
         if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
             removeNode(p);
             p = end = p.prev;
-            if (p === p.next) return null;
+            if (p === p.next) break;
             again = true;
 
         } else {
@@ -2286,11 +2542,11 @@ function filterPoints(start, end) {
 }
 
 // main ear slicing loop which triangulates a polygon (given as a linked list)
-function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
+function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
     if (!ear) return;
 
     // interlink polygon nodes in z-order
-    if (!pass && size) indexCurve(ear, minX, minY, size);
+    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
 
     var stop = ear,
         prev, next;
@@ -2300,7 +2556,7 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
         prev = ear.prev;
         next = ear.next;
 
-        if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {
+        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
             // cut off the triangle
             triangles.push(prev.i / dim);
             triangles.push(ear.i / dim);
@@ -2308,7 +2564,7 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
 
             removeNode(ear);
 
-            // skipping the next vertice leads to less sliver triangles
+            // skipping the next vertex leads to less sliver triangles
             ear = next.next;
             stop = next.next;
 
@@ -2321,16 +2577,16 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
         if (ear === stop) {
             // try filtering points and slicing again
             if (!pass) {
-                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);
+                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
 
             // if this didn't work, try curing all small self-intersections locally
             } else if (pass === 1) {
-                ear = cureLocalIntersections(ear, triangles, dim);
-                earcutLinked(ear, triangles, dim, minX, minY, size, 2);
+                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
+                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
 
             // as a last resort, try splitting the remaining polygon into two
             } else if (pass === 2) {
-                splitEarcut(ear, triangles, dim, minX, minY, size);
+                splitEarcut(ear, triangles, dim, minX, minY, invSize);
             }
 
             break;
@@ -2358,7 +2614,7 @@ function isEar(ear) {
     return true;
 }
 
-function isEarHashed(ear, minX, minY, size) {
+function isEarHashed(ear, minX, minY, invSize) {
     var a = ear.prev,
         b = ear,
         c = ear.next;
@@ -2372,22 +2628,26 @@ function isEarHashed(ear, minX, minY, size) {
         maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
 
     // z-order range for the current triangle bbox;
-    var minZ = zOrder(minTX, minTY, minX, minY, size),
-        maxZ = zOrder(maxTX, maxTY, minX, minY, size);
+    var minZ = zOrder(minTX, minTY, minX, minY, invSize),
+        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
 
-    // first look for points inside the triangle in increasing z-order
-    var p = ear.nextZ;
+    var p = ear.prevZ,
+        n = ear.nextZ;
 
-    while (p && p.z <= maxZ) {
+    // look for points inside the triangle in both directions
+    while (p && p.z >= minZ && n && n.z <= maxZ) {
         if (p !== ear.prev && p !== ear.next &&
             pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
             area(p.prev, p, p.next) >= 0) return false;
-        p = p.nextZ;
-    }
+        p = p.prevZ;
 
-    // then look for points in decreasing z-order
-    p = ear.prevZ;
+        if (n !== ear.prev && n !== ear.next &&
+            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
+            area(n.prev, n, n.next) >= 0) return false;
+        n = n.nextZ;
+    }
 
+    // look for remaining points in decreasing z-order
     while (p && p.z >= minZ) {
         if (p !== ear.prev && p !== ear.next &&
             pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
@@ -2395,6 +2655,14 @@ function isEarHashed(ear, minX, minY, size) {
         p = p.prevZ;
     }
 
+    // look for remaining points in increasing z-order
+    while (n && n.z <= maxZ) {
+        if (n !== ear.prev && n !== ear.next &&
+            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
+            area(n.prev, n, n.next) >= 0) return false;
+        n = n.nextZ;
+    }
+
     return true;
 }
 
@@ -2420,11 +2688,11 @@ function cureLocalIntersections(start, triangles, dim) {
         p = p.next;
     } while (p !== start);
 
-    return p;
+    return filterPoints(p);
 }
 
 // try splitting polygon into two and triangulate them independently
-function splitEarcut(start, triangles, dim, minX, minY, size) {
+function splitEarcut(start, triangles, dim, minX, minY, invSize) {
     // look for a valid diagonal that divides the polygon into two
     var a = start;
     do {
@@ -2439,8 +2707,8 @@ function splitEarcut(start, triangles, dim, minX, minY, size) {
                 c = filterPoints(c, c.next);
 
                 // run earcut on each half
-                earcutLinked(a, triangles, dim, minX, minY, size);
-                earcutLinked(c, triangles, dim, minX, minY, size);
+                earcutLinked(a, triangles, dim, minX, minY, invSize);
+                earcutLinked(c, triangles, dim, minX, minY, invSize);
                 return;
             }
             b = b.next;
@@ -2482,6 +2750,9 @@ function eliminateHole(hole, outerNode) {
     outerNode = findHoleBridge(hole, outerNode);
     if (outerNode) {
         var b = splitPolygon(outerNode, hole);
+
+        // filter collinear points around the cuts
+        filterPoints(outerNode, outerNode.next);
         filterPoints(b, b.next);
     }
 }
@@ -2497,7 +2768,7 @@ function findHoleBridge(hole, outerNode) {
     // find a segment intersected by a ray from the hole's leftmost point to the left;
     // segment's endpoint with lesser x will be potential connection point
     do {
-        if (hy <= p.y && hy >= p.next.y) {
+        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
             var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
             if (x <= hx && x > qx) {
                 qx = x;
@@ -2513,7 +2784,7 @@ function findHoleBridge(hole, outerNode) {
 
     if (!m) return null;
 
-    if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
+    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint
 
     // look for points inside the triangle of hole point, segment intersection and endpoint;
     // if there are no points found, we have a valid connection;
@@ -2525,31 +2796,37 @@ function findHoleBridge(hole, outerNode) {
         tanMin = Infinity,
         tan;
 
-    p = m.next;
+    p = m;
 
-    while (p !== stop) {
-        if (hx >= p.x && p.x >= mx &&
+    do {
+        if (hx >= p.x && p.x >= mx && hx !== p.x &&
                 pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
 
             tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
 
-            if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
+            if (locallyInside(p, hole) &&
+                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
                 m = p;
                 tanMin = tan;
             }
         }
 
         p = p.next;
-    }
+    } while (p !== stop);
 
     return m;
 }
 
+// whether sector in vertex m contains sector in vertex p in the same coordinates
+function sectorContainsSector(m, p) {
+    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
+}
+
 // interlink polygon nodes in z-order
-function indexCurve(start, minX, minY, size) {
+function indexCurve(start, minX, minY, invSize) {
     var p = start;
     do {
-        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
+        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
         p.prevZ = p.prev;
         p.nextZ = p.next;
         p = p.next;
@@ -2582,20 +2859,11 @@ function sortLinked(list) {
                 q = q.nextZ;
                 if (!q) break;
             }
-
             qSize = inSize;
 
             while (pSize > 0 || (qSize > 0 && q)) {
 
-                if (pSize === 0) {
-                    e = q;
-                    q = q.nextZ;
-                    qSize--;
-                } else if (qSize === 0 || !q) {
-                    e = p;
-                    p = p.nextZ;
-                    pSize--;
-                } else if (p.z <= q.z) {
+                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
                     e = p;
                     p = p.nextZ;
                     pSize--;
@@ -2623,11 +2891,11 @@ function sortLinked(list) {
     return list;
 }
 
-// z-order of a point given coords and size of the data bounding box
-function zOrder(x, y, minX, minY, size) {
+// z-order of a point given coords and inverse of the longer side of data bbox
+function zOrder(x, y, minX, minY, invSize) {
     // coords are transformed into non-negative 15-bit integer range
-    x = 32767 * (x - minX) / size;
-    y = 32767 * (y - minY) / size;
+    x = 32767 * (x - minX) * invSize;
+    y = 32767 * (y - minY) * invSize;
 
     x = (x | (x << 8)) & 0x00FF00FF;
     x = (x | (x << 4)) & 0x0F0F0F0F;
@@ -2647,7 +2915,7 @@ function getLeftmost(start) {
     var p = start,
         leftmost = start;
     do {
-        if (p.x < leftmost.x) leftmost = p;
+        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
         p = p.next;
     } while (p !== start);
 
@@ -2663,8 +2931,10 @@ function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
 
 // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
 function isValidDiagonal(a, b) {
-    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
-           locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
+    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
+           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
+            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
+            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
 }
 
 // signed area of a triangle
@@ -2679,10 +2949,28 @@ function equals(p1, p2) {
 
 // check if two segments intersect
 function intersects(p1, q1, p2, q2) {
-    if ((equals(p1, q1) && equals(p2, q2)) ||
-        (equals(p1, q2) && equals(p2, q1))) return true;
-    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
-           area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
+    var o1 = sign(area(p1, q1, p2));
+    var o2 = sign(area(p1, q1, q2));
+    var o3 = sign(area(p2, q2, p1));
+    var o4 = sign(area(p2, q2, q1));
+
+    if (o1 !== o2 && o3 !== o4) return true; // general case
+
+    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
+    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
+    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
+    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
+
+    return false;
+}
+
+// for collinear points p, q, r, check if point q lies on segment pr
+function onSegment(p, q, r) {
+    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
+}
+
+function sign(num) {
+    return num > 0 ? 1 : num < 0 ? -1 : 0;
 }
 
 // check if a polygon diagonal intersects any polygon segments
@@ -2711,7 +2999,8 @@ function middleInside(a, b) {
         px = (a.x + b.x) / 2,
         py = (a.y + b.y) / 2;
     do {
-        if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
+        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
+                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
             inside = !inside;
         p = p.next;
     } while (p !== a);
@@ -2768,14 +3057,14 @@ function removeNode(p) {
 }
 
 function Node(i, x, y) {
-    // vertice index in coordinates array
+    // vertex index in coordinates array
     this.i = i;
 
     // vertex coordinates
     this.x = x;
     this.y = y;
 
-    // previous and next vertice nodes in a polygon ring
+    // previous and next vertex nodes in a polygon ring
     this.prev = null;
     this.next = null;
 
@@ -2846,7 +3135,7 @@ earcut.flatten = function (data) {
     return result;
 };
 
-},{}],7:[function(require,module,exports){
+},{}],9:[function(require,module,exports){
 'use strict';
 
 var OneVersionConstraint = require('individual/one-version');
@@ -2868,7 +3157,7 @@ function EvStore(elem) {
     return hash;
 }
 
-},{"individual/one-version":17}],8:[function(require,module,exports){
+},{"individual/one-version":19}],10:[function(require,module,exports){
 'use strict';
 var request = require('./request');
 var buildQueryObject = require('./buildQueryObject');
@@ -2969,7 +3258,7 @@ XMLHttpSource['default'] = XMLHttpSource;
 // commonjs
 module.exports = XMLHttpSource;
 
-},{"./buildQueryObject":9,"./request":12}],9:[function(require,module,exports){
+},{"./buildQueryObject":11,"./request":14}],11:[function(require,module,exports){
 'use strict';
 module.exports = function buildQueryObject(url, method, queryData) {
   var qData = [];
@@ -2998,7 +3287,7 @@ module.exports = function buildQueryObject(url, method, queryData) {
   return data;
 };
 
-},{}],10:[function(require,module,exports){
+},{}],12:[function(require,module,exports){
 (function (global){
 'use strict';
 // Get CORS support even for older IE
@@ -3015,7 +3304,7 @@ module.exports = function getCORSRequest() {
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{}],11:[function(require,module,exports){
+},{}],13:[function(require,module,exports){
 (function (global){
 'use strict';
 module.exports = function getXMLHttpRequest() {
@@ -3044,7 +3333,7 @@ module.exports = function getXMLHttpRequest() {
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{}],12:[function(require,module,exports){
+},{}],14:[function(require,module,exports){
 'use strict';
 var getXMLHttpRequest = require('./getXMLHttpRequest');
 var getCORSRequest = require('./getCORSRequest');
@@ -3267,7 +3556,7 @@ function onXhrError(observer, xhr, status, e) {
 
 module.exports = request;
 
-},{"./getCORSRequest":10,"./getXMLHttpRequest":11}],13:[function(require,module,exports){
+},{"./getCORSRequest":12,"./getXMLHttpRequest":13}],15:[function(require,module,exports){
 (function (global){
 !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.falcor=t()}}(function(){var t;return function e(t,n,r){function o(s,u){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return o(n?n:e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(t,e,n){var r=t(32),o=t(130);r.atom=o.atom,r.ref=o.ref,r.error=o.error,r.pathValue=o.pathValue,r.HttpDataSource=t(125),e.exports=r},{125:125,130:130,32:32}],2:[function(t,e,n){function r(t){var e=t||{};this._root=e._root||new o(e),this._path=e.path||e._path||[],this._scheduler=e.scheduler||e._scheduler||new l,this._source=e.source||e._source,this._request=e.request||e._request||new s(this,this._scheduler),this._ID=N++,"number"==typeof e.maxSize?this._maxSize=e.maxSize:this._maxSize=e._maxSize||r.prototype._maxSize,"number"==typeof e.collectRatio?this._collectRatio=e.collectRatio:this._collectRatio=e._collectRatio||r.prototype._collectRatio,(e.boxed||e.hasOwnProperty("_boxed"))&&(this._boxed=e.boxed||e._boxed),(e.materialized||e.hasOwnProperty("_materialized"))&&(this._materialized=e.materialized||e._materialized),"boolean"==typeof e.treatErrorsAsValues?this._treatErrorsAsValues=e.treatErrorsAsValues:e.hasOwnProperty("_treatErrorsAsValues")&&(this._treatErrorsAsValues=e._treatErrorsAsValues),e.cache&&this.setCache(e.cache)}var o=t(4),i=t(3),s=t(55),u=t(64),a=t(65),c=t(61),p=t(63),h=t(73),f=t(75),l=t(74),d=t(81),v=t(84),y=t(49),b=t(134),m=t(88),g=t(100),w=t(96),x=t(102),_=t(98),S=t(99),E=t(77),C=t(76),A=t(130),N=0,k=t(116),O=function(){},P=t(14),j=t(19),D={pathValue:!0,pathSyntax:!0,json:!0,jsonGraph:!0},q=t(72);e.exports=r,r.ref=A.ref,r.atom=A.atom,r.error=A.error,r.pathValue=A.pathValue,r.prototype.constructor=r,r.prototype._materialized=!1,r.prototype._boxed=!1,r.prototype._progressive=!1,r.prototype._treatErrorsAsValues=!1,r.prototype._maxSize=Math.pow(2,53)-1,r.prototype._collectRatio=.75,r.prototype.get=t(71),r.prototype._getWithPaths=t(70),r.prototype.set=function(){var t=k(arguments,D,"set");return t!==!0?new u(function(e){e.onError(t)}):this._set.apply(this,arguments)},r.prototype.preload=function(){var t=k(arguments,q,"preload");if(t!==!0)return new u(function(e){e.onError(t)});var e=Array.prototype.slice.call(arguments),n=this;return new u(function(t){return n.get.apply(n,e).subscribe(function(){},function(e){t.onError(e)},function(){t.onCompleted()})})},r.prototype._set=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(w(r)?n-=1:r=void 0,t=new Array(n);++e<n;)t[e]=arguments[e];return a.create(this,t,r)},r.prototype.call=function(){var t,e=-1,n=arguments.length;for(t=new Array(n);++e<n;){var r=arguments[e];t[e]=r;var o=typeof r;if(e>1&&!Array.isArray(r)||0===e&&!Array.isArray(r)&&"string"!==o||1===e&&!Array.isArray(r)&&!x(r))return new u(function(t){t.onError(new Error("Invalid argument"))})}return c.create(this,t)},r.prototype.invalidate=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(t=new Array(n);++e<n;)if(t[e]=b.fromPath(arguments[e]),"object"!=typeof t[e])throw new Error("Invalid argument");p.create(this,t,r).subscribe(O,function(t){throw t})},r.prototype.deref=t(5),r.prototype.getValue=t(16),r.prototype.setValue=t(79),r.prototype._getValueSync=t(24),r.prototype._setValueSync=t(80),r.prototype._derefSync=t(6),r.prototype.setCache=function(t){var e=this._root.cache;if(t!==e){var n=this._root,r=this._path;this._path=[],this._root.cache={},"undefined"!=typeof e&&y(n,n.expired,m(e),0),S(t)?C(this,[t]):_(t)?E(this,[t]):g(t)&&E(this,[{json:t}]),this._path=r}else"undefined"==typeof e&&(this._root.cache={});return this},r.prototype.getCache=function(){var t=v(arguments);if(0===t.length)return P(this._root.cache);var e=[{}],n=this._path;return j.getWithPathsAsJSONGraph(this,t,e),this._path=n,e[0].jsonGraph},r.prototype.getVersion=function(t){var e=t&&b.fromPath(t)||[];if(Array.isArray(e)===!1)throw new Error("Model#getVersion must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._getVersion(this,e)},r.prototype._syncCheck=function(t){if(Boolean(this._source)&&this._root.syncRefCount<=0&&this._root.unsafeMode===!1)throw new Error("Model#"+t+" may only be called within the context of a request selector.");return!0},r.prototype._clone=function(t){var e=new r(this);for(var n in t){var o=t[n];"delete"===o?delete e[n]:e[n]=o}return e.setCache=void 0,e},r.prototype.batch=function(t){var e=t;"number"==typeof e?e=new f(Math.round(Math.abs(e))):e&&e.schedule||(e=new h);var n=this._clone();return n._request=new s(n,e),n},r.prototype.unbatch=function(){var t=this._clone();return t._request=new s(t,new l),t},r.prototype.treatErrorsAsValues=function(){return this._clone({_treatErrorsAsValues:!0})},r.prototype.asDataSource=function(){return new i(this)},r.prototype._materialize=function(){return this._clone({_materialized:!0})},r.prototype._dematerialize=function(){return this._clone({_materialized:"delete"})},r.prototype.boxValues=function(){return this._clone({_boxed:!0})},r.prototype.unboxValues=function(){return this._clone({_boxed:"delete"})},r.prototype.withoutDataSource=function(){return this._clone({_source:"delete"})},r.prototype.toJSON=function(){return{$type:"ref",value:this._path}},r.prototype.getPath=function(){return d(this._path)},r.prototype._getBoundValue=t(13),r.prototype._getVersion=t(18),r.prototype._getValueSync=t(17),r.prototype._getPathValuesAsPathMap=j.getWithPathsAsPathMap,r.prototype._getPathValuesAsJSONG=j.getWithPathsAsJSONGraph,r.prototype._setPathValuesAsJSON=t(78),r.prototype._setPathValuesAsJSONG=t(78),r.prototype._setPathValuesAsPathMap=t(78),r.prototype._setPathValuesAsValues=t(78),r.prototype._setPathMapsAsJSON=t(77),r.prototype._setPathMapsAsJSONG=t(77),r.prototype._setPathMapsAsPathMap=t(77),r.prototype._setPathMapsAsValues=t(77),r.prototype._setJSONGsAsJSON=t(76),r.prototype._setJSONGsAsJSONG=t(76),r.prototype._setJSONGsAsPathMap=t(76),r.prototype._setJSONGsAsValues=t(76),r.prototype._setCache=t(77),r.prototype._invalidatePathValuesAsJSON=t(48),r.prototype._invalidatePathMapsAsJSON=t(47)},{100:100,102:102,116:116,13:13,130:130,134:134,14:14,16:16,17:17,18:18,19:19,24:24,3:3,4:4,47:47,48:48,49:49,5:5,55:55,6:6,61:61,63:63,64:64,65:65,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,84:84,88:88,96:96,98:98,99:99}],3:[function(t,e,n){function r(t){this._model=t._materialize().treatErrorsAsValues()}r.prototype.get=function(t){return this._model.get.apply(this._model,t)._toJSONG()},r.prototype.set=function(t){return this._model.set(t)._toJSONG()},r.prototype.call=function(t,e,n,r){var o=[t,e,n].concat(r);return this._model.call.apply(this._model,o)._toJSONG()},e.exports=r},{}],4:[function(t,e,n){function r(t){var e=t||{};this.syncRefCount=0,this.expired=e.expired||[],this.unsafeMode=e.unsafeMode||!1,this.collectionScheduler=e.collectionScheduler||new s,this.cache={},o(e.comparator)&&(this.comparator=e.comparator),o(e.errorSelector)&&(this.errorSelector=e.errorSelector),o(e.onChange)&&(this.onChange=e.onChange)}var o=t(96),i=t(91),s=t(74);r.prototype.errorSelector=function(t,e){return e},r.prototype.comparator=function(t,e){return i(t,"value")&&i(e,"value")?t.value===e.value&&t.$type===e.$type&&t.$expires===e.$expires:t===e},e.exports=r},{74:74,91:91,96:96}],5:[function(t,e,n){function r(t,e){var n,r=!1;try{++t._root.syncRefCount,n=t._derefSync(e)}catch(i){n=i,r=!0}finally{--t._root.syncRefCount}return r?o.Observable["throw"](n):o.Observable["return"](n)}var o=t(159),i=t(134);e.exports=function(t){for(var e=this,n=-1,s=arguments.length-1,u=new Array(s),a=i.fromPath(t);++n<s;)u[n]=i.fromPath(arguments[n+1]);if(0===s)throw new Error("Model#deref requires at least one value path.");return o.Observable.defer(function(){return r(e,a)}).flatMap(function(t){if(Boolean(t)){if(s>0){var n=o.Observable.of(t);return t.get.apply(t,u)["catch"](o.Observable.empty()).concat(n).last().flatMap(function(){return r(e,a)}).filter(function(t){return t})}return o.Observable["return"](t)}if(s>0){var i=u.map(function(t){return a.concat(t)});return e.get.apply(e,i).concat(o.Observable.defer(function(){return r(e,a)})).last().filter(function(t){return t})}return o.Observable.empty()})}},{134:134,159:159}],6:[function(t,e,n){var r=t(134),o=t(13),i=t(8),s=t(118);e.exports=function(t){var e=r.fromPath(t);if(!Array.isArray(e))throw new Error("Model#derefSync must be called with an Array path.");var n=o(this,this._path.concat(e),!1),u=n.path,a=n.value,c=n.found;if(c&&void 0!==a&&(a.$type!==s||void 0!==a.value)){if(a.$type)throw new i;return this._clone({_path:u})}}},{118:118,13:13,134:134,8:8}],7:[function(t,e,n){function r(){this.message=r.message,this.stack=(new Error).stack}r.prototype=new Error,r.prototype.name="BoundJSONGraphModelError",r.message="It is not legal to use the JSON Graph format from a bound Model. JSON Graph format can only be used from a root model.",e.exports=r},{}],8:[function(t,e,n){function r(t,e){this.message=i,this.stack=(new Error).stack,this.boundPath=t,this.shortedPath=e}var o="InvalidModelError",i="The boundPath of the model is not valid since a value or error was found before the path end.";r.prototype=new Error,r.prototype.name=o,r.message=i,e.exports=r},{}],9:[function(t,e,n){function r(t){this.message="An exception was thrown when making a request.",this.stack=(new Error).stack,this.innerError=t}var o="InvalidSourceError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],10:[function(t,e,n){function r(){this.message="The allowed number of retries have been exceeded.",this.stack=(new Error).stack}var o="MaxRetryExceededError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],11:[function(t,e,n){function r(t,e,n,r,o,h,f){for(var l,d,v=n,y=o,b=r,m=0;;){if(0===m&&b[c]?(m=y.length,d=b[c]):(l=y[m++],d=v[l]),d){var g=d.$type,w=g&&d.value||d;if(m<y.length){if(g){v=d;break}v=d;continue}if(v=d,g&&u(d))break;if(b[c]||i(b,d),g===a){f?s(t,d,h,null,null,null,y,y.length,f):p(t,d),m=0,y=w,b=d,v=e;continue}break}v=void 0;break}if(m<y.length&&void 0!==v){for(var x=[],_=0;m>_;_++)x[_]=y[_];y=x}return[v,y]}var o=t(26),i=o.create,s=t(22),u=t(27),a=t(120),c=t(33),p=t(29).promote;e.exports=r},{120:120,22:22,26:26,27:27,29:29,33:33}],12:[function(t,e,n){var r=t(15),o=t(8),i=t(7);e.exports=function(t,e){return function(n,s,u){var a,c,p,h=u[0],f={values:u,optimizedPaths:[]},l=n._root.cache,d=n._path,v=l,y=d.length,b=[];if(y){if(e)return{criticalError:new i};if(v=r(n,d),v.$type)return{criticalError:new o(d,d)};for(a=[],c=0;y>c;++c)a[c]=d[c]}else a=[],y=0;for(c=0,p=s.length;p>c;c++)t(n,l,v,s[c],0,h,f,b,a,y,e);return f}}},{15:15,7:7,8:8}],13:[function(t,e,n){var r=t(17),o=t(8);e.exports=function(t,e,n){var i,s,u,a,c,p=e,h=e;for(i=t._boxed,n=t._materialized,s=t._treatErrorsAsValues,t._boxed=!0,t._materialized=void 0===n||n,t._treatErrorsAsValues=!0,u=r(t,p.concat(null),!0),t._boxed=i,t._materialized=n,t._treatErrorsAsValues=s,p=u.optimizedPath,a=u.shorted,c=u.found,u=u.value;p.length&&null===p[p.length-1];)p.pop();if(c&&a)throw new o(h,p);return{path:p,value:u,shorted:a,found:c}}},{17:17,8:8}],14:[function(t,e,n){function r(t){var e,n,r,o={},i=Object.keys(t);for(n=0,r=i.length;r>n;n++)e=i[n],s(e)||(o[e]=t[e]);return o}function o(t,e,n){Object.keys(t).filter(function(e){return!s(e)&&t[e]}).forEach(function(n){var s=t[n],u=e[n];if(u||(u=e[n]={}),s.$type){var a,c=s.value&&"object"==typeof s.value,p=!t[i];return a=c||p?r(s):s.value,void(e[n]=a)}o(s,u,n)})}var i=t(37),s=t(97);e.exports=function(t){var e={};return o(t,e),e}},{37:37,97:97}],15:[function(t,e,n){e.exports=function(t,e){for(var n=t._root.cache,r=-1,o=e.length;++r<o&&n&&!n.$type;)n=n[e[r]];return n}},{}],16:[function(t,e,n){var r=t(64),o=t(134);e.exports=function(t){for(var e=o.fromPath(t),n=0,i=e.length;++n<i;)if("object"==typeof e[n])return new r(function(t){t.onError(new Error("Paths must be simple paths"))});var s=this;return new r(function(t){return s.get(e).subscribe(function(n){for(var r=n.json,o=-1,i=e.length;r&&++o<i;)r=r[e[o]];t.onNext(r)},function(e){t.onError(e)},function(){t.onCompleted()})})}},{134:134,64:64}],17:[function(t,e,n){var r=t(11),o=t(25),i=t(27),s=t(29).promote,u=t(120),a=t(118),c=t(119);e.exports=function(t,e,n){for(var p,h,f,l,d,v=t._root.cache,y=e.length,b=[],m=!1,g=!1,w=0,x=v,_=v,S=v,E=!0,C=!1;x&&y>w;){if(p=e[w++],null!==p&&(x=_[p],b[b.length]=p),!x){S=void 0,m=!0,E=!1;break}if(f=x.$type,f===a&&void 0===x.value){S=void 0,E=!1,m=y>w;break}if(y>w){if(f===u){if(i(x)){C=!0,S=void 0,E=!1;break}if(l=r(t,v,v,x,x.value),d=l[0],!d){S=void 0,x=void 0,E=!1;break}f=d.$type,x=d,b=l[1].slice(0)}if(f)break}else S=x;_=x}if(y>w&&!C){for(h=w;y>h;++h)if(null!==e[w]){g=!0;break}for(g?(m=!0,S=void 0):S=x,h=w;y>h;++h)null!==e[h]&&(b[b.length]=e[h])}if(S&&f&&(i(S)?S=void 0:s(t,S)),S&&f===c&&!t._treatErrorsAsValues)throw{path:w===y?e:e.slice(0,w),value:S.value};return S&&t._boxed?S=Boolean(f)&&!n?o(S):S:!S&&t._materialized?S={$type:a}:S&&(S=S.value),{value:S,shorted:m,optimizedPath:b,found:E}}},{11:11,118:118,119:119,120:120,25:25,27:27,29:29}],18:[function(t,e,n){var r=t(46);e.exports=function(t,e){var n=t._getValueSync({_boxed:!0,_root:t._root,_treatErrorsAsValues:t._treatErrorsAsValues},e,!0).value,o=n&&n[r];return null==o?-1:o}},{46:46}],19:[function(t,e,n){var r=t(12),o=t(31),i=r(o,!1),s=r(o,!0);e.exports={getValueSync:t(17),getBoundValue:t(13),getWithPathsAsPathMap:i,getWithPathsAsJSONGraph:s}},{12:12,13:13,17:17,31:31}],20:[function(t,e,n){var r=t(29),o=t(25),i=r.promote;e.exports=function(t,e,n,r,s){var u=e.value;s.errors||(s.errors=[]),t._boxed&&(u=o(e)),s.errors.push({path:r.slice(0,n+1),value:u}),i(t,e)}},{25:25,29:29}],21:[function(t,e,n){function r(t,e,n,r,o,i,s){s.requestedMissingPaths.push(r.slice(0,n).concat(e)),s.optimizedMissingPaths.push(o.slice(0,i).concat(e))}var o=t(30),i=o.fastCopy;e.exports=function(t,e,n,o,s,u,a){var c;o.requestedMissingPaths||(o.requestedMissingPaths=[],o.optimizedMissingPaths=[]),c=n<e.length?i(e,n):[],r(t,c,n,s,u,a,o)}},{30:30}],22:[function(t,e,n){var r=t(29),o=t(25),i=r.promote,s=t(120),u=t(118),a=t(119),c=t(37);e.exports=function(t,e,n,r,p,h,f,l,d,v){if(n){var y,b,m,g,w,x,_,S,E=!1;if(e&&i(t,e),e&&void 0!==e.value||(E=t._materialized),E)S={$type:u};else if(t._boxed)S=o(e);else if(e.$type===s||e.$type===a)S=d?o(e):e.value;else if(d){var C=e.value&&"object"==typeof e.value,A=!e[c];S=C||A?o(e):e.value}else S=e.value;if(p&&(p.hasValue=!0),d){for(w=n.jsonGraph,w||(w=n.jsonGraph={},n.paths=[]),y=0,b=l-1;b>y;y++)g=f[y],w[g]||(w[g]={}),w=w[g];g=f[y],w[g]=E?{$type:u}:S,h&&n.paths.push(h.slice(0,r))}else if(0===r)n.json=S;else{for(w=n.json,w||(w=n.json={}),y=0;r-1>y;y++)m=h[y],w[m]||(w[m]={}),x=w,_=m,w=w[m];m=h[y],null!==m?w[m]=S:x[_]=S}}}},{118:118,119:119,120:120,25:25,29:29,37:37}],23:[function(t,e,n){var r=t(27),o=t(26),i=t(29),s=o.remove,u=i.splice,a=t(119),c=t(20),p=t(22),h=t(21),f=t(28),l=t(35);e.exports=function(t,e,n,o,i,d,v,y,b,m,g){var w=e&&e.$type,x=e&&void 0===e.value;return e&&w?void(r(e)?(e[l]||(u(t,e),s(e)),h(t,n,o,d,v,y,b)):w===a?(g&&(v[o]=null),m||t._treatErrorsAsValues?p(t,e,i,o,d,v,y,b,m,g):c(t,e,o,v,d)):(g&&(v[o]=null),(!x||x&&t._materialized)&&p(t,e,i,o,d,v,y,b,m,g))):void(f(t)?p(t,e,i,o,d,v,y,b,m,g):h(t,n,o,d,v,y,b))}},{119:119,20:20,21:21,22:22,26:26,27:27,28:28,29:29,35:35}],24:[function(t,e,n){var r=t(134);e.exports=function(t){var e=r.fromPath(t);if(Array.isArray(e)===!1)throw new Error("Model#getValueSync must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._syncCheck("getValueSync")&&this._getValueSync(this,e).value}},{134:134}],25:[function(t,e,n){var r=t(40);e.exports=function(t){var e,n,o,i=Object.keys(t);for(e={},n=0,o=i.length;o>n;n++){var s=i[n];s[0]!==r&&(e[s]=t[s])}return e}},{40:40}],26:[function(t,e,n){function r(t,e){var n=e[a]||0;e[i+n]=t,e[a]=n+1,t[u]=n,t[s]=e}function o(t){var e=t[s];if(e){for(var n=t[u],r=e[a];r>n;)e[i+n]=e[i+n+1],++n;e[a]=r-1,t[s]=void 0,t[u]=void 0}}var i=t(43),s=t(33),u=t(42),a=t(44);e.exports={create:r,remove:o}},{33:33,42:42,43:43,44:44}],27:[function(t,e,n){var r=t(106);e.exports=function(t){var e=void 0===t.$expires&&-1||t.$expires;return-1!==e&&1!==e&&(0===e||e<r())}},{106:106}],28:[function(t,e,n){e.exports=function(t){return t._materialized&&!t._source}},{}],29:[function(t,e,n){function r(t,e){var n=t._root,r=n[i];if(r!==e){var o=e[a],s=e[u];s&&(s[a]=o),o&&(o[u]=s),e[a]=void 0,n[i]=e,e[u]=r,r[a]=e}}function o(t,e){var n=t._root,r=e[a],o=e[u];o&&(o[a]=r),r&&(r[u]=o),e[a]=void 0,e===n[i]&&(n[i]=void 0),e===n[s]&&(n[s]=void 0),e[c]=!0,n.expired.push(e)}var i=t(34),s=t(45),u=t(38),a=t(41),c=t(35);e.exports={promote:r,splice:o}},{34:34,35:35,38:38,41:41,45:45}],30:[function(t,e,n){function r(t,e){var n,r,o,i=[];for(r=0,o=e||0,n=t.length;n>o;r++,o++)i[r]=t[o];return i}function o(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)null!==e[o]&&(i[n++]=e[o]);return i}function i(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)i[n++]=e[o];return i}e.exports={fastCat:i,fastCatSkipNulls:o,fastCopy:r}},{}],31:[function(t,e,n){var r=t(11),o=t(23),i=t(27),s=t(143).iterateKeySet,u=t(120),a=t(29).promote;e.exports=function c(t,e,n,p,h,f,l,d,v,y,b,m){var g=m,w=v;if(!n||n&&n.$type||h===p.length)return void o(t,n,p,h,f,l,d,w,y,b,g);var x,_;x=p[h];var S="object"==typeof x,E=h+1,C=!1,A=x;if(S&&(C={},A=s(x,C)),void 0!==A||!C.done){var N=y+1;do{g=!1;var k;null===A?k=n:(k=n[A],w[y]=A,d[h]=A);var O=w,P=N;if(k){var j=k.$type,D=j&&k.value||k;if(E<p.length&&j&&j===u&&!i(k)){b&&o(t,k,p,E,f,l,null,w,P,b,g),a(t,k);var q=r(t,e,e,k,D,f,b);g=!0,k=q[0];var R=q[1];for(O=[],P=R.length,_=0;P>_;++_)O[_]=R[_]}}c(t,e,k,p,E,f,l,d,O,P,b,g),C&&!C.done&&(A=s(x,C))}while(C&&!C.done)}}},{11:11,120:120,143:143,23:23,27:27,29:29}],32:[function(t,e,n){"use strict";function r(t){return new r.Model(t)}"function"==typeof Promise?r.Promise=Promise:r.Promise=t(151),e.exports=r,r.Model=t(2)},{151:151,2:2}],33:[function(t,e,n){e.exports=t(40)+"context"},{40:40}],34:[function(t,e,n){e.exports=t(40)+"head"},{40:40}],35:[function(t,e,n){e.exports=t(40)+"invalidated"},{40:40}],36:[function(t,e,n){e.exports=t(40)+"key"},{40:40}],37:[function(t,e,n){e.exports="$modelCreated"},{}],38:[function(t,e,n){e.exports=t(40)+"next"},{40:40}],39:[function(t,e,n){e.exports=t(40)+"parent"},{40:40}],40:[function(t,e,n){e.exports=String.fromCharCode(30)},{}],41:[function(t,e,n){e.exports=t(40)+"prev"},{40:40}],42:[function(t,e,n){e.exports=t(40)+"ref-index"},{40:40}],43:[function(t,e,n){e.exports=t(40)+"ref"},{40:40}],44:[function(t,e,n){e.exports=t(40)+"refs-length"},{40:40}],45:[function(t,e,n){e.exports=t(40)+"tail"},{40:40}],46:[function(t,e,n){e.exports=t(40)+"version"},{40:40}],47:[function(t,e,n){function r(t,e,n,o,s,u,c,p,h,f){if(!_(t)&&!t.$type)for(var l in t)if(l[0]!==a&&"$"!==l[0]&&m(t,l)){var d=t[l],v=g(d)&&!d.$type,y=i(n,o,s,l,d,v,!1,u,c,p,h,f),w=y[0],x=y[1];w&&(v?r(d,e+1,n,x,w,u,c,p,h,f):A(w,x,l,p)&&C(x,b(w),p,u))}}function o(t,e,n,r,o,s,a,h){if(w(n))return S(n,o,s),[void 0,e];y(s,n);var d=n,v=n.value,b=e;if(n=n[p],null!=n)b=n[c]||e;else{var m=0,g=v.length-1;b=n=e;do{var x=v[m],E=g>m,C=i(e,b,n,x,t,E,!0,r,o,s,a,h);if(n=C[0],_(n))return C;b=C[1]}while(m++<g);if(d[p]!==n){var A=n[l]||0;n[l]=A+1,n[u+A]=d,d[p]=n,d[f]=A}}return[n,b]}function i(t,e,n,r,i,u,a,c,p,h,f,l){for(var v=n.$type;v===d;){var y=o(i,t,n,c,p,h,f,l);if(n=y[0],_(n))return y;e=y[1],v=n&&n.$type}if(void 0!==v)return[n,e];if(null==r){if(u)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return[n,e]}var s=t(36),u=t(43),a=t(40),c=t(39),p=t(33),h=t(46),f=t(42),l=t(44),d=t(120),v=t(13),y=t(50),b=t(88),m=t(91),g=t(100),w=t(95),x=t(96),_=t(102),S=t(86),E=t(92),C=t(115),A=t(109);e.exports=function(t,e){for(var n=t._root,o=n,i=n.expired,s=E(),u=n._comparator,a=n._errorSelector,p=t._path,f=n.cache,l=p.length?v(t,p).value:f,d=l[c]||f,y=f[h],b=-1,m=e.length;++b<m;){var g=e[b];r(g.json,0,f,d,l,s,i,o,u,a)}var w=f[h],_=n.onChange;x(_)&&y!==w&&_()}},{100:100,102:102,109:109,115:115,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,88:88,91:91,92:92,95:95,96:96}],48:[function(t,e,n){function r(t,e,n,o,s,u,a,c){var p={},h=e<t.length-1,f=t[e],l=x(f,p);do{var d=i(n,o,s,l,h,!1,u,a,c),v=d[0],b=d[1];v&&(h?r(t,e+1,n,b,v,u,a,c):E(v,b,l,c)&&S(b,y(v),c,u)),l=x(f,p)}while(!p.done)}function o(t,e,n,r,o){if(b(e))return w(e,r,o),[void 0,t];v(o,e);var s=e,p=e.value,l=t;if(e=e[c],null!=e)l=e[a]||t;else{var d=0,y=p.length-1;l=e=t;do{var m=p[d],x=y>d,_=i(t,l,e,m,x,!0,n,r,o);if(e=_[0],g(e))return _;l=_[1]}while(d++<y);if(s[c]!==e){var S=e[f]||0;e[f]=S+1,e[u+S]=s,s[c]=e,s[h]=S}}return[e,l]}function i(t,e,n,r,i,u,a,c,p){for(var h=n.$type;h===l;){var f=o(t,n,a,c,p);if(n=f[0],g(n))return f;e=f[1],h=n.$type}if(void 0!==h)return[n,e];if(null==r){if(i)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return[n,e]}var s=t(36),u=t(43),a=t(39),c=t(33),p=t(46),h=t(42),f=t(44),l=t(120),d=t(13),v=t(50),y=t(88),b=t(95),m=t(96),g=t(102),w=t(86),x=t(143).iterateKeySet,_=t(92),S=t(115),E=t(109);e.exports=function(t,e){for(var n=t._root,o=n,i=n.expired,s=_(),u=t._path,c=n.cache,h=u.length?d(t,u).value:c,f=h[a]||c,l=c[p],v=-1,y=e.length;++v<y;){var b=e[v];r(b,0,c,f,h,s,i,o)}var g=c[p],w=n.onChange;m(w)&&l!==g&&w()}},{102:102,109:109,115:115,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,88:88,92:92,95:95,96:96}],49:[function(t,e,n){var r=t(36),o=t(39),i=t(34),s=t(45),u=t(38),a=t(41),c=t(108),p=t(115);e.exports=function(t,e,n,h,f,l){var d=n,v=f;"number"!=typeof v&&(v=.75);var y,b,m,g="number"==typeof l,w=h*v;for(b=e.pop();b;)m=b.$size||0,d-=m,g===!0?p(b,m,t,l):(y=b[o])&&c(b,y,b[r],t),b=e.pop();if(d>=h){var x=t[s];for(b=x;d>=w&&b;)x=x[a],m=b.$size||0,d-=m,g===!0&&p(b,m,t,l),b=x;t[s]=t[a]=b,null==b?t[i]=t[u]=void 0:b[u]=void 0}}},{108:108,115:115,34:34,36:36,38:38,39:39,41:41,45:45}],50:[function(t,e,n){var r=t(121),o=t(34),i=t(45),s=t(38),u=t(41),a=t(100);e.exports=function(t,e){if(a(e)&&e.$expires!==r){var n=t[o],c=t[i],p=e[s],h=e[u];e!==n&&(null!=p&&"object"==typeof p&&(p[u]=h),null!=h&&"object"==typeof h&&(h[s]=p),p=n,null!=n&&"object"==typeof n&&(n[u]=e),t[o]=t[s]=n=e,n[s]=p,n[u]=void 0),null!=c&&e!==c||(t[i]=t[u]=c=h||e)}return e}},{100:100,121:121,34:34,38:38,41:41,45:45}],51:[function(t,e,n){var r=t(34),o=t(45),i=t(38),s=t(41);e.exports=function(t,e){var n=t[r],u=t[o],a=e[i],c=e[s];null!=a&&"object"==typeof a&&(a[s]=c),null!=c&&"object"==typeof c&&(c[i]=a),e===n&&(t[r]=t[i]=a),e===u&&(t[o]=t[s]=c),e[i]=e[s]=void 0,n=u=a=c=void 0}},{34:34,38:38,41:41,45:45}],52:[function(t,e,n){function r(t,e){var n=!1;return function(){if(!n&&!t._disposed){n=!0,t._callbacks[e]=null,t._optimizedPaths[e]=[],t._requestedPaths[e]=[];var r=--t._count;0!==r||t.sent||(t._disposable.dispose(),t.requestQueue.removeRequest(t))}}}function o(t){for(var e=[],n=-1,r=0,o=t.length;o>r;++r)for(var i=t[r],s=0,u=i.length;u>s;++s)e[++n]=i[s];return e}var i=t(59),s=t(60),u=0,a=t(57).GetRequest,c=t(76),p=t(78),h=t(119),f=[],l=function(t,e){this.sent=!1,this.scheduled=!1,this.requestQueue=e,this.id=++u,this.type=a,this._scheduler=t,this._pathMap={},this._optimizedPaths=[],this._requestedPaths=[],this._callbacks=[],this._count=0,this._disposable=null,this._collapsed=null,this._disposed=!1};l.prototype={batch:function(t,e,n){var o=this,i=o._optimizedPaths,u=o._requestedPaths,a=o._callbacks,c=i.length;return i[c]=e,u[c]=t,a[c]=n,++o._count,o.scheduled||(o.scheduled=!0,o._disposable=o._scheduler.schedule(function(){s(o,i,function(t,e){if(o.requestQueue.removeRequest(o),o._disposed=!0,o._count){o._merge(u,t,e);for(var n=0,r=a.length;r>n;++n){var i=a[n];i&&i(t,e)}}})})),r(o,c)},add:function(t,e,n){var o,s,u=this,a=i(t,e,u._pathMap);a?(s=a[2],o=a[1]):(s=t,o=e);var c=!1,p=!1;if(o.length<e.length){c=!0;var h=u._callbacks.length;u._callbacks[h]=n,u._requestedPaths[h]=a[0],u._optimizedPaths[h]=[],++u._count,p=r(u,h)}return[c,s,o,p]},_merge:function(t,e,n){var r=this,i=r.requestQueue.model,s=i._root,u=s.errorSelector,a=s.comparator,l=i._path;i._path=f;var d=o(t);if(e){var v=e;v instanceof Error&&(v={message:v.message}),v.$type||(v={$type:h,value:v});var y=d.map(function(t){return{path:t,value:v}});p(i,y,null,u,a)}else c(i,[{paths:d,jsonGraph:n.jsonGraph}],null,u,a);i._path=l}},e.exports=l},{119:119,57:57,59:59,60:60,76:76,78:78}],53:[function(t,e,n){function r(){this.length=0,this.pending=!1,this.pathmaps=[],s.call(this,this._subscribe)}var o=t(159),i=o.Observer,s=o.Observable,u=o.Disposable,a=o.SerialDisposable,c=o.CompositeDisposable,p=t(9),h=t(143),f=h.iterateKeySet;r.create=function(t,e,n){var r=new this;return r.queue=t,r.model=e,r.index=n,r},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.insertPath=function(t,e,n,r,o){var i=r||0,s=o||t.length-1,u=n||this.pathmaps[s+1]||(this.pathmaps[s+1]=Object.create(null));if(void 0===u||null===u)return!1;var a,c,p=t[i],h={};a=f(p,h);do{if(c=u[a],s>i){if(null==c){if(e)return!1;c=u[a]=Object.create(null)}if(this.insertPath(t,e,c,i+1,s)===!1)return!1}else u[a]=(c||0)+1,this.length+=1;h.done||(a=f(p,h))}while(!h.done);return!0},r.prototype.removePath=function(t,e,n,r){var o=n||0,i=r||t.length-1,s=e||this.pathmaps[i+1];if(void 0===s||null===s)return!0;var u,a,c=0,p=t[o],h={};u=f(p,h);do if(a=s[u],void 0!==a&&null!==a){if(i>o){c+=this.removePath(t,a,o+1,i);var l=void 0;for(l in a)break;void 0===l&&delete s[u]}else a=s[u]=(a||1)-1,0===a&&delete s[u],c+=1,this.length-=1;h.done||(u=f(p,h))}while(!h.done);return c},r.prototype.getSourceObserver=function(t){var e=this;return i.create(function(n){n.jsonGraph=n.jsonGraph||n.jsong||n.values||n.value,n.index=e.index,t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})},r.prototype._subscribe=function(t){var e=this,n=this.queue;e.pending=!0;var r=!1,o=new a,i=u.create(function(){r||(r=!0,n&&n._remove(e))}),s=new c(o,i);try{o.setDisposable(this.model._source[this.method](this.getSourceArgs()).subscribe(this.getSourceObserver(t)))}catch(h){throw new p(h)}return s},e.exports=r},{143:143,159:159,9:9}],54:[function(t,e,n){function r(t,e){this.total=0,this.model=t,this.requests=[],this.scheduler=e}var o=t(58),i=t(40),s=t(90),u=t(100),a=t(143);r.prototype.set=function(t){return t.paths=a.collapse(t.paths),o.create(this.model,t)},r.prototype._remove=function(t){var e=this.requests,n=e.indexOf(t);-1!==n&&e.splice(n,1)},r.prototype.distributePaths=function(t,e,n){var r,o,i=this.model,s=-1,u=t.length,a=-1,c=e.length,p=[];t:for(;++s<u;){var h=t[s];for(a=-1;++a<c;)if(o=e[a],o.insertPath(h,o.pending)){p[a]=o;continue t}r||(r=n.create(this,i,this.total++),e[a]=r,p[c++]=r),r.insertPath(h,!1)}var f=[],l=-1;for(a=-1;++a<c;)o=p[a],null!=o&&(f[++l]=o);return f},r.prototype.mergeJSONGraphs=function(t,e){var n=0,r=[],o=[],a=[],c=t.index,p=e.index;t.index=Math.max(c,p),r[-1]=t.jsonGraph||{},o[-1]=e.jsonGraph||{};t:for(;n>-1;){for(var h=r[n-1],f=o[n-1],l=a[n-1]||(a[n-1]=Object.keys(f));l.length>0;){var d=l.pop();if(d[0]!==i)if(h.hasOwnProperty(d)){var v=h[d],y=s(v),b=f[d],m=s(b);if(u(v)&&u(b)&&!y&&!m){r[n]=v,o[n]=b,n+=1;continue t}p>c&&(h[d]=b)}else h[d]=f[d]}n-=1}return t},e.exports=r},{100:100,143:143,40:40,58:58,90:90}],55:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(54),i=t(56);r.prototype.get=i.prototype.get,r.prototype.removeRequest=i.prototype.removeRequest,r.prototype.set=o.prototype.set,r.prototype.call=o.prototype.call,e.exports=r},{54:54,56:56}],56:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(57),i=t(52);r.prototype={setScheduler:function(t){this.scheduler=t},get:function(t,e,n){function r(){v||(--h,0===h&&n())}var s,u,a,c=this,p=[],h=0,f=c._requests,l=e,d=t,v=!1;for(s=0,u=f.length;u>s;++s)if(a=f[s],a.type===o.GetRequest){if(a.sent){var y=a.add(d,l,r);y[0]&&(d=y[1],l=y[2],p[p.length]=y[3],++h)}else a.batch(d,l,r),l=[],d=[],++h;if(!l.length)break}if(l.length){a=new i(c.scheduler,c),f[f.length]=a,++h;var b=a.batch(d,l,r);p[p.length]=b}return function(){if(!v&&0!==h){v=!0;for(var t=p.length,e=0;t>e;++e)p[e]()}}},removeRequest:function(t){for(var e=this._requests,n=e.length;--n>=0;)if(e[n].id===t.id){e.splice(n,1);break}}},e.exports=r},{52:52,57:57}],57:[function(t,e,n){e.exports={GetRequest:"GET"}},{}],58:[function(t,e,n){function r(){s.call(this)}var o=t(159),i=o.Observer,s=t(53),u=t(83),a=t(76),c=t(78),p=new Array(0);r.create=function(t,e){var n=new r;return n.model=t,n.jsonGraphEnvelope=e,n},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.method="set",r.prototype.insertPath=function(){return!1},r.prototype.removePath=function(){return 0},r.prototype.getSourceArgs=function(){return this.jsonGraphEnvelope},r.prototype.getSourceObserver=function(t){var e=this.model,n=e._path,r=this.jsonGraphEnvelope.paths,o=e._root,h=o.errorSelector,f=o.comparator;return s.prototype.getSourceObserver.call(this,i.create(function(o){e._path=p;var i=a(e,[{paths:r,jsonGraph:o.jsonGraph}],null,h,f);o.paths=i[1],e._path=n,t.onNext(o)},function(o){e._path=p,c(e,u(r,function(t){return{path:t,value:o}}),null,h,f),e._path=n,t.onError(o)},function(){t.onCompleted()}))},e.exports=r},{159:159,53:53,76:76,78:78,83:83}],59:[function(t,e,n){var r=t(143).hasIntersection,o=t(84);e.exports=function(t,e,n){for(var i=[],s=[],u=[],a=-1,c=-1,p=!1,h=0,f=e.length;f>h;++h){var l=e[h],d=n[l.length];d&&r(d,l,0)?(!p&&h>0&&(s=o(t,0,h),i=o(e,0,h)),u[++a]=t[h],p=!0):p&&(i[++c]=l,s[c]=t[h])}return p?[u,i,s]:null}},{143:143,84:84}],60:[function(t,e,n){var r=t(143),o=r.toTree,i=r.toPaths;e.exports=function(t,e,n){if(0===t._count)return void t.requestQueue.removeRequest(t);t.sent=!0,t.scheduled=!1;for(var r=t._pathMap,s=Object.keys(e),u=0,a=s.length;a>u;++u)for(var c=e[u],p=0,h=c.length;h>p;++p){var f=c[p],l=f.length;if(r[l]){var d=r[l];d[d.length]=f}else r[l]=[f]}for(var v=Object.keys(r),y=0,b=v.length;b>y;++y){var m=v[y];r[m]=o(r[m])}var g,w=t._collasped=i(r);t.requestQueue.model._source.get(w).subscribe(function(t){g=t},function(t){n(t,g)},function(){n(null,g)})}},{143:143}],61:[function(t,e,n){function r(t){u.call(this,t||i)}function o(t){return s.Observable.defer(function(){return t})}function i(t){function e(t){function e(t,e){if(Boolean(e.invalidated))t.invalidations.push(t.localThisPath.concat(e.path));else{var n=e.path,r=e.value;Boolean(r)&&"object"==typeof r&&r.$type===f?t.references.push({path:i(n),value:e.value}):t.values.push({path:i(n),value:e.value})}return t}function n(t){var e=t.values.concat(t.references);return e.length>0?o(g.set.apply(g,e)._toJSONG()).map(function(e){return{results:t,envelope:e}}):u["return"]({results:t,envelope:{jsonGraph:{},paths:[]}})}function r(t){var e,n=t.envelope,r=t.results,c=r.values,p=r.references,h=r.invalidations,f=c.map(a).map(i),l=p.reduce(s,[]),d=b.map(i),v=l.concat(d);return e=v.length>0?o(m.get.apply(m,f.concat(v))._toJSONG()):u["return"](n),e.doAction(function(t){t.invalidated=h})}function s(t,e){var n=e.path;return t.push.apply(t,y.map(function(t){return n.concat(t)})),t}function a(t){return t.path}var c=t&&t.localFn;if("function"==typeof c){var p=t.model,h=p._path,l=c.apply(p,v).reduce(e,{values:[],references:[],invalidations:[],localThisPath:h}).flatMap(n).flatMap(r);return u["return"](l)}return u.empty()}function n(t){function e(t){var e=t.invalidated;return e&&e.length&&m.invalidate.apply(m,e),t}return t&&"object"==typeof t?s.Observable.defer(function(){
 var e;try{e=t.call(x,v,y,b)}catch(n){e=u["throw"](new p(n))}return e}).map(e):u.empty()}function r(t){return o(g.set(t)).reduce(function(t){return t},null).map(function(){return{invalidated:t.invalidated,paths:t.paths.map(function(t){return t.slice(w.length)})}})}function i(t){return _.concat(t)}var c=this.args,l=this.model,d=h.fromPath(c[0]),v=c[1]||[],y=(c[2]||[]).map(h.fromPath),b=(c[3]||[]).map(h.fromPath),m=l._clone({_path:[]}),g=m.withoutDataSource(),w=l._path,x=w.concat(d),_=x.slice(0,-1),S=o(l.withoutDataSource().get(d)).map(function(t){for(var e=t.json,n=-1,r=d.length;e&&++n<r;)e=e[d[n]];var o=m._derefSync(_).boxValues();return{model:o,localFn:e}}).flatMap(e).defaultIfEmpty(n(l._source)).mergeAll().flatMap(r),E=new a;return E.add(S.subscribe(function(e){var n=e.paths,r=e.invalidated,i=l.get.apply(l,n);"AsJSONG"===t.outputFormat&&(i=o(i._toJSONG()).doAction(function(t){t.invalidated=r})),E.add(i.subscribe(t))},function(e){t.onError(e)})),E}var s=t(159)&&t(158),u=s.Observable,a=s.CompositeDisposable,c=t(64),p=t(9),h=t(134),f=t(120);r.create=c.create,r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){return this},r.prototype.ensureCollect=function(t){return this},r.prototype.initialize=function(){return this},e.exports=r},{120:120,134:134,158:158,159:159,64:64,9:9}],62:[function(t,e,n){function r(t){i.call(this,t)}var o=t(159),i=o.Observable,s=t(64),u=t(134),a=t(88),c=t(49),p=t(81),h=t(46),f=Array.isArray,l=t(101),d=t(98),v=t(99);r.create=s.create,r.prototype=Object.create(i.prototype),r.prototype.constructor=r,r.prototype.subscribeCount=0,r.prototype.subscribeLimit=10,r.prototype.initialize=function(){for(var t,e,n=this.model,r=this.outputFormat||"AsPathMap",o=this.isProgressive,i=[{}],s=[],a=this.args,c=-1,h=a.length;++c<h;){var y,b=a[c];f(b)||"string"==typeof b?(b=u.fromPath(b),y="PathValues"):l(b)?(b.path=u.fromPath(b.path),y="PathValues"):v(b)?y="JSONGs":d(b)&&(y="PathMaps"),e!==y&&(e=y,t={inputType:y,arguments:[]},s.push(t),t.values=i),t.arguments.push(b)}return this.boundPath=p(n._path),this.groups=s,this.outputFormat=r,this.isProgressive=o,this.isCompleted=!1,this.isMaster=null==n._source,this.values=i,this},r.prototype.invokeSourceRequest=function(t){return this},r.prototype.ensureCollect=function(t){var e=this["finally"](function(){var e=t._root,n=e.cache;e.collectionScheduler.schedule(function(){c(e,e.expired,a(n),t._maxSize,t._collectRatio,n[h])})});return new this.constructor(function(t){return e.subscribe(t)})},e.exports=r},{101:101,134:134,159:159,46:46,49:49,64:64,81:81,88:88,98:98,99:99}],63:[function(t,e,n){function r(t){u.call(this,t||o)}function o(t){for(var e=this.model,n=this.method,r=this.groups,o=-1,i=r.length;++o<i;){var u=r[o],a=u.inputType,c=u.arguments;if(c.length>0){var p="_"+n+a+"AsJSON",h=e[p];h(e,c)}}return t.onCompleted(),s.empty}var i=t(159),s=i.Disposable,u=t(62);r.create=u.create,r.prototype=Object.create(u.prototype),r.prototype.method="invalidate",r.prototype.constructor=r,e.exports=r},{159:159,62:62}],64:[function(t,e,n){function r(t){this._subscribe=t}function o(t){var e=this.model,n=new this.type;return n.model=e,n.args=this.args,n.outputFormat=t.outputFormat||"AsPathMap",n.isProgressive=t.isProgressive||!1,n.subscribeCount=0,n.subscribeLimit=t.retryLimit||10,n.initialize().invokeSourceRequest(e).ensureCollect(e).subscribe(t)}var i=t(32),s=t(159)&&t(158),u=s.Observable,a=t(84),c=t(105),p={outputFormat:{value:"AsJSONG"}},h={isProgressive:{value:!0}};r.create=function(t,e){var n=new r(o);return n.args=e,n.type=this,n.model=t,n},r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype._mixin=function(){var t=this,e=a(arguments);return new t.constructor(function(n){return t.subscribe(e.reduce(function(t,e){return Object.create(t,e)},n))})},r.prototype._toJSONG=function(){return this._mixin(p)},r.prototype.progressively=function(){return this._mixin(h)},r.prototype.subscribe=function(t,e,n){var r=t;r&&"object"==typeof r||(r={onNext:t||c,onError:e||c,onCompleted:n||c});var o=this._subscribe(r);switch(typeof o){case"function":return{dispose:o};case"object":return o||{dispose:c};default:return{dispose:c}}},r.prototype.then=function(t,e){var n=this;return new i.Promise(function(t,e){var r,o=!1;n.toArray().subscribe(function(t){r=t.length<=1?t[0]:t},function(t){o=!0,e(t)},function(){o===!1&&t(r)})}).then(t,e)},e.exports=r},{105:105,158:158,159:159,32:32,84:84}],65:[function(t,e,n){function r(t){l.call(this,t||o)}function o(t){return this.isCompleted?s.call(this,t):i.call(this,t)}function i(t){if(this.subscribeCount++>this.subscribeLimit)return t.onError("Loop kill switch thrown."),h.empty;for(var e=[],n=[],r=this.model,o=this.isMaster,i=r._root,c=this.outputFormat,p=i.errorSelector,f=this.method,l=this.groups,d=-1,y=l.length;++d<y;){var b=l[d],m=b.inputType,g=b.arguments;if(g.length>0){var w="_"+f+m+c,x=r[w],_=x(r,g,null,p);n.push.apply(n,_[1]),"PathValues"===m?e.push.apply(e,g.map(u)):"JSONGs"===m?e.push.apply(e,v(g,a)):e.push.apply(e,_[0])}}return this.requestedPaths=e,o?(this.isCompleted=!0,s.call(this,t)):void t.onError({method:f,optimizedPaths:n,invokeSourceRequest:!0})}function s(t){var e=new f(this.model,this.requestedPaths);return"AsJSONG"===this.outputFormat&&(e=e._toJSONG()),this.isProgressive&&(e=e.progressively()),e.subscribe(t)}function u(t){return t.path}function a(t){return t.paths}var c=t(159),p=c.Observable,h=c.Disposable,f=t(67),l=t(62),d=t(9),v=t(82),y=new Array(0);r.create=l.create,r.prototype=Object.create(l.prototype),r.prototype.method="set",r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){var e=this,n=this["catch"](function(r){var o;if(r&&r.invokeSourceRequest===!0){var i={},s=t._path,u=r.optimizedPaths;t._path=y,t._getPathValuesAsJSONG(t._materialize().withoutDataSource(),u,[i]),t._path=s,o=t._request.set(i)["do"](function(t){e.isCompleted=u.length===t.paths.length},function(){e.isCompleted=!0}).materialize().flatMap(function(t){if("C"===t.kind)return p.empty();if("E"===t.kind){var e=t.exception;if(d.is(e))return p["throw"](t.exception)}return n})}else o=p["throw"](r);return o});return new this.constructor(function(t){return n.subscribe(t)})},e.exports=r},{159:159,62:62,67:67,82:82,9:9}],66:[function(t,e,n){var r=function(t){this.disposed=!1,this.currentDisposable=t};r.prototype={dispose:function(){if(!this.disposed&&this.currentDisposable){this.disposed=!0;var t=this.currentDisposable;t.dispose?t.dispose():t()}}},e.exports=r},{}],67:[function(t,e,n){var r=t(64),o=t(68),i=t(69),s={dispose:function(){}},u=t(159).Observable,a=e.exports=function(t,e,n,r){this.model=t,this.currentRemainingPaths=e,this.isJSONGraph=n||!1,this.isProgressive=r||!1};a.prototype=Object.create(u.prototype),a.prototype.subscribe=r.prototype.subscribe,a.prototype.then=r.prototype.then,a.prototype._toJSONG=function(){return new a(this.model,this.currentRemainingPaths,!0,this.isProgressive)},a.prototype.progressively=function(){return new a(this.model,this.currentRemainingPaths,this.isJSONGraph,!0)},a.prototype._subscribe=function(t){var e=[{}],n=[],r=t.isJSONG=this.isJSONGraph,u=this.isProgressive,a=o(this.model,this.currentRemainingPaths,t,u,r,e,n);return a?i(this,this.model,a,t,e,n,1):s}},{159:159,64:64,68:68,69:69}],68:[function(t,e,n){var r=t(19),o=r.getWithPathsAsJSONGraph,i=r.getWithPathsAsPathMap;e.exports=function(t,e,n,r,s,u,a){var c;if(c=s?o(t,e,u):i(t,e,u),c.criticalError)return n.onError(c.criticalError),null;var p=c.hasValue,h=!c.requestedMissingPaths||!t._source,f=u[0].json||u[0].jsonGraph;if(c.errors)for(var l=c.errors,d=a.length,v=0,y=l.length;y>v;++v,++d)a[d]=l[v];if(p&&r||f&&h)try{++t._root.syncRefCount,n.onNext(u[0])}catch(b){throw b}finally{--t._root.syncRefCount}return h?(a.length?n.onError(a):n.onCompleted(),null):c}},{19:19}],69:[function(t,e,n){var r=t(68),o=t(10),i=t(30).fastCat,s=t(49),u=t(88),a=t(66),c=t(46);e.exports=function p(t,e,n,h,f,l,d){if(10===d)throw new o;var v=e._request,y=n.requestedMissingPaths,b=n.optimizedMissingPaths,m=new a,g=[],w=e._path;if(w.length)for(var x=0,_=y.length;_>x;++x)g[x]=i(w,y[x]);else g=y;var S=v.get(g,b,function(){var n=r(e,y,h,t.isProgressive,t.isJSONGraph,f,l);if(n)m.currentDisposable=p(t,e,n,h,f,l,d+1);else{var o=e._root,i=o.cache,a=i[c];s(o,o.expired,u(i),e._maxSize,e._collectRatio,a)}});return m.currentDisposable=S,m}},{10:10,30:30,46:46,49:49,66:66,68:68,88:88}],70:[function(t,e,n){var r=t(67);e.exports=function(t){return new r(this,t)}},{67:67}],71:[function(t,e,n){var r=t(134),o=t(64),i=t(72),s=t(116),u=t(67);e.exports=function(){var t=s(arguments,i,"get");if(t!==!0)return new o(function(e){e.onError(t)});var e=r.fromPathsOrPathValues(arguments);return new u(this,e)}},{116:116,134:134,64:64,67:67,72:72}],72:[function(t,e,n){e.exports={path:!0,pathSyntax:!0}},{}],73:[function(t,e,n){function r(){}var o=t(123),i=t(159),s=i.Disposable;r.prototype.schedule=function(t){return o(t),s.empty},r.prototype.scheduleWithState=function(t,e){var n=this;return o(function(){e(n,t)}),s.empty},e.exports=r},{123:123,159:159}],74:[function(t,e,n){function r(){}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){return t(),i.empty},r.prototype.scheduleWithState=function(t,e){return e(this,t),i.empty},e.exports=r},{159:159}],75:[function(t,e,n){function r(t){this.delay=t}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){var e=setTimeout(t,this.delay);return i.create(function(){void 0!==e&&(clearTimeout(e),e=void 0)})},r.prototype.scheduleWithState=function(t,e){var n=this,r=setTimeout(function(){e(n,t)},this.delay);return i.create(function(){void 0!==r&&(clearTimeout(r),r=void 0)})},e.exports=r},{159:159}],76:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,d,v,y,b,g,w){for(var x={},_=e<t.length-1,S=t[e],E=m(S,x),C=d.index;;){f.depth=e;var A=i(n,o,s,u,a,c,E,_,!1,f,d,v,y,b,g,w);f[e]=E,f.index=e,d[d.index++]=E;var N=A[0],k=A[1];if(N&&(_?r(t,e+1,n,k,N,u,A[3],A[2],p,h,f,d,v,y,b,g,w):(l(b,N),p.push(f.slice(0,f.index+1)),h.push(d.slice(0,d.index)))),E=m(S,x),x.done)break;d.index=C}}function o(t,e,n,r,o,s,c,f,v,m,g){var w=e.value;if(s.splice(0,s.length),s.push.apply(s,w),d(e))return s.index=w.length,b(e,f,v),[void 0,t,r,n];l(v,e);var x=0,_=e,S=w.length-1,E=e=t,C=r=n;do{var A=w[x],N=S>x,k=i(t,E,e,n,C,r,A,N,!0,o,s,c,f,v,m,g);if(e=k[0],y(e))return s.index=x,k;E=k[1],r=k[2],C=k[3]}while(x++<S);if(s.index=x,_[a]!==e){var O=e[h]||0;e[h]=O+1,e[u+O]=_,_[a]=e,_[p]=O}return[e,E,r,C]}function i(t,e,n,r,i,u,a,c,p,h,l,d,v,b,m,g){for(var x=n.$type;x===f;){var _=o(t,n,r,u,h,l,d,v,b,m,g);if(n=_[0],y(n))return _;e=_[1],u=_[2],i=_[3],x=n.$type}if(void 0!==x)return[n,e,u,i];if(null==a){if(c)throw new Error("`null` is not allowed in branch key positions.");n&&(a=n[s])}else e=n,i=u,n=e[a],u=i&&i[a];return n=w(e,n,u,a,h,l,d,v,b,m,g),[n,e,u,i]}var s=t(36),u=t(43),a=t(33),c=t(46),p=t(42),h=t(44),f=t(120),l=t(50),d=t(94),v=t(96),y=t(102),b=t(86),m=t(143).iterateKeySet,g=t(92),w=t(103);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,p=g(),h=s.cache,f=h[c],l=[],d=[],y=[],b=[],m=-1,w=e.length;++m<w;)for(var x=e[m],_=x.paths,S=x.jsonGraph,E=-1,C=_.length;++E<C;){var A=_[E];d.index=0,r(A,0,h,h,h,S,S,S,y,b,l,d,p,a,u,i,o)}var N=h[c],k=s.onChange;return v(k)&&f!==N&&k(),[y,b]}},{102:102,103:103,120:120,143:143,33:33,36:36,42:42,43:43,44:44,46:46,50:50,86:86,92:92,94:94,96:96}],77:[function(t,e,n){function r(t,e,n,o,u,a,c,p,h,f,l,d,v,y){var b=s(t);if(b&&b.length)for(var g=0,x=b.length,_=h.index;;){var S=b[g],E=t[S],C=w(E)&&!E.$type;p.depth=e;var A=i(n,o,u,S,E,C,!1,p,h,f,l,d,v,y);p[e]=S,p.index=e,h[h.index++]=S;var N=A[0],k=A[1];if(N&&(C?r(E,e+1,n,k,N,a,c,p,h,f,l,d,v,y):(m(d,N),a.push(p.slice(0,p.index+1)),c.push(h.slice(0,h.index)))),++g>=x)break;h.index=_}}function o(t,e,n,r,o,s,u,c,f,v){var y=n.value;if(o.splice(0,o.length),o.push.apply(o,y),x(n))return o.index=y.length,E(n,u,c),[void 0,e];m(c,n);var b=n,g=e;if(n=n[h],null!=n)g=n[p]||e,o.index=y.length;else{var w=0,_=y.length-1;g=n=e;do{var C=y[w],A=_>w,N=i(e,g,n,C,t,A,!0,r,o,s,u,c,f,v);if(n=N[0],S(n))return o.index=w,N;g=N[1]}while(w++<_);if(o.index=w,b[h]!==n){var k=n[d]||0;n[d]=k+1,n[a+k]=b,b[h]=n,b[l]=k}}return[n,g]}function i(t,e,n,r,i,s,a,c,p,h,f,l,d,y){for(var b=n.$type;b===v;){var m=o(i,t,n,c,p,h,f,l,d,y);if(n=m[0],S(n))return m;e=m[1],b=n&&n.$type}if(void 0!==b)return[n,e];if(null==r){if(s)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[u])}else e=n,n=e[r];return n=A(e,n,r,i,s,a,c,p,h,f,l,d,y),[n,e]}function s(t){if(w(t)&&!t.$type){var e=[],n=0;b(t)&&(e[n++]="length");for(var r in t)r[0]!==c&&"$"!==r[0]&&g(t,r)&&(e[n++]=r);return e}}var u=t(36),a=t(43),c=t(40),p=t(39),h=t(33),f=t(46),l=t(42),d=t(44),v=t(120),y=t(13),b=Array.isArray,m=t(50),g=t(91),w=t(100),x=t(95),_=t(96),S=t(102),E=t(86),C=t(92),A=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,c=C(),h=t._path,l=s.cache,d=h.length?y(t,h).value:l,v=d[p]||l,b=l[f],m=[],g=[],w=[],x=h.length,S=-1,E=e.length;++S<E;){var A=e[S],N=h.slice(0);N.index=x,r(A.json,0,l,v,d,g,w,m,N,c,a,u,i,o)}var k=l[f],O=s.onChange;return _(O)&&b!==k&&O(),[g,w]}},{100:100,102:102,104:104,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,91:91,92:92,95:95,96:96}],78:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,l,d,y,b){for(var m={},g=n<e.length-1,x=e[n],_=w(x,m),S=h.index;;){p.depth=n;var E=i(o,s,u,_,t,g,!1,p,h,f,l,d,y,b);p[n]=_,p.index=n,h[h.index++]=_;var C=E[0],A=E[1];if(C&&(g?r(t,e,n+1,o,A,C,a,c,p,h,f,l,d,y,b):(v(d,C),a.push(p.slice(0,p.index+1)),c.push(h.slice(0,h.index)))),_=w(x,m),m.done)break;h.index=S}}function o(t,e,n,r,o,s,p,l,d,b){var w=n.value;if(o.splice(0,o.length),o.push.apply(o,w),y(n))return o.index=w.length,g(n,p,l),[void 0,e];v(l,n);var x=n,_=e;if(n=n[c],null!=n)_=n[a]||e,o.index=w.length;else{var S=0,E=w.length-1;_=n=e;do{var C=w[S],A=E>S,N=i(e,_,n,C,t,A,!0,r,o,s,p,l,d,b);if(n=N[0],m(n))return o.index=S,N;_=N[1]}while(S++<E);if(o.index=S,x[c]!==n){var k=n[f]||0;n[f]=k+1,n[u+k]=x,x[c]=n,x[h]=k}}return[n,_]}function i(t,e,n,r,i,u,a,c,p,h,f,d,v,y){for(var b=n.$type;b===l;){var g=o(i,t,n,c,p,h,f,d,v,y);if(n=g[0],m(n))return g;e=g[1],b=n.$type}if(void 0!==b)return[n,e];if(null==r){if(u)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return n=_(e,n,r,i,u,a,c,p,h,f,d,v,y),[n,e]}var s=t(36),u=t(43),a=t(39),c=t(33),p=t(46),h=t(42),f=t(44),l=t(120),d=t(13),v=t(50),y=t(95),b=t(96),m=t(102),g=t(86),w=t(143).iterateKeySet,x=t(92),_=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,c=s.expired,h=x(),f=t._path,l=s.cache,v=f.length?d(t,f).value:l,y=v[a]||l,m=l[p],g=[],w=[],_=[],S=f.length,E=-1,C=e.length;++E<C;){var A=e[E],N=A.path,k=A.value,O=f.slice(0);O.index=S,r(k,N,0,l,y,v,w,_,g,O,h,c,u,i,o)}var P=l[p],j=s.onChange;return b(j)&&m!==P&&j(),[w,_]}},{102:102,104:104,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,92:92,95:95,96:96}],79:[function(t,e,n){var r=t(130),o=t(64),i=t(101);e.exports=function(t,e){for(var n=i(t)?t:r.pathValue(t,e),s=0,u=n.path,a=u.length;++s<a;)if("object"==typeof u[s])return new o(function(t){t.onError(new Error("Paths must be simple paths"))});var c=this;return new o(function(t){return c._set(n).subscribe(function(e){for(var n=e.json,r=-1,o=u.length;n&&++r<o;)n=n[u[r]];t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})})}},{101:101,130:130,64:64}],80:[function(t,e,n){var r=t(134),o=t(101),i=t(78);e.exports=function(t,e,n,s){var u=r.fromPath(t),a=e,c=n,p=s;if(o(u)?(p=c,c=a,a=u):a={path:u,value:a},o(a)===!1)throw new Error("Model#setValueSync must be called with an Array path.");return"function"!=typeof c&&(c=this._root._errorSelector),"function"!=typeof p&&(p=this._root._comparator),this._syncCheck("setValueSync")?(i(this,[a]),this._getValueSync(this,a.path).value):void 0}},{101:101,134:134,78:78}],81:[function(t,e,n){e.exports=function(t){if(!t)return t;for(var e=-1,n=t.length,r=[];++e<n;)r[e]=t[e];return r}},{}],82:[function(t,e,n){e.exports=function(t,e){for(var n=-1,r=-1,o=t.length,i=[];++r<o;)for(var s=e(t[r],r,t),u=-1,a=s.length;++u<a;)i[++n]=s[u];return i}},{}],83:[function(t,e,n){e.exports=function(t,e){for(var n=-1,r=t.length,o=new Array(r);++n<r;)o[n]=e(t[n],n,t);return o}},{}],84:[function(t,e,n){e.exports=function(t,e,n){var r=e||0,o=-1,i=t.length-r;0>i&&(i=0),n>0&&i>n&&(i=n);for(var s=new Array(i);++o<i;)s[o]=t[o+r];return s}},{}],85:[function(t,e,n){var r=t(40),o=t(91),i=Array.isArray,s=t(100);e.exports=function(t){var e=t;if(s(e)){e=i(t)?[]:{};var n=t;for(var u in n)u[0]!==r&&o(n,u)&&(e[u]=n[u])}return e}},{100:100,40:40,91:91}],86:[function(t,e,n){var r=t(51),o=t(35);e.exports=function(t,e,n){return t[o]||(t[o]=!0,e.push(t),r(n,t)),t}},{35:35,51:51}],87:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$expires||void 0}},{100:100}],88:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$size||0}},{100:100}],89:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$timestamp||void 0}},{100:100}],90:[function(t,e,n){var r=t(100);e.exports=function(t,e){var n=r(t)&&t.$type||void 0;return e&&n?"branch":n}},{100:100}],91:[function(t,e,n){var r=t(100),o=Object.prototype.hasOwnProperty;e.exports=function(t,e){return r(t)&&o.call(t,e)}},{100:100}],92:[function(t,e,n){var r=1;e.exports=function(){return r++}},{}],93:[function(t,e,n){var r=t(36),o=t(39),i=t(46);e.exports=function(t,e,n,s){return t[r]=n,t[o]=e,t[i]=s,e[n]=t,t}},{36:36,39:39,46:46}],94:[function(t,e,n){var r=t(106),o=t(122),i=t(121);e.exports=function(t){var e=t.$expires;return null!=e&&e!==i&&e!==o&&e<r()}},{106:106,121:121,122:122}],95:[function(t,e,n){var r=t(106),o=t(122),i=t(121);e.exports=function(t){var e=t.$expires;return null!=e&&e!==i&&(e===o||e<r())}},{106:106,121:121,122:122}],96:[function(t,e,n){var r="function";e.exports=function(t){return Boolean(t)&&typeof t===r}},{}],97:[function(t,e,n){var r=t(40);e.exports=function(t){return"$size"===t||t&&t.charAt(0)===r}},{40:40}],98:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&"json"in t}},{100:100}],99:[function(t,e,n){var r=Array.isArray,o=t(100);e.exports=function(t){return o(t)&&r(t.paths)&&(o(t.jsonGraph)||o(t.jsong)||o(t.json)||o(t.values)||o(t.value))}},{100:100}],100:[function(t,e,n){var r="object";e.exports=function(t){return null!==t&&typeof t===r}},{}],101:[function(t,e,n){var r=Array.isArray,o=t(100);e.exports=function(t){return o(t)&&(r(t.path)||"string"==typeof t.path)}},{100:100}],102:[function(t,e,n){var r="object";e.exports=function(t){return null==t||typeof t!==r}},{}],103:[function(t,e,n){var r=t(36),o=t(39),i=t(120),s=t(119),u=t(88),a=t(89),c=t(100),p=t(95),h=t(96),f=t(50),l=t(117),d=t(93),v=t(86),y=t(110),b=t(115),m=t(107);e.exports=function(t,e,n,g,w,x,_,S,E,C,A){var N,k,O,P,j,D,q;if(e===n){if(null===n)return e=l(n,void 0,n),t=b(t,-e.$size,E,_),e=d(e,t,g),f(E,e),e;if(void 0===n)return n;if(P=c(e),P&&(k=e.$type,null==k))return null==e[o]&&(e[r]=g,e[o]=t),e}else P=c(e),P&&(k=e.$type);if(k!==i){if(j=c(n),j&&(O=n.$type),P&&!k&&(null==n||j&&!O))return e}else{if(null==n)return p(e)?void v(e,S,E):e;if(j=c(n),j&&(O=n.$type,O===i))if(e===n){if(null!=e[o])return e}else if(D=e.$timestamp,q=n.$timestamp,!p(e)&&!p(n)&&D>q)return}if(k&&j&&!O)return d(y(e,n,t,g,E),t,g);if(O||!j){if(O===s&&h(A)&&(n=A(m(w,g),n)),O&&e===n)null==e[o]&&(e=l(e,k,e.value),t=b(t,-e.$size,E,_),e=d(e,t,g,_));else{var R=!0;!k&&P||(R=a(n)<a(e)==!1,(k||O)&&h(C)&&(R=!C(e,n,x.slice(0,x.index)))),R&&(n=l(n,O,O?n.value:n),N=u(e)-u(n),e=y(e,n,t,g,E),t=b(t,N,E,_),e=d(e,t,g,_))}p(e)?v(e,S,E):f(E,e)}else null==e&&(e=d(n,t,g));return e}},{100:100,107:107,110:110,115:115,117:117,119:119,120:120,36:36,39:39,50:50,86:86,88:88,89:89,93:93,95:95,96:96}],104:[function(t,e,n){var r=t(120),o=t(119),i=t(90),s=t(88),u=t(89),a=t(95),c=t(102),p=t(96),h=t(117),f=t(86),l=t(93),d=t(110),v=t(115),y=t(114),b=t(107);e.exports=function(t,e,n,m,g,w,x,_,S,E,C,A,N){var k=i(e,w);if(g||w)k&&a(e)&&(k="expired",f(e,E,C)),(k&&k!==r||c(e))&&(e=d(e,{},t,n,C),e=l(e,t,n,S),e=y(e,S));else{var O=m,P=i(O),j=u(O)<u(e)==!1;if((k||P)&&p(A)&&(j=!A(e,O,_.slice(0,_.index))),j){P===o&&p(N)&&(O=N(b(x,n),O)),O=h(O,P,P?O.value:O);var D=s(e)-s(O);e=d(e,O,t,n,C),t=v(t,D,C,S),e=l(e,t,n,S)}}return e}},{102:102,107:107,110:110,114:114,115:115,117:117,119:119,120:120,86:86,88:88,89:89,90:90,93:93,95:95,96:96}],105:[function(t,e,n){e.exports=function(){}},{}],106:[function(t,e,n){e.exports=Date.now},{}],107:[function(t,e,n){e.exports=function(t,e){var n=t.slice(0,t.depth);return n[n.length]=e,n}},{}],108:[function(t,e,n){var r=t(120),o=t(39),i=t(51),s=t(100),u=t(112),a=t(113);e.exports=function(t,e,n,c){if(s(t)){var p=t.$type;return Boolean(p)&&(p===r&&a(t),i(c,t)),u(t),e[n]=t[o]=void 0,!0}return!1}},{100:100,112:112,113:113,120:120,39:39,51:51}],109:[function(t,e,n){var r=t(91),o=t(40),i=t(108);e.exports=function s(t,e,n,u){if(i(t,e,n,u)){if(null==t.$type)for(var a in t)a[0]!==o&&"$"!==a[0]&&r(t,a)&&s(t[a],t,a,u);return!0}return!1}},{108:108,40:40,91:91}],110:[function(t,e,n){var r=t(100),o=t(111),i=t(109);e.exports=function(t,e,n,s,u){return t===e?t:(r(t)&&(o(t,e),i(t,n,s,u)),n[s]=e,e)}},{100:100,109:109,111:111}],111:[function(t,e,n){var r=t(43),o=t(33),i=t(44);e.exports=function(t,e){for(var n=t[i]||0,s=e[i]||0,u=-1;++u<n;){var a=t[r+u];void 0!==a&&(a[o]=e,e[r+(s+u)]=a,t[r+u]=void 0)}return e[i]=n+s,t[i]=void 0,e}},{33:33,43:43,44:44}],112:[function(t,e,n){var r=t(43),o=t(33),i=t(42),s=t(44);e.exports=function(t){for(var e=-1,n=t[s]||0;++e<n;){var u=t[r+e];null!=u&&(u[o]=u[i]=t[r+e]=void 0)}return t[s]=void 0,t}},{33:33,42:42,43:43,44:44}],113:[function(t,e,n){var r=t(43),o=t(33),i=t(42),s=t(44);e.exports=function(t){var e=t[o];if(e){for(var n=(t[i]||0)-1,u=(e[s]||0)-1;++n<=u;)e[r+n]=e[r+(n+1)];e[s]=u,t[i]=t[o]=e=void 0}return t}},{33:33,42:42,43:43,44:44}],114:[function(t,e,n){var r=t(43),o=t(39),i=t(46),s=t(44);e.exports=function(t,e){var n=[t],u=0;do{var a=n[u--];if(a&&a[i]!==e){a[i]=e,n[u++]=a[o];for(var c=-1,p=a[s]||0;++c<p;)n[u++]=a[r+c]}}while(u>-1);return t}},{39:39,43:43,44:44,46:46}],115:[function(t,e,n){var r=t(36),o=t(46),i=t(39),s=t(108),u=t(114);e.exports=function(t,e,n,a){var c=t;do{var p=c[i],h=c.$size=(c.$size||0)-e;0>=h&&null!=p?s(c,p,c[r],n):c[o]!==a&&u(c,a),c=p}while(c);return t}},{108:108,114:114,36:36,39:39,46:46}],116:[function(t,e,n){var r=Array.isArray,o=t(101),i=t(99),s=t(98),u=t(134);e.exports=function(t,e,n){for(var a=0,c=t.length;c>a;++a){var p=t[a],h=!1;if(r(p)&&e.path?h=!0:"string"==typeof p&&e.pathSyntax?h=!0:o(p)&&e.pathValue?(p.path=u.fromPath(p.path),h=!0):i(p)&&e.jsonGraph?h=!0:s(p)&&e.json?h=!0:"function"==typeof p&&a+1===c&&e.selector&&(h=!0),!h)return new Error("Unrecognized argument "+typeof p+" ["+String(p)+"] to Model#"+n)}return!0}},{101:101,134:134,98:98,99:99}],117:[function(t,e,n){var r=t(130),o=r.atom,i=t(106),s=t(122),u=t(37),a=50,c=t(85),p=Array.isArray,h=t(88),f=t(87);e.exports=function(t,e,n){var r=0,l=t,d=e;if(d?(l=c(l),r=h(l),l.$type=d):(l=o(n),d=l.$type,l[u]=!0),null==n)r=a+1;else if(null==r||0>=r)switch(typeof n){case"object":r=p(n)?a+n.length:a+1;break;case"string":r=a+n.length;break;default:r=a+1}var v=f(l);return"number"==typeof v&&s>v&&(l.$expires=i()+-1*v),l.$size=r,l}},{106:106,122:122,130:130,37:37,85:85,87:87,88:88}],118:[function(t,e,n){e.exports="atom"},{}],119:[function(t,e,n){e.exports="error"},{}],120:[function(t,e,n){e.exports="ref"},{}],121:[function(t,e,n){e.exports=1},{}],122:[function(t,e,n){e.exports=0},{}],123:[function(t,e,n){"use strict";function r(){if(a.length)throw a.shift()}function o(t){var e;e=u.length?u.pop():new i,e.task=t,s(e)}function i(){this.task=null}var s=t(124),u=[],a=[],c=s.makeRequestCallFromTimer(r);e.exports=o,i.prototype.call=function(){try{this.task.call()}catch(t){o.onerror?o.onerror(t):(a.push(t),c())}finally{this.task=null,u[u.length]=this}}},{124:124}],124:[function(t,e,n){(function(t){"use strict";function n(t){u.length||(s(),a=!0),u[u.length]=t}function r(){for(;c<u.length;){var t=c;if(c+=1,u[t].call(),c>p){for(var e=0,n=u.length-c;n>e;e++)u[e]=u[e+c];u.length-=c,c=0}}u.length=0,c=0,a=!1}function o(t){var e=1,n=new h(t),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){e=-e,r.data=e}}function i(t){return function(){function e(){clearTimeout(n),clearInterval(r),t()}var n=setTimeout(e,0),r=setInterval(e,50)}}e.exports=n;var s,u=[],a=!1,c=0,p=1024,h=t.MutationObserver||t.WebKitMutationObserver;s="function"==typeof h?o(r):i(r),n.requestFlush=s,n.makeRequestCallFromTimer=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],125:[function(t,e,n){"use strict";function r(t,e){var n;for(n in e)t[n]=e[n];return t}function o(t,e){if(this._jsongUrl=t,"number"==typeof e){var n={timeout:e};e=n}this._config=r({timeout:15e3,headers:{}},e||{})}var i=t(129),s=t(126);Array.isArray;o.prototype={constructor:o,buildQueryObject:s,get:function(t){var e="GET",n=this.buildQueryObject(this._jsongUrl,e,{paths:t,method:"get"}),o=r(n,this._config),s=this;return i(e,o,s)},set:function(t){var e="POST",n=this.buildQueryObject(this._jsongUrl,e,{jsonGraph:t,method:"set"}),o=r(n,this._config);o.headers["Content-Type"]="application/x-www-form-urlencoded";var s=this;return i(e,o,s)},call:function(t,e,n,o){e=e||[],n=n||[],o=o||[];var s="POST",u=[];u.push("method=call"),u.push("callPath="+encodeURIComponent(JSON.stringify(t))),u.push("arguments="+encodeURIComponent(JSON.stringify(e))),u.push("pathSuffixes="+encodeURIComponent(JSON.stringify(n))),u.push("paths="+encodeURIComponent(JSON.stringify(o)));var a=this.buildQueryObject(this._jsongUrl,s,u.join("&")),c=r(a,this._config);c.headers["Content-Type"]="application/x-www-form-urlencoded";var p=this;return i(s,c,p)}},o.XMLHttpSource=o,o["default"]=o,e.exports=o},{126:126,129:129}],126:[function(t,e,n){"use strict";e.exports=function(t,e,n){var r,o=[],i={url:t},s=-1!==t.indexOf("?"),u=s?"&":"?";return"string"==typeof n?o.push(n):(r=Object.keys(n),r.forEach(function(t){var e="object"==typeof n[t]?JSON.stringify(n[t]):n[t];o.push(t+"="+encodeURIComponent(e))})),"GET"===e?i.url+=u+o.join("&"):i.data=o.join("&"),i}},{}],127:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e=new t.XMLHttpRequest;if("withCredentials"in e)return e;if(t.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e,n,r;if(t.XMLHttpRequest)return new t.XMLHttpRequest;try{for(n=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],r=0;3>r;r++)try{if(e=n[r],new t.ActiveXObject(e))break}catch(o){}return new t.ActiveXObject(e)}catch(o){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],129:[function(t,e,n){"use strict";function r(){}function o(t,e,n){return r.create(function(r){var o,i,h,f,l,d={method:t||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(l in e)p.call(e,l)&&(d[l]=e[l]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=n.onBeforeRequest&&n.onBeforeRequest(d);try{o=d.crossDomain?c():a()}catch(v){r.onError(v)}try{d.user?o.open(d.method,d.url,d.async,d.user,d.password):o.open(d.method,d.url,d.async),o.timeout=d.timeout,o.withCredentials=d.withCredentials!==!1,h=d.headers;for(f in h)p.call(h,f)&&o.setRequestHeader(f,h[f]);if(d.responseType)try{o.responseType=d.responseType}catch(y){if("json"!==d.responseType)throw y}o.onreadystatechange=function(t){4===o.readyState&&(i||(i=!0,s(r,o,t)))},o.ontimeout=function(t){i||(i=!0,u(r,o,"timeout error",t))},o.send(d.data)}catch(y){r.onError(y)}return function(){i||4===o.readyState||(i=!0,o.abort())}})}function i(t,e,n){n||(n=new Error(e)),t.onError(n)}function s(t,e,n){var r,o;if(e&&t){o=e.responseType,r="response"in e?e.response:e.responseText;var s=1223===e.status?204:e.status;if(s>=200&&399>=s){try{"json"!==o&&(r=JSON.parse(r||"")),"string"==typeof r&&(r=JSON.parse(r||""))}catch(n){i(t,"invalid json",n)}return t.onNext(r),void t.onCompleted()}return 401===s||403===s||407===s?i(t,r):410===s?i(t,r):408===s||504===s?i(t,r):i(t,r||"Response code "+s)}}function u(t,e,n,r){i(t,n||e.statusText||"request error",r)}var a=t(128),c=t(127),p=Object.prototype.hasOwnProperty,h=function(){};r.create=function(t){var e=new r;return e.subscribe=function(e,n,r){var o,i;return o="function"==typeof e?{onNext:e,onError:n||h,onCompleted:r||h}:e,i=t(o),"function"==typeof i?{dispose:i}:i},e},e.exports=o},{127:127,128:128}],130:[function(t,e,n){function r(t,e,n){var r=Object.create(null);if(null!=n){for(var o in n)r[o]=n[o];return r.$type=t,r.value=e,r}return{$type:t,value:e}}var o=t(134);e.exports={ref:function(t,e){return r("ref",o.fromPath(t),e)},atom:function(t,e){return r("atom",t,e)},undefined:function(){return r("atom")},error:function(t,e){return r("error",t,e)},pathValue:function(t,e){return{path:o.fromPath(t),value:e}},pathInvalidation:function(t){return{path:o.fromPath(t),invalidated:!0}}}},{134:134}],131:[function(t,e,n){e.exports={integers:"integers",ranges:"ranges",keys:"keys"}},{}],132:[function(t,e,n){var r={token:"token",dotSeparator:".",commaSeparator:",",openingBracket:"[",closingBracket:"]",openingBrace:"{",closingBrace:"}",escape:"\\",space:" ",colon:":",quote:"quote",unknown:"unknown"};e.exports=r},{}],133:[function(t,e,n){e.exports={indexer:{nested:"Indexers cannot be nested.",needQuotes:"unquoted indexers must be numeric.",empty:"cannot have empty indexers.",leadingDot:"Indexers cannot have leading dots.",leadingComma:"Indexers cannot have leading comma.",requiresComma:"Indexers require commas between indexer args.",routedTokens:"Only one token can be used per indexer when specifying routed tokens."},range:{precedingNaN:"ranges must be preceded by numbers.",suceedingNaN:"ranges must be suceeded by numbers."},routed:{invalid:"Invalid routed token.  only integers|ranges|keys are supported."},quote:{empty:"cannot have empty quoted keys.",illegalEscape:"Invalid escape character.  Only quotes are escapable."},unexpectedToken:"Unexpected token.",invalidIdentifier:"Invalid Identifier.",invalidPath:"Please provide a valid path.",throwError:function(t,e,n){if(n)throw t+" -- "+e.parseString+" with next token: "+n;throw t+" -- "+e.parseString}}},{}],134:[function(t,e,n){var r=t(140),o=t(135),i=t(131),s=function(t,e){return o(new r(t,e))};e.exports=s,s.fromPathsOrPathValues=function(t,e){if(!t)return[];for(var n=[],r=0,o=t.length;o>r;r++)"string"==typeof t[r]?n[r]=s(t[r],e):"string"==typeof t[r].path?n[r]={path:s(t[r].path,e),value:t[r].value}:n[r]=t[r];return n},s.fromPath=function(t,e){return t?"string"==typeof t?s(t,e):t:[]},s.RoutedTokens=i},{131:131,135:135,140:140}],135:[function(t,e,n){var r=t(132),o=t(133),i=t(136);e.exports=function(t){for(var e=t.next(),n={},s=[];!e.done;){switch(e.type){case r.token:var u=+e.token[0];isNaN(u)||o.throwError(o.invalidIdentifier,t),s[s.length]=e.token;break;case r.dotSeparator:0===s.length&&o.throwError(o.unexpectedToken,t);break;case r.space:break;case r.openingBracket:i(t,e,n,s);break;default:o.throwError(o.unexpectedToken,t)}e=t.next()}return 0===s.length&&o.throwError(o.invalidPath,t),s}},{132:132,133:133,136:136}],136:[function(t,e,n){var r=t(132),o=t(133),i=o.indexer,s=t(138),u=t(137),a=t(139);e.exports=function(t,e,n,c){var p=t.next(),h=!1,f=1,l=!1;for(n.indexer=[];!p.done;){switch(p.type){case r.token:case r.quote:n.indexer.length===f&&o.throwError(i.requiresComma,t)}switch(p.type){case r.openingBrace:l=!0,a(t,p,n,c);break;case r.token:var d=+p.token;isNaN(d)&&o.throwError(i.needQuotes,t),n.indexer[n.indexer.length]=d;break;case r.dotSeparator:n.indexer.length||o.throwError(i.leadingDot,t),s(t,p,n,c);
@@ -3276,27 +3565,29 @@ if(!this.isDisposed){this.isDisposed=!0;for(var t=this.disposables.length,e=new
 return new Sn(this)},qe.onErrorResumeNext=function(t){if(!t)throw new Error("Second observable is required");return En([this,t])};var En=We.onErrorResumeNext=function(){var t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return new qn(function(e){var n=0,r=new le,o=xe.scheduleRecursive(function(o){var i,s;n<t.length?(i=t[n++],ut(i)&&(i=Xe(i)),s=new fe,r.setDisposable(s),s.setDisposable(i.subscribe(e.onNext.bind(e),o,o))):e.onCompleted()});return new ie(r,o)})};qe.skipUntil=function(t){var e=this;return new qn(function(n){var r=!1,o=new ie(e.subscribe(function(t){r&&n.onNext(t)},function(t){n.onError(t)},function(){r&&n.onCompleted()}));ut(t)&&(t=Xe(t));var i=new fe;return o.add(i),i.setDisposable(t.subscribe(function(){r=!0,i.dispose()},function(t){n.onError(t)},function(){i.dispose()})),o},e)};var Cn=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.inner=e,this.stopped=!1,this.latest=0,this.hasLatest=!1,this.isStopped=!1}function r(t,e){this.parent=t,this.id=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new le,r=this.source.subscribe(new n(t,e));return new ie(r,e)},n.prototype.onNext=function(t){if(!this.isStopped){var e=new fe,n=++this.latest;this.hasLatest=!0,this.inner.setDisposable(e),ut(t)&&(t=Xe(t)),e.setDisposable(t.subscribe(new r(this,n)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.stopped=!0,!this.hasLatest&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.latest===this.id&&this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&this.parent.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted()))},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ze);qe["switch"]=qe.switchLatest=function(){return new Cn(this)};var An=function(t){function e(e,n){this.source=e,this.other=ut(n)?Xe(n):n,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return new ie(this.source.subscribe(t),this.other.subscribe(new n(t)))},n.prototype.onNext=function(t){this.isStopped||this.o.onCompleted()},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){!this.isStopped&&(this.isStopped=!0)},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.takeUntil=function(t){return new An(this,t)},qe.withLatestFrom=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.pop(),o=this;return Array.isArray(e[0])&&(e=e[0]),new qn(function(t){for(var n=e.length,i=g(n,W),s=!1,u=new Array(n),a=new Array(n+1),c=0;n>c;c++)!function(n){var r=e[n],o=new fe;ut(r)&&(r=Xe(r)),o.setDisposable(r.subscribe(function(t){u[n]=t,i[n]=!0,s=i.every(nt)},function(e){t.onError(e)},et)),a[n]=o}(c);var p=new fe;return p.setDisposable(o.subscribe(function(e){var n=[e].concat(u);if(s){var o=x(r).apply(null,n);return o===ne?t.onError(o.e):void t.onNext(o)}},function(e){t.onError(e)},function(){t.onCompleted()})),a[n]=p,new ie(a)},this)},qe.zip=function(){if(Array.isArray(arguments[0]))return z.apply(this,arguments);for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=this,o=e.pop();return e.unshift(r),new qn(function(t){for(var n=e.length,i=g(n,G),s=g(n,W),u=new Array(n),a=0;n>a;a++)!function(n){var a=e[n],c=new fe;ut(a)&&(a=Xe(a)),c.setDisposable(a.subscribe(function(e){if(i[n].push(e),i.every(function(t){return t.length>0})){var u=i.map(function(t){return t.shift()}),a=x(o).apply(r,u);if(a===ne)return t.onError(a.e);t.onNext(a)}else s.filter(function(t,e){return e!==n}).every(nt)&&t.onCompleted()},function(e){t.onError(e)},function(){s[n]=!0,s.every(nt)&&t.onCompleted()})),u[n]=c}(a);return new ie(u)},r)},We.zip=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.shift();return r.zip.apply(r,e)},We.zipArray=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}return new qn(function(e){for(var n=t.length,r=g(n,J),o=g(n,W),i=new Array(n),s=0;n>s;s++)!function(n){i[n]=new fe,i[n].setDisposable(t[n].subscribe(function(t){if(r[n].push(t),r.every(function(t){return t.length>0})){var i=r.map(function(t){return t.shift()});e.onNext(i)}else if(o.filter(function(t,e){return e!==n}).every(nt))return e.onCompleted()},function(t){e.onError(t)},function(){o[n]=!0,o.every(nt)&&e.onCompleted()}))}(s);return new ie(i)})},qe.asObservable=function(){var t=this;return new qn(function(e){return t.subscribe(e)},t)},qe.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},qe.dematerialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){return t.accept(e)},function(t){e.onError(t)},function(){e.onCompleted()})},this)},qe.distinctUntilChanged=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o,i=!1;return n.subscribe(function(n){var s=n;if(t&&(s=x(t)(n),s===ne))return r.onError(s.e);if(i){var u=x(e)(o,s);if(u===ne)return r.onError(u.e)}i&&u||(i=!0,o=s,r.onNext(n))},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Nn=function(t){function e(e,n,r,o){this.source=e,this.t=!n||at(n)?De(n||et,r||et,o||et):n,t.call(this)}function n(t,e){this.o=t,this.t=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.t))},n.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.t.onNext).call(this.t,t);e===ne&&this.o.onError(e.e),this.o.onNext(t)}},n.prototype.onError=function(t){if(!this.isStopped){this.isStopped=!0;var e=x(this.t.onError).call(this.t,t);if(e===ne)return this.o.onError(e.e);this.o.onError(t)}},n.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var t=x(this.t.onCompleted).call(this.t);if(t===ne)return this.o.onError(t.e);this.o.onCompleted()}},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe["do"]=qe.tap=qe.doAction=function(t,e,n){return new Nn(this,t,e,n)},qe.doOnNext=qe.tapOnNext=function(t,e){return this.tap("undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnError=qe.tapOnError=function(t,e){return this.tap(et,"undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnCompleted=qe.tapOnCompleted=function(t,e){return this.tap(et,null,"undefined"!=typeof e?function(){t.call(e)}:t)},qe["finally"]=qe.ensure=function(t){var e=this;return new qn(function(n){var r;try{r=e.subscribe(n)}catch(o){throw t(),o}return ae(function(){try{r.dispose()}catch(e){throw e}finally{t()}})},this)},qe.finallyAction=function(t){return this.ensure(t)};var kn=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=et,n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},e}(ze);qe.ignoreElements=function(){return new kn(this)},qe.materialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){e.onNext(ke(t))},function(t){e.onNext(Oe(t)),e.onCompleted()},function(){e.onNext(Pe()),e.onCompleted()})},t)},qe.repeat=function(t){return Be(this,t).concat()},qe.retry=function(t){return Be(this,t).catchError()},qe.retryWhen=function(t){return Be(this).catchErrorWhen(t)};var On=function(t){function e(e,n,r,o){this.source=e,this.accumulator=n,this.hasSeed=r,this.seed=o,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new I(t,this))},e}(ze);I.prototype.onNext=function(t){if(!this.isStopped){!this.hasValue&&(this.hasValue=!0);try{this.hasAccumulation?this.accumulation=this.accumulator(this.accumulation,t):(this.accumulation=this.hasSeed?this.accumulator(this.seed,t):t,this.hasAccumulation=!0)}catch(e){return this.observer.onError(e)}this.observer.onNext(this.accumulation)}},I.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.observer.onError(t))},I.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,!this.hasValue&&this.hasSeed&&this.observer.onNext(this.seed),this.observer.onCompleted())},I.prototype.dispose=function(){this.isStopped=!0},I.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},qe.scan=function(){var t,e,n=!1;return 2===arguments.length?(n=!0,t=arguments[0],e=arguments[1]):e=arguments[0],new On(this,e,n,t)},qe.skipLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},function(t){n.onError(t)},function(){n.onCompleted()})},e)},qe.startWith=function(){var t,e=0;arguments.length&&me(arguments[0])?(t=arguments[0],e=1):t=xe;for(var n=[],r=e,o=arguments.length;o>r;r++)n.push(arguments[r]);return Ue([on(n,t),this]).concat()},qe.takeLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){for(;r.length>0;)n.onNext(r.shift());n.onCompleted()})},e)},qe.takeLastBuffer=function(t){var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){n.onNext(r),n.onCompleted()})},e)},qe.windowWithCount=function(t,e){var n=this;if(+t||(t=0),Math.abs(t)===1/0&&(t=0),0>=t)throw new yt;if(null==e&&(e=t),+e||(e=0),Math.abs(e)===1/0&&(e=0),0>=e)throw new yt;return new qn(function(r){function o(){var t=new Tn;a.push(t),r.onNext(ee(t,s))}var i=new fe,s=new de(i),u=0,a=[];return o(),i.setDisposable(n.subscribe(function(n){for(var r=0,i=a.length;i>r;r++)a[r].onNext(n);var s=u-t+1;s>=0&&s%e===0&&a.shift().onCompleted(),++u%e===0&&o()},function(t){for(;a.length>0;)a.shift().onError(t);r.onError(t)},function(){for(;a.length>0;)a.shift().onCompleted();r.onCompleted()})),s},n)},qe.selectConcat=qe.concatMap=function(t,e,n){return at(t)&&at(e)?this.concatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})}):at(t)?L(this,t,n):L(this,function(){return t})},qe.concatMapObserver=qe.selectConcatObserver=function(t,e,n,r){var o=this,i=At(t,r,2),s=At(e,r,1),u=At(n,r,0);return new qn(function(t){var e=0;return o.subscribe(function(n){var r;try{r=i(n,e++)}catch(o){return void t.onError(o)}ut(r)&&(r=Xe(r)),t.onNext(r)},function(e){var n;try{n=s(e)}catch(r){return void t.onError(r)}ut(n)&&(n=Xe(n)),t.onNext(n),t.onCompleted()},function(){var e;try{e=u()}catch(n){return void t.onError(n)}ut(e)&&(e=Xe(e)),t.onNext(e),t.onCompleted()})},this).concatAll()},qe.defaultIfEmpty=function(t){var e=this;return t===i&&(t=null),new qn(function(n){var r=!1;return e.subscribe(function(t){r=!0,n.onNext(t)},function(t){n.onError(t)},function(){!r&&n.onNext(t),n.onCompleted()})},e)},F.prototype.push=function(t){var e=-1===B(this.set,t,this.comparer);return e&&this.set.push(t),e},qe.distinct=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o=new F(e);return n.subscribe(function(e){var n=e;if(t)try{n=t(e)}catch(i){return void r.onError(i)}o.push(n)&&r.onNext(e)},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Pn=function(t){function e(e,n,r){this.source=e,this.selector=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return t.call(this,e.selector(n,r,o),r,o)}}function r(t,e,n){this.o=t,this.selector=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.internalMap=function(t,r){return new e(this.source,n(t,this),r)},e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.selector,this))},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.selector)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void this.o.onNext(e)}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.map=qe.select=function(t,e){var n="function"==typeof t?t:function(){return t};return this instanceof Pn?this.internalMap(n,e):new Pn(this,n,e)},qe.pluck=function(){var t=arguments,e=arguments.length;if(0===e)throw new Error("List of properties cannot be empty.");return this.map(function(n){for(var r=n,o=0;e>o;o++){var s=r[t[o]];if("undefined"==typeof s)return i;r=s}return r})},qe.flatMapObserver=qe.selectManyObserver=function(t,e,n,r){var o=this;return new qn(function(i){var s=0;return o.subscribe(function(e){var n;try{n=t.call(r,e,s++)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n)},function(t){var n;try{n=e.call(r,t)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n),i.onCompleted()},function(){var t;try{t=n.call(r)}catch(e){return void i.onError(e)}ut(t)&&(t=Xe(t)),i.onNext(t),i.onCompleted()})},o).mergeAll()},qe.selectMany=qe.flatMap=function(t,e,n){return at(t)&&at(e)?this.flatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})},n):at(t)?U(this,t,n):U(this,function(){return t})},qe.selectSwitch=qe.flatMapLatest=qe.switchMap=function(t,e){return this.select(t,e).switchLatest()};var jn=function(t){function e(e,n){this.source=e,this.skipCount=n,t.call(this)}function n(t,e){this.c=e,this.r=e,this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.skipCount))},n.prototype.onNext=function(t){this.isStopped||(this.r<=0?this.o.onNext(t):this.r--)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.skip=function(t){if(0>t)throw new yt;return new jn(this,t)},qe.skipWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!1;return n.subscribe(function(i){if(!o)try{o=!r(i,e++,n)}catch(s){return void t.onError(s)}o&&t.onNext(i)},function(e){t.onError(e)},function(){t.onCompleted()})},n)},qe.take=function(t,e){if(0>t)throw new yt;if(0===t)return Ye(e);var n=this;return new qn(function(e){var r=t;return n.subscribe(function(t){r-- >0&&(e.onNext(t),0>=r&&e.onCompleted())},function(t){e.onError(t)},function(){e.onCompleted()})},n)},qe.takeWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!0;return n.subscribe(function(i){if(o){try{o=r(i,e++,n)}catch(s){return void t.onError(s)}o?t.onNext(i):t.onCompleted()}},function(e){t.onError(e)},function(){t.onCompleted()})},n)};var Dn=function(t){function e(e,n,r){this.source=e,this.predicate=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return e.predicate(n,r,o)&&t.call(this,n,r,o)}}function r(t,e,n){this.o=t,this.predicate=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.predicate,this))},e.prototype.internalFilter=function(t,r){return new e(this.source,n(t,this),r)},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.predicate)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void(e&&this.o.onNext(t))}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.filter=qe.where=function(t,e){return this instanceof Dn?this.internalFilter(t,e):new Dn(this,t,e)},qe.transduce=function(t){function e(t){return{"@@transducer/init":function(){return t},"@@transducer/step":function(t,e){return t.onNext(e)},"@@transducer/result":function(t){return t.onCompleted()}}}var n=this;return new qn(function(r){var o=t(e(r));return n.subscribe(function(t){try{o["@@transducer/step"](r,t)}catch(e){r.onError(e)}},function(t){r.onError(t)},function(){o["@@transducer/result"](r)})},n)};var qn=tt.AnonymousObservable=function(t){function e(t){return t&&at(t.dispose)?t:at(t)?ae(t):ce}function n(t,n){var r=n[0],o=n[1],i=x(o)(r);return i!==ne||r.fail(ne.e)?void r.setDisposable(e(i)):_(ne.e)}function r(e,r){function o(t){var r=new Rn(t),o=[r,e];return _e.scheduleRequired()?_e.scheduleWithState(o,n):n(null,o),r}this.source=r,t.call(this,o)}return Zt(r,t),r}(We),Rn=function(t){function e(e){t.call(this),this.observer=e,this.m=new fe}Zt(e,t);var n=e.prototype;return n.next=function(t){var e=x(this.observer.onNext).call(this.observer,t);e===ne&&(this.dispose(),_(e.e))},n.error=function(t){var e=x(this.observer.onError).call(this.observer,t);this.dispose(),e===ne&&_(e.e)},n.completed=function(){var t=x(this.observer.onCompleted).call(this.observer);this.dispose(),t===ne&&_(t.e)},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Re),Mn=function(t,e){this.subject=t,this.observer=e};Mn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var Tn=tt.Subject=function(t){function e(t){return he(this),this.isStopped?this.hasError?(t.onError(this.error),ce):(t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je.prototype,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(he(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=u(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(he(this),!this.isStopped)for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),n.create=function(t,e){return new Vn(t,e)},n}(We),Vn=(tt.AsyncSubject=function(t){function e(t){return he(this),this.isStopped?(this.hasError?t.onError(this.error):this.hasValue?(t.onNext(this.value),t.onCompleted()):t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je,{hasObservers:function(){return he(this),this.observers.length>0},onCompleted:function(){var t,e;if(he(this),!this.isStopped){this.isStopped=!0;var n=u(this.observers),e=n.length;if(this.hasValue)for(t=0;e>t;t++){var r=n[t];r.onNext(this.value),r.onCompleted()}else for(t=0;e>t;t++)n[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){he(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),n}(We),tt.AnonymousSubject=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){this.observer=n,this.observable=r,t.call(this,e)}return Zt(n,t),te(n.prototype,je.prototype,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(We));"function"==typeof t&&"object"==typeof t.amd&&t.amd?(X.Rx=tt,t(function(){return tt})):Q&&K?Y?(K.exports=tt).Rx=tt:Q.Rx=tt:X.Rx=tt;var $n=f()}).call(this)}).call(this,e(150),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{150:150}]},{},[1])(1)});
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{}],14:[function(require,module,exports){
+},{}],16:[function(require,module,exports){
 (function (global){
 var topLevel = typeof global !== 'undefined' ? global :
     typeof window !== 'undefined' ? window : {}
 var minDoc = require('min-document');
 
+var doccy;
+
 if (typeof document !== 'undefined') {
-    module.exports = document;
+    doccy = document;
 } else {
-    var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
+    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
 
     if (!doccy) {
         doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
     }
-
-    module.exports = doccy;
 }
 
+module.exports = doccy;
+
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{"min-document":2}],15:[function(require,module,exports){
+},{"min-document":4}],17:[function(require,module,exports){
 exports.read = function (buffer, offset, isLE, mLen, nBytes) {
   var e, m
   var eLen = nBytes * 8 - mLen - 1
@@ -3382,7 +3673,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
   buffer[offset + i - d] |= s * 128
 }
 
-},{}],16:[function(require,module,exports){
+},{}],18:[function(require,module,exports){
 (function (global){
 'use strict';
 
@@ -3406,7 +3697,7 @@ function Individual(key, value) {
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{}],17:[function(require,module,exports){
+},{}],19:[function(require,module,exports){
 'use strict';
 
 var Individual = require('./index.js');
@@ -3430,21 +3721,14 @@ function OneVersion(moduleName, version, defaultValue) {
     return Individual(key, defaultValue);
 }
 
-},{"./index.js":16}],18:[function(require,module,exports){
+},{"./index.js":18}],20:[function(require,module,exports){
 "use strict";
 
 module.exports = function isObject(x) {
        return typeof x === "object" && x !== null;
 };
 
-},{}],19:[function(require,module,exports){
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
-  return toString.call(arr) == '[object Array]';
-};
-
-},{}],20:[function(require,module,exports){
+},{}],21:[function(require,module,exports){
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
 /* Geohash encoding/decoding and associated functions   (c) Chris Veness 2014-2016 / MIT Licence  */
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
@@ -3690,20657 +3974,39316 @@ Geohash.neighbours = function(geohash) {
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
 if (typeof module != 'undefined' && module.exports) module.exports = Geohash; // CommonJS, node.js
 
-},{}],21:[function(require,module,exports){
-(function (process){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
+},{}],22:[function(require,module,exports){
+/**
+ * martinez v0.7.0
+ * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
+ *
+ * @author Alex Milevski <info@w8r.name>
+ * @license MIT
+ * @preserve
+ */
 
-// resolves . and .. elements in a path array with directory names there
-// must be no slashes, empty elements, or device names (c:\) in the array
-// (so also no leading and trailing slashes - it does not distinguish
-// relative and absolute paths)
-function normalizeArray(parts, allowAboveRoot) {
-  // if the path tries to go above the root, `up` ends up > 0
-  var up = 0;
-  for (var i = parts.length - 1; i >= 0; i--) {
-    var last = parts[i];
-    if (last === '.') {
-      parts.splice(i, 1);
-    } else if (last === '..') {
-      parts.splice(i, 1);
-      up++;
-    } else if (up) {
-      parts.splice(i, 1);
-      up--;
-    }
-  }
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+  typeof define === 'function' && define.amd ? define(['exports'], factory) :
+  (global = global || self, factory(global.martinez = {}));
+}(this, (function (exports) { 'use strict';
 
-  // if the path is allowed to go above the root, restore leading ..s
-  if (allowAboveRoot) {
-    for (; up--; up) {
-      parts.unshift('..');
-    }
-  }
+  function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
 
-  return parts;
-}
+  var SplayTree = function SplayTree(compare, noDuplicates) {
+    if ( compare === void 0 ) compare = DEFAULT_COMPARE;
+    if ( noDuplicates === void 0 ) noDuplicates = false;
 
-// Split a filename into [root, dir, basename, ext], unix version
-// 'root' is just a slash, or nothing.
-var splitPathRe =
-    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
-var splitPath = function(filename) {
-  return splitPathRe.exec(filename).slice(1);
-};
+    this._compare = compare;
+    this._root = null;
+    this._size = 0;
+    this._noDuplicates = !!noDuplicates;
+  };
 
-// path.resolve([from ...], to)
-// posix version
-exports.resolve = function() {
-  var resolvedPath = '',
-      resolvedAbsolute = false;
+  var prototypeAccessors = { size: { configurable: true } };
 
-  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
-    var path = (i >= 0) ? arguments[i] : process.cwd();
 
-    // Skip empty and invalid entries
-    if (typeof path !== 'string') {
-      throw new TypeError('Arguments to path.resolve must be strings');
-    } else if (!path) {
-      continue;
+  SplayTree.prototype.rotateLeft = function rotateLeft (x) {
+    var y = x.right;
+    if (y) {
+      x.right = y.left;
+      if (y.left) { y.left.parent = x; }
+      y.parent = x.parent;
     }
 
-    resolvedPath = path + '/' + resolvedPath;
-    resolvedAbsolute = path.charAt(0) === '/';
-  }
-
-  // At this point the path should be resolved to a full absolute path, but
-  // handle relative paths to be safe (might happen when process.cwd() fails)
-
-  // Normalize the path
-  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
-    return !!p;
-  }), !resolvedAbsolute).join('/');
+    if (!x.parent)              { this._root = y; }
+    else if (x === x.parent.left) { x.parent.left = y; }
+    else                        { x.parent.right = y; }
+    if (y) { y.left = x; }
+    x.parent = y;
+  };
 
-  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
-};
 
-// path.normalize(path)
-// posix version
-exports.normalize = function(path) {
-  var isAbsolute = exports.isAbsolute(path),
-      trailingSlash = substr(path, -1) === '/';
+  SplayTree.prototype.rotateRight = function rotateRight (x) {
+    var y = x.left;
+    if (y) {
+      x.left = y.right;
+      if (y.right) { y.right.parent = x; }
+      y.parent = x.parent;
+    }
 
-  // Normalize the path
-  path = normalizeArray(filter(path.split('/'), function(p) {
-    return !!p;
-  }), !isAbsolute).join('/');
+    if (!x.parent)             { this._root = y; }
+    else if(x === x.parent.left) { x.parent.left = y; }
+    else                       { x.parent.right = y; }
+    if (y) { y.right = x; }
+    x.parent = y;
+  };
 
-  if (!path && !isAbsolute) {
-    path = '.';
-  }
-  if (path && trailingSlash) {
-    path += '/';
-  }
 
-  return (isAbsolute ? '/' : '') + path;
-};
+  SplayTree.prototype._splay = function _splay (x) {
+    while (x.parent) {
+      var p = x.parent;
+      if (!p.parent) {
+        if (p.left === x) { this.rotateRight(p); }
+        else            { this.rotateLeft(p); }
+      } else if (p.left === x && p.parent.left === p) {
+        this.rotateRight(p.parent);
+        this.rotateRight(p);
+      } else if (p.right === x && p.parent.right === p) {
+        this.rotateLeft(p.parent);
+        this.rotateLeft(p);
+      } else if (p.left === x && p.parent.right === p) {
+        this.rotateRight(p);
+        this.rotateLeft(p);
+      } else {
+        this.rotateLeft(p);
+        this.rotateRight(p);
+      }
+    }
+  };
 
-// posix version
-exports.isAbsolute = function(path) {
-  return path.charAt(0) === '/';
-};
 
-// posix version
-exports.join = function() {
-  var paths = Array.prototype.slice.call(arguments, 0);
-  return exports.normalize(filter(paths, function(p, index) {
-    if (typeof p !== 'string') {
-      throw new TypeError('Arguments to path.join must be strings');
-    }
-    return p;
-  }).join('/'));
-};
+  SplayTree.prototype.splay = function splay (x) {
+    var p, gp, ggp, l, r;
 
+    while (x.parent) {
+      p = x.parent;
+      gp = p.parent;
 
-// path.relative(from, to)
-// posix version
-exports.relative = function(from, to) {
-  from = exports.resolve(from).substr(1);
-  to = exports.resolve(to).substr(1);
+      if (gp && gp.parent) {
+        ggp = gp.parent;
+        if (ggp.left === gp) { ggp.left= x; }
+        else               { ggp.right = x; }
+        x.parent = ggp;
+      } else {
+        x.parent = null;
+        this._root = x;
+      }
 
-  function trim(arr) {
-    var start = 0;
-    for (; start < arr.length; start++) {
-      if (arr[start] !== '') break;
-    }
+      l = x.left; r = x.right;
+
+      if (x === p.left) { // left
+        if (gp) {
+          if (gp.left === p) {
+            /* zig-zig */
+            if (p.right) {
+              gp.left = p.right;
+              gp.left.parent = gp;
+            } else { gp.left = null; }
+
+            p.right = gp;
+            gp.parent = p;
+          } else {
+            /* zig-zag */
+            if (l) {
+              gp.right = l;
+              l.parent = gp;
+            } else { gp.right = null; }
+
+            x.left  = gp;
+            gp.parent = x;
+          }
+        }
+        if (r) {
+          p.left = r;
+          r.parent = p;
+        } else { p.left = null; }
+
+        x.right= p;
+        p.parent = x;
+      } else { // right
+        if (gp) {
+          if (gp.right === p) {
+            /* zig-zig */
+            if (p.left) {
+              gp.right = p.left;
+              gp.right.parent = gp;
+            } else { gp.right = null; }
+
+            p.left = gp;
+            gp.parent = p;
+          } else {
+            /* zig-zag */
+            if (r) {
+              gp.left = r;
+              r.parent = gp;
+            } else { gp.left = null; }
+
+            x.right = gp;
+            gp.parent = x;
+          }
+        }
+        if (l) {
+          p.right = l;
+          l.parent = p;
+        } else { p.right = null; }
 
-    var end = arr.length - 1;
-    for (; end >= 0; end--) {
-      if (arr[end] !== '') break;
+        x.left = p;
+        p.parent = x;
+      }
     }
+  };
 
-    if (start > end) return [];
-    return arr.slice(start, end - start + 1);
-  }
 
-  var fromParts = trim(from.split('/'));
-  var toParts = trim(to.split('/'));
+  SplayTree.prototype.replace = function replace (u, v) {
+    if (!u.parent) { this._root = v; }
+    else if (u === u.parent.left) { u.parent.left = v; }
+    else { u.parent.right = v; }
+    if (v) { v.parent = u.parent; }
+  };
 
-  var length = Math.min(fromParts.length, toParts.length);
-  var samePartsLength = length;
-  for (var i = 0; i < length; i++) {
-    if (fromParts[i] !== toParts[i]) {
-      samePartsLength = i;
-      break;
-    }
-  }
 
-  var outputParts = [];
-  for (var i = samePartsLength; i < fromParts.length; i++) {
-    outputParts.push('..');
-  }
+  SplayTree.prototype.minNode = function minNode (u) {
+      if ( u === void 0 ) u = this._root;
 
-  outputParts = outputParts.concat(toParts.slice(samePartsLength));
+    if (u) { while (u.left) { u = u.left; } }
+    return u;
+  };
 
-  return outputParts.join('/');
-};
 
-exports.sep = '/';
-exports.delimiter = ':';
+  SplayTree.prototype.maxNode = function maxNode (u) {
+      if ( u === void 0 ) u = this._root;
 
-exports.dirname = function(path) {
-  var result = splitPath(path),
-      root = result[0],
-      dir = result[1];
+    if (u) { while (u.right) { u = u.right; } }
+    return u;
+  };
 
-  if (!root && !dir) {
-    // No dirname whatsoever
-    return '.';
-  }
 
-  if (dir) {
-    // It has a dirname, strip trailing slash
-    dir = dir.substr(0, dir.length - 1);
-  }
+  SplayTree.prototype.insert = function insert (key, data) {
+    var z = this._root;
+    var p = null;
+    var comp = this._compare;
+    var cmp;
 
-  return root + dir;
-};
+    if (this._noDuplicates) {
+      while (z) {
+        p = z;
+        cmp = comp(z.key, key);
+        if (cmp === 0) { return; }
+        else if (comp(z.key, key) < 0) { z = z.right; }
+        else { z = z.left; }
+      }
+    } else {
+      while (z) {
+        p = z;
+        if (comp(z.key, key) < 0) { z = z.right; }
+        else { z = z.left; }
+      }
+    }
 
+    z = { key: key, data: data, left: null, right: null, parent: p };
 
-exports.basename = function(path, ext) {
-  var f = splitPath(path)[2];
-  // TODO: make this comparison case-insensitive on windows?
-  if (ext && f.substr(-1 * ext.length) === ext) {
-    f = f.substr(0, f.length - ext.length);
-  }
-  return f;
-};
+    if (!p)                        { this._root = z; }
+    else if (comp(p.key, z.key) < 0) { p.right = z; }
+    else                           { p.left= z; }
 
+    this.splay(z);
+    this._size++;
+    return z;
+  };
 
-exports.extname = function(path) {
-  return splitPath(path)[3];
-};
 
-function filter (xs, f) {
-    if (xs.filter) return xs.filter(f);
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        if (f(xs[i], i, xs)) res.push(xs[i]);
+  SplayTree.prototype.find = function find (key) {
+    var z  = this._root;
+    var comp = this._compare;
+    while (z) {
+      var cmp = comp(z.key, key);
+      if    (cmp < 0) { z = z.right; }
+      else if (cmp > 0) { z = z.left; }
+      else            { return z; }
     }
-    return res;
-}
+    return null;
+  };
 
-// String.prototype.substr - negative index don't work in IE8
-var substr = 'ab'.substr(-1) === 'b'
-    ? function (str, start, len) { return str.substr(start, len) }
-    : function (str, start, len) {
-        if (start < 0) start = str.length + start;
-        return str.substr(start, len);
+  /**
+   * Whether the tree contains a node with the given key
+   * @param{Key} key
+   * @return {boolean} true/false
+   */
+  SplayTree.prototype.contains = function contains (key) {
+    var node     = this._root;
+    var comparator = this._compare;
+    while (node){
+      var cmp = comparator(key, node.key);
+      if    (cmp === 0) { return true; }
+      else if (cmp < 0) { node = node.left; }
+      else              { node = node.right; }
     }
-;
 
-}).call(this,require('_process'))
+    return false;
+  };
 
-},{"_process":4}],22:[function(require,module,exports){
-'use strict';
 
-module.exports = Pbf;
+  SplayTree.prototype.remove = function remove (key) {
+    var z = this.find(key);
 
-var ieee754 = require('ieee754');
+    if (!z) { return false; }
 
-function Pbf(buf) {
-    this.buf = ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
-    this.pos = 0;
-    this.type = 0;
-    this.length = this.buf.length;
-}
+    this.splay(z);
 
-Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
-Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
-Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
-Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
+    if (!z.left) { this.replace(z, z.right); }
+    else if (!z.right) { this.replace(z, z.left); }
+    else {
+      var y = this.minNode(z.right);
+      if (y.parent !== z) {
+        this.replace(y, y.right);
+        y.right = z.right;
+        y.right.parent = y;
+      }
+      this.replace(z, y);
+      y.left = z.left;
+      y.left.parent = y;
+    }
 
-var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
-    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
+    this._size--;
+    return true;
+  };
 
-Pbf.prototype = {
 
-    destroy: function() {
-        this.buf = null;
-    },
+  SplayTree.prototype.removeNode = function removeNode (z) {
+    if (!z) { return false; }
 
-    // === READING =================================================================
+    this.splay(z);
 
-    readFields: function(readField, result, end) {
-        end = end || this.length;
+    if (!z.left) { this.replace(z, z.right); }
+    else if (!z.right) { this.replace(z, z.left); }
+    else {
+      var y = this.minNode(z.right);
+      if (y.parent !== z) {
+        this.replace(y, y.right);
+        y.right = z.right;
+        y.right.parent = y;
+      }
+      this.replace(z, y);
+      y.left = z.left;
+      y.left.parent = y;
+    }
 
-        while (this.pos < end) {
-            var val = this.readVarint(),
-                tag = val >> 3,
-                startPos = this.pos;
+    this._size--;
+    return true;
+  };
 
-            this.type = val & 0x7;
-            readField(tag, result, this);
 
-            if (this.pos === startPos) this.skip(val);
-        }
-        return result;
-    },
+  SplayTree.prototype.erase = function erase (key) {
+    var z = this.find(key);
+    if (!z) { return; }
 
-    readMessage: function(readField, result) {
-        return this.readFields(readField, result, this.readVarint() + this.pos);
-    },
+    this.splay(z);
 
-    readFixed32: function() {
-        var val = readUInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
+    var s = z.left;
+    var t = z.right;
 
-    readSFixed32: function() {
-        var val = readInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
+    var sMax = null;
+    if (s) {
+      s.parent = null;
+      sMax = this.maxNode(s);
+      this.splay(sMax);
+      this._root = sMax;
+    }
+    if (t) {
+      if (s) { sMax.right = t; }
+      else { this._root = t; }
+      t.parent = sMax;
+    }
 
-    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
+    this._size--;
+  };
 
-    readFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
+  /**
+   * Removes and returns the node with smallest key
+   * @return {?Node}
+   */
+  SplayTree.prototype.pop = function pop () {
+    var node = this._root, returnValue = null;
+    if (node) {
+      while (node.left) { node = node.left; }
+      returnValue = { key: node.key, data: node.data };
+      this.remove(node.key);
+    }
+    return returnValue;
+  };
 
-    readSFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
-
-    readFloat: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 23, 4);
-        this.pos += 4;
-        return val;
-    },
 
-    readDouble: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 52, 8);
-        this.pos += 8;
-        return val;
-    },
+  /* eslint-disable class-methods-use-this */
 
-    readVarint: function(isSigned) {
-        var buf = this.buf,
-            val, b;
+  /**
+   * Successor node
+   * @param{Node} node
+   * @return {?Node}
+   */
+  SplayTree.prototype.next = function next (node) {
+    var successor = node;
+    if (successor) {
+      if (successor.right) {
+        successor = successor.right;
+        while (successor && successor.left) { successor = successor.left; }
+      } else {
+        successor = node.parent;
+        while (successor && successor.right === node) {
+          node = successor; successor = successor.parent;
+        }
+      }
+    }
+    return successor;
+  };
 
-        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
-        b = buf[this.pos];   val |= (b & 0x0f) << 28;
 
-        return readVarintRemainder(val, isSigned, this);
-    },
+  /**
+   * Predecessor node
+   * @param{Node} node
+   * @return {?Node}
+   */
+  SplayTree.prototype.prev = function prev (node) {
+    var predecessor = node;
+    if (predecessor) {
+      if (predecessor.left) {
+        predecessor = predecessor.left;
+        while (predecessor && predecessor.right) { predecessor = predecessor.right; }
+      } else {
+        predecessor = node.parent;
+        while (predecessor && predecessor.left === node) {
+          node = predecessor;
+          predecessor = predecessor.parent;
+        }
+      }
+    }
+    return predecessor;
+  };
+  /* eslint-enable class-methods-use-this */
 
-    readVarint64: function() { // for compatibility with v2.0.1
-        return this.readVarint(true);
-    },
 
-    readSVarint: function() {
-        var num = this.readVarint();
-        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
-    },
+  /**
+   * @param{forEachCallback} callback
+   * @return {SplayTree}
+   */
+  SplayTree.prototype.forEach = function forEach (callback) {
+    var current = this._root;
+    var s = [], done = false, i = 0;
+
+    while (!done) {
+      // Reach the left most Node of the current Node
+      if (current) {
+        // Place pointer to a tree node on the stack
+        // before traversing the node's left subtree
+        s.push(current);
+        current = current.left;
+      } else {
+        // BackTrack from the empty subtree and visit the Node
+        // at the top of the stack; however, if the stack is
+        // empty you are done
+        if (s.length > 0) {
+          current = s.pop();
+          callback(current, i++);
+
+          // We have visited the node and its left
+          // subtree. Now, it's right subtree's turn
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return this;
+  };
 
-    readBoolean: function() {
-        return Boolean(this.readVarint());
-    },
 
-    readString: function() {
-        var end = this.readVarint() + this.pos,
-            str = readUtf8(this.buf, this.pos, end);
-        this.pos = end;
-        return str;
-    },
+  /**
+   * Walk key range from `low` to `high`. Stops if `fn` returns a value.
+   * @param{Key}    low
+   * @param{Key}    high
+   * @param{Function} fn
+   * @param{*?}     ctx
+   * @return {SplayTree}
+   */
+  SplayTree.prototype.range = function range (low, high, fn, ctx) {
+    var Q = [];
+    var compare = this._compare;
+    var node = this._root, cmp;
+
+    while (Q.length !== 0 || node) {
+      if (node) {
+        Q.push(node);
+        node = node.left;
+      } else {
+        node = Q.pop();
+        cmp = compare(node.key, high);
+        if (cmp > 0) {
+          break;
+        } else if (compare(node.key, low) >= 0) {
+          if (fn.call(ctx, node)) { return this; } // stop if smth is returned
+        }
+        node = node.right;
+      }
+    }
+    return this;
+  };
 
-    readBytes: function() {
-        var end = this.readVarint() + this.pos,
-            buffer = this.buf.subarray(this.pos, end);
-        this.pos = end;
-        return buffer;
-    },
+  /**
+   * Returns all keys in order
+   * @return {Array<Key>}
+   */
+  SplayTree.prototype.keys = function keys () {
+    var current = this._root;
+    var s = [], r = [], done = false;
+
+    while (!done) {
+      if (current) {
+        s.push(current);
+        current = current.left;
+      } else {
+        if (s.length > 0) {
+          current = s.pop();
+          r.push(current.key);
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return r;
+  };
 
-    // verbose for performance reasons; doesn't affect gzipped size
 
-    readPackedVarint: function(arr, isSigned) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readVarint(isSigned));
-        return arr;
-    },
-    readPackedSVarint: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSVarint());
-        return arr;
-    },
-    readPackedBoolean: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readBoolean());
-        return arr;
-    },
-    readPackedFloat: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFloat());
-        return arr;
-    },
-    readPackedDouble: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readDouble());
-        return arr;
-    },
-    readPackedFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed32());
-        return arr;
-    },
-    readPackedSFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed32());
-        return arr;
-    },
-    readPackedFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed64());
-        return arr;
-    },
-    readPackedSFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed64());
-        return arr;
-    },
+  /**
+   * Returns `data` fields of all nodes in order.
+   * @return {Array<Value>}
+   */
+  SplayTree.prototype.values = function values () {
+    var current = this._root;
+    var s = [], r = [], done = false;
+
+    while (!done) {
+      if (current) {
+        s.push(current);
+        current = current.left;
+      } else {
+        if (s.length > 0) {
+          current = s.pop();
+          r.push(current.data);
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return r;
+  };
 
-    skip: function(val) {
-        var type = val & 0x7;
-        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
-        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
-        else if (type === Pbf.Fixed32) this.pos += 4;
-        else if (type === Pbf.Fixed64) this.pos += 8;
-        else throw new Error('Unimplemented type: ' + type);
-    },
 
-    // === WRITING =================================================================
+  /**
+   * Returns node at given index
+   * @param{number} index
+   * @return {?Node}
+   */
+  SplayTree.prototype.at = function at (index) {
+    // removed after a consideration, more misleading than useful
+    // index = index % this.size;
+    // if (index < 0) index = this.size - index;
+
+    var current = this._root;
+    var s = [], done = false, i = 0;
+
+    while (!done) {
+      if (current) {
+        s.push(current);
+        current = current.left;
+      } else {
+        if (s.length > 0) {
+          current = s.pop();
+          if (i === index) { return current; }
+          i++;
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return null;
+  };
 
-    writeTag: function(tag, type) {
-        this.writeVarint((tag << 3) | type);
-    },
+  /**
+   * Bulk-load items. Both array have to be same size
+   * @param{Array<Key>}  keys
+   * @param{Array<Value>}[values]
+   * @param{Boolean}     [presort=false] Pre-sort keys and values, using
+   *                                       tree's comparator. Sorting is done
+   *                                       in-place
+   * @return {AVLTree}
+   */
+  SplayTree.prototype.load = function load (keys, values, presort) {
+      if ( keys === void 0 ) keys = [];
+      if ( values === void 0 ) values = [];
+      if ( presort === void 0 ) presort = false;
+
+    if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
+    var size = keys.length;
+    if (presort) { sort(keys, values, 0, size - 1, this._compare); }
+    this._root = loadRecursive(null, keys, values, 0, size);
+    this._size = size;
+    return this;
+  };
 
-    realloc: function(min) {
-        var length = this.length || 16;
 
-        while (length < this.pos + min) length *= 2;
+  SplayTree.prototype.min = function min () {
+    var node = this.minNode(this._root);
+    if (node) { return node.key; }
+    else    { return null; }
+  };
 
-        if (length !== this.length) {
-            var buf = new Uint8Array(length);
-            buf.set(this.buf);
-            this.buf = buf;
-            this.length = length;
-        }
-    },
 
-    finish: function() {
-        this.length = this.pos;
-        this.pos = 0;
-        return this.buf.subarray(0, this.length);
-    },
+  SplayTree.prototype.max = function max () {
+    var node = this.maxNode(this._root);
+    if (node) { return node.key; }
+    else    { return null; }
+  };
 
-    writeFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
+  SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
+  prototypeAccessors.size.get = function () { return this._size; };
 
-    writeSFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
 
-    writeFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
+  /**
+   * Create a tree and load it with items
+   * @param{Array<Key>}        keys
+   * @param{Array<Value>?}      [values]
+
+   * @param{Function?}          [comparator]
+   * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
+   *                                             tree's comparator. Sorting is done
+   *                                             in-place
+   * @param{Boolean?}           [noDuplicates=false] Allow duplicates
+   * @return {SplayTree}
+   */
+  SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
+    return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
+  };
 
-    writeSFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
+  Object.defineProperties( SplayTree.prototype, prototypeAccessors );
 
-    writeVarint: function(val) {
-        val = +val || 0;
 
-        if (val > 0xfffffff || val < 0) {
-            writeBigVarint(val, this);
-            return;
-        }
+  function loadRecursive (parent, keys, values, start, end) {
+    var size = end - start;
+    if (size > 0) {
+      var middle = start + Math.floor(size / 2);
+      var key    = keys[middle];
+      var data   = values[middle];
+      var node   = { key: key, data: data, parent: parent };
+      node.left    = loadRecursive(node, keys, values, start, middle);
+      node.right   = loadRecursive(node, keys, values, middle + 1, end);
+      return node;
+    }
+    return null;
+  }
 
-        this.realloc(4);
 
-        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] =   (val >>> 7) & 0x7f;
-    },
+  function sort(keys, values, left, right, compare) {
+    if (left >= right) { return; }
 
-    writeSVarint: function(val) {
-        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
-    },
+    var pivot = keys[(left + right) >> 1];
+    var i = left - 1;
+    var j = right + 1;
 
-    writeBoolean: function(val) {
-        this.writeVarint(Boolean(val));
-    },
+    while (true) {
+      do { i++; } while (compare(keys[i], pivot) < 0);
+      do { j--; } while (compare(keys[j], pivot) > 0);
+      if (i >= j) { break; }
 
-    writeString: function(str) {
-        str = String(str);
-        this.realloc(str.length * 4);
+      var tmp = keys[i];
+      keys[i] = keys[j];
+      keys[j] = tmp;
 
-        this.pos++; // reserve 1 byte for short string length
+      tmp = values[i];
+      values[i] = values[j];
+      values[j] = tmp;
+    }
 
-        var startPos = this.pos;
-        // write the string directly to the buffer and see how much was written
-        this.pos = writeUtf8(this.buf, str, this.pos);
-        var len = this.pos - startPos;
+    sort(keys, values,  left,     j, compare);
+    sort(keys, values, j + 1, right, compare);
+  }
 
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
+  var NORMAL               = 0;
+  var NON_CONTRIBUTING     = 1;
+  var SAME_TRANSITION      = 2;
+  var DIFFERENT_TRANSITION = 3;
 
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
+  var INTERSECTION = 0;
+  var UNION        = 1;
+  var DIFFERENCE   = 2;
+  var XOR          = 3;
 
-    writeFloat: function(val) {
-        this.realloc(4);
-        ieee754.write(this.buf, val, this.pos, true, 23, 4);
-        this.pos += 4;
-    },
+  /**
+   * @param  {SweepEvent} event
+   * @param  {SweepEvent} prev
+   * @param  {Operation} operation
+   */
+  function computeFields (event, prev, operation) {
+    // compute inOut and otherInOut fields
+    if (prev === null) {
+      event.inOut      = false;
+      event.otherInOut = true;
 
-    writeDouble: function(val) {
-        this.realloc(8);
-        ieee754.write(this.buf, val, this.pos, true, 52, 8);
-        this.pos += 8;
-    },
+    // previous line segment in sweepline belongs to the same polygon
+    } else {
+      if (event.isSubject === prev.isSubject) {
+        event.inOut      = !prev.inOut;
+        event.otherInOut = prev.otherInOut;
 
-    writeBytes: function(buffer) {
-        var len = buffer.length;
-        this.writeVarint(len);
-        this.realloc(len);
-        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
-    },
+      // previous line segment in sweepline belongs to the clipping polygon
+      } else {
+        event.inOut      = !prev.otherInOut;
+        event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
+      }
 
-    writeRawMessage: function(fn, obj) {
-        this.pos++; // reserve 1 byte for short message length
+      // compute prevInResult field
+      if (prev) {
+        event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
+          ? prev.prevInResult : prev;
+      }
+    }
 
-        // write the message directly to the buffer and see how much was written
-        var startPos = this.pos;
-        fn(obj, this);
-        var len = this.pos - startPos;
+    // check if the line segment belongs to the Boolean operation
+    var isInResult = inResult(event, operation);
+    if (isInResult) {
+      event.resultTransition = determineResultTransition(event, operation);
+    } else {
+      event.resultTransition = 0;
+    }
+  }
 
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
 
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
+  /* eslint-disable indent */
+  function inResult(event, operation) {
+    switch (event.type) {
+      case NORMAL:
+        switch (operation) {
+          case INTERSECTION:
+            return !event.otherInOut;
+          case UNION:
+            return event.otherInOut;
+          case DIFFERENCE:
+            // return (event.isSubject && !event.otherInOut) ||
+            //         (!event.isSubject && event.otherInOut);
+            return (event.isSubject && event.otherInOut) ||
+                    (!event.isSubject && !event.otherInOut);
+          case XOR:
+            return true;
+        }
+        break;
+      case SAME_TRANSITION:
+        return operation === INTERSECTION || operation === UNION;
+      case DIFFERENT_TRANSITION:
+        return operation === DIFFERENCE;
+      case NON_CONTRIBUTING:
+        return false;
+    }
+    return false;
+  }
+  /* eslint-enable indent */
+
+
+  function determineResultTransition(event, operation) {
+    var thisIn = !event.inOut;
+    var thatIn = !event.otherInOut;
+
+    var isIn;
+    switch (operation) {
+      case INTERSECTION:
+        isIn = thisIn && thatIn; break;
+      case UNION:
+        isIn = thisIn || thatIn; break;
+      case XOR:
+        isIn = thisIn ^ thatIn; break;
+      case DIFFERENCE:
+        if (event.isSubject) {
+          isIn = thisIn && !thatIn;
+        } else {
+          isIn = thatIn && !thisIn;
+        }
+        break;
+    }
+    return isIn ? +1 : -1;
+  }
 
-    writeMessage: function(tag, fn, obj) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeRawMessage(fn, obj);
-    },
+  var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
 
-    writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
-    writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
-    writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
-    writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
-    writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
-    writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
-    writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
-    writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
-    writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
+    /**
+     * Is left endpoint?
+     * @type {Boolean}
+     */
+    this.left = left;
 
-    writeBytesField: function(tag, buffer) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeBytes(buffer);
-    },
-    writeFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFixed32(val);
-    },
-    writeSFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeSFixed32(val);
-    },
-    writeFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeFixed64(val);
-    },
-    writeSFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeSFixed64(val);
-    },
-    writeVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeVarint(val);
-    },
-    writeSVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeSVarint(val);
-    },
-    writeStringField: function(tag, str) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeString(str);
-    },
-    writeFloatField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFloat(val);
-    },
-    writeDoubleField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeDouble(val);
-    },
-    writeBooleanField: function(tag, val) {
-        this.writeVarintField(tag, Boolean(val));
-    }
-};
+    /**
+     * @type {Array.<Number>}
+     */
+    this.point = point;
 
-function readVarintRemainder(l, s, p) {
-    var buf = p.buf,
-        h, b;
+    /**
+     * Other edge reference
+     * @type {SweepEvent}
+     */
+    this.otherEvent = otherEvent;
 
-    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
+    /**
+     * Belongs to source or clipping polygon
+     * @type {Boolean}
+     */
+    this.isSubject = isSubject;
 
-    throw new Error('Expected varint not more than 10 bytes');
-}
+    /**
+     * Edge contribution type
+     * @type {Number}
+     */
+    this.type = edgeType || NORMAL;
 
-function readPackedEnd(pbf) {
-    return pbf.type === Pbf.Bytes ?
-        pbf.readVarint() + pbf.pos : pbf.pos + 1;
-}
 
-function toNum(low, high, isSigned) {
-    if (isSigned) {
-        return high * 0x100000000 + (low >>> 0);
-    }
+    /**
+     * In-out transition for the sweepline crossing polygon
+     * @type {Boolean}
+     */
+    this.inOut = false;
 
-    return ((high >>> 0) * 0x100000000) + (low >>> 0);
-}
 
-function writeBigVarint(val, pbf) {
-    var low, high;
+    /**
+     * @type {Boolean}
+     */
+    this.otherInOut = false;
 
-    if (val >= 0) {
-        low  = (val % 0x100000000) | 0;
-        high = (val / 0x100000000) | 0;
-    } else {
-        low  = ~(-val % 0x100000000);
-        high = ~(-val / 0x100000000);
+    /**
+     * Previous event in result?
+     * @type {SweepEvent}
+     */
+    this.prevInResult = null;
 
-        if (low ^ 0xffffffff) {
-            low = (low + 1) | 0;
-        } else {
-            low = 0;
-            high = (high + 1) | 0;
-        }
-    }
+    /**
+     * Type of result transition (0 = not in result, +1 = out-in, -1, in-out)
+     * @type {Number}
+     */
+    this.resultTransition = 0;
 
-    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
-        throw new Error('Given varint doesn\'t fit into 10 bytes');
-    }
+    // connection step
 
-    pbf.realloc(10);
+    /**
+     * @type {Number}
+     */
+    this.otherPos = -1;
 
-    writeBigVarintLow(low, high, pbf);
-    writeBigVarintHigh(high, pbf);
-}
+    /**
+     * @type {Number}
+     */
+    this.outputContourId = -1;
 
-function writeBigVarintLow(low, high, pbf) {
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos]   = low & 0x7f;
-}
+    this.isExteriorRing = true; // TODO: Looks unused, remove?
+  };
 
-function writeBigVarintHigh(high, pbf) {
-    var lsb = (high & 0x07) << 4;
+  var prototypeAccessors$1 = { inResult: { configurable: true } };
 
-    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f;
-}
 
-function makeRoomForExtraLength(startPos, len, pbf) {
-    var extraLen =
-        len <= 0x3fff ? 1 :
-        len <= 0x1fffff ? 2 :
-        len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
+  /**
+   * @param{Array.<Number>}p
+   * @return {Boolean}
+   */
+  SweepEvent.prototype.isBelow = function isBelow (p) {
+    var p0 = this.point, p1 = this.otherEvent.point;
+    return this.left
+      ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
+      // signedArea(this.point, this.otherEvent.point, p) > 0 :
+      : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
+      //signedArea(this.otherEvent.point, this.point, p) > 0;
+  };
 
-    // if 1 byte isn't enough for encoding message length, shift the data to the right
-    pbf.realloc(extraLen);
-    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
-}
 
-function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
-function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
-function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
-function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
-function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
-function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
-function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
-function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
-function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
+  /**
+   * @param{Array.<Number>}p
+   * @return {Boolean}
+   */
+  SweepEvent.prototype.isAbove = function isAbove (p) {
+    return !this.isBelow(p);
+  };
 
-// Buffer code below from https://github.com/feross/buffer, MIT-licensed
 
-function readUInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] * 0x1000000);
-}
+  /**
+   * @return {Boolean}
+   */
+  SweepEvent.prototype.isVertical = function isVertical () {
+    return this.point[0] === this.otherEvent.point[0];
+  };
 
-function writeInt32(buf, val, pos) {
-    buf[pos] = val;
-    buf[pos + 1] = (val >>> 8);
-    buf[pos + 2] = (val >>> 16);
-    buf[pos + 3] = (val >>> 24);
-}
 
-function readInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] << 24);
-}
+  /**
+   * Does event belong to result?
+   * @return {Boolean}
+   */
+  prototypeAccessors$1.inResult.get = function () {
+    return this.resultTransition !== 0;
+  };
 
-function readUtf8(buf, pos, end) {
-    var str = '';
-    var i = pos;
 
-    while (i < end) {
-        var b0 = buf[i];
-        var c = null; // codepoint
-        var bytesPerSequence =
-            b0 > 0xEF ? 4 :
-            b0 > 0xDF ? 3 :
-            b0 > 0xBF ? 2 : 1;
+  SweepEvent.prototype.clone = function clone () {
+    var copy = new SweepEvent(
+      this.point, this.left, this.otherEvent, this.isSubject, this.type);
 
-        if (i + bytesPerSequence > end) break;
+    copy.contourId      = this.contourId;
+    copy.resultTransition = this.resultTransition;
+    copy.prevInResult   = this.prevInResult;
+    copy.isExteriorRing = this.isExteriorRing;
+    copy.inOut          = this.inOut;
+    copy.otherInOut     = this.otherInOut;
 
-        var b1, b2, b3;
+    return copy;
+  };
 
-        if (bytesPerSequence === 1) {
-            if (b0 < 0x80) {
-                c = b0;
-            }
-        } else if (bytesPerSequence === 2) {
-            b1 = buf[i + 1];
-            if ((b1 & 0xC0) === 0x80) {
-                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
-                if (c <= 0x7F) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 3) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
-                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 4) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            b3 = buf[i + 3];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
-                if (c <= 0xFFFF || c >= 0x110000) {
-                    c = null;
-                }
-            }
-        }
-
-        if (c === null) {
-            c = 0xFFFD;
-            bytesPerSequence = 1;
-
-        } else if (c > 0xFFFF) {
-            c -= 0x10000;
-            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
-            c = 0xDC00 | c & 0x3FF;
-        }
+  Object.defineProperties( SweepEvent.prototype, prototypeAccessors$1 );
 
-        str += String.fromCharCode(c);
-        i += bytesPerSequence;
+  function equals(p1, p2) {
+    if (p1[0] === p2[0]) {
+      if (p1[1] === p2[1]) {
+        return true;
+      } else {
+        return false;
+      }
     }
+    return false;
+  }
 
-    return str;
-}
-
-function writeUtf8(buf, str, pos) {
-    for (var i = 0, c, lead; i < str.length; i++) {
-        c = str.charCodeAt(i); // code point
+  // const EPSILON = 1e-9;
+  // const abs = Math.abs;
+  // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
+  // Precision problem.
+  //
+  // module.exports = function equals(p1, p2) {
+  //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
+  // };
+
+  var epsilon = 1.1102230246251565e-16;
+  var splitter = 134217729;
+  var resulterrbound = (3 + 8 * epsilon) * epsilon;
+
+  // fast_expansion_sum_zeroelim routine from oritinal code
+  function sum(elen, e, flen, f, h) {
+      var Q, Qnew, hh, bvirt;
+      var enow = e[0];
+      var fnow = f[0];
+      var eindex = 0;
+      var findex = 0;
+      if ((fnow > enow) === (fnow > -enow)) {
+          Q = enow;
+          enow = e[++eindex];
+      } else {
+          Q = fnow;
+          fnow = f[++findex];
+      }
+      var hindex = 0;
+      if (eindex < elen && findex < flen) {
+          if ((fnow > enow) === (fnow > -enow)) {
+              Qnew = enow + Q;
+              hh = Q - (Qnew - enow);
+              enow = e[++eindex];
+          } else {
+              Qnew = fnow + Q;
+              hh = Q - (Qnew - fnow);
+              fnow = f[++findex];
+          }
+          Q = Qnew;
+          if (hh !== 0) {
+              h[hindex++] = hh;
+          }
+          while (eindex < elen && findex < flen) {
+              if ((fnow > enow) === (fnow > -enow)) {
+                  Qnew = Q + enow;
+                  bvirt = Qnew - Q;
+                  hh = Q - (Qnew - bvirt) + (enow - bvirt);
+                  enow = e[++eindex];
+              } else {
+                  Qnew = Q + fnow;
+                  bvirt = Qnew - Q;
+                  hh = Q - (Qnew - bvirt) + (fnow - bvirt);
+                  fnow = f[++findex];
+              }
+              Q = Qnew;
+              if (hh !== 0) {
+                  h[hindex++] = hh;
+              }
+          }
+      }
+      while (eindex < elen) {
+          Qnew = Q + enow;
+          bvirt = Qnew - Q;
+          hh = Q - (Qnew - bvirt) + (enow - bvirt);
+          enow = e[++eindex];
+          Q = Qnew;
+          if (hh !== 0) {
+              h[hindex++] = hh;
+          }
+      }
+      while (findex < flen) {
+          Qnew = Q + fnow;
+          bvirt = Qnew - Q;
+          hh = Q - (Qnew - bvirt) + (fnow - bvirt);
+          fnow = f[++findex];
+          Q = Qnew;
+          if (hh !== 0) {
+              h[hindex++] = hh;
+          }
+      }
+      if (Q !== 0 || hindex === 0) {
+          h[hindex++] = Q;
+      }
+      return hindex;
+  }
 
-        if (c > 0xD7FF && c < 0xE000) {
-            if (lead) {
-                if (c < 0xDC00) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                    lead = c;
-                    continue;
-                } else {
-                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
-                    lead = null;
-                }
-            } else {
-                if (c > 0xDBFF || (i + 1 === str.length)) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                } else {
-                    lead = c;
-                }
-                continue;
-            }
-        } else if (lead) {
-            buf[pos++] = 0xEF;
-            buf[pos++] = 0xBF;
-            buf[pos++] = 0xBD;
-            lead = null;
-        }
+  function estimate(elen, e) {
+      var Q = e[0];
+      for (var i = 1; i < elen; i++) { Q += e[i]; }
+      return Q;
+  }
 
-        if (c < 0x80) {
-            buf[pos++] = c;
-        } else {
-            if (c < 0x800) {
-                buf[pos++] = c >> 0x6 | 0xC0;
-            } else {
-                if (c < 0x10000) {
-                    buf[pos++] = c >> 0xC | 0xE0;
-                } else {
-                    buf[pos++] = c >> 0x12 | 0xF0;
-                    buf[pos++] = c >> 0xC & 0x3F | 0x80;
-                }
-                buf[pos++] = c >> 0x6 & 0x3F | 0x80;
-            }
-            buf[pos++] = c & 0x3F | 0x80;
-        }
-    }
-    return pos;
-}
+  function vec(n) {
+      return new Float64Array(n);
+  }
 
-},{"ieee754":15}],23:[function(require,module,exports){
-'use strict';
+  var ccwerrboundA = (3 + 16 * epsilon) * epsilon;
+  var ccwerrboundB = (2 + 12 * epsilon) * epsilon;
+  var ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;
+
+  var B = vec(4);
+  var C1 = vec(8);
+  var C2 = vec(12);
+  var D = vec(16);
+  var u = vec(4);
+
+  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {
+      var acxtail, acytail, bcxtail, bcytail;
+      var bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
+
+      var acx = ax - cx;
+      var bcx = bx - cx;
+      var acy = ay - cy;
+      var bcy = by - cy;
+
+      s1 = acx * bcy;
+      c = splitter * acx;
+      ahi = c - (c - acx);
+      alo = acx - ahi;
+      c = splitter * bcy;
+      bhi = c - (c - bcy);
+      blo = bcy - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acy * bcx;
+      c = splitter * acy;
+      ahi = c - (c - acy);
+      alo = acy - ahi;
+      c = splitter * bcx;
+      bhi = c - (c - bcx);
+      blo = bcx - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      B[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      B[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      B[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      B[3] = u3;
+
+      var det = estimate(4, B);
+      var errbound = ccwerrboundB * detsum;
+      if (det >= errbound || -det >= errbound) {
+          return det;
+      }
 
-module.exports = partialSort;
+      bvirt = ax - acx;
+      acxtail = ax - (acx + bvirt) + (bvirt - cx);
+      bvirt = bx - bcx;
+      bcxtail = bx - (bcx + bvirt) + (bvirt - cx);
+      bvirt = ay - acy;
+      acytail = ay - (acy + bvirt) + (bvirt - cy);
+      bvirt = by - bcy;
+      bcytail = by - (bcy + bvirt) + (bvirt - cy);
+
+      if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {
+          return det;
+      }
 
-// Floyd-Rivest selection algorithm:
-// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
-// The k-th element will have the (k - left + 1)th smallest value in [left, right]
+      errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);
+      det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);
+      if (det >= errbound || -det >= errbound) { return det; }
+
+      s1 = acxtail * bcy;
+      c = splitter * acxtail;
+      ahi = c - (c - acxtail);
+      alo = acxtail - ahi;
+      c = splitter * bcy;
+      bhi = c - (c - bcy);
+      blo = bcy - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acytail * bcx;
+      c = splitter * acytail;
+      ahi = c - (c - acytail);
+      alo = acytail - ahi;
+      c = splitter * bcx;
+      bhi = c - (c - bcx);
+      blo = bcx - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      u[3] = u3;
+      var C1len = sum(4, B, 4, u, C1);
+
+      s1 = acx * bcytail;
+      c = splitter * acx;
+      ahi = c - (c - acx);
+      alo = acx - ahi;
+      c = splitter * bcytail;
+      bhi = c - (c - bcytail);
+      blo = bcytail - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acy * bcxtail;
+      c = splitter * acy;
+      ahi = c - (c - acy);
+      alo = acy - ahi;
+      c = splitter * bcxtail;
+      bhi = c - (c - bcxtail);
+      blo = bcxtail - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      u[3] = u3;
+      var C2len = sum(C1len, C1, 4, u, C2);
+
+      s1 = acxtail * bcytail;
+      c = splitter * acxtail;
+      ahi = c - (c - acxtail);
+      alo = acxtail - ahi;
+      c = splitter * bcytail;
+      bhi = c - (c - bcytail);
+      blo = bcytail - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acytail * bcxtail;
+      c = splitter * acytail;
+      ahi = c - (c - acytail);
+      alo = acytail - ahi;
+      c = splitter * bcxtail;
+      bhi = c - (c - bcxtail);
+      blo = bcxtail - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      u[3] = u3;
+      var Dlen = sum(C2len, C2, 4, u, D);
+
+      return D[Dlen - 1];
+  }
 
-function partialSort(arr, k, left, right, compare) {
-    left = left || 0;
-    right = right || (arr.length - 1);
-    compare = compare || defaultCompare;
+  function orient2d(ax, ay, bx, by, cx, cy) {
+      var detleft = (ay - cy) * (bx - cx);
+      var detright = (ax - cx) * (by - cy);
+      var det = detleft - detright;
 
-    while (right > left) {
-        if (right - left > 600) {
-            var n = right - left + 1;
-            var m = k - left + 1;
-            var z = Math.log(n);
-            var s = 0.5 * Math.exp(2 * z / 3);
-            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
-            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
-            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-            partialSort(arr, k, newLeft, newRight, compare);
-        }
+      if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) { return det; }
 
-        var t = arr[k];
-        var i = left;
-        var j = right;
+      var detsum = Math.abs(detleft + detright);
+      if (Math.abs(det) >= ccwerrboundA * detsum) { return det; }
 
-        swap(arr, left, k);
-        if (compare(arr[right], t) > 0) swap(arr, left, right);
+      return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);
+  }
 
-        while (i < j) {
-            swap(arr, i, j);
-            i++;
-            j--;
-            while (compare(arr[i], t) < 0) i++;
-            while (compare(arr[j], t) > 0) j--;
-        }
+  /**
+   * Signed area of the triangle (p0, p1, p2)
+   * @param  {Array.<Number>} p0
+   * @param  {Array.<Number>} p1
+   * @param  {Array.<Number>} p2
+   * @return {Number}
+   */
+  function signedArea(p0, p1, p2) {
+    var res = orient2d(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]);
+    if (res > 0) { return -1; }
+    if (res < 0) { return 1; }
+    return 0;
+  }
 
-        if (compare(arr[left], t) === 0) swap(arr, left, j);
-        else {
-            j++;
-            swap(arr, j, right);
-        }
+  /**
+   * @param  {SweepEvent} e1
+   * @param  {SweepEvent} e2
+   * @return {Number}
+   */
+  function compareEvents(e1, e2) {
+    var p1 = e1.point;
+    var p2 = e2.point;
 
-        if (j <= k) left = j + 1;
-        if (k <= j) right = j - 1;
-    }
-}
+    // Different x-coordinate
+    if (p1[0] > p2[0]) { return 1; }
+    if (p1[0] < p2[0]) { return -1; }
 
-function swap(arr, i, j) {
-    var tmp = arr[i];
-    arr[i] = arr[j];
-    arr[j] = tmp;
-}
+    // Different points, but same x-coordinate
+    // Event with lower y-coordinate is processed first
+    if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
 
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
+    return specialCases(e1, e2, p1);
+  }
 
-},{}],24:[function(require,module,exports){
-'use strict';
 
-module.exports = rbush;
+  /* eslint-disable no-unused-vars */
+  function specialCases(e1, e2, p1, p2) {
+    // Same coordinates, but one is a left endpoint and the other is
+    // a right endpoint. The right endpoint is processed first
+    if (e1.left !== e2.left)
+      { return e1.left ? 1 : -1; }
 
-var quickselect = require('quickselect');
+    // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
+    // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
+    // Same coordinates, both events
+    // are left endpoints or right endpoints.
+    // not collinear
+    if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
+      // the event associate to the bottom segment is processed first
+      return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
+    }
 
-function rbush(maxEntries, format) {
-    if (!(this instanceof rbush)) return new rbush(maxEntries, format);
+    return (!e1.isSubject && e2.isSubject) ? 1 : -1;
+  }
+  /* eslint-enable no-unused-vars */
 
-    // max entries in a node is 9 by default; min node fill is 40% for best performance
-    this._maxEntries = Math.max(4, maxEntries || 9);
-    this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
+  /**
+   * @param  {SweepEvent} se
+   * @param  {Array.<Number>} p
+   * @param  {Queue} queue
+   * @return {Queue}
+   */
+  function divideSegment(se, p, queue)  {
+    var r = new SweepEvent(p, false, se,            se.isSubject);
+    var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
 
-    if (format) {
-        this._initFormat(format);
+    /* eslint-disable no-console */
+    if (equals(se.point, se.otherEvent.point)) {
+      console.warn('what is that, a collapsed segment?', se);
     }
+    /* eslint-enable no-console */
 
-    this.clear();
-}
-
-rbush.prototype = {
+    r.contourId = l.contourId = se.contourId;
 
-    all: function () {
-        return this._all(this.data, []);
-    },
+    // avoid a rounding error. The left event would be processed after the right event
+    if (compareEvents(l, se.otherEvent) > 0) {
+      se.otherEvent.left = true;
+      l.left = false;
+    }
 
-    search: function (bbox) {
+    // avoid a rounding error. The left event would be processed after the right event
+    // if (compareEvents(se, r) > 0) {}
 
-        var node = this.data,
-            result = [],
-            toBBox = this.toBBox;
+    se.otherEvent.otherEvent = l;
+    se.otherEvent = r;
 
-        if (!intersects(bbox, node)) return result;
+    queue.push(l);
+    queue.push(r);
 
-        var nodesToSearch = [],
-            i, len, child, childBBox;
+    return queue;
+  }
 
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
+  //const EPS = 1e-9;
 
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
+  /**
+   * Finds the magnitude of the cross product of two vectors (if we pretend
+   * they're in three dimensions)
+   *
+   * @param {Object} a First vector
+   * @param {Object} b Second vector
+   * @private
+   * @returns {Number} The magnitude of the cross product
+   */
+  function crossProduct(a, b) {
+    return (a[0] * b[1]) - (a[1] * b[0]);
+  }
 
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf) result.push(child);
-                    else if (contains(bbox, childBBox)) this._all(child, result);
-                    else nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
+  /**
+   * Finds the dot product of two vectors.
+   *
+   * @param {Object} a First vector
+   * @param {Object} b Second vector
+   * @private
+   * @returns {Number} The dot product
+   */
+  function dotProduct(a, b) {
+    return (a[0] * b[0]) + (a[1] * b[1]);
+  }
 
-        return result;
-    },
+  /**
+   * Finds the intersection (if any) between two line segments a and b, given the
+   * line segments' end points a1, a2 and b1, b2.
+   *
+   * This algorithm is based on Schneider and Eberly.
+   * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
+   * Page 244.
+   *
+   * @param {Array.<Number>} a1 point of first line
+   * @param {Array.<Number>} a2 point of first line
+   * @param {Array.<Number>} b1 point of second line
+   * @param {Array.<Number>} b2 point of second line
+   * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
+   *                                         (meaning connected segments) as
+   *                                         intersections
+   * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
+   * intersection. If they overlap, the two end points of the overlapping segment.
+   * Otherwise, null.
+   */
+  function intersection (a1, a2, b1, b2, noEndpointTouch) {
+    // The algorithm expects our lines in the form P + sd, where P is a point,
+    // s is on the interval [0, 1], and d is a vector.
+    // We are passed two points. P can be the first point of each pair. The
+    // vector, then, could be thought of as the distance (in x and y components)
+    // from the first point to the second point.
+    // So first, let's make our vectors:
+    var va = [a2[0] - a1[0], a2[1] - a1[1]];
+    var vb = [b2[0] - b1[0], b2[1] - b1[1]];
+    // We also define a function to convert back to regular point form:
+
+    /* eslint-disable arrow-body-style */
+
+    function toPoint(p, s, d) {
+      return [
+        p[0] + s * d[0],
+        p[1] + s * d[1]
+      ];
+    }
+
+    /* eslint-enable arrow-body-style */
+
+    // The rest is pretty much a straight port of the algorithm.
+    var e = [b1[0] - a1[0], b1[1] - a1[1]];
+    var kross    = crossProduct(va, vb);
+    var sqrKross = kross * kross;
+    var sqrLenA  = dotProduct(va, va);
+    //const sqrLenB  = dotProduct(vb, vb);
+
+    // Check for line intersection. This works because of the properties of the
+    // cross product -- specifically, two vectors are parallel if and only if the
+    // cross product is the 0 vector. The full calculation involves relative error
+    // to account for possible very small line segments. See Schneider & Eberly
+    // for details.
+    if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
+      // If they're not parallel, then (because these are line segments) they
+      // still might not actually intersect. This code checks that the
+      // intersection point of the lines is actually on both line segments.
+      var s = crossProduct(e, vb) / kross;
+      if (s < 0 || s > 1) {
+        // not on line segment a
+        return null;
+      }
+      var t = crossProduct(e, va) / kross;
+      if (t < 0 || t > 1) {
+        // not on line segment b
+        return null;
+      }
+      if (s === 0 || s === 1) {
+        // on an endpoint of line segment a
+        return noEndpointTouch ? null : [toPoint(a1, s, va)];
+      }
+      if (t === 0 || t === 1) {
+        // on an endpoint of line segment b
+        return noEndpointTouch ? null : [toPoint(b1, t, vb)];
+      }
+      return [toPoint(a1, s, va)];
+    }
 
-    collides: function (bbox) {
+    // If we've reached this point, then the lines are either parallel or the
+    // same, but the segments could overlap partially or fully, or not at all.
+    // So we need to find the overlap, if any. To do that, we can use e, which is
+    // the (vector) difference between the two initial points. If this is parallel
+    // with the line itself, then the two lines are the same line, and there will
+    // be overlap.
+    //const sqrLenE = dotProduct(e, e);
+    kross = crossProduct(e, va);
+    sqrKross = kross * kross;
 
-        var node = this.data,
-            toBBox = this.toBBox;
+    if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
+    // Lines are just parallel, not the same. No overlap.
+      return null;
+    }
 
-        if (!intersects(bbox, node)) return false;
+    var sa = dotProduct(va, e) / sqrLenA;
+    var sb = sa + dotProduct(va, vb) / sqrLenA;
+    var smin = Math.min(sa, sb);
+    var smax = Math.max(sa, sb);
 
-        var nodesToSearch = [],
-            i, len, child, childBBox;
+    // this is, essentially, the FindIntersection acting on floats from
+    // Schneider & Eberly, just inlined into this function.
+    if (smin <= 1 && smax >= 0) {
 
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
+      // overlap on an end point
+      if (smin === 1) {
+        return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
+      }
 
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
+      if (smax === 0) {
+        return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
+      }
 
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf || contains(bbox, childBBox)) return true;
-                    nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
+      if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
 
-        return false;
-    },
+      // There's overlap on a segment -- two points of intersection. Return both.
+      return [
+        toPoint(a1, smin > 0 ? smin : 0, va),
+        toPoint(a1, smax < 1 ? smax : 1, va)
+      ];
+    }
 
-    load: function (data) {
-        if (!(data && data.length)) return this;
+    return null;
+  }
 
-        if (data.length < this._minEntries) {
-            for (var i = 0, len = data.length; i < len; i++) {
-                this.insert(data[i]);
-            }
-            return this;
-        }
+  /**
+   * @param  {SweepEvent} se1
+   * @param  {SweepEvent} se2
+   * @param  {Queue}      queue
+   * @return {Number}
+   */
+  function possibleIntersection (se1, se2, queue) {
+    // that disallows self-intersecting polygons,
+    // did cost us half a day, so I'll leave it
+    // out of respect
+    // if (se1.isSubject === se2.isSubject) return;
+    var inter = intersection(
+      se1.point, se1.otherEvent.point,
+      se2.point, se2.otherEvent.point
+    );
+
+    var nintersections = inter ? inter.length : 0;
+    if (nintersections === 0) { return 0; } // no intersection
+
+    // the line segments intersect at an endpoint of both line segments
+    if ((nintersections === 1) &&
+        (equals(se1.point, se2.point) ||
+         equals(se1.otherEvent.point, se2.otherEvent.point))) {
+      return 0;
+    }
+
+    if (nintersections === 2 && se1.isSubject === se2.isSubject) {
+      // if(se1.contourId === se2.contourId){
+      // console.warn('Edges of the same polygon overlap',
+      //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
+      // }
+      //throw new Error('Edges of the same polygon overlap');
+      return 0;
+    }
+
+    // The line segments associated to se1 and se2 intersect
+    if (nintersections === 1) {
+
+      // if the intersection point is not an endpoint of se1
+      if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
+        divideSegment(se1, inter[0], queue);
+      }
 
-        // recursively build the tree with the given data from stratch using OMT algorithm
-        var node = this._build(data.slice(), 0, data.length - 1, 0);
+      // if the intersection point is not an endpoint of se2
+      if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
+        divideSegment(se2, inter[0], queue);
+      }
+      return 1;
+    }
 
-        if (!this.data.children.length) {
-            // save as is if tree is empty
-            this.data = node;
+    // The line segments associated to se1 and se2 overlap
+    var events        = [];
+    var leftCoincide  = false;
+    var rightCoincide = false;
 
-        } else if (this.data.height === node.height) {
-            // split root if trees have the same height
-            this._splitRoot(this.data, node);
+    if (equals(se1.point, se2.point)) {
+      leftCoincide = true; // linked
+    } else if (compareEvents(se1, se2) === 1) {
+      events.push(se2, se1);
+    } else {
+      events.push(se1, se2);
+    }
 
-        } else {
-            if (this.data.height < node.height) {
-                // swap trees if inserted one is bigger
-                var tmpNode = this.data;
-                this.data = node;
-                node = tmpNode;
-            }
+    if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
+      rightCoincide = true;
+    } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
+      events.push(se2.otherEvent, se1.otherEvent);
+    } else {
+      events.push(se1.otherEvent, se2.otherEvent);
+    }
 
-            // insert the small tree into the large tree at appropriate level
-            this._insert(node, this.data.height - node.height - 1, true);
-        }
+    if ((leftCoincide && rightCoincide) || leftCoincide) {
+      // both line segments are equal or share the left endpoint
+      se2.type = NON_CONTRIBUTING;
+      se1.type = (se2.inOut === se1.inOut)
+        ? SAME_TRANSITION : DIFFERENT_TRANSITION;
 
-        return this;
-    },
+      if (leftCoincide && !rightCoincide) {
+        // honestly no idea, but changing events selection from [2, 1]
+        // to [0, 1] fixes the overlapping self-intersecting polygons issue
+        divideSegment(events[1].otherEvent, events[0].point, queue);
+      }
+      return 2;
+    }
 
-    insert: function (item) {
-        if (item) this._insert(item, this.data.height - 1);
-        return this;
-    },
+    // the line segments share the right endpoint
+    if (rightCoincide) {
+      divideSegment(events[0], events[1].point, queue);
+      return 3;
+    }
 
-    clear: function () {
-        this.data = createNode([]);
-        return this;
-    },
+    // no line segment includes totally the other one
+    if (events[0] !== events[3].otherEvent) {
+      divideSegment(events[0], events[1].point, queue);
+      divideSegment(events[1], events[2].point, queue);
+      return 3;
+    }
 
-    remove: function (item, equalsFn) {
-        if (!item) return this;
+    // one line segment includes the other one
+    divideSegment(events[0], events[1].point, queue);
+    divideSegment(events[3].otherEvent, events[2].point, queue);
 
-        var node = this.data,
-            bbox = this.toBBox(item),
-            path = [],
-            indexes = [],
-            i, parent, index, goingUp;
+    return 3;
+  }
 
-        // depth-first iterative tree traversal
-        while (node || path.length) {
+  /**
+   * @param  {SweepEvent} le1
+   * @param  {SweepEvent} le2
+   * @return {Number}
+   */
+  function compareSegments(le1, le2) {
+    if (le1 === le2) { return 0; }
 
-            if (!node) { // go up
-                node = path.pop();
-                parent = path[path.length - 1];
-                i = indexes.pop();
-                goingUp = true;
-            }
+    // Segments are not collinear
+    if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
+      signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
 
-            if (node.leaf) { // check current node
-                index = findItem(item, node.children, equalsFn);
+      // If they share their left endpoint use the right endpoint to sort
+      if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
 
-                if (index !== -1) {
-                    // item found, remove the item and condense tree upwards
-                    node.children.splice(index, 1);
-                    path.push(node);
-                    this._condense(path);
-                    return this;
-                }
-            }
+      // Different left endpoint: use the left endpoint to sort
+      if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
 
-            if (!goingUp && !node.leaf && contains(node, bbox)) { // go down
-                path.push(node);
-                indexes.push(i);
-                i = 0;
-                parent = node;
-                node = node.children[0];
+      // has the line segment associated to e1 been inserted
+      // into S after the line segment associated to e2 ?
+      if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
 
-            } else if (parent) { // go right
-                i++;
-                node = parent.children[i];
-                goingUp = false;
+      // The line segment associated to e2 has been inserted
+      // into S after the line segment associated to e1
+      return le1.isBelow(le2.point) ? -1 : 1;
+    }
 
-            } else node = null; // nothing found
-        }
+    if (le1.isSubject === le2.isSubject) { // same polygon
+      var p1 = le1.point, p2 = le2.point;
+      if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
+        p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
+        if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
+        else { return le1.contourId > le2.contourId ? 1 : -1; }
+      }
+    } else { // Segments are collinear, but belong to separate polygons
+      return le1.isSubject ? -1 : 1;
+    }
 
-        return this;
-    },
+    return compareEvents(le1, le2) === 1 ? 1 : -1;
+  }
 
-    toBBox: function (item) { return item; },
+  function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
+    var sweepLine = new SplayTree(compareSegments);
+    var sortedEvents = [];
 
-    compareMinX: compareNodeMinX,
-    compareMinY: compareNodeMinY,
+    var rightbound = Math.min(sbbox[2], cbbox[2]);
 
-    toJSON: function () { return this.data; },
+    var prev, next, begin;
 
-    fromJSON: function (data) {
-        this.data = data;
-        return this;
-    },
+    while (eventQueue.length !== 0) {
+      var event = eventQueue.pop();
+      sortedEvents.push(event);
 
-    _all: function (node, result) {
-        var nodesToSearch = [];
-        while (node) {
-            if (node.leaf) result.push.apply(result, node.children);
-            else nodesToSearch.push.apply(nodesToSearch, node.children);
+      // optimization by bboxes for intersection and difference goes here
+      if ((operation === INTERSECTION && event.point[0] > rightbound) ||
+          (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
+        break;
+      }
 
-            node = nodesToSearch.pop();
-        }
-        return result;
-    },
+      if (event.left) {
+        next  = prev = sweepLine.insert(event);
+        begin = sweepLine.minNode();
 
-    _build: function (items, left, right, height) {
+        if (prev !== begin) { prev = sweepLine.prev(prev); }
+        else                { prev = null; }
 
-        var N = right - left + 1,
-            M = this._maxEntries,
-            node;
+        next = sweepLine.next(next);
 
-        if (N <= M) {
-            // reached leaf level; return leaf
-            node = createNode(items.slice(left, right + 1));
-            calcBBox(node, this.toBBox);
-            return node;
+        var prevEvent = prev ? prev.key : null;
+        var prevprevEvent = (void 0);
+        computeFields(event, prevEvent, operation);
+        if (next) {
+          if (possibleIntersection(event, next.key, eventQueue) === 2) {
+            computeFields(event, prevEvent, operation);
+            computeFields(event, next.key, operation);
+          }
         }
 
-        if (!height) {
-            // target height of the bulk-loaded tree
-            height = Math.ceil(Math.log(N) / Math.log(M));
+        if (prev) {
+          if (possibleIntersection(prev.key, event, eventQueue) === 2) {
+            var prevprev = prev;
+            if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
+            else                    { prevprev = null; }
 
-            // target number of root entries to maximize storage utilization
-            M = Math.ceil(N / Math.pow(M, height - 1));
+            prevprevEvent = prevprev ? prevprev.key : null;
+            computeFields(prevEvent, prevprevEvent, operation);
+            computeFields(event,     prevEvent,     operation);
+          }
         }
+      } else {
+        event = event.otherEvent;
+        next = prev = sweepLine.find(event);
 
-        node = createNode([]);
-        node.leaf = false;
-        node.height = height;
-
-        // split the items into M mostly square tiles
-
-        var N2 = Math.ceil(N / M),
-            N1 = N2 * Math.ceil(Math.sqrt(M)),
-            i, j, right2, right3;
-
-        multiSelect(items, left, right, N1, this.compareMinX);
+        if (prev && next) {
 
-        for (i = left; i <= right; i += N1) {
+          if (prev !== begin) { prev = sweepLine.prev(prev); }
+          else                { prev = null; }
 
-            right2 = Math.min(i + N1 - 1, right);
+          next = sweepLine.next(next);
+          sweepLine.remove(event);
 
-            multiSelect(items, i, right2, N2, this.compareMinY);
+          if (next && prev) {
+            possibleIntersection(prev.key, next.key, eventQueue);
+          }
+        }
+      }
+    }
+    return sortedEvents;
+  }
 
-            for (j = i; j <= right2; j += N2) {
+  var Contour = function Contour() {
+    this.points = [];
+    this.holeIds = [];
+    this.holeOf = null;
+    this.depth = null;
+  };
 
-                right3 = Math.min(j + N2 - 1, right2);
+  Contour.prototype.isExterior = function isExterior () {
+    return this.holeOf == null;
+  };
 
-                // pack each entry recursively
-                node.children.push(this._build(items, j, right3, height - 1));
-            }
+  /**
+   * @param  {Array.<SweepEvent>} sortedEvents
+   * @return {Array.<SweepEvent>}
+   */
+  function orderEvents(sortedEvents) {
+    var event, i, len, tmp;
+    var resultEvents = [];
+    for (i = 0, len = sortedEvents.length; i < len; i++) {
+      event = sortedEvents[i];
+      if ((event.left && event.inResult) ||
+        (!event.left && event.otherEvent.inResult)) {
+        resultEvents.push(event);
+      }
+    }
+    // Due to overlapping edges the resultEvents array can be not wholly sorted
+    var sorted = false;
+    while (!sorted) {
+      sorted = true;
+      for (i = 0, len = resultEvents.length; i < len; i++) {
+        if ((i + 1) < len &&
+          compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
+          tmp = resultEvents[i];
+          resultEvents[i] = resultEvents[i + 1];
+          resultEvents[i + 1] = tmp;
+          sorted = false;
         }
+      }
+    }
 
-        calcBBox(node, this.toBBox);
 
-        return node;
-    },
+    for (i = 0, len = resultEvents.length; i < len; i++) {
+      event = resultEvents[i];
+      event.otherPos = i;
+    }
 
-    _chooseSubtree: function (bbox, node, level, path) {
+    // imagine, the right event is found in the beginning of the queue,
+    // when his left counterpart is not marked yet
+    for (i = 0, len = resultEvents.length; i < len; i++) {
+      event = resultEvents[i];
+      if (!event.left) {
+        tmp = event.otherPos;
+        event.otherPos = event.otherEvent.otherPos;
+        event.otherEvent.otherPos = tmp;
+      }
+    }
 
-        var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
+    return resultEvents;
+  }
 
-        while (true) {
-            path.push(node);
 
-            if (node.leaf || path.length - 1 === level) break;
+  /**
+   * @param  {Number} pos
+   * @param  {Array.<SweepEvent>} resultEvents
+   * @param  {Object>}    processed
+   * @return {Number}
+   */
+  function nextPos(pos, resultEvents, processed, origPos) {
+    var newPos = pos + 1,
+        p = resultEvents[pos].point,
+        p1;
+    var length = resultEvents.length;
+
+    if (newPos < length)
+      { p1 = resultEvents[newPos].point; }
+
+    while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
+      if (!processed[newPos]) {
+        return newPos;
+      } else   {
+        newPos++;
+      }
+      p1 = resultEvents[newPos].point;
+    }
 
-            minArea = minEnlargement = Infinity;
+    newPos = pos - 1;
 
-            for (i = 0, len = node.children.length; i < len; i++) {
-                child = node.children[i];
-                area = bboxArea(child);
-                enlargement = enlargedArea(bbox, child) - area;
+    while (processed[newPos] && newPos > origPos) {
+      newPos--;
+    }
 
-                // choose entry with the least area enlargement
-                if (enlargement < minEnlargement) {
-                    minEnlargement = enlargement;
-                    minArea = area < minArea ? area : minArea;
-                    targetNode = child;
+    return newPos;
+  }
 
-                } else if (enlargement === minEnlargement) {
-                    // otherwise choose one with the smallest area
-                    if (area < minArea) {
-                        minArea = area;
-                        targetNode = child;
-                    }
-                }
-            }
 
-            node = targetNode || node.children[0];
+  function initializeContourFromContext(event, contours, contourId) {
+    var contour = new Contour();
+    if (event.prevInResult != null) {
+      var prevInResult = event.prevInResult;
+      // Note that it is valid to query the "previous in result" for its output contour id,
+      // because we must have already processed it (i.e., assigned an output contour id)
+      // in an earlier iteration, otherwise it wouldn't be possible that it is "previous in
+      // result".
+      var lowerContourId = prevInResult.outputContourId;
+      var lowerResultTransition = prevInResult.resultTransition;
+      if (lowerResultTransition > 0) {
+        // We are inside. Now we have to check if the thing below us is another hole or
+        // an exterior contour.
+        var lowerContour = contours[lowerContourId];
+        if (lowerContour.holeOf != null) {
+          // The lower contour is a hole => Connect the new contour as a hole to its parent,
+          // and use same depth.
+          var parentContourId = lowerContour.holeOf;
+          contours[parentContourId].holeIds.push(contourId);
+          contour.holeOf = parentContourId;
+          contour.depth = contours[lowerContourId].depth;
+        } else {
+          // The lower contour is an exterior contour => Connect the new contour as a hole,
+          // and increment depth.
+          contours[lowerContourId].holeIds.push(contourId);
+          contour.holeOf = lowerContourId;
+          contour.depth = contours[lowerContourId].depth + 1;
         }
+      } else {
+        // We are outside => this contour is an exterior contour of same depth.
+        contour.holeOf = null;
+        contour.depth = contours[lowerContourId].depth;
+      }
+    } else {
+      // There is no lower/previous contour => this contour is an exterior contour of depth 0.
+      contour.holeOf = null;
+      contour.depth = 0;
+    }
+    return contour;
+  }
 
-        return node;
-    },
+  /**
+   * @param  {Array.<SweepEvent>} sortedEvents
+   * @return {Array.<*>} polygons
+   */
+  function connectEdges(sortedEvents) {
+    var i, len;
+    var resultEvents = orderEvents(sortedEvents);
 
-    _insert: function (item, level, isNode) {
+    // "false"-filled array
+    var processed = {};
+    var contours = [];
 
-        var toBBox = this.toBBox,
-            bbox = isNode ? item : toBBox(item),
-            insertPath = [];
+    var loop = function (  ) {
 
-        // find the best node for accommodating the item, saving all nodes along the path too
-        var node = this._chooseSubtree(bbox, this.data, level, insertPath);
+      if (processed[i]) {
+        return;
+      }
 
-        // put the item into the node
-        node.children.push(item);
-        extend(node, bbox);
+      var contourId = contours.length;
+      var contour = initializeContourFromContext(resultEvents[i], contours, contourId);
 
-        // split on node overflow; propagate upwards if necessary
-        while (level >= 0) {
-            if (insertPath[level].children.length > this._maxEntries) {
-                this._split(insertPath, level);
-                level--;
-            } else break;
-        }
+      // Helper function that combines marking an event as processed with assigning its output contour ID
+      var markAsProcessed = function (pos) {
+        processed[pos] = true;
+        resultEvents[pos].outputContourId = contourId;
+      };
 
-        // adjust bboxes along the insertion path
-        this._adjustParentBBoxes(bbox, insertPath, level);
-    },
+      var pos = i;
+      var origPos = i;
 
-    // split overflowed node into two
-    _split: function (insertPath, level) {
+      var initial = resultEvents[i].point;
+      contour.points.push(initial);
 
-        var node = insertPath[level],
-            M = node.children.length,
-            m = this._minEntries;
+      /* eslint no-constant-condition: "off" */
+      while (true) {
+        markAsProcessed(pos);
 
-        this._chooseSplitAxis(node, m, M);
+        pos = resultEvents[pos].otherPos;
 
-        var splitIndex = this._chooseSplitIndex(node, m, M);
+        markAsProcessed(pos);
+        contour.points.push(resultEvents[pos].point);
 
-        var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
-        newNode.height = node.height;
-        newNode.leaf = node.leaf;
+        pos = nextPos(pos, resultEvents, processed, origPos);
 
-        calcBBox(node, this.toBBox);
-        calcBBox(newNode, this.toBBox);
+        if (pos == origPos) {
+          break;
+        }
+      }
 
-        if (level) insertPath[level - 1].children.push(newNode);
-        else this._splitRoot(node, newNode);
-    },
+      contours.push(contour);
+    };
 
-    _splitRoot: function (node, newNode) {
-        // split root node
-        this.data = createNode([node, newNode]);
-        this.data.height = node.height + 1;
-        this.data.leaf = false;
-        calcBBox(this.data, this.toBBox);
-    },
+    for (i = 0, len = resultEvents.length; i < len; i++) loop(  );
 
-    _chooseSplitIndex: function (node, m, M) {
+    return contours;
+  }
 
-        var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
+  var tinyqueue = TinyQueue;
+  var default_1 = TinyQueue;
 
-        minOverlap = minArea = Infinity;
+  function TinyQueue(data, compare) {
+      if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
 
-        for (i = m; i <= M - m; i++) {
-            bbox1 = distBBox(node, 0, i, this.toBBox);
-            bbox2 = distBBox(node, i, M, this.toBBox);
+      this.data = data || [];
+      this.length = this.data.length;
+      this.compare = compare || defaultCompare;
 
-            overlap = intersectionArea(bbox1, bbox2);
-            area = bboxArea(bbox1) + bboxArea(bbox2);
+      if (this.length > 0) {
+          for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); }
+      }
+  }
 
-            // choose distribution with minimum overlap
-            if (overlap < minOverlap) {
-                minOverlap = overlap;
-                index = i;
+  function defaultCompare(a, b) {
+      return a < b ? -1 : a > b ? 1 : 0;
+  }
 
-                minArea = area < minArea ? area : minArea;
+  TinyQueue.prototype = {
 
-            } else if (overlap === minOverlap) {
-                // otherwise choose distribution with minimum area
-                if (area < minArea) {
-                    minArea = area;
-                    index = i;
-                }
-            }
-        }
+      push: function (item) {
+          this.data.push(item);
+          this.length++;
+          this._up(this.length - 1);
+      },
 
-        return index;
-    },
+      pop: function () {
+          if (this.length === 0) { return undefined; }
 
-    // sorts node children by the best axis for split
-    _chooseSplitAxis: function (node, m, M) {
+          var top = this.data[0];
+          this.length--;
 
-        var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
-            compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
-            xMargin = this._allDistMargin(node, m, M, compareMinX),
-            yMargin = this._allDistMargin(node, m, M, compareMinY);
+          if (this.length > 0) {
+              this.data[0] = this.data[this.length];
+              this._down(0);
+          }
+          this.data.pop();
+
+          return top;
+      },
+
+      peek: function () {
+          return this.data[0];
+      },
+
+      _up: function (pos) {
+          var data = this.data;
+          var compare = this.compare;
+          var item = data[pos];
+
+          while (pos > 0) {
+              var parent = (pos - 1) >> 1;
+              var current = data[parent];
+              if (compare(item, current) >= 0) { break; }
+              data[pos] = current;
+              pos = parent;
+          }
 
-        // if total distributions margin value is minimal for x, sort by minX,
-        // otherwise it's already sorted by minY
-        if (xMargin < yMargin) node.children.sort(compareMinX);
-    },
+          data[pos] = item;
+      },
 
-    // total margin of all possible split distributions where each node is at least m full
-    _allDistMargin: function (node, m, M, compare) {
+      _down: function (pos) {
+          var data = this.data;
+          var compare = this.compare;
+          var halfLength = this.length >> 1;
+          var item = data[pos];
 
-        node.children.sort(compare);
+          while (pos < halfLength) {
+              var left = (pos << 1) + 1;
+              var right = left + 1;
+              var best = data[left];
 
-        var toBBox = this.toBBox,
-            leftBBox = distBBox(node, 0, m, toBBox),
-            rightBBox = distBBox(node, M - m, M, toBBox),
-            margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
-            i, child;
+              if (right < this.length && compare(data[right], best) < 0) {
+                  left = right;
+                  best = data[right];
+              }
+              if (compare(best, item) >= 0) { break; }
 
-        for (i = m; i < M - m; i++) {
-            child = node.children[i];
-            extend(leftBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(leftBBox);
-        }
+              data[pos] = best;
+              pos = left;
+          }
 
-        for (i = M - m - 1; i >= m; i--) {
-            child = node.children[i];
-            extend(rightBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(rightBBox);
-        }
+          data[pos] = item;
+      }
+  };
+  tinyqueue.default = default_1;
 
-        return margin;
-    },
+  var max = Math.max;
+  var min = Math.min;
 
-    _adjustParentBBoxes: function (bbox, path, level) {
-        // adjust bboxes along the given tree path
-        for (var i = level; i >= 0; i--) {
-            extend(path[i], bbox);
-        }
-    },
+  var contourId = 0;
 
-    _condense: function (path) {
-        // go through the path, removing empty nodes and updating bboxes
-        for (var i = path.length - 1, siblings; i >= 0; i--) {
-            if (path[i].children.length === 0) {
-                if (i > 0) {
-                    siblings = path[i - 1].children;
-                    siblings.splice(siblings.indexOf(path[i]), 1);
 
-                } else this.clear();
+  function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
+    var i, len, s1, s2, e1, e2;
+    for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
+      s1 = contourOrHole[i];
+      s2 = contourOrHole[i + 1];
+      e1 = new SweepEvent(s1, false, undefined, isSubject);
+      e2 = new SweepEvent(s2, false, e1,        isSubject);
+      e1.otherEvent = e2;
 
-            } else calcBBox(path[i], this.toBBox);
-        }
-    },
+      if (s1[0] === s2[0] && s1[1] === s2[1]) {
+        continue; // skip collapsed edges, or it breaks
+      }
+
+      e1.contourId = e2.contourId = depth;
+      if (!isExteriorRing) {
+        e1.isExteriorRing = false;
+        e2.isExteriorRing = false;
+      }
+      if (compareEvents(e1, e2) > 0) {
+        e2.left = true;
+      } else {
+        e1.left = true;
+      }
+
+      var x = s1[0], y = s1[1];
+      bbox[0] = min(bbox[0], x);
+      bbox[1] = min(bbox[1], y);
+      bbox[2] = max(bbox[2], x);
+      bbox[3] = max(bbox[3], y);
 
-    _initFormat: function (format) {
-        // data format (minX, minY, maxX, maxY accessors)
+      // Pushing it so the queue is sorted from left to right,
+      // with object on the left having the highest priority.
+      Q.push(e1);
+      Q.push(e2);
+    }
+  }
 
-        // uses eval-type function compilation instead of just accepting a toBBox function
-        // because the algorithms are very sensitive to sorting functions performance,
-        // so they should be dead simple and without inner calls
 
-        var compareArr = ['return a', ' - b', ';'];
+  function fillQueue(subject, clipping, sbbox, cbbox, operation) {
+    var eventQueue = new tinyqueue(null, compareEvents);
+    var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
 
-        this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
-        this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
+    for (i = 0, ii = subject.length; i < ii; i++) {
+      polygonSet = subject[i];
+      for (j = 0, jj = polygonSet.length; j < jj; j++) {
+        isExteriorRing = j === 0;
+        if (isExteriorRing) { contourId++; }
+        processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
+      }
+    }
 
-        this.toBBox = new Function('a',
-            'return {minX: a' + format[0] +
-            ', minY: a' + format[1] +
-            ', maxX: a' + format[2] +
-            ', maxY: a' + format[3] + '};');
+    for (i = 0, ii = clipping.length; i < ii; i++) {
+      polygonSet = clipping[i];
+      for (j = 0, jj = polygonSet.length; j < jj; j++) {
+        isExteriorRing = j === 0;
+        if (operation === DIFFERENCE) { isExteriorRing = false; }
+        if (isExteriorRing) { contourId++; }
+        processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
+      }
     }
-};
 
-function findItem(item, items, equalsFn) {
-    if (!equalsFn) return items.indexOf(item);
+    return eventQueue;
+  }
+
+  var EMPTY = [];
 
-    for (var i = 0; i < items.length; i++) {
-        if (equalsFn(item, items[i])) return i;
+
+  function trivialOperation(subject, clipping, operation) {
+    var result = null;
+    if (subject.length * clipping.length === 0) {
+      if        (operation === INTERSECTION) {
+        result = EMPTY;
+      } else if (operation === DIFFERENCE) {
+        result = subject;
+      } else if (operation === UNION ||
+                 operation === XOR) {
+        result = (subject.length === 0) ? clipping : subject;
+      }
     }
-    return -1;
-}
+    return result;
+  }
 
-// calculate node's bbox from bboxes of its children
-function calcBBox(node, toBBox) {
-    distBBox(node, 0, node.children.length, toBBox, node);
-}
 
-// min bounding rectangle of node children from k to p-1
-function distBBox(node, k, p, toBBox, destNode) {
-    if (!destNode) destNode = createNode(null);
-    destNode.minX = Infinity;
-    destNode.minY = Infinity;
-    destNode.maxX = -Infinity;
-    destNode.maxY = -Infinity;
+  function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
+    var result = null;
+    if (sbbox[0] > cbbox[2] ||
+        cbbox[0] > sbbox[2] ||
+        sbbox[1] > cbbox[3] ||
+        cbbox[1] > sbbox[3]) {
+      if        (operation === INTERSECTION) {
+        result = EMPTY;
+      } else if (operation === DIFFERENCE) {
+        result = subject;
+      } else if (operation === UNION ||
+                 operation === XOR) {
+        result = subject.concat(clipping);
+      }
+    }
+    return result;
+  }
+
 
-    for (var i = k, child; i < p; i++) {
-        child = node.children[i];
-        extend(destNode, node.leaf ? toBBox(child) : child);
+  function boolean(subject, clipping, operation) {
+    if (typeof subject[0][0][0] === 'number') {
+      subject = [subject];
+    }
+    if (typeof clipping[0][0][0] === 'number') {
+      clipping = [clipping];
     }
+    var trivial = trivialOperation(subject, clipping, operation);
+    if (trivial) {
+      return trivial === EMPTY ? null : trivial;
+    }
+    var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
+    var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
 
-    return destNode;
-}
+    // console.time('fill queue');
+    var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
+    //console.timeEnd('fill queue');
 
-function extend(a, b) {
-    a.minX = Math.min(a.minX, b.minX);
-    a.minY = Math.min(a.minY, b.minY);
-    a.maxX = Math.max(a.maxX, b.maxX);
-    a.maxY = Math.max(a.maxY, b.maxY);
-    return a;
-}
+    trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
+    if (trivial) {
+      return trivial === EMPTY ? null : trivial;
+    }
+    // console.time('subdivide edges');
+    var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
+    //console.timeEnd('subdivide edges');
 
-function compareNodeMinX(a, b) { return a.minX - b.minX; }
-function compareNodeMinY(a, b) { return a.minY - b.minY; }
+    // console.time('connect vertices');
+    var contours = connectEdges(sortedEvents);
+    //console.timeEnd('connect vertices');
 
-function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
-function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
+    // Convert contours to polygons
+    var polygons = [];
+    for (var i = 0; i < contours.length; i++) {
+      var contour = contours[i];
+      if (contour.isExterior()) {
+        // The exterior ring goes first
+        var rings = [contour.points];
+        // Followed by holes if any
+        for (var j = 0; j < contour.holeIds.length; j++) {
+          var holeId = contour.holeIds[j];
+          rings.push(contours[holeId].points);
+        }
+        polygons.push(rings);
+      }
+    }
 
-function enlargedArea(a, b) {
-    return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
-           (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
-}
+    return polygons;
+  }
 
-function intersectionArea(a, b) {
-    var minX = Math.max(a.minX, b.minX),
-        minY = Math.max(a.minY, b.minY),
-        maxX = Math.min(a.maxX, b.maxX),
-        maxY = Math.min(a.maxY, b.maxY);
+  function union (subject, clipping) {
+    return boolean(subject, clipping, UNION);
+  }
 
-    return Math.max(0, maxX - minX) *
-           Math.max(0, maxY - minY);
-}
+  function diff (subject, clipping) {
+    return boolean(subject, clipping, DIFFERENCE);
+  }
 
-function contains(a, b) {
-    return a.minX <= b.minX &&
-           a.minY <= b.minY &&
-           b.maxX <= a.maxX &&
-           b.maxY <= a.maxY;
-}
+  function xor (subject, clipping) {
+    return boolean(subject, clipping, XOR);
+  }
 
-function intersects(a, b) {
-    return b.minX <= a.maxX &&
-           b.minY <= a.maxY &&
-           b.maxX >= a.minX &&
-           b.maxY >= a.minY;
-}
+  function intersection$1 (subject, clipping) {
+    return boolean(subject, clipping, INTERSECTION);
+  }
 
-function createNode(children) {
-    return {
-        children: children,
-        height: 1,
-        leaf: true,
-        minX: Infinity,
-        minY: Infinity,
-        maxX: -Infinity,
-        maxY: -Infinity
-    };
-}
+  /**
+   * @enum {Number}
+   */
+  var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
+
+  exports.diff = diff;
+  exports.intersection = intersection$1;
+  exports.operations = operations;
+  exports.union = union;
+  exports.xor = xor;
+
+  Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
+
+
+},{}],23:[function(require,module,exports){
+// Top level file is just a mixin of submodules & constants
+'use strict';
+
+var assign    = require('./lib/utils/common').assign;
+
+var deflate   = require('./lib/deflate');
+var inflate   = require('./lib/inflate');
+var constants = require('./lib/zlib/constants');
+
+var pako = {};
+
+assign(pako, deflate, inflate, constants);
+
+module.exports = pako;
+
+},{"./lib/deflate":24,"./lib/inflate":25,"./lib/utils/common":26,"./lib/zlib/constants":29}],24:[function(require,module,exports){
+'use strict';
+
+
+var zlib_deflate = require('./zlib/deflate');
+var utils        = require('./utils/common');
+var strings      = require('./utils/strings');
+var msg          = require('./zlib/messages');
+var ZStream      = require('./zlib/zstream');
+
+var toString = Object.prototype.toString;
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+var Z_NO_FLUSH      = 0;
+var Z_FINISH        = 4;
+
+var Z_OK            = 0;
+var Z_STREAM_END    = 1;
+var Z_SYNC_FLUSH    = 2;
+
+var Z_DEFAULT_COMPRESSION = -1;
+
+var Z_DEFAULT_STRATEGY    = 0;
+
+var Z_DEFLATED  = 8;
+
+/* ===========================================================================*/
+
+
+/**
+ * class Deflate
+ *
+ * Generic JS-style wrapper for zlib calls. If you don't need
+ * streaming behaviour - use more simple functions: [[deflate]],
+ * [[deflateRaw]] and [[gzip]].
+ **/
+
+/* internal
+ * Deflate.chunks -> Array
+ *
+ * Chunks of output data, if [[Deflate#onData]] not overridden.
+ **/
 
-// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
-// combines selection algorithm with binary divide & conquer approach
+/**
+ * Deflate.result -> Uint8Array|Array
+ *
+ * Compressed result, generated by default [[Deflate#onData]]
+ * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
+ * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you
+ * push a chunk with explicit flush (call [[Deflate#push]] with
+ * `Z_SYNC_FLUSH` param).
+ **/
+
+/**
+ * Deflate.err -> Number
+ *
+ * Error code after deflate finished. 0 (Z_OK) on success.
+ * You will not need it in real life, because deflate errors
+ * are possible only on wrong options or bad `onData` / `onEnd`
+ * custom handlers.
+ **/
+
+/**
+ * Deflate.msg -> String
+ *
+ * Error message, if [[Deflate.err]] != 0
+ **/
+
+
+/**
+ * new Deflate(options)
+ * - options (Object): zlib deflate options.
+ *
+ * Creates new deflator instance with specified params. Throws exception
+ * on bad params. Supported options:
+ *
+ * - `level`
+ * - `windowBits`
+ * - `memLevel`
+ * - `strategy`
+ * - `dictionary`
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information on these.
+ *
+ * Additional options, for internal needs:
+ *
+ * - `chunkSize` - size of generated data chunks (16K by default)
+ * - `raw` (Boolean) - do raw deflate
+ * - `gzip` (Boolean) - create gzip wrapper
+ * - `to` (String) - if equal to 'string', then result will be "binary string"
+ *    (each char code [0..255])
+ * - `header` (Object) - custom header for gzip
+ *   - `text` (Boolean) - true if compressed data believed to be text
+ *   - `time` (Number) - modification time, unix timestamp
+ *   - `os` (Number) - operation system code
+ *   - `extra` (Array) - array of bytes with extra data (max 65536)
+ *   - `name` (String) - file name (binary string)
+ *   - `comment` (String) - comment (binary string)
+ *   - `hcrc` (Boolean) - true if header crc should be added
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
+ *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
+ *
+ * var deflate = new pako.Deflate({ level: 3});
+ *
+ * deflate.push(chunk1, false);
+ * deflate.push(chunk2, true);  // true -> last chunk
+ *
+ * if (deflate.err) { throw new Error(deflate.err); }
+ *
+ * console.log(deflate.result);
+ * ```
+ **/
+function Deflate(options) {
+  if (!(this instanceof Deflate)) return new Deflate(options);
+
+  this.options = utils.assign({
+    level: Z_DEFAULT_COMPRESSION,
+    method: Z_DEFLATED,
+    chunkSize: 16384,
+    windowBits: 15,
+    memLevel: 8,
+    strategy: Z_DEFAULT_STRATEGY,
+    to: ''
+  }, options || {});
+
+  var opt = this.options;
+
+  if (opt.raw && (opt.windowBits > 0)) {
+    opt.windowBits = -opt.windowBits;
+  }
 
-function multiSelect(arr, left, right, n, compare) {
-    var stack = [left, right],
-        mid;
+  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
+    opt.windowBits += 16;
+  }
+
+  this.err    = 0;      // error code, if happens (0 = Z_OK)
+  this.msg    = '';     // error message
+  this.ended  = false;  // used to avoid multiple onEnd() calls
+  this.chunks = [];     // chunks of compressed data
+
+  this.strm = new ZStream();
+  this.strm.avail_out = 0;
+
+  var status = zlib_deflate.deflateInit2(
+    this.strm,
+    opt.level,
+    opt.method,
+    opt.windowBits,
+    opt.memLevel,
+    opt.strategy
+  );
+
+  if (status !== Z_OK) {
+    throw new Error(msg[status]);
+  }
 
-    while (stack.length) {
-        right = stack.pop();
-        left = stack.pop();
+  if (opt.header) {
+    zlib_deflate.deflateSetHeader(this.strm, opt.header);
+  }
 
-        if (right - left <= n) continue;
+  if (opt.dictionary) {
+    var dict;
+    // Convert data if needed
+    if (typeof opt.dictionary === 'string') {
+      // If we need to compress text, change encoding to utf8.
+      dict = strings.string2buf(opt.dictionary);
+    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
+      dict = new Uint8Array(opt.dictionary);
+    } else {
+      dict = opt.dictionary;
+    }
 
-        mid = left + Math.ceil((right - left) / n / 2) * n;
-        quickselect(arr, mid, left, right, compare);
+    status = zlib_deflate.deflateSetDictionary(this.strm, dict);
 
-        stack.push(left, mid, mid, right);
+    if (status !== Z_OK) {
+      throw new Error(msg[status]);
     }
+
+    this._dict_set = true;
+  }
 }
 
-},{"quickselect":23}],25:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('./Subject');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
 /**
- * @class BehaviorSubject<T>
- */
-var BehaviorSubject = (function (_super) {
-    __extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        _super.call(this);
-        this._value = _value;
+ * Deflate#push(data[, mode]) -> Boolean
+ * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be
+ *   converted to utf8 byte sequence.
+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
+ *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
+ *
+ * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
+ * new compressed chunks. Returns `true` on success. The last data block must have
+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
+ * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you
+ * can use mode Z_SYNC_FLUSH, keeping the compression context.
+ *
+ * On fail call [[Deflate#onEnd]] with error code and return false.
+ *
+ * We strongly recommend to use `Uint8Array` on input for best speed (output
+ * array format is detected automatically). Also, don't skip last param and always
+ * use the same type in your code (boolean or number). That will improve JS speed.
+ *
+ * For regular `Array`-s make sure all elements are [0..255].
+ *
+ * ##### Example
+ *
+ * ```javascript
+ * push(chunk, false); // push one of data chunks
+ * ...
+ * push(chunk, true);  // push last chunk
+ * ```
+ **/
+Deflate.prototype.push = function (data, mode) {
+  var strm = this.strm;
+  var chunkSize = this.options.chunkSize;
+  var status, _mode;
+
+  if (this.ended) { return false; }
+
+  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
+
+  // Convert data if needed
+  if (typeof data === 'string') {
+    // If we need to compress text, change encoding to utf8.
+    strm.input = strings.string2buf(data);
+  } else if (toString.call(data) === '[object ArrayBuffer]') {
+    strm.input = new Uint8Array(data);
+  } else {
+    strm.input = data;
+  }
+
+  strm.next_in = 0;
+  strm.avail_in = strm.input.length;
+
+  do {
+    if (strm.avail_out === 0) {
+      strm.output = new utils.Buf8(chunkSize);
+      strm.next_out = 0;
+      strm.avail_out = chunkSize;
     }
-    Object.defineProperty(BehaviorSubject.prototype, "value", {
-        get: function () {
-            return this.getValue();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    BehaviorSubject.prototype._subscribe = function (subscriber) {
-        var subscription = _super.prototype._subscribe.call(this, subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    };
-    BehaviorSubject.prototype.getValue = function () {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
-        }
-    };
-    BehaviorSubject.prototype.next = function (value) {
-        _super.prototype.next.call(this, this._value = value);
-    };
-    return BehaviorSubject;
-}(Subject_1.Subject));
-exports.BehaviorSubject = BehaviorSubject;
+    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
 
-},{"./Subject":33,"./util/ObjectUnsubscribedError":145}],26:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    if (status !== Z_STREAM_END && status !== Z_OK) {
+      this.onEnd(status);
+      this.ended = true;
+      return false;
+    }
+    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {
+      if (this.options.to === 'string') {
+        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
+      } else {
+        this.onData(utils.shrinkBuf(strm.output, strm.next_out));
+      }
+    }
+  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
+
+  // Finalize on the last chunk.
+  if (_mode === Z_FINISH) {
+    status = zlib_deflate.deflateEnd(this.strm);
+    this.onEnd(status);
+    this.ended = true;
+    return status === Z_OK;
+  }
+
+  // callback interim results if Z_SYNC_FLUSH.
+  if (_mode === Z_SYNC_FLUSH) {
+    this.onEnd(Z_OK);
+    strm.avail_out = 0;
+    return true;
+  }
+
+  return true;
 };
-var Subscriber_1 = require('./Subscriber');
+
+
 /**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var InnerSubscriber = (function (_super) {
-    __extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        _super.call(this);
-        this.parent = parent;
-        this.outerValue = outerValue;
-        this.outerIndex = outerIndex;
-        this.index = 0;
-    }
-    InnerSubscriber.prototype._next = function (value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    };
-    InnerSubscriber.prototype._error = function (error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    };
-    InnerSubscriber.prototype._complete = function () {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    };
-    return InnerSubscriber;
-}(Subscriber_1.Subscriber));
-exports.InnerSubscriber = InnerSubscriber;
+ * Deflate#onData(chunk) -> Void
+ * - chunk (Uint8Array|Array|String): output data. Type of array depends
+ *   on js engine support. When string output requested, each chunk
+ *   will be string.
+ *
+ * By default, stores data blocks in `chunks[]` property and glue
+ * those in `onEnd`. Override this handler, if you need another behaviour.
+ **/
+Deflate.prototype.onData = function (chunk) {
+  this.chunks.push(chunk);
+};
+
 
-},{"./Subscriber":35}],27:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('./Observable');
 /**
- * Represents a push-based event or value that an {@link Observable} can emit.
- * This class is particularly useful for operators that manage notifications,
- * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
- * others. Besides wrapping the actual delivered value, it also annotates it
- * with metadata of, for instance, what type of push message it is (`next`,
- * `error`, or `complete`).
- *
- * @see {@link materialize}
- * @see {@link dematerialize}
- * @see {@link observeOn}
- *
- * @class Notification<T>
- */
-var Notification = (function () {
-    function Notification(kind, value, exception) {
-        this.kind = kind;
-        this.value = value;
-        this.exception = exception;
-        this.hasValue = kind === 'N';
+ * Deflate#onEnd(status) -> Void
+ * - status (Number): deflate status. 0 (Z_OK) on success,
+ *   other if not.
+ *
+ * Called once after you tell deflate that the input stream is
+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
+ * or if an error happened. By default - join collected chunks,
+ * free memory and fill `results` / `err` properties.
+ **/
+Deflate.prototype.onEnd = function (status) {
+  // On success - join
+  if (status === Z_OK) {
+    if (this.options.to === 'string') {
+      this.result = this.chunks.join('');
+    } else {
+      this.result = utils.flattenChunks(this.chunks);
     }
-    /**
-     * Delivers to the given `observer` the value wrapped by this Notification.
-     * @param {Observer} observer
-     * @return
-     */
-    Notification.prototype.observe = function (observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.exception);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    };
-    /**
-     * Given some {@link Observer} callbacks, deliver the value represented by the
-     * current Notification to the correctly corresponding callback.
-     * @param {function(value: T): void} next An Observer `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    Notification.prototype.do = function (next, error, complete) {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.exception);
-            case 'C':
-                return complete && complete();
-        }
-    };
-    /**
-     * Takes an Observer or its individual callback functions, and calls `observe`
-     * or `do` methods accordingly.
-     * @param {Observer|function(value: T): void} nextOrObserver An Observer or
-     * the `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    /**
-     * Returns a simple Observable that just delivers the notification represented
-     * by this Notification instance.
-     * @return {any}
-     */
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return Observable_1.Observable.of(this.value);
-            case 'E':
-                return Observable_1.Observable.throw(this.exception);
-            case 'C':
-                return Observable_1.Observable.empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `next` from a
-     * given value.
-     * @param {T} value The `next` value.
-     * @return {Notification<T>} The "next" Notification representing the
-     * argument.
-     */
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return this.undefinedValueNotification;
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `error` from a
-     * given error.
-     * @param {any} [err] The `error` exception.
-     * @return {Notification<T>} The "error" Notification representing the
-     * argument.
-     */
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `complete`.
-     * @return {Notification<any>} The valueless "complete" Notification.
-     */
-    Notification.createComplete = function () {
-        return this.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-exports.Notification = Notification;
+  }
+  this.chunks = [];
+  this.err = status;
+  this.msg = this.strm.msg;
+};
+
 
-},{"./Observable":28}],28:[function(require,module,exports){
-"use strict";
-var root_1 = require('./util/root');
-var toSubscriber_1 = require('./util/toSubscriber');
-var observable_1 = require('./symbol/observable');
 /**
- * A representation of any set of values over any amount of time. This the most basic building block
- * of RxJS.
+ * deflate(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to compress.
+ * - options (Object): zlib deflate options.
  *
- * @class Observable<T>
- */
-var Observable = (function () {
-    /**
-     * @constructor
-     * @param {Function} subscribe the function that is  called when the Observable is
-     * initially subscribed to. This function is given a Subscriber, to which new values
-     * can be `next`ed, or an `error` method can be called to raise an error, or
-     * `complete` can be called to notify of a successful completion.
-     */
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    /**
-     * Creates a new Observable, with this Observable as the source, and the passed
-     * operator defined as the new observable's operator.
-     * @method lift
-     * @param {Operator} operator the operator defining the operation to take on the observable
-     * @return {Observable} a new observable with the Operator applied
-     */
-    Observable.prototype.lift = function (operator) {
-        var observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    };
-    /**
-     * Registers handlers for handling emitted values, error and completions from the observable, and
-     *  executes the observable's subscriber function, which will take action to set up the underlying data stream
-     * @method subscribe
-     * @param {PartialObserver|Function} observerOrNext (optional) either an observer defining all functions to be called,
-     *  or the first of three possible handlers, which is the handler for each value emitted from the observable.
-     * @param {Function} error (optional) a handler for a terminal event resulting from an error. If no error handler is provided,
-     *  the error will be thrown as unhandled
-     * @param {Function} complete (optional) a handler for a terminal event resulting from successful completion.
-     * @return {ISubscription} a subscription reference to the registered handlers
-     */
-    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-        var operator = this.operator;
-        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            operator.call(sink, this);
-        }
-        else {
-            sink.add(this._subscribe(sink));
-        }
-        if (sink.syncErrorThrowable) {
-            sink.syncErrorThrowable = false;
-            if (sink.syncErrorThrown) {
-                throw sink.syncErrorValue;
-            }
-        }
-        return sink;
-    };
-    /**
-     * @method forEach
-     * @param {Function} next a handler for each value emitted by the observable
-     * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise
-     * @return {Promise} a promise that either resolves on observable completion or
-     *  rejects with the handled error
-     */
-    Observable.prototype.forEach = function (next, PromiseCtor) {
-        var _this = this;
-        if (!PromiseCtor) {
-            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {
-                PromiseCtor = root_1.root.Rx.config.Promise;
-            }
-            else if (root_1.root.Promise) {
-                PromiseCtor = root_1.root.Promise;
-            }
-        }
-        if (!PromiseCtor) {
-            throw new Error('no Promise impl found');
-        }
-        return new PromiseCtor(function (resolve, reject) {
-            var subscription = _this.subscribe(function (value) {
-                if (subscription) {
-                    // if there is a subscription, then we can surmise
-                    // the next handling is asynchronous. Any errors thrown
-                    // need to be rejected explicitly and unsubscribe must be
-                    // called manually
-                    try {
-                        next(value);
-                    }
-                    catch (err) {
-                        reject(err);
-                        subscription.unsubscribe();
-                    }
-                }
-                else {
-                    // if there is NO subscription, then we're getting a nexted
-                    // value synchronously during subscription. We can just call it.
-                    // If it errors, Observable's `subscribe` will ensure the
-                    // unsubscription logic is called, then synchronously rethrow the error.
-                    // After that, Promise will trap the error and send it
-                    // down the rejection path.
-                    next(value);
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        return this.source.subscribe(subscriber);
-    };
-    /**
-     * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
-     * @method Symbol.observable
-     * @return {Observable} this instance of the observable
-     */
-    Observable.prototype[observable_1.$$observable] = function () {
-        return this;
-    };
-    // HACK: Since TypeScript inherits static properties too, we have to
-    // fight against TypeScript here so Subject can have a different static create signature
-    /**
-     * Creates a new cold Observable by calling the Observable constructor
-     * @static true
-     * @owner Observable
-     * @method create
-     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
-     * @return {Observable} a new cold observable
-     */
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-exports.Observable = Observable;
+ * Compress `data` with deflate algorithm and `options`.
+ *
+ * Supported options are:
+ *
+ * - level
+ * - windowBits
+ * - memLevel
+ * - strategy
+ * - dictionary
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information on these.
+ *
+ * Sugar (options):
+ *
+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
+ *   negative windowBits implicitly.
+ * - `to` (String) - if equal to 'string', then result will be "binary string"
+ *    (each char code [0..255])
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
+ *
+ * console.log(pako.deflate(data));
+ * ```
+ **/
+function deflate(input, options) {
+  var deflator = new Deflate(options);
+
+  deflator.push(input, true);
+
+  // That will never happens, if you don't cheat with options :)
+  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }
+
+  return deflator.result;
+}
 
-},{"./symbol/observable":141,"./util/root":153,"./util/toSubscriber":155}],29:[function(require,module,exports){
-"use strict";
-exports.empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) { throw err; },
-    complete: function () { }
-};
 
-},{}],30:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('./Subscriber');
 /**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var OuterSubscriber = (function (_super) {
-    __extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        _super.apply(this, arguments);
-    }
-    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.destination.error(error);
-    };
-    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.destination.complete();
-    };
-    return OuterSubscriber;
-}(Subscriber_1.Subscriber));
-exports.OuterSubscriber = OuterSubscriber;
+ * deflateRaw(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to compress.
+ * - options (Object): zlib deflate options.
+ *
+ * The same as [[deflate]], but creates raw data, without wrapper
+ * (header and adler32 crc).
+ **/
+function deflateRaw(input, options) {
+  options = options || {};
+  options.raw = true;
+  return deflate(input, options);
+}
+
 
-},{"./Subscriber":35}],31:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('./Subject');
-var queue_1 = require('./scheduler/queue');
-var observeOn_1 = require('./operator/observeOn');
 /**
- * @class ReplaySubject<T>
- */
-var ReplaySubject = (function (_super) {
-    __extends(ReplaySubject, _super);
-    function ReplaySubject(bufferSize, windowTime, scheduler) {
-        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-        _super.call(this);
-        this.scheduler = scheduler;
-        this._events = [];
-        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        this._windowTime = windowTime < 1 ? 1 : windowTime;
-    }
-    ReplaySubject.prototype.next = function (value) {
-        var now = this._getNow();
-        this._events.push(new ReplayEvent(now, value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _events = this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
-        }
-        var len = _events.length;
-        for (var i = 0; i < len && !subscriber.closed; i++) {
-            subscriber.next(_events[i].value);
-        }
-        return _super.prototype._subscribe.call(this, subscriber);
-    };
-    ReplaySubject.prototype._getNow = function () {
-        return (this.scheduler || queue_1.queue).now();
-    };
-    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-        var now = this._getNow();
-        var _bufferSize = this._bufferSize;
-        var _windowTime = this._windowTime;
-        var _events = this._events;
-        var eventsCount = _events.length;
-        var spliceCount = 0;
-        // Trim events that fall out of the time window.
-        // Start at the front of the list. Break early once
-        // we encounter an event that falls within the window.
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    };
-    return ReplaySubject;
-}(Subject_1.Subject));
-exports.ReplaySubject = ReplaySubject;
-var ReplayEvent = (function () {
-    function ReplayEvent(time, value) {
-        this.time = time;
-        this.value = value;
-    }
-    return ReplayEvent;
-}());
+ * gzip(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to compress.
+ * - options (Object): zlib deflate options.
+ *
+ * The same as [[deflate]], but create gzip wrapper instead of
+ * deflate one.
+ **/
+function gzip(input, options) {
+  options = options || {};
+  options.gzip = true;
+  return deflate(input, options);
+}
+
+
+exports.Deflate = Deflate;
+exports.deflate = deflate;
+exports.deflateRaw = deflateRaw;
+exports.gzip = gzip;
+
+},{"./utils/common":26,"./utils/strings":27,"./zlib/deflate":31,"./zlib/messages":36,"./zlib/zstream":38}],25:[function(require,module,exports){
+'use strict';
+
+
+var zlib_inflate = require('./zlib/inflate');
+var utils        = require('./utils/common');
+var strings      = require('./utils/strings');
+var c            = require('./zlib/constants');
+var msg          = require('./zlib/messages');
+var ZStream      = require('./zlib/zstream');
+var GZheader     = require('./zlib/gzheader');
+
+var toString = Object.prototype.toString;
 
-},{"./Subject":33,"./operator/observeOn":118,"./scheduler/queue":139}],32:[function(require,module,exports){
-"use strict";
 /**
- * An execution context and a data structure to order tasks and schedule their
- * execution. Provides a notion of (potentially virtual) time, through the
- * `now()` getter method.
+ * class Inflate
  *
- * Each unit of work in a Scheduler is called an {@link Action}.
+ * Generic JS-style wrapper for zlib calls. If you don't need
+ * streaming behaviour - use more simple functions: [[inflate]]
+ * and [[inflateRaw]].
+ **/
+
+/* internal
+ * inflate.chunks -> Array
  *
- * ```ts
- * class Scheduler {
- *   now(): number;
- *   schedule(work, delay?, state?): Subscription;
- * }
- * ```
+ * Chunks of output data, if [[Inflate#onData]] not overridden.
+ **/
+
+/**
+ * Inflate.result -> Uint8Array|Array|String
  *
- * @class Scheduler
- */
-var Scheduler = (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler.now; }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    /**
-     * Schedules a function, `work`, for execution. May happen at some point in
-     * the future, according to the `delay` parameter, if specified. May be passed
-     * some context object, `state`, which will be passed to the `work` function.
-     *
-     * The given arguments will be processed an stored as an Action object in a
-     * queue of actions.
-     *
-     * @param {function(state: ?T): ?Subscription} work A function representing a
-     * task, or some unit of work to be executed by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler itself.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @return {Subscription} A subscription in order to be able to unsubscribe
-     * the scheduled work.
-     */
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = Date.now ? Date.now : function () { return +new Date(); };
-    return Scheduler;
-}());
-exports.Scheduler = Scheduler;
+ * Uncompressed result, generated by default [[Inflate#onData]]
+ * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
+ * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you
+ * push a chunk with explicit flush (call [[Inflate#push]] with
+ * `Z_SYNC_FLUSH` param).
+ **/
 
-},{}],33:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('./Observable');
-var Subscriber_1 = require('./Subscriber');
-var Subscription_1 = require('./Subscription');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
-var SubjectSubscription_1 = require('./SubjectSubscription');
-var rxSubscriber_1 = require('./symbol/rxSubscriber');
 /**
- * @class SubjectSubscriber<T>
- */
-var SubjectSubscriber = (function (_super) {
-    __extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        _super.call(this, destination);
-        this.destination = destination;
-    }
-    return SubjectSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SubjectSubscriber = SubjectSubscriber;
+ * Inflate.err -> Number
+ *
+ * Error code after inflate finished. 0 (Z_OK) on success.
+ * Should be checked if broken data possible.
+ **/
+
 /**
- * @class Subject<T>
- */
-var Subject = (function (_super) {
-    __extends(Subject, _super);
-    function Subject() {
-        _super.call(this);
-        this.observers = [];
-        this.closed = false;
-        this.isStopped = false;
-        this.hasError = false;
-        this.thrownError = null;
+ * Inflate.msg -> String
+ *
+ * Error message, if [[Inflate.err]] != 0
+ **/
+
+
+/**
+ * new Inflate(options)
+ * - options (Object): zlib inflate options.
+ *
+ * Creates new inflator instance with specified params. Throws exception
+ * on bad params. Supported options:
+ *
+ * - `windowBits`
+ * - `dictionary`
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information on these.
+ *
+ * Additional options, for internal needs:
+ *
+ * - `chunkSize` - size of generated data chunks (16K by default)
+ * - `raw` (Boolean) - do raw inflate
+ * - `to` (String) - if equal to 'string', then result will be converted
+ *   from utf8 to utf16 (javascript) string. When string output requested,
+ *   chunk length can differ from `chunkSize`, depending on content.
+ *
+ * By default, when no options set, autodetect deflate/gzip data format via
+ * wrapper header.
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
+ *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
+ *
+ * var inflate = new pako.Inflate({ level: 3});
+ *
+ * inflate.push(chunk1, false);
+ * inflate.push(chunk2, true);  // true -> last chunk
+ *
+ * if (inflate.err) { throw new Error(inflate.err); }
+ *
+ * console.log(inflate.result);
+ * ```
+ **/
+function Inflate(options) {
+  if (!(this instanceof Inflate)) return new Inflate(options);
+
+  this.options = utils.assign({
+    chunkSize: 16384,
+    windowBits: 0,
+    to: ''
+  }, options || {});
+
+  var opt = this.options;
+
+  // Force window size for `raw` data, if not set directly,
+  // because we have no header for autodetect.
+  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
+    opt.windowBits = -opt.windowBits;
+    if (opt.windowBits === 0) { opt.windowBits = -15; }
+  }
+
+  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
+  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
+      !(options && options.windowBits)) {
+    opt.windowBits += 32;
+  }
+
+  // Gzip header has no info about windows size, we can do autodetect only
+  // for deflate. So, if window size not set, force it to max when gzip possible
+  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
+    // bit 3 (16) -> gzipped data
+    // bit 4 (32) -> autodetect gzip/deflate
+    if ((opt.windowBits & 15) === 0) {
+      opt.windowBits |= 15;
     }
-    Subject.prototype[rxSubscriber_1.$$rxSubscriber] = function () {
-        return new SubjectSubscriber(this);
-    };
-    Subject.prototype.lift = function (operator) {
-        var subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    };
-    Subject.prototype.next = function (value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    };
-    Subject.prototype.error = function (err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.complete = function () {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.unsubscribe = function () {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    };
-    Subject.prototype._subscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-    };
-    Subject.prototype.asObservable = function () {
-        var observable = new Observable_1.Observable();
-        observable.source = this;
-        return observable;
-    };
-    Subject.create = function (destination, source) {
-        return new AnonymousSubject(destination, source);
-    };
-    return Subject;
-}(Observable_1.Observable));
-exports.Subject = Subject;
+  }
+
+  this.err    = 0;      // error code, if happens (0 = Z_OK)
+  this.msg    = '';     // error message
+  this.ended  = false;  // used to avoid multiple onEnd() calls
+  this.chunks = [];     // chunks of compressed data
+
+  this.strm   = new ZStream();
+  this.strm.avail_out = 0;
+
+  var status  = zlib_inflate.inflateInit2(
+    this.strm,
+    opt.windowBits
+  );
+
+  if (status !== c.Z_OK) {
+    throw new Error(msg[status]);
+  }
+
+  this.header = new GZheader();
+
+  zlib_inflate.inflateGetHeader(this.strm, this.header);
+
+  // Setup dictionary
+  if (opt.dictionary) {
+    // Convert data if needed
+    if (typeof opt.dictionary === 'string') {
+      opt.dictionary = strings.string2buf(opt.dictionary);
+    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
+      opt.dictionary = new Uint8Array(opt.dictionary);
+    }
+    if (opt.raw) { //In raw mode we need to set the dictionary early
+      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);
+      if (status !== c.Z_OK) {
+        throw new Error(msg[status]);
+      }
+    }
+  }
+}
+
 /**
- * @class AnonymousSubject<T>
- */
-var AnonymousSubject = (function (_super) {
-    __extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        _super.call(this);
-        this.destination = destination;
-        this.source = source;
+ * Inflate#push(data[, mode]) -> Boolean
+ * - data (Uint8Array|Array|ArrayBuffer|String): input data
+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
+ *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
+ *
+ * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
+ * new output chunks. Returns `true` on success. The last data block must have
+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
+ * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you
+ * can use mode Z_SYNC_FLUSH, keeping the decompression context.
+ *
+ * On fail call [[Inflate#onEnd]] with error code and return false.
+ *
+ * We strongly recommend to use `Uint8Array` on input for best speed (output
+ * format is detected automatically). Also, don't skip last param and always
+ * use the same type in your code (boolean or number). That will improve JS speed.
+ *
+ * For regular `Array`-s make sure all elements are [0..255].
+ *
+ * ##### Example
+ *
+ * ```javascript
+ * push(chunk, false); // push one of data chunks
+ * ...
+ * push(chunk, true);  // push last chunk
+ * ```
+ **/
+Inflate.prototype.push = function (data, mode) {
+  var strm = this.strm;
+  var chunkSize = this.options.chunkSize;
+  var dictionary = this.options.dictionary;
+  var status, _mode;
+  var next_out_utf8, tail, utf8str;
+
+  // Flag to properly process Z_BUF_ERROR on testing inflate call
+  // when we check that all output data was flushed.
+  var allowBufError = false;
+
+  if (this.ended) { return false; }
+  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
+
+  // Convert data if needed
+  if (typeof data === 'string') {
+    // Only binary strings can be decompressed on practice
+    strm.input = strings.binstring2buf(data);
+  } else if (toString.call(data) === '[object ArrayBuffer]') {
+    strm.input = new Uint8Array(data);
+  } else {
+    strm.input = data;
+  }
+
+  strm.next_in = 0;
+  strm.avail_in = strm.input.length;
+
+  do {
+    if (strm.avail_out === 0) {
+      strm.output = new utils.Buf8(chunkSize);
+      strm.next_out = 0;
+      strm.avail_out = chunkSize;
     }
-    AnonymousSubject.prototype.next = function (value) {
-        var destination = this.destination;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    };
-    AnonymousSubject.prototype.error = function (err) {
-        var destination = this.destination;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    };
-    AnonymousSubject.prototype.complete = function () {
-        var destination = this.destination;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    };
-    AnonymousSubject.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription_1.Subscription.EMPTY;
+
+    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
+
+    if (status === c.Z_NEED_DICT && dictionary) {
+      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);
+    }
+
+    if (status === c.Z_BUF_ERROR && allowBufError === true) {
+      status = c.Z_OK;
+      allowBufError = false;
+    }
+
+    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
+      this.onEnd(status);
+      this.ended = true;
+      return false;
+    }
+
+    if (strm.next_out) {
+      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {
+
+        if (this.options.to === 'string') {
+
+          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
+
+          tail = strm.next_out - next_out_utf8;
+          utf8str = strings.buf2string(strm.output, next_out_utf8);
+
+          // move tail
+          strm.next_out = tail;
+          strm.avail_out = chunkSize - tail;
+          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
+
+          this.onData(utf8str);
+
+        } else {
+          this.onData(utils.shrinkBuf(strm.output, strm.next_out));
         }
-    };
-    return AnonymousSubject;
-}(Subject));
-exports.AnonymousSubject = AnonymousSubject;
+      }
+    }
 
-},{"./Observable":28,"./SubjectSubscription":34,"./Subscriber":35,"./Subscription":36,"./symbol/rxSubscriber":142,"./util/ObjectUnsubscribedError":145}],34:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    // When no more input data, we should check that internal inflate buffers
+    // are flushed. The only way to do it when avail_out = 0 - run one more
+    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.
+    // Here we set flag to process this error properly.
+    //
+    // NOTE. Deflate does not return error in this case and does not needs such
+    // logic.
+    if (strm.avail_in === 0 && strm.avail_out === 0) {
+      allowBufError = true;
+    }
+
+  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);
+
+  if (status === c.Z_STREAM_END) {
+    _mode = c.Z_FINISH;
+  }
+
+  // Finalize on the last chunk.
+  if (_mode === c.Z_FINISH) {
+    status = zlib_inflate.inflateEnd(this.strm);
+    this.onEnd(status);
+    this.ended = true;
+    return status === c.Z_OK;
+  }
+
+  // callback interim results if Z_SYNC_FLUSH.
+  if (_mode === c.Z_SYNC_FLUSH) {
+    this.onEnd(c.Z_OK);
+    strm.avail_out = 0;
+    return true;
+  }
+
+  return true;
 };
-var Subscription_1 = require('./Subscription');
+
+
 /**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SubjectSubscription = (function (_super) {
-    __extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        _super.call(this);
-        this.subject = subject;
-        this.subscriber = subscriber;
-        this.closed = false;
-    }
-    SubjectSubscription.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var subject = this.subject;
-        var observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        var subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    };
-    return SubjectSubscription;
-}(Subscription_1.Subscription));
-exports.SubjectSubscription = SubjectSubscription;
+ * Inflate#onData(chunk) -> Void
+ * - chunk (Uint8Array|Array|String): output data. Type of array depends
+ *   on js engine support. When string output requested, each chunk
+ *   will be string.
+ *
+ * By default, stores data blocks in `chunks[]` property and glue
+ * those in `onEnd`. Override this handler, if you need another behaviour.
+ **/
+Inflate.prototype.onData = function (chunk) {
+  this.chunks.push(chunk);
+};
 
-},{"./Subscription":36}],35:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+
+/**
+ * Inflate#onEnd(status) -> Void
+ * - status (Number): inflate status. 0 (Z_OK) on success,
+ *   other if not.
+ *
+ * Called either after you tell inflate that the input stream is
+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
+ * or if an error happened. By default - join collected chunks,
+ * free memory and fill `results` / `err` properties.
+ **/
+Inflate.prototype.onEnd = function (status) {
+  // On success - join
+  if (status === c.Z_OK) {
+    if (this.options.to === 'string') {
+      // Glue & convert here, until we teach pako to send
+      // utf8 aligned strings to onData
+      this.result = this.chunks.join('');
+    } else {
+      this.result = utils.flattenChunks(this.chunks);
+    }
+  }
+  this.chunks = [];
+  this.err = status;
+  this.msg = this.strm.msg;
 };
-var isFunction_1 = require('./util/isFunction');
-var Subscription_1 = require('./Subscription');
-var Observer_1 = require('./Observer');
-var rxSubscriber_1 = require('./symbol/rxSubscriber');
+
+
 /**
- * Implements the {@link Observer} interface and extends the
- * {@link Subscription} class. While the {@link Observer} is the public API for
- * consuming the values of an {@link Observable}, all Observers get converted to
- * a Subscriber, in order to provide Subscription-like capabilities such as
- * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
- * implementing operators, but it is rarely used as a public API.
- *
- * @class Subscriber<T>
- */
-var Subscriber = (function (_super) {
-    __extends(Subscriber, _super);
-    /**
-     * @param {Observer|function(value: T): void} [destinationOrNext] A partially
-     * defined Observer or a `next` callback function.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     */
-    function Subscriber(destinationOrNext, error, complete) {
-        _super.call(this);
-        this.syncErrorValue = null;
-        this.syncErrorThrown = false;
-        this.syncErrorThrowable = false;
-        this.isStopped = false;
-        switch (arguments.length) {
-            case 0:
-                this.destination = Observer_1.empty;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    this.destination = Observer_1.empty;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        this.destination = destinationOrNext;
-                        this.destination.add(this);
-                    }
-                    else {
-                        this.syncErrorThrowable = true;
-                        this.destination = new SafeSubscriber(this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                this.syncErrorThrowable = true;
-                this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);
-                break;
-        }
-    }
-    Subscriber.prototype[rxSubscriber_1.$$rxSubscriber] = function () { return this; };
-    /**
-     * A static factory for a Subscriber, given a (potentially partial) definition
-     * of an Observer.
-     * @param {function(x: ?T): void} [next] The `next` callback of an Observer.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)
-     * Observer represented by the given arguments.
-     */
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    /**
-     * The {@link Observer} callback to receive notifications of type `next` from
-     * the Observable, with a value. The Observable may call this method 0 or more
-     * times.
-     * @param {T} [value] The `next` value.
-     * @return {void}
-     */
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    /**
-     * The {@link Observer} callback to receive notifications of type `error` from
-     * the Observable, with an attached {@link Error}. Notifies the Observer that
-     * the Observable has experienced an error condition.
-     * @param {any} [err] The `error` exception.
-     * @return {void}
-     */
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    /**
-     * The {@link Observer} callback to receive a valueless notification of type
-     * `complete` from the Observable. Notifies the Observer that the Observable
-     * has finished sending push-based notifications.
-     * @return {void}
-     */
-    Subscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    };
-    Subscriber.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        _super.prototype.unsubscribe.call(this);
-    };
-    Subscriber.prototype._next = function (value) {
-        this.destination.next(value);
-    };
-    Subscriber.prototype._error = function (err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    Subscriber.prototype._complete = function () {
-        this.destination.complete();
-        this.unsubscribe();
-    };
-    return Subscriber;
-}(Subscription_1.Subscription));
-exports.Subscriber = Subscriber;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SafeSubscriber = (function (_super) {
-    __extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parent, observerOrNext, error, complete) {
-        _super.call(this);
-        this._parent = _parent;
-        var next;
-        var context = this;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            context = observerOrNext;
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (isFunction_1.isFunction(context.unsubscribe)) {
-                this.add(context.unsubscribe.bind(context));
-            }
-            context.unsubscribe = this.unsubscribe.bind(this);
-        }
-        this._context = context;
-        this._next = next;
-        this._error = error;
-        this._complete = complete;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parent = this._parent;
-            if (!_parent.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parent, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parent = this._parent;
-            if (this._error) {
-                if (!_parent.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parent, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parent.syncErrorThrowable) {
-                this.unsubscribe();
-                throw err;
-            }
-            else {
-                _parent.syncErrorValue = err;
-                _parent.syncErrorThrown = true;
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            var _parent = this._parent;
-            if (this._complete) {
-                if (!_parent.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._complete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parent, this._complete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            throw err;
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            parent.syncErrorValue = err;
-            parent.syncErrorThrown = true;
-            return true;
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parent = this._parent;
-        this._context = null;
-        this._parent = null;
-        _parent.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
-
-},{"./Observer":29,"./Subscription":36,"./symbol/rxSubscriber":142,"./util/isFunction":149}],36:[function(require,module,exports){
-"use strict";
-var isArray_1 = require('./util/isArray');
-var isObject_1 = require('./util/isObject');
-var isFunction_1 = require('./util/isFunction');
-var tryCatch_1 = require('./util/tryCatch');
-var errorObject_1 = require('./util/errorObject');
-var UnsubscriptionError_1 = require('./util/UnsubscriptionError');
-/**
- * Represents a disposable resource, such as the execution of an Observable. A
- * Subscription has one important method, `unsubscribe`, that takes no argument
- * and just disposes the resource held by the subscription.
+ * inflate(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to decompress.
+ * - options (Object): zlib inflate options.
  *
- * Additionally, subscriptions may be grouped together through the `add()`
- * method, which will attach a child Subscription to the current Subscription.
- * When a Subscription is unsubscribed, all its children (and its grandchildren)
- * will be unsubscribed as well.
+ * Decompress `data` with inflate/ungzip and `options`. Autodetect
+ * format via wrapper header by default. That's why we don't provide
+ * separate `ungzip` method.
  *
- * @class Subscription
- */
-var Subscription = (function () {
-    /**
-     * @param {function(): void} [unsubscribe] A function describing how to
-     * perform the disposal of resources when the `unsubscribe` method is called.
-     */
-    function Subscription(unsubscribe) {
-        /**
-         * A flag to indicate whether this Subscription has already been unsubscribed.
-         * @type {boolean}
-         */
-        this.closed = false;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    /**
-     * Disposes the resources held by the subscription. May, for instance, cancel
-     * an ongoing Observable execution or cancel any other type of work that
-     * started when the Subscription was created.
-     * @return {void}
-     */
-    Subscription.prototype.unsubscribe = function () {
-        var hasErrors = false;
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var _a = this, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this._subscriptions = null;
-        if (isFunction_1.isFunction(_unsubscribe)) {
-            var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);
-            if (trial === errorObject_1.errorObject) {
-                hasErrors = true;
-                (errors = errors || []).push(errorObject_1.errorObject.e);
-            }
-        }
-        if (isArray_1.isArray(_subscriptions)) {
-            var index = -1;
-            var len = _subscriptions.length;
-            while (++index < len) {
-                var sub = _subscriptions[index];
-                if (isObject_1.isObject(sub)) {
-                    var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);
-                    if (trial === errorObject_1.errorObject) {
-                        hasErrors = true;
-                        errors = errors || [];
-                        var err = errorObject_1.errorObject.e;
-                        if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
-                            errors = errors.concat(err.errors);
-                        }
-                        else {
-                            errors.push(err);
-                        }
-                    }
-                }
-            }
-        }
-        if (hasErrors) {
-            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
-        }
-    };
-    /**
-     * Adds a tear down to be called during the unsubscribe() of this
-     * Subscription.
-     *
-     * If the tear down being added is a subscription that is already
-     * unsubscribed, is the same reference `add` is being called on, or is
-     * `Subscription.EMPTY`, it will not be added.
-     *
-     * If this subscription is already in an `closed` state, the passed
-     * tear down logic will be executed immediately.
-     *
-     * @param {TeardownLogic} teardown The additional logic to execute on
-     * teardown.
-     * @return {Subscription} Returns the Subscription used or created to be
-     * added to the inner subscriptions list. This Subscription can be used with
-     * `remove()` to remove the passed teardown logic from the inner subscriptions
-     * list.
-     */
-    Subscription.prototype.add = function (teardown) {
-        if (!teardown || (teardown === Subscription.EMPTY)) {
-            return Subscription.EMPTY;
-        }
-        if (teardown === this) {
-            return this;
-        }
-        var sub = teardown;
-        switch (typeof teardown) {
-            case 'function':
-                sub = new Subscription(teardown);
-            case 'object':
-                if (sub.closed || typeof sub.unsubscribe !== 'function') {
-                    break;
-                }
-                else if (this.closed) {
-                    sub.unsubscribe();
-                }
-                else {
-                    (this._subscriptions || (this._subscriptions = [])).push(sub);
-                }
-                break;
-            default:
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-        }
-        return sub;
-    };
-    /**
-     * Removes a Subscription from the internal list of subscriptions that will
-     * unsubscribe during the unsubscribe process of this Subscription.
-     * @param {Subscription} subscription The subscription to remove.
-     * @return {void}
-     */
-    Subscription.prototype.remove = function (subscription) {
-        // HACK: This might be redundant because of the logic in `add()`
-        if (subscription == null || (subscription === this) || (subscription === Subscription.EMPTY)) {
-            return;
-        }
-        var subscriptions = this._subscriptions;
-        if (subscriptions) {
-            var subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    };
-    Subscription.EMPTY = (function (empty) {
-        empty.closed = true;
-        return empty;
-    }(new Subscription()));
-    return Subscription;
-}());
-exports.Subscription = Subscription;
+ * Supported options are:
+ *
+ * - windowBits
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information.
+ *
+ * Sugar (options):
+ *
+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
+ *   negative windowBits implicitly.
+ * - `to` (String) - if equal to 'string', then result will be converted
+ *   from utf8 to utf16 (javascript) string. When string output requested,
+ *   chunk length can differ from `chunkSize`, depending on content.
+ *
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
+ *   , output;
+ *
+ * try {
+ *   output = pako.inflate(input);
+ * } catch (err)
+ *   console.log(err);
+ * }
+ * ```
+ **/
+function inflate(input, options) {
+  var inflator = new Inflate(options);
 
-},{"./util/UnsubscriptionError":146,"./util/errorObject":147,"./util/isArray":148,"./util/isFunction":149,"./util/isObject":150,"./util/tryCatch":156}],37:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var combineLatest_1 = require('../../observable/combineLatest');
-Observable_1.Observable.combineLatest = combineLatest_1.combineLatest;
+  inflator.push(input, true);
 
-},{"../../Observable":28,"../../observable/combineLatest":90}],38:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var defer_1 = require('../../observable/defer');
-Observable_1.Observable.defer = defer_1.defer;
+  // That will never happens, if you don't cheat with options :)
+  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }
 
-},{"../../Observable":28,"../../observable/defer":91}],39:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var empty_1 = require('../../observable/empty');
-Observable_1.Observable.empty = empty_1.empty;
+  return inflator.result;
+}
 
-},{"../../Observable":28,"../../observable/empty":92}],40:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var from_1 = require('../../observable/from');
-Observable_1.Observable.from = from_1.from;
 
-},{"../../Observable":28,"../../observable/from":93}],41:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var fromEvent_1 = require('../../observable/fromEvent');
-Observable_1.Observable.fromEvent = fromEvent_1.fromEvent;
+/**
+ * inflateRaw(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to decompress.
+ * - options (Object): zlib inflate options.
+ *
+ * The same as [[inflate]], but creates raw data, without wrapper
+ * (header and adler32 crc).
+ **/
+function inflateRaw(input, options) {
+  options = options || {};
+  options.raw = true;
+  return inflate(input, options);
+}
 
-},{"../../Observable":28,"../../observable/fromEvent":94}],42:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var fromPromise_1 = require('../../observable/fromPromise');
-Observable_1.Observable.fromPromise = fromPromise_1.fromPromise;
 
-},{"../../Observable":28,"../../observable/fromPromise":95}],43:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var merge_1 = require('../../observable/merge');
-Observable_1.Observable.merge = merge_1.merge;
-
-},{"../../Observable":28,"../../observable/merge":96}],44:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var of_1 = require('../../observable/of');
-Observable_1.Observable.of = of_1.of;
+/**
+ * ungzip(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to decompress.
+ * - options (Object): zlib inflate options.
+ *
+ * Just shortcut to [[inflate]], because it autodetects format
+ * by header.content. Done for convenience.
+ **/
 
-},{"../../Observable":28,"../../observable/of":97}],45:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var throw_1 = require('../../observable/throw');
-Observable_1.Observable.throw = throw_1._throw;
 
-},{"../../Observable":28,"../../observable/throw":98}],46:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var zip_1 = require('../../observable/zip');
-Observable_1.Observable.zip = zip_1.zip;
+exports.Inflate = Inflate;
+exports.inflate = inflate;
+exports.inflateRaw = inflateRaw;
+exports.ungzip  = inflate;
 
-},{"../../Observable":28,"../../observable/zip":99}],47:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var buffer_1 = require('../../operator/buffer');
-Observable_1.Observable.prototype.buffer = buffer_1.buffer;
+},{"./utils/common":26,"./utils/strings":27,"./zlib/constants":29,"./zlib/gzheader":32,"./zlib/inflate":34,"./zlib/messages":36,"./zlib/zstream":38}],26:[function(require,module,exports){
+'use strict';
 
-},{"../../Observable":28,"../../operator/buffer":100}],48:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var catch_1 = require('../../operator/catch');
-Observable_1.Observable.prototype.catch = catch_1._catch;
-Observable_1.Observable.prototype._catch = catch_1._catch;
 
-},{"../../Observable":28,"../../operator/catch":101}],49:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var combineLatest_1 = require('../../operator/combineLatest');
-Observable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest;
+var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
+                (typeof Uint16Array !== 'undefined') &&
+                (typeof Int32Array !== 'undefined');
 
-},{"../../Observable":28,"../../operator/combineLatest":102}],50:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var concat_1 = require('../../operator/concat');
-Observable_1.Observable.prototype.concat = concat_1.concat;
+function _has(obj, key) {
+  return Object.prototype.hasOwnProperty.call(obj, key);
+}
 
-},{"../../Observable":28,"../../operator/concat":103}],51:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var debounceTime_1 = require('../../operator/debounceTime');
-Observable_1.Observable.prototype.debounceTime = debounceTime_1.debounceTime;
+exports.assign = function (obj /*from1, from2, from3, ...*/) {
+  var sources = Array.prototype.slice.call(arguments, 1);
+  while (sources.length) {
+    var source = sources.shift();
+    if (!source) { continue; }
 
-},{"../../Observable":28,"../../operator/debounceTime":104}],52:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var distinct_1 = require('../../operator/distinct');
-Observable_1.Observable.prototype.distinct = distinct_1.distinct;
+    if (typeof source !== 'object') {
+      throw new TypeError(source + 'must be non-object');
+    }
 
-},{"../../Observable":28,"../../operator/distinct":105}],53:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var distinctUntilChanged_1 = require('../../operator/distinctUntilChanged');
-Observable_1.Observable.prototype.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
+    for (var p in source) {
+      if (_has(source, p)) {
+        obj[p] = source[p];
+      }
+    }
+  }
 
-},{"../../Observable":28,"../../operator/distinctUntilChanged":106}],54:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var do_1 = require('../../operator/do');
-Observable_1.Observable.prototype.do = do_1._do;
-Observable_1.Observable.prototype._do = do_1._do;
+  return obj;
+};
 
-},{"../../Observable":28,"../../operator/do":107}],55:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var expand_1 = require('../../operator/expand');
-Observable_1.Observable.prototype.expand = expand_1.expand;
 
-},{"../../Observable":28,"../../operator/expand":108}],56:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var filter_1 = require('../../operator/filter');
-Observable_1.Observable.prototype.filter = filter_1.filter;
+// reduce buffer size, avoiding mem copy
+exports.shrinkBuf = function (buf, size) {
+  if (buf.length === size) { return buf; }
+  if (buf.subarray) { return buf.subarray(0, size); }
+  buf.length = size;
+  return buf;
+};
 
-},{"../../Observable":28,"../../operator/filter":109}],57:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var finally_1 = require('../../operator/finally');
-Observable_1.Observable.prototype.finally = finally_1._finally;
-Observable_1.Observable.prototype._finally = finally_1._finally;
 
-},{"../../Observable":28,"../../operator/finally":110}],58:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var first_1 = require('../../operator/first');
-Observable_1.Observable.prototype.first = first_1.first;
+var fnTyped = {
+  arraySet: function (dest, src, src_offs, len, dest_offs) {
+    if (src.subarray && dest.subarray) {
+      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
+      return;
+    }
+    // Fallback to ordinary array
+    for (var i = 0; i < len; i++) {
+      dest[dest_offs + i] = src[src_offs + i];
+    }
+  },
+  // Join array of chunks to single array.
+  flattenChunks: function (chunks) {
+    var i, l, len, pos, chunk, result;
 
-},{"../../Observable":28,"../../operator/first":111}],59:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var last_1 = require('../../operator/last');
-Observable_1.Observable.prototype.last = last_1.last;
+    // calculate data length
+    len = 0;
+    for (i = 0, l = chunks.length; i < l; i++) {
+      len += chunks[i].length;
+    }
 
-},{"../../Observable":28,"../../operator/last":112}],60:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var map_1 = require('../../operator/map');
-Observable_1.Observable.prototype.map = map_1.map;
+    // join chunks
+    result = new Uint8Array(len);
+    pos = 0;
+    for (i = 0, l = chunks.length; i < l; i++) {
+      chunk = chunks[i];
+      result.set(chunk, pos);
+      pos += chunk.length;
+    }
 
-},{"../../Observable":28,"../../operator/map":113}],61:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var merge_1 = require('../../operator/merge');
-Observable_1.Observable.prototype.merge = merge_1.merge;
+    return result;
+  }
+};
 
-},{"../../Observable":28,"../../operator/merge":114}],62:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var mergeAll_1 = require('../../operator/mergeAll');
-Observable_1.Observable.prototype.mergeAll = mergeAll_1.mergeAll;
+var fnUntyped = {
+  arraySet: function (dest, src, src_offs, len, dest_offs) {
+    for (var i = 0; i < len; i++) {
+      dest[dest_offs + i] = src[src_offs + i];
+    }
+  },
+  // Join array of chunks to single array.
+  flattenChunks: function (chunks) {
+    return [].concat.apply([], chunks);
+  }
+};
 
-},{"../../Observable":28,"../../operator/mergeAll":115}],63:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var mergeMap_1 = require('../../operator/mergeMap');
-Observable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap;
-Observable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap;
 
-},{"../../Observable":28,"../../operator/mergeMap":116}],64:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var pairwise_1 = require('../../operator/pairwise');
-Observable_1.Observable.prototype.pairwise = pairwise_1.pairwise;
+// Enable/Disable typed arrays use, for testing
+//
+exports.setTyped = function (on) {
+  if (on) {
+    exports.Buf8  = Uint8Array;
+    exports.Buf16 = Uint16Array;
+    exports.Buf32 = Int32Array;
+    exports.assign(exports, fnTyped);
+  } else {
+    exports.Buf8  = Array;
+    exports.Buf16 = Array;
+    exports.Buf32 = Array;
+    exports.assign(exports, fnUntyped);
+  }
+};
 
-},{"../../Observable":28,"../../operator/pairwise":119}],65:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var pluck_1 = require('../../operator/pluck');
-Observable_1.Observable.prototype.pluck = pluck_1.pluck;
+exports.setTyped(TYPED_OK);
 
-},{"../../Observable":28,"../../operator/pluck":120}],66:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var publish_1 = require('../../operator/publish');
-Observable_1.Observable.prototype.publish = publish_1.publish;
+},{}],27:[function(require,module,exports){
+// String encode/decode helpers
+'use strict';
 
-},{"../../Observable":28,"../../operator/publish":121}],67:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var publishReplay_1 = require('../../operator/publishReplay');
-Observable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay;
 
-},{"../../Observable":28,"../../operator/publishReplay":122}],68:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var scan_1 = require('../../operator/scan');
-Observable_1.Observable.prototype.scan = scan_1.scan;
+var utils = require('./common');
 
-},{"../../Observable":28,"../../operator/scan":123}],69:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var share_1 = require('../../operator/share');
-Observable_1.Observable.prototype.share = share_1.share;
 
-},{"../../Observable":28,"../../operator/share":124}],70:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skip_1 = require('../../operator/skip');
-Observable_1.Observable.prototype.skip = skip_1.skip;
+// Quick check if we can use fast array to bin string conversion
+//
+// - apply(Array) can fail on Android 2.2
+// - apply(Uint8Array) can fail on iOS 5.1 Safari
+//
+var STR_APPLY_OK = true;
+var STR_APPLY_UIA_OK = true;
 
-},{"../../Observable":28,"../../operator/skip":125}],71:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skipUntil_1 = require('../../operator/skipUntil');
-Observable_1.Observable.prototype.skipUntil = skipUntil_1.skipUntil;
+try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }
+try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
 
-},{"../../Observable":28,"../../operator/skipUntil":126}],72:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var startWith_1 = require('../../operator/startWith');
-Observable_1.Observable.prototype.startWith = startWith_1.startWith;
 
-},{"../../Observable":28,"../../operator/startWith":127}],73:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var switchMap_1 = require('../../operator/switchMap');
-Observable_1.Observable.prototype.switchMap = switchMap_1.switchMap;
+// Table with utf8 lengths (calculated by first byte of sequence)
+// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
+// because max possible codepoint is 0x10ffff
+var _utf8len = new utils.Buf8(256);
+for (var q = 0; q < 256; q++) {
+  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
+}
+_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
 
-},{"../../Observable":28,"../../operator/switchMap":128}],74:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var take_1 = require('../../operator/take');
-Observable_1.Observable.prototype.take = take_1.take;
 
-},{"../../Observable":28,"../../operator/take":129}],75:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var takeUntil_1 = require('../../operator/takeUntil');
-Observable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;
+// convert string to array (typed, when possible)
+exports.string2buf = function (str) {
+  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
 
-},{"../../Observable":28,"../../operator/takeUntil":130}],76:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var withLatestFrom_1 = require('../../operator/withLatestFrom');
-Observable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;
+  // count binary size
+  for (m_pos = 0; m_pos < str_len; m_pos++) {
+    c = str.charCodeAt(m_pos);
+    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
+      c2 = str.charCodeAt(m_pos + 1);
+      if ((c2 & 0xfc00) === 0xdc00) {
+        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
+        m_pos++;
+      }
+    }
+    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
+  }
 
-},{"../../Observable":28,"../../operator/withLatestFrom":131}],77:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var zip_1 = require('../../operator/zip');
-Observable_1.Observable.prototype.zip = zip_1.zipProto;
+  // allocate buffer
+  buf = new utils.Buf8(buf_len);
+
+  // convert
+  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
+    c = str.charCodeAt(m_pos);
+    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
+      c2 = str.charCodeAt(m_pos + 1);
+      if ((c2 & 0xfc00) === 0xdc00) {
+        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
+        m_pos++;
+      }
+    }
+    if (c < 0x80) {
+      /* one byte */
+      buf[i++] = c;
+    } else if (c < 0x800) {
+      /* two bytes */
+      buf[i++] = 0xC0 | (c >>> 6);
+      buf[i++] = 0x80 | (c & 0x3f);
+    } else if (c < 0x10000) {
+      /* three bytes */
+      buf[i++] = 0xE0 | (c >>> 12);
+      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
+      buf[i++] = 0x80 | (c & 0x3f);
+    } else {
+      /* four bytes */
+      buf[i++] = 0xf0 | (c >>> 18);
+      buf[i++] = 0x80 | (c >>> 12 & 0x3f);
+      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
+      buf[i++] = 0x80 | (c & 0x3f);
+    }
+  }
 
-},{"../../Observable":28,"../../operator/zip":132}],78:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  return buf;
 };
-var Observable_1 = require('../Observable');
-var ScalarObservable_1 = require('./ScalarObservable');
-var EmptyObservable_1 = require('./EmptyObservable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ArrayLikeObservable = (function (_super) {
-    __extends(ArrayLikeObservable, _super);
-    function ArrayLikeObservable(arrayLike, scheduler) {
-        _super.call(this);
-        this.arrayLike = arrayLike;
-        this.scheduler = scheduler;
-        if (!scheduler && arrayLike.length === 1) {
-            this._isScalar = true;
-            this.value = arrayLike[0];
-        }
+
+// Helper (used in 2 places)
+function buf2binstring(buf, len) {
+  // On Chrome, the arguments in a function call that are allowed is `65534`.
+  // If the length of the buffer is smaller than that, we can use this optimization,
+  // otherwise we will take a slower path.
+  if (len < 65534) {
+    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
+      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
     }
-    ArrayLikeObservable.create = function (arrayLike, scheduler) {
-        var length = arrayLike.length;
-        if (length === 0) {
-            return new EmptyObservable_1.EmptyObservable();
-        }
-        else if (length === 1) {
-            return new ScalarObservable_1.ScalarObservable(arrayLike[0], scheduler);
-        }
-        else {
-            return new ArrayLikeObservable(arrayLike, scheduler);
-        }
-    };
-    ArrayLikeObservable.dispatch = function (state) {
-        var arrayLike = state.arrayLike, index = state.index, length = state.length, subscriber = state.subscriber;
-        if (subscriber.closed) {
-            return;
-        }
-        if (index >= length) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(arrayLike[index]);
-        state.index = index + 1;
-        this.schedule(state);
-    };
-    ArrayLikeObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, arrayLike = _a.arrayLike, scheduler = _a.scheduler;
-        var length = arrayLike.length;
-        if (scheduler) {
-            return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {
-                arrayLike: arrayLike, index: index, length: length, subscriber: subscriber
-            });
-        }
-        else {
-            for (var i = 0; i < length && !subscriber.closed; i++) {
-                subscriber.next(arrayLike[i]);
-            }
-            subscriber.complete();
-        }
-    };
-    return ArrayLikeObservable;
-}(Observable_1.Observable));
-exports.ArrayLikeObservable = ArrayLikeObservable;
+  }
 
-},{"../Observable":28,"./EmptyObservable":82,"./ScalarObservable":89}],79:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  var result = '';
+  for (var i = 0; i < len; i++) {
+    result += String.fromCharCode(buf[i]);
+  }
+  return result;
+}
+
+
+// Convert byte array to binary string
+exports.buf2binstring = function (buf) {
+  return buf2binstring(buf, buf.length);
 };
-var Observable_1 = require('../Observable');
-var ScalarObservable_1 = require('./ScalarObservable');
-var EmptyObservable_1 = require('./EmptyObservable');
-var isScheduler_1 = require('../util/isScheduler');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ArrayObservable = (function (_super) {
-    __extends(ArrayObservable, _super);
-    function ArrayObservable(array, scheduler) {
-        _super.call(this);
-        this.array = array;
-        this.scheduler = scheduler;
-        if (!scheduler && array.length === 1) {
-            this._isScalar = true;
-            this.value = array[0];
-        }
-    }
-    ArrayObservable.create = function (array, scheduler) {
-        return new ArrayObservable(array, scheduler);
-    };
-    /**
-     * Creates an Observable that emits some values you specify as arguments,
-     * immediately one after the other, and then emits a complete notification.
-     *
-     * <span class="informal">Emits the arguments you provide, then completes.
-     * </span>
-     *
-     * <img src="./img/of.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the arguments given, and the complete notification thereafter. It can
-     * be used for composing with other Observables, such as with {@link concat}.
-     * By default, it uses a `null` Scheduler, which means the `next`
-     * notifications are sent synchronously, although with a different Scheduler
-     * it is possible to determine when those notifications will be delivered.
-     *
-     * @example <caption>Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.</caption>
-     * var numbers = Rx.Observable.of(10, 20, 30);
-     * var letters = Rx.Observable.of('a', 'b', 'c');
-     * var interval = Rx.Observable.interval(1000);
-     * var result = numbers.concat(letters).concat(interval);
-     * result.subscribe(x => console.log(x));
-     *
-     * @see {@link create}
-     * @see {@link empty}
-     * @see {@link never}
-     * @see {@link throw}
-     *
-     * @param {...T} values Arguments that represent `next` values to be emitted.
-     * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling
-     * the emissions of the `next` notifications.
-     * @return {Observable<T>} An Observable that emits each given input value.
-     * @static true
-     * @name of
-     * @owner Observable
-     */
-    ArrayObservable.of = function () {
-        var array = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            array[_i - 0] = arguments[_i];
-        }
-        var scheduler = array[array.length - 1];
-        if (isScheduler_1.isScheduler(scheduler)) {
-            array.pop();
-        }
-        else {
-            scheduler = null;
-        }
-        var len = array.length;
-        if (len > 1) {
-            return new ArrayObservable(array, scheduler);
-        }
-        else if (len === 1) {
-            return new ScalarObservable_1.ScalarObservable(array[0], scheduler);
-        }
-        else {
-            return new EmptyObservable_1.EmptyObservable(scheduler);
-        }
-    };
-    ArrayObservable.dispatch = function (state) {
-        var array = state.array, index = state.index, count = state.count, subscriber = state.subscriber;
-        if (index >= count) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(array[index]);
-        if (subscriber.closed) {
-            return;
-        }
-        state.index = index + 1;
-        this.schedule(state);
-    };
-    ArrayObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var array = this.array;
-        var count = array.length;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ArrayObservable.dispatch, 0, {
-                array: array, index: index, count: count, subscriber: subscriber
-            });
-        }
-        else {
-            for (var i = 0; i < count && !subscriber.closed; i++) {
-                subscriber.next(array[i]);
-            }
-            subscriber.complete();
-        }
-    };
-    return ArrayObservable;
-}(Observable_1.Observable));
-exports.ArrayObservable = ArrayObservable;
 
-},{"../Observable":28,"../util/isScheduler":152,"./EmptyObservable":82,"./ScalarObservable":89}],80:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+
+// Convert binary string (typed, when possible)
+exports.binstring2buf = function (str) {
+  var buf = new utils.Buf8(str.length);
+  for (var i = 0, len = buf.length; i < len; i++) {
+    buf[i] = str.charCodeAt(i);
+  }
+  return buf;
 };
-var Subject_1 = require('../Subject');
-var Observable_1 = require('../Observable');
-var Subscriber_1 = require('../Subscriber');
-var Subscription_1 = require('../Subscription');
-/**
- * @class ConnectableObservable<T>
- */
-var ConnectableObservable = (function (_super) {
-    __extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        _super.call(this);
-        this.source = source;
-        this.subjectFactory = subjectFactory;
-        this._refCount = 0;
-    }
-    ConnectableObservable.prototype._subscribe = function (subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    };
-    ConnectableObservable.prototype.getSubject = function () {
-        var subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    };
-    ConnectableObservable.prototype.connect = function () {
-        var connection = this._connection;
-        if (!connection) {
-            connection = this._connection = new Subscription_1.Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription_1.Subscription.EMPTY;
-            }
-            else {
-                this._connection = connection;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return this.lift(new RefCountOperator(this));
-    };
-    return ConnectableObservable;
-}(Observable_1.Observable));
-exports.ConnectableObservable = ConnectableObservable;
-var ConnectableSubscriber = (function (_super) {
-    __extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        _super.call(this, destination);
-        this.connectable = connectable;
-    }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        this._unsubscribe();
-        _super.prototype._complete.call(this);
-    };
-    ConnectableSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            var connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    };
-    return ConnectableSubscriber;
-}(Subject_1.SubjectSubscriber));
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
+
+
+// convert array to string
+exports.buf2string = function (buf, max) {
+  var i, out, c, c_len;
+  var len = max || buf.length;
+
+  // Reserve max possible length (2 words per char)
+  // NB: by unknown reasons, Array is significantly faster for
+  //     String.fromCharCode.apply than Uint16Array.
+  var utf16buf = new Array(len * 2);
+
+  for (out = 0, i = 0; i < len;) {
+    c = buf[i++];
+    // quick process ascii
+    if (c < 0x80) { utf16buf[out++] = c; continue; }
+
+    c_len = _utf8len[c];
+    // skip 5 & 6 byte codes
+    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
+
+    // apply mask on first byte
+    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
+    // join the rest
+    while (c_len > 1 && i < len) {
+      c = (c << 6) | (buf[i++] & 0x3f);
+      c_len--;
     }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source._subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        _super.call(this, destination);
-        this.connectable = connectable;
+
+    // terminated by end of string?
+    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
+
+    if (c < 0x10000) {
+      utf16buf[out++] = c;
+    } else {
+      c -= 0x10000;
+      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
+      utf16buf[out++] = 0xdc00 | (c & 0x3ff);
     }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        ///
-        // Compare the local RefCountSubscriber's connection Subscription to the
-        // connection Subscription on the shared ConnectableObservable. In cases
-        // where the ConnectableObservable source synchronously emits values, and
-        // the RefCountSubscriber's dowstream Observers synchronously unsubscribe,
-        // execution continues to here before the RefCountOperator has a chance to
-        // supply the RefCountSubscriber with the shared connection Subscription.
-        // For example:
-        // ```
-        // Observable.range(0, 10)
-        //   .publish()
-        //   .refCount()
-        //   .take(5)
-        //   .subscribe();
-        // ```
-        // In order to account for this case, RefCountSubscriber should only dispose
-        // the ConnectableObservable's shared connection Subscription if the
-        // connection Subscription exists, *and* either:
-        //   a. RefCountSubscriber doesn't have a reference to the shared connection
-        //      Subscription yet, or,
-        //   b. RefCountSubscriber's connection Subscription reference is identical
-        //      to the shared connection Subscription
-        ///
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
+  }
 
-},{"../Observable":28,"../Subject":33,"../Subscriber":35,"../Subscription":36}],81:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  return buf2binstring(utf16buf, out);
 };
-var Observable_1 = require('../Observable');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var DeferObservable = (function (_super) {
-    __extends(DeferObservable, _super);
-    function DeferObservable(observableFactory) {
-        _super.call(this);
-        this.observableFactory = observableFactory;
-    }
-    /**
-     * Creates an Observable that, on subscribe, calls an Observable factory to
-     * make an Observable for each new Observer.
-     *
-     * <span class="informal">Creates the Observable lazily, that is, only when it
-     * is subscribed.
-     * </span>
-     *
-     * <img src="./img/defer.png" width="100%">
-     *
-     * `defer` allows you to create the Observable only when the Observer
-     * subscribes, and create a fresh Observable for each Observer. It waits until
-     * an Observer subscribes to it, and then it generates an Observable,
-     * typically with an Observable factory function. It does this afresh for each
-     * subscriber, so although each subscriber may think it is subscribing to the
-     * same Observable, in fact each subscriber gets its own individual
-     * Observable.
-     *
-     * @example <caption>Subscribe to either an Observable of clicks or an Observable of interval, at random</caption>
-     * var clicksOrInterval = Rx.Observable.defer(function () {
-     *   if (Math.random() > 0.5) {
-     *     return Rx.Observable.fromEvent(document, 'click');
-     *   } else {
-     *     return Rx.Observable.interval(1000);
-     *   }
-     * });
-     * clicksOrInterval.subscribe(x => console.log(x));
-     *
-     * @see {@link create}
-     *
-     * @param {function(): Observable|Promise} observableFactory The Observable
-     * factory function to invoke for each Observer that subscribes to the output
-     * Observable. May also return a Promise, which will be converted on the fly
-     * to an Observable.
-     * @return {Observable} An Observable whose Observers' subscriptions trigger
-     * an invocation of the given Observable factory function.
-     * @static true
-     * @name defer
-     * @owner Observable
-     */
-    DeferObservable.create = function (observableFactory) {
-        return new DeferObservable(observableFactory);
-    };
-    DeferObservable.prototype._subscribe = function (subscriber) {
-        return new DeferSubscriber(subscriber, this.observableFactory);
-    };
-    return DeferObservable;
-}(Observable_1.Observable));
-exports.DeferObservable = DeferObservable;
-var DeferSubscriber = (function (_super) {
-    __extends(DeferSubscriber, _super);
-    function DeferSubscriber(destination, factory) {
-        _super.call(this, destination);
-        this.factory = factory;
-        this.tryDefer();
-    }
-    DeferSubscriber.prototype.tryDefer = function () {
-        try {
-            this._callFactory();
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    DeferSubscriber.prototype._callFactory = function () {
-        var result = this.factory();
-        if (result) {
-            this.add(subscribeToResult_1.subscribeToResult(this, result));
-        }
-    };
-    return DeferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../Observable":28,"../OuterSubscriber":30,"../util/subscribeToResult":154}],82:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+
+// Calculate max possible position in utf8 buffer,
+// that will not break sequence. If that's not possible
+// - (very small limits) return max size as is.
+//
+// buf[] - utf8 bytes array
+// max   - length limit (mandatory);
+exports.utf8border = function (buf, max) {
+  var pos;
+
+  max = max || buf.length;
+  if (max > buf.length) { max = buf.length; }
+
+  // go back from last position, until start of sequence found
+  pos = max - 1;
+  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
+
+  // Very small and broken sequence,
+  // return max, because we should return something anyway.
+  if (pos < 0) { return max; }
+
+  // If we came to start of buffer - that means buffer is too small,
+  // return max too.
+  if (pos === 0) { return max; }
+
+  return (pos + _utf8len[buf[pos]] > max) ? pos : max;
 };
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var EmptyObservable = (function (_super) {
-    __extends(EmptyObservable, _super);
-    function EmptyObservable(scheduler) {
-        _super.call(this);
-        this.scheduler = scheduler;
-    }
-    /**
-     * Creates an Observable that emits no items to the Observer and immediately
-     * emits a complete notification.
-     *
-     * <span class="informal">Just emits 'complete', and nothing else.
-     * </span>
-     *
-     * <img src="./img/empty.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the complete notification. It can be used for composing with other
-     * Observables, such as in a {@link mergeMap}.
-     *
-     * @example <caption>Emit the number 7, then complete.</caption>
-     * var result = Rx.Observable.empty().startWith(7);
-     * result.subscribe(x => console.log(x));
-     *
-     * @example <caption>Map and flatten only odd numbers to the sequence 'a', 'b', 'c'</caption>
-     * var interval = Rx.Observable.interval(1000);
-     * var result = interval.mergeMap(x =>
-     *   x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()
-     * );
-     * result.subscribe(x => console.log(x));
-     *
-     * @see {@link create}
-     * @see {@link never}
-     * @see {@link of}
-     * @see {@link throw}
-     *
-     * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling
-     * the emission of the complete notification.
-     * @return {Observable} An "empty" Observable: emits only the complete
-     * notification.
-     * @static true
-     * @name empty
-     * @owner Observable
-     */
-    EmptyObservable.create = function (scheduler) {
-        return new EmptyObservable(scheduler);
-    };
-    EmptyObservable.dispatch = function (arg) {
-        var subscriber = arg.subscriber;
-        subscriber.complete();
-    };
-    EmptyObservable.prototype._subscribe = function (subscriber) {
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber });
-        }
-        else {
-            subscriber.complete();
-        }
-    };
-    return EmptyObservable;
-}(Observable_1.Observable));
-exports.EmptyObservable = EmptyObservable;
 
-},{"../Observable":28}],83:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+},{"./common":26}],28:[function(require,module,exports){
+'use strict';
+
+// Note: adler32 takes 12% for level 0 and 2% for level 6.
+// It isn't worth it to make additional optimizations as in original.
+// Small size is preferable.
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+function adler32(adler, buf, len, pos) {
+  var s1 = (adler & 0xffff) |0,
+      s2 = ((adler >>> 16) & 0xffff) |0,
+      n = 0;
+
+  while (len !== 0) {
+    // Set limit ~ twice less than 5552, to keep
+    // s2 in 31-bits, because we force signed ints.
+    // in other case %= will fail.
+    n = len > 2000 ? 2000 : len;
+    len -= n;
+
+    do {
+      s1 = (s1 + buf[pos++]) |0;
+      s2 = (s2 + s1) |0;
+    } while (--n);
+
+    s1 %= 65521;
+    s2 %= 65521;
+  }
+
+  return (s1 | (s2 << 16)) |0;
+}
+
+
+module.exports = adler32;
+
+},{}],29:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+module.exports = {
+
+  /* Allowed flush values; see deflate() and inflate() below for details */
+  Z_NO_FLUSH:         0,
+  Z_PARTIAL_FLUSH:    1,
+  Z_SYNC_FLUSH:       2,
+  Z_FULL_FLUSH:       3,
+  Z_FINISH:           4,
+  Z_BLOCK:            5,
+  Z_TREES:            6,
+
+  /* Return codes for the compression/decompression functions. Negative values
+  * are errors, positive values are used for special but normal events.
+  */
+  Z_OK:               0,
+  Z_STREAM_END:       1,
+  Z_NEED_DICT:        2,
+  Z_ERRNO:           -1,
+  Z_STREAM_ERROR:    -2,
+  Z_DATA_ERROR:      -3,
+  //Z_MEM_ERROR:     -4,
+  Z_BUF_ERROR:       -5,
+  //Z_VERSION_ERROR: -6,
+
+  /* compression levels */
+  Z_NO_COMPRESSION:         0,
+  Z_BEST_SPEED:             1,
+  Z_BEST_COMPRESSION:       9,
+  Z_DEFAULT_COMPRESSION:   -1,
+
+
+  Z_FILTERED:               1,
+  Z_HUFFMAN_ONLY:           2,
+  Z_RLE:                    3,
+  Z_FIXED:                  4,
+  Z_DEFAULT_STRATEGY:       0,
+
+  /* Possible values of the data_type field (though see inflate()) */
+  Z_BINARY:                 0,
+  Z_TEXT:                   1,
+  //Z_ASCII:                1, // = Z_TEXT (deprecated)
+  Z_UNKNOWN:                2,
+
+  /* The deflate compression method */
+  Z_DEFLATED:               8
+  //Z_NULL:                 null // Use -1 or null inline, depending on var type
 };
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+
+},{}],30:[function(require,module,exports){
+'use strict';
+
+// Note: we can't get significant speed boost here.
+// So write code to minimize size - no pregenerated tables
+// and array tools dependencies.
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+// Use ordinary array, since untyped makes no boost here
+function makeTable() {
+  var c, table = [];
+
+  for (var n = 0; n < 256; n++) {
+    c = n;
+    for (var k = 0; k < 8; k++) {
+      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
+    }
+    table[n] = c;
+  }
+
+  return table;
+}
+
+// Create table on load. Just 255 signed longs. Not a problem.
+var crcTable = makeTable();
+
+
+function crc32(crc, buf, len, pos) {
+  var t = crcTable,
+      end = pos + len;
+
+  crc ^= -1;
+
+  for (var i = pos; i < end; i++) {
+    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
+  }
+
+  return (crc ^ (-1)); // >>> 0;
+}
+
+
+module.exports = crc32;
+
+},{}],31:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+var utils   = require('../utils/common');
+var trees   = require('./trees');
+var adler32 = require('./adler32');
+var crc32   = require('./crc32');
+var msg     = require('./messages');
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+/* Allowed flush values; see deflate() and inflate() below for details */
+var Z_NO_FLUSH      = 0;
+var Z_PARTIAL_FLUSH = 1;
+//var Z_SYNC_FLUSH    = 2;
+var Z_FULL_FLUSH    = 3;
+var Z_FINISH        = 4;
+var Z_BLOCK         = 5;
+//var Z_TREES         = 6;
+
+
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
  */
-var ErrorObservable = (function (_super) {
-    __extends(ErrorObservable, _super);
-    function ErrorObservable(error, scheduler) {
-        _super.call(this);
-        this.error = error;
-        this.scheduler = scheduler;
-    }
-    /**
-     * Creates an Observable that emits no items to the Observer and immediately
-     * emits an error notification.
-     *
-     * <span class="informal">Just emits 'error', and nothing else.
-     * </span>
-     *
-     * <img src="./img/throw.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the error notification. It can be used for composing with other
-     * Observables, such as in a {@link mergeMap}.
-     *
-     * @example <caption>Emit the number 7, then emit an error.</caption>
-     * var result = Rx.Observable.throw(new Error('oops!')).startWith(7);
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @example <caption>Map and flattens numbers to the sequence 'a', 'b', 'c', but throw an error for 13</caption>
-     * var interval = Rx.Observable.interval(1000);
-     * var result = interval.mergeMap(x =>
-     *   x === 13 ?
-     *     Rx.Observable.throw('Thirteens are bad') :
-     *     Rx.Observable.of('a', 'b', 'c')
-     * );
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @see {@link create}
-     * @see {@link empty}
-     * @see {@link never}
-     * @see {@link of}
-     *
-     * @param {any} error The particular Error to pass to the error notification.
-     * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling
-     * the emission of the error notification.
-     * @return {Observable} An error Observable: emits only the error notification
-     * using the given error argument.
-     * @static true
-     * @name throw
-     * @owner Observable
-     */
-    ErrorObservable.create = function (error, scheduler) {
-        return new ErrorObservable(error, scheduler);
-    };
-    ErrorObservable.dispatch = function (arg) {
-        var error = arg.error, subscriber = arg.subscriber;
-        subscriber.error(error);
-    };
-    ErrorObservable.prototype._subscribe = function (subscriber) {
-        var error = this.error;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ErrorObservable.dispatch, 0, {
-                error: error, subscriber: subscriber
-            });
-        }
-        else {
-            subscriber.error(error);
-        }
-    };
-    return ErrorObservable;
-}(Observable_1.Observable));
-exports.ErrorObservable = ErrorObservable;
+var Z_OK            = 0;
+var Z_STREAM_END    = 1;
+//var Z_NEED_DICT     = 2;
+//var Z_ERRNO         = -1;
+var Z_STREAM_ERROR  = -2;
+var Z_DATA_ERROR    = -3;
+//var Z_MEM_ERROR     = -4;
+var Z_BUF_ERROR     = -5;
+//var Z_VERSION_ERROR = -6;
 
-},{"../Observable":28}],84:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var tryCatch_1 = require('../util/tryCatch');
-var isFunction_1 = require('../util/isFunction');
-var errorObject_1 = require('../util/errorObject');
-var Subscription_1 = require('../Subscription');
-function isNodeStyleEventEmmitter(sourceObj) {
-    return !!sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
+
+/* compression levels */
+//var Z_NO_COMPRESSION      = 0;
+//var Z_BEST_SPEED          = 1;
+//var Z_BEST_COMPRESSION    = 9;
+var Z_DEFAULT_COMPRESSION = -1;
+
+
+var Z_FILTERED            = 1;
+var Z_HUFFMAN_ONLY        = 2;
+var Z_RLE                 = 3;
+var Z_FIXED               = 4;
+var Z_DEFAULT_STRATEGY    = 0;
+
+/* Possible values of the data_type field (though see inflate()) */
+//var Z_BINARY              = 0;
+//var Z_TEXT                = 1;
+//var Z_ASCII               = 1; // = Z_TEXT
+var Z_UNKNOWN             = 2;
+
+
+/* The deflate compression method */
+var Z_DEFLATED  = 8;
+
+/*============================================================================*/
+
+
+var MAX_MEM_LEVEL = 9;
+/* Maximum value for memLevel in deflateInit2 */
+var MAX_WBITS = 15;
+/* 32K LZ77 window */
+var DEF_MEM_LEVEL = 8;
+
+
+var LENGTH_CODES  = 29;
+/* number of length codes, not counting the special END_BLOCK code */
+var LITERALS      = 256;
+/* number of literal bytes 0..255 */
+var L_CODES       = LITERALS + 1 + LENGTH_CODES;
+/* number of Literal or Length codes, including the END_BLOCK code */
+var D_CODES       = 30;
+/* number of distance codes */
+var BL_CODES      = 19;
+/* number of codes used to transfer the bit lengths */
+var HEAP_SIZE     = 2 * L_CODES + 1;
+/* maximum heap size */
+var MAX_BITS  = 15;
+/* All codes must not exceed MAX_BITS bits */
+
+var MIN_MATCH = 3;
+var MAX_MATCH = 258;
+var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
+
+var PRESET_DICT = 0x20;
+
+var INIT_STATE = 42;
+var EXTRA_STATE = 69;
+var NAME_STATE = 73;
+var COMMENT_STATE = 91;
+var HCRC_STATE = 103;
+var BUSY_STATE = 113;
+var FINISH_STATE = 666;
+
+var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
+var BS_BLOCK_DONE     = 2; /* block flush performed */
+var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
+var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
+
+var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
+
+function err(strm, errorCode) {
+  strm.msg = msg[errorCode];
+  return errorCode;
 }
-function isJQueryStyleEventEmitter(sourceObj) {
-    return !!sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
+
+function rank(f) {
+  return ((f) << 1) - ((f) > 4 ? 9 : 0);
 }
-function isNodeList(sourceObj) {
-    return !!sourceObj && sourceObj.toString() === '[object NodeList]';
+
+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
+
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->output buffer and copying into it.
+ * (See also read_buf()).
+ */
+function flush_pending(strm) {
+  var s = strm.state;
+
+  //_tr_flush_bits(s);
+  var len = s.pending;
+  if (len > strm.avail_out) {
+    len = strm.avail_out;
+  }
+  if (len === 0) { return; }
+
+  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
+  strm.next_out += len;
+  s.pending_out += len;
+  strm.total_out += len;
+  strm.avail_out -= len;
+  s.pending -= len;
+  if (s.pending === 0) {
+    s.pending_out = 0;
+  }
 }
-function isHTMLCollection(sourceObj) {
-    return !!sourceObj && sourceObj.toString() === '[object HTMLCollection]';
+
+
+function flush_block_only(s, last) {
+  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
+  s.block_start = s.strstart;
+  flush_pending(s.strm);
 }
-function isEventTarget(sourceObj) {
-    return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
+
+
+function put_byte(s, b) {
+  s.pending_buf[s.pending++] = b;
 }
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
  */
-var FromEventObservable = (function (_super) {
-    __extends(FromEventObservable, _super);
-    function FromEventObservable(sourceObj, eventName, selector, options) {
-        _super.call(this);
-        this.sourceObj = sourceObj;
-        this.eventName = eventName;
-        this.selector = selector;
-        this.options = options;
-    }
-    /* tslint:enable:max-line-length */
-    /**
-     * Creates an Observable that emits events of a specific type coming from the
-     * given event target.
-     *
-     * <span class="informal">Creates an Observable from DOM events, or Node
-     * EventEmitter events or others.</span>
-     *
-     * <img src="./img/fromEvent.png" width="100%">
-     *
-     * Creates an Observable by attaching an event listener to an "event target",
-     * which may be an object with `addEventListener` and `removeEventListener`,
-     * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the
-     * DOM, or an HTMLCollection from the DOM. The event handler is attached when
-     * the output Observable is subscribed, and removed when the Subscription is
-     * unsubscribed.
-     *
-     * @example <caption>Emits clicks happening on the DOM document</caption>
-     * var clicks = Rx.Observable.fromEvent(document, 'click');
-     * clicks.subscribe(x => console.log(x));
-     *
-     * @see {@link from}
-     * @see {@link fromEventPattern}
-     *
-     * @param {EventTargetLike} target The DOMElement, event target, Node.js
-     * EventEmitter, NodeList or HTMLCollection to attach the event handler to.
-     * @param {string} eventName The event name of interest, being emitted by the
-     * `target`.
-     * @parm {EventListenerOptions} [options] Options to pass through to addEventListener
-     * @param {SelectorMethodSignature<T>} [selector] An optional function to
-     * post-process results. It takes the arguments from the event handler and
-     * should return a single value.
-     * @return {Observable<T>}
-     * @static true
-     * @name fromEvent
-     * @owner Observable
-     */
-    FromEventObservable.create = function (target, eventName, options, selector) {
-        if (isFunction_1.isFunction(options)) {
-            selector = options;
-            options = undefined;
-        }
-        return new FromEventObservable(target, eventName, selector, options);
-    };
-    FromEventObservable.setupSubscription = function (sourceObj, eventName, handler, subscriber, options) {
-        var unsubscribe;
-        if (isNodeList(sourceObj) || isHTMLCollection(sourceObj)) {
-            for (var i = 0, len = sourceObj.length; i < len; i++) {
-                FromEventObservable.setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-            }
-        }
-        else if (isEventTarget(sourceObj)) {
-            var source_1 = sourceObj;
-            sourceObj.addEventListener(eventName, handler, options);
-            unsubscribe = function () { return source_1.removeEventListener(eventName, handler); };
-        }
-        else if (isJQueryStyleEventEmitter(sourceObj)) {
-            var source_2 = sourceObj;
-            sourceObj.on(eventName, handler);
-            unsubscribe = function () { return source_2.off(eventName, handler); };
-        }
-        else if (isNodeStyleEventEmmitter(sourceObj)) {
-            var source_3 = sourceObj;
-            sourceObj.addListener(eventName, handler);
-            unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-        }
-        subscriber.add(new Subscription_1.Subscription(unsubscribe));
-    };
-    FromEventObservable.prototype._subscribe = function (subscriber) {
-        var sourceObj = this.sourceObj;
-        var eventName = this.eventName;
-        var options = this.options;
-        var selector = this.selector;
-        var handler = selector ? function () {
-            var args = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                args[_i - 0] = arguments[_i];
-            }
-            var result = tryCatch_1.tryCatch(selector).apply(void 0, args);
-            if (result === errorObject_1.errorObject) {
-                subscriber.error(errorObject_1.errorObject.e);
-            }
-            else {
-                subscriber.next(result);
-            }
-        } : function (e) { return subscriber.next(e); };
-        FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options);
-    };
-    return FromEventObservable;
-}(Observable_1.Observable));
-exports.FromEventObservable = FromEventObservable;
+function putShortMSB(s, b) {
+//  put_byte(s, (Byte)(b >> 8));
+//  put_byte(s, (Byte)(b & 0xff));
+  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
+  s.pending_buf[s.pending++] = b & 0xff;
+}
 
-},{"../Observable":28,"../Subscription":36,"../util/errorObject":147,"../util/isFunction":149,"../util/tryCatch":156}],85:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var isArray_1 = require('../util/isArray');
-var isPromise_1 = require('../util/isPromise');
-var PromiseObservable_1 = require('./PromiseObservable');
-var IteratorObservable_1 = require('./IteratorObservable');
-var ArrayObservable_1 = require('./ArrayObservable');
-var ArrayLikeObservable_1 = require('./ArrayLikeObservable');
-var iterator_1 = require('../symbol/iterator');
-var Observable_1 = require('../Observable');
-var observeOn_1 = require('../operator/observeOn');
-var observable_1 = require('../symbol/observable');
-var isArrayLike = (function (x) { return x && typeof x.length === 'number'; });
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read.  All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->input buffer and copying from it.
+ * (See also flush_pending()).
  */
-var FromObservable = (function (_super) {
-    __extends(FromObservable, _super);
-    function FromObservable(ish, scheduler) {
-        _super.call(this, null);
-        this.ish = ish;
-        this.scheduler = scheduler;
-    }
-    /**
-     * Creates an Observable from an Array, an array-like object, a Promise, an
-     * iterable object, or an Observable-like object.
-     *
-     * <span class="informal">Converts almost anything to an Observable.</span>
-     *
-     * <img src="./img/from.png" width="100%">
-     *
-     * Convert various other objects and data types into Observables. `from`
-     * converts a Promise or an array-like or an
-     * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)
-     * object into an Observable that emits the items in that promise or array or
-     * iterable. A String, in this context, is treated as an array of characters.
-     * Observable-like objects (contains a function named with the ES2015 Symbol
-     * for Observable) can also be converted through this operator.
-     *
-     * @example <caption>Converts an array to an Observable</caption>
-     * var array = [10, 20, 30];
-     * var result = Rx.Observable.from(array);
-     * result.subscribe(x => console.log(x));
-     *
-     * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>
-     * function* generateDoubles(seed) {
-     *   var i = seed;
-     *   while (true) {
-     *     yield i;
-     *     i = 2 * i; // double it
-     *   }
-     * }
-     *
-     * var iterator = generateDoubles(3);
-     * var result = Rx.Observable.from(iterator).take(10);
-     * result.subscribe(x => console.log(x));
-     *
-     * @see {@link create}
-     * @see {@link fromEvent}
-     * @see {@link fromEventPattern}
-     * @see {@link fromPromise}
-     *
-     * @param {ObservableInput<T>} ish A subscribable object, a Promise, an
-     * Observable-like, an Array, an iterable or an array-like object to be
-     * converted.
-     * @param {Scheduler} [scheduler] The scheduler on which to schedule the
-     * emissions of values.
-     * @return {Observable<T>} The Observable whose values are originally from the
-     * input object that was converted.
-     * @static true
-     * @name from
-     * @owner Observable
-     */
-    FromObservable.create = function (ish, scheduler) {
-        if (ish != null) {
-            if (typeof ish[observable_1.$$observable] === 'function') {
-                if (ish instanceof Observable_1.Observable && !scheduler) {
-                    return ish;
-                }
-                return new FromObservable(ish, scheduler);
-            }
-            else if (isArray_1.isArray(ish)) {
-                return new ArrayObservable_1.ArrayObservable(ish, scheduler);
-            }
-            else if (isPromise_1.isPromise(ish)) {
-                return new PromiseObservable_1.PromiseObservable(ish, scheduler);
-            }
-            else if (typeof ish[iterator_1.$$iterator] === 'function' || typeof ish === 'string') {
-                return new IteratorObservable_1.IteratorObservable(ish, scheduler);
-            }
-            else if (isArrayLike(ish)) {
-                return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);
-            }
-        }
-        throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');
-    };
-    FromObservable.prototype._subscribe = function (subscriber) {
-        var ish = this.ish;
-        var scheduler = this.scheduler;
-        if (scheduler == null) {
-            return ish[observable_1.$$observable]().subscribe(subscriber);
-        }
-        else {
-            return ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));
-        }
-    };
-    return FromObservable;
-}(Observable_1.Observable));
-exports.FromObservable = FromObservable;
+function read_buf(strm, buf, start, size) {
+  var len = strm.avail_in;
 
-},{"../Observable":28,"../operator/observeOn":118,"../symbol/iterator":140,"../symbol/observable":141,"../util/isArray":148,"../util/isPromise":151,"./ArrayLikeObservable":78,"./ArrayObservable":79,"./IteratorObservable":86,"./PromiseObservable":88}],86:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Observable_1 = require('../Observable');
-var iterator_1 = require('../symbol/iterator');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+  if (len > size) { len = size; }
+  if (len === 0) { return 0; }
+
+  strm.avail_in -= len;
+
+  // zmemcpy(buf, strm->next_in, len);
+  utils.arraySet(buf, strm.input, strm.next_in, len, start);
+  if (strm.state.wrap === 1) {
+    strm.adler = adler32(strm.adler, buf, len, start);
+  }
+
+  else if (strm.state.wrap === 2) {
+    strm.adler = crc32(strm.adler, buf, len, start);
+  }
+
+  strm.next_in += len;
+  strm.total_in += len;
+
+  return len;
+}
+
+
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
  */
-var IteratorObservable = (function (_super) {
-    __extends(IteratorObservable, _super);
-    function IteratorObservable(iterator, scheduler) {
-        _super.call(this);
-        this.scheduler = scheduler;
-        if (iterator == null) {
-            throw new Error('iterator cannot be null.');
-        }
-        this.iterator = getIterator(iterator);
+function longest_match(s, cur_match) {
+  var chain_length = s.max_chain_length;      /* max hash chain length */
+  var scan = s.strstart; /* current string */
+  var match;                       /* matched string */
+  var len;                           /* length of current match */
+  var best_len = s.prev_length;              /* best match length so far */
+  var nice_match = s.nice_match;             /* stop if match long enough */
+  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
+      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
+
+  var _win = s.window; // shortcut
+
+  var wmask = s.w_mask;
+  var prev  = s.prev;
+
+  /* Stop when cur_match becomes <= limit. To simplify the code,
+   * we prevent matches with the string of window index 0.
+   */
+
+  var strend = s.strstart + MAX_MATCH;
+  var scan_end1  = _win[scan + best_len - 1];
+  var scan_end   = _win[scan + best_len];
+
+  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+   * It is easy to get rid of this optimization if necessary.
+   */
+  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+  /* Do not waste too much time if we already have a good match: */
+  if (s.prev_length >= s.good_match) {
+    chain_length >>= 2;
+  }
+  /* Do not look for matches beyond the end of the input. This is necessary
+   * to make deflate deterministic.
+   */
+  if (nice_match > s.lookahead) { nice_match = s.lookahead; }
+
+  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+  do {
+    // Assert(cur_match < s->strstart, "no future");
+    match = cur_match;
+
+    /* Skip to next match if the match length cannot increase
+     * or if the match length is less than 2.  Note that the checks below
+     * for insufficient lookahead only occur occasionally for performance
+     * reasons.  Therefore uninitialized memory will be accessed, and
+     * conditional jumps will be made that depend on those values.
+     * However the length of the match is limited to the lookahead, so
+     * the output of deflate is not affected by the uninitialized values.
+     */
+
+    if (_win[match + best_len]     !== scan_end  ||
+        _win[match + best_len - 1] !== scan_end1 ||
+        _win[match]                !== _win[scan] ||
+        _win[++match]              !== _win[scan + 1]) {
+      continue;
     }
-    IteratorObservable.create = function (iterator, scheduler) {
-        return new IteratorObservable(iterator, scheduler);
-    };
-    IteratorObservable.dispatch = function (state) {
-        var index = state.index, hasError = state.hasError, iterator = state.iterator, subscriber = state.subscriber;
-        if (hasError) {
-            subscriber.error(state.error);
-            return;
-        }
-        var result = iterator.next();
-        if (result.done) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(result.value);
-        state.index = index + 1;
-        if (subscriber.closed) {
-            return;
-        }
-        this.schedule(state);
-    };
-    IteratorObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, iterator = _a.iterator, scheduler = _a.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(IteratorObservable.dispatch, 0, {
-                index: index, iterator: iterator, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                var result = iterator.next();
-                if (result.done) {
-                    subscriber.complete();
-                    break;
-                }
-                else {
-                    subscriber.next(result.value);
-                }
-                if (subscriber.closed) {
-                    break;
-                }
-            } while (true);
-        }
-    };
-    return IteratorObservable;
-}(Observable_1.Observable));
-exports.IteratorObservable = IteratorObservable;
-var StringIterator = (function () {
-    function StringIterator(str, idx, len) {
-        if (idx === void 0) { idx = 0; }
-        if (len === void 0) { len = str.length; }
-        this.str = str;
-        this.idx = idx;
-        this.len = len;
-    }
-    StringIterator.prototype[iterator_1.$$iterator] = function () { return (this); };
-    StringIterator.prototype.next = function () {
-        return this.idx < this.len ? {
-            done: false,
-            value: this.str.charAt(this.idx++)
-        } : {
-            done: true,
-            value: undefined
-        };
-    };
-    return StringIterator;
-}());
-var ArrayIterator = (function () {
-    function ArrayIterator(arr, idx, len) {
-        if (idx === void 0) { idx = 0; }
-        if (len === void 0) { len = toLength(arr); }
-        this.arr = arr;
-        this.idx = idx;
-        this.len = len;
-    }
-    ArrayIterator.prototype[iterator_1.$$iterator] = function () { return this; };
-    ArrayIterator.prototype.next = function () {
-        return this.idx < this.len ? {
-            done: false,
-            value: this.arr[this.idx++]
-        } : {
-            done: true,
-            value: undefined
-        };
-    };
-    return ArrayIterator;
-}());
-function getIterator(obj) {
-    var i = obj[iterator_1.$$iterator];
-    if (!i && typeof obj === 'string') {
-        return new StringIterator(obj);
+
+    /* The check at best_len-1 can be removed because it will be made
+     * again later. (This heuristic is not always a win.)
+     * It is not necessary to compare scan[2] and match[2] since they
+     * are always equal when the other bytes match, given that
+     * the hash keys are equal and that HASH_BITS >= 8.
+     */
+    scan += 2;
+    match++;
+    // Assert(*scan == *match, "match[2]?");
+
+    /* We check for insufficient lookahead only every 8th comparison;
+     * the 256th check will be made at strstart+258.
+     */
+    do {
+      /*jshint noempty:false*/
+    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             scan < strend);
+
+    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+    len = MAX_MATCH - (strend - scan);
+    scan = strend - MAX_MATCH;
+
+    if (len > best_len) {
+      s.match_start = cur_match;
+      best_len = len;
+      if (len >= nice_match) {
+        break;
+      }
+      scan_end1  = _win[scan + best_len - 1];
+      scan_end   = _win[scan + best_len];
     }
-    if (!i && obj.length !== undefined) {
-        return new ArrayIterator(obj);
+  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
+
+  if (best_len <= s.lookahead) {
+    return best_len;
+  }
+  return s.lookahead;
+}
+
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ *    At least one byte has been read, or avail_in == 0; reads are
+ *    performed for at least two bytes (required for the zip translate_eol
+ *    option -- not supported here).
+ */
+function fill_window(s) {
+  var _w_size = s.w_size;
+  var p, n, m, more, str;
+
+  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+  do {
+    more = s.window_size - s.lookahead - s.strstart;
+
+    // JS ints have 32 bit, block below not needed
+    /* Deal with !@#$% 64K limit: */
+    //if (sizeof(int) <= 2) {
+    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+    //        more = wsize;
+    //
+    //  } else if (more == (unsigned)(-1)) {
+    //        /* Very unlikely, but possible on 16 bit machine if
+    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
+    //         */
+    //        more--;
+    //    }
+    //}
+
+
+    /* If the window is almost full and there is insufficient lookahead,
+     * move the upper half to the lower one to make room in the upper half.
+     */
+    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
+
+      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
+      s.match_start -= _w_size;
+      s.strstart -= _w_size;
+      /* we now have strstart >= MAX_DIST */
+      s.block_start -= _w_size;
+
+      /* Slide the hash table (could be avoided with 32 bit values
+       at the expense of memory usage). We slide even when level == 0
+       to keep the hash table consistent if we switch back to level > 0
+       later. (Using level 0 permanently is not an optimal usage of
+       zlib, so we don't care about this pathological case.)
+       */
+
+      n = s.hash_size;
+      p = n;
+      do {
+        m = s.head[--p];
+        s.head[p] = (m >= _w_size ? m - _w_size : 0);
+      } while (--n);
+
+      n = _w_size;
+      p = n;
+      do {
+        m = s.prev[--p];
+        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
+        /* If n is not on any hash chain, prev[n] is garbage but
+         * its value will never be used.
+         */
+      } while (--n);
+
+      more += _w_size;
     }
-    if (!i) {
-        throw new TypeError('object is not iterable');
+    if (s.strm.avail_in === 0) {
+      break;
     }
-    return obj[iterator_1.$$iterator]();
-}
-var maxSafeInteger = Math.pow(2, 53) - 1;
-function toLength(o) {
-    var len = +o.length;
-    if (isNaN(len)) {
-        return 0;
+
+    /* If there was no sliding:
+     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+     *    more == window_size - lookahead - strstart
+     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+     * => more >= window_size - 2*WSIZE + 2
+     * In the BIG_MEM or MMAP case (not yet supported),
+     *   window_size == input_size + MIN_LOOKAHEAD  &&
+     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+     * Otherwise, window_size == 2*WSIZE so more >= 2.
+     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+     */
+    //Assert(more >= 2, "more < 2");
+    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
+    s.lookahead += n;
+
+    /* Initialize the hash value now that we have some input: */
+    if (s.lookahead + s.insert >= MIN_MATCH) {
+      str = s.strstart - s.insert;
+      s.ins_h = s.window[str];
+
+      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
+//#if MIN_MATCH != 3
+//        Call update_hash() MIN_MATCH-3 more times
+//#endif
+      while (s.insert) {
+        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
+        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
+
+        s.prev[str & s.w_mask] = s.head[s.ins_h];
+        s.head[s.ins_h] = str;
+        str++;
+        s.insert--;
+        if (s.lookahead + s.insert < MIN_MATCH) {
+          break;
+        }
+      }
     }
-    if (len === 0 || !numberIsFinite(len)) {
-        return len;
+    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+     * but this is not important since only literal bytes will be emitted.
+     */
+
+  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
+
+  /* If the WIN_INIT bytes after the end of the current data have never been
+   * written, then zero those bytes in order to avoid memory check reports of
+   * the use of uninitialized (or uninitialised as Julian writes) bytes by
+   * the longest match routines.  Update the high water mark for the next
+   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
+   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+   */
+//  if (s.high_water < s.window_size) {
+//    var curr = s.strstart + s.lookahead;
+//    var init = 0;
+//
+//    if (s.high_water < curr) {
+//      /* Previous high water mark below current data -- zero WIN_INIT
+//       * bytes or up to end of window, whichever is less.
+//       */
+//      init = s.window_size - curr;
+//      if (init > WIN_INIT)
+//        init = WIN_INIT;
+//      zmemzero(s->window + curr, (unsigned)init);
+//      s->high_water = curr + init;
+//    }
+//    else if (s->high_water < (ulg)curr + WIN_INIT) {
+//      /* High water mark at or above current data, but below current data
+//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+//       * to end of window, whichever is less.
+//       */
+//      init = (ulg)curr + WIN_INIT - s->high_water;
+//      if (init > s->window_size - s->high_water)
+//        init = s->window_size - s->high_water;
+//      zmemzero(s->window + s->high_water, (unsigned)init);
+//      s->high_water += init;
+//    }
+//  }
+//
+//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+//    "not enough room for search");
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+function deflate_stored(s, flush) {
+  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+   * to pending_buf_size, and each stored block has a 5 byte header:
+   */
+  var max_block_size = 0xffff;
+
+  if (max_block_size > s.pending_buf_size - 5) {
+    max_block_size = s.pending_buf_size - 5;
+  }
+
+  /* Copy as much as possible from input to output: */
+  for (;;) {
+    /* Fill the window as much as possible: */
+    if (s.lookahead <= 1) {
+
+      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+      //  s->block_start >= (long)s->w_size, "slide too late");
+//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
+//        s.block_start >= s.w_size)) {
+//        throw  new Error("slide too late");
+//      }
+
+      fill_window(s);
+      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+
+      if (s.lookahead === 0) {
+        break;
+      }
+      /* flush the current block */
     }
-    len = sign(len) * Math.floor(Math.abs(len));
-    if (len <= 0) {
-        return 0;
+    //Assert(s->block_start >= 0L, "block gone");
+//    if (s.block_start < 0) throw new Error("block gone");
+
+    s.strstart += s.lookahead;
+    s.lookahead = 0;
+
+    /* Emit a stored block if pending_buf will be full: */
+    var max_start = s.block_start + max_block_size;
+
+    if (s.strstart === 0 || s.strstart >= max_start) {
+      /* strstart == 0 is possible when wraparound on 16-bit machine */
+      s.lookahead = s.strstart - max_start;
+      s.strstart = max_start;
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+
+
     }
-    if (len > maxSafeInteger) {
-        return maxSafeInteger;
+    /* Flush if we may have to slide, otherwise block_start may become
+     * negative and the data will be gone:
+     */
+    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
     }
-    return len;
-}
-function numberIsFinite(value) {
-    return typeof value === 'number' && root_1.root.isFinite(value);
-}
-function sign(value) {
-    var valueAsNumber = +value;
-    if (valueAsNumber === 0) {
-        return valueAsNumber;
+  }
+
+  s.insert = 0;
+
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
     }
-    if (isNaN(valueAsNumber)) {
-        return valueAsNumber;
+    /***/
+    return BS_FINISH_DONE;
+  }
+
+  if (s.strstart > s.block_start) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
     }
-    return valueAsNumber < 0 ? -1 : 1;
+    /***/
+  }
+
+  return BS_NEED_MORE;
 }
 
-},{"../Observable":28,"../symbol/iterator":140,"../util/root":153}],87:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var ConnectableObservable_1 = require('../observable/ConnectableObservable');
-var MulticastObservable = (function (_super) {
-    __extends(MulticastObservable, _super);
-    function MulticastObservable(source, subjectFactory, selector) {
-        _super.call(this);
-        this.source = source;
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+function deflate_fast(s, flush) {
+  var hash_head;        /* head of the hash chain */
+  var bflush;           /* set if current block must be flushed */
+
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the next match, plus MIN_MATCH bytes to insert the
+     * string following the next match.
+     */
+    if (s.lookahead < MIN_LOOKAHEAD) {
+      fill_window(s);
+      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) {
+        break; /* flush the current block */
+      }
     }
-    MulticastObservable.prototype._subscribe = function (subscriber) {
-        var _a = this, selector = _a.selector, source = _a.source;
-        var connectable = new ConnectableObservable_1.ConnectableObservable(source, this.subjectFactory);
-        var subscription = selector(connectable).subscribe(subscriber);
-        subscription.add(connectable.connect());
-        return subscription;
-    };
-    return MulticastObservable;
-}(Observable_1.Observable));
-exports.MulticastObservable = MulticastObservable;
 
-},{"../Observable":28,"../observable/ConnectableObservable":80}],88:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var PromiseObservable = (function (_super) {
-    __extends(PromiseObservable, _super);
-    function PromiseObservable(promise, scheduler) {
-        _super.call(this);
-        this.promise = promise;
-        this.scheduler = scheduler;
+    /* Insert the string window[strstart .. strstart+2] in the
+     * dictionary, and set hash_head to the head of the hash chain:
+     */
+    hash_head = 0/*NIL*/;
+    if (s.lookahead >= MIN_MATCH) {
+      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+      s.head[s.ins_h] = s.strstart;
+      /***/
     }
-    /**
-     * Converts a Promise to an Observable.
-     *
-     * <span class="informal">Returns an Observable that just emits the Promise's
-     * resolved value, then completes.</span>
-     *
-     * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an
-     * Observable. If the Promise resolves with a value, the output Observable
-     * emits that resolved value as a `next`, and then completes. If the Promise
-     * is rejected, then the output Observable emits the corresponding Error.
-     *
-     * @example <caption>Convert the Promise returned by Fetch to an Observable</caption>
-     * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @see {@link bindCallback}
-     * @see {@link from}
-     *
-     * @param {Promise<T>} promise The promise to be converted.
-     * @param {Scheduler} [scheduler] An optional Scheduler to use for scheduling
-     * the delivery of the resolved value (or the rejection).
-     * @return {Observable<T>} An Observable which wraps the Promise.
-     * @static true
-     * @name fromPromise
-     * @owner Observable
+
+    /* Find the longest match, discarding those <= prev_length.
+     * At this point we have always match_length < MIN_MATCH
      */
-    PromiseObservable.create = function (promise, scheduler) {
-        return new PromiseObservable(promise, scheduler);
-    };
-    PromiseObservable.prototype._subscribe = function (subscriber) {
-        var _this = this;
-        var promise = this.promise;
-        var scheduler = this.scheduler;
-        if (scheduler == null) {
-            if (this._isScalar) {
-                if (!subscriber.closed) {
-                    subscriber.next(this.value);
-                    subscriber.complete();
-                }
-            }
-            else {
-                promise.then(function (value) {
-                    _this.value = value;
-                    _this._isScalar = true;
-                    if (!subscriber.closed) {
-                        subscriber.next(value);
-                        subscriber.complete();
-                    }
-                }, function (err) {
-                    if (!subscriber.closed) {
-                        subscriber.error(err);
-                    }
-                })
-                    .then(null, function (err) {
-                    // escape the promise trap, throw unhandled errors
-                    root_1.root.setTimeout(function () { throw err; });
-                });
-            }
-        }
-        else {
-            if (this._isScalar) {
-                if (!subscriber.closed) {
-                    return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber });
-                }
-            }
-            else {
-                promise.then(function (value) {
-                    _this.value = value;
-                    _this._isScalar = true;
-                    if (!subscriber.closed) {
-                        subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber }));
-                    }
-                }, function (err) {
-                    if (!subscriber.closed) {
-                        subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber }));
-                    }
-                })
-                    .then(null, function (err) {
-                    // escape the promise trap, throw unhandled errors
-                    root_1.root.setTimeout(function () { throw err; });
-                });
-            }
-        }
-    };
-    return PromiseObservable;
-}(Observable_1.Observable));
-exports.PromiseObservable = PromiseObservable;
-function dispatchNext(arg) {
-    var value = arg.value, subscriber = arg.subscriber;
-    if (!subscriber.closed) {
-        subscriber.next(value);
-        subscriber.complete();
+    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
+      /* To simplify the code, we prevent matches with the string
+       * of window index 0 (in particular we have to avoid a match
+       * of the string with itself at the start of the input file).
+       */
+      s.match_length = longest_match(s, hash_head);
+      /* longest_match() sets match_start */
+    }
+    if (s.match_length >= MIN_MATCH) {
+      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
+
+      /*** _tr_tally_dist(s, s.strstart - s.match_start,
+                     s.match_length - MIN_MATCH, bflush); ***/
+      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
+
+      s.lookahead -= s.match_length;
+
+      /* Insert new strings in the hash table only if the match length
+       * is not too large. This saves time but degrades compression.
+       */
+      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
+        s.match_length--; /* string at strstart already in table */
+        do {
+          s.strstart++;
+          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+          s.head[s.ins_h] = s.strstart;
+          /***/
+          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+           * always MIN_MATCH bytes ahead.
+           */
+        } while (--s.match_length !== 0);
+        s.strstart++;
+      } else
+      {
+        s.strstart += s.match_length;
+        s.match_length = 0;
+        s.ins_h = s.window[s.strstart];
+        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
+        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
+
+//#if MIN_MATCH != 3
+//                Call UPDATE_HASH() MIN_MATCH-3 more times
+//#endif
+        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+         * matter since it will be recomputed at next deflate call.
+         */
+      }
+    } else {
+      /* No match, output a literal byte */
+      //Tracevv((stderr,"%c", s.window[s.strstart]));
+      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+
+      s.lookahead--;
+      s.strstart++;
+    }
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
     }
-}
-function dispatchError(arg) {
-    var err = arg.err, subscriber = arg.subscriber;
-    if (!subscriber.closed) {
-        subscriber.error(err);
+  }
+  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
     }
+    /***/
+  }
+  return BS_BLOCK_DONE;
 }
 
-},{"../Observable":28,"../util/root":153}],89:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
  */
-var ScalarObservable = (function (_super) {
-    __extends(ScalarObservable, _super);
-    function ScalarObservable(value, scheduler) {
-        _super.call(this);
-        this.value = value;
-        this.scheduler = scheduler;
-        this._isScalar = true;
-        if (scheduler) {
-            this._isScalar = false;
-        }
+function deflate_slow(s, flush) {
+  var hash_head;          /* head of hash chain */
+  var bflush;              /* set if current block must be flushed */
+
+  var max_insert;
+
+  /* Process the input block. */
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the next match, plus MIN_MATCH bytes to insert the
+     * string following the next match.
+     */
+    if (s.lookahead < MIN_LOOKAHEAD) {
+      fill_window(s);
+      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) { break; } /* flush the current block */
     }
-    ScalarObservable.create = function (value, scheduler) {
-        return new ScalarObservable(value, scheduler);
-    };
-    ScalarObservable.dispatch = function (state) {
-        var done = state.done, value = state.value, subscriber = state.subscriber;
-        if (done) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(value);
-        if (subscriber.closed) {
-            return;
-        }
-        state.done = true;
-        this.schedule(state);
-    };
-    ScalarObservable.prototype._subscribe = function (subscriber) {
-        var value = this.value;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ScalarObservable.dispatch, 0, {
-                done: false, value: value, subscriber: subscriber
-            });
-        }
-        else {
-            subscriber.next(value);
-            if (!subscriber.closed) {
-                subscriber.complete();
-            }
-        }
-    };
-    return ScalarObservable;
-}(Observable_1.Observable));
-exports.ScalarObservable = ScalarObservable;
 
-},{"../Observable":28}],90:[function(require,module,exports){
-"use strict";
-var isScheduler_1 = require('../util/isScheduler');
-var isArray_1 = require('../util/isArray');
-var ArrayObservable_1 = require('./ArrayObservable');
-var combineLatest_1 = require('../operator/combineLatest');
-/* tslint:enable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * <img src="./img/combineLatest.png" width="100%">
- *
- * `combineLatest` combines the values from all the Observables passed as
- * arguments. This is done by subscribing to each Observable, in order, and
- * collecting an array of each of the most recent values any time any of the
- * input Observables emits, then either taking that array and passing it as
- * arguments to an optional `project` function and emitting the return value of
- * that, or just emitting the array of recent values directly if there is no
- * `project` function.
- *
- * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>
- * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
- * var height = Rx.Observable.of(1.76, 1.77, 1.78);
- * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {Observable} observable1 An input Observable to combine with the
- * source Observable.
- * @param {Observable} observable2 An input Observable to combine with the
- * source Observable. More than one input Observables may be given as argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to
- * each input Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @static true
- * @name combineLatest
- * @owner Observable
- */
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+    /* Insert the string window[strstart .. strstart+2] in the
+     * dictionary, and set hash_head to the head of the hash chain:
+     */
+    hash_head = 0/*NIL*/;
+    if (s.lookahead >= MIN_MATCH) {
+      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+      s.head[s.ins_h] = s.strstart;
+      /***/
     }
-    var project = null;
-    var scheduler = null;
-    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
+
+    /* Find the longest match, discarding those <= prev_length.
+     */
+    s.prev_length = s.match_length;
+    s.prev_match = s.match_start;
+    s.match_length = MIN_MATCH - 1;
+
+    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
+        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
+      /* To simplify the code, we prevent matches with the string
+       * of window index 0 (in particular we have to avoid a match
+       * of the string with itself at the start of the input file).
+       */
+      s.match_length = longest_match(s, hash_head);
+      /* longest_match() sets match_start */
+
+      if (s.match_length <= 5 &&
+         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
+
+        /* If prev_match is also MIN_MATCH, match_start is garbage
+         * but we will ignore the current match anyway.
+         */
+        s.match_length = MIN_MATCH - 1;
+      }
     }
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
+    /* If there was a match at the previous step and the current
+     * match is not better, output the previous match:
+     */
+    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
+      max_insert = s.strstart + s.lookahead - MIN_MATCH;
+      /* Do not insert strings in hash table beyond this. */
+
+      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
+
+      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
+                     s.prev_length - MIN_MATCH, bflush);***/
+      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
+      /* Insert in hash table all strings up to the end of the match.
+       * strstart-1 and strstart are already inserted. If there is not
+       * enough lookahead, the last two strings are not inserted in
+       * the hash table.
+       */
+      s.lookahead -= s.prev_length - 1;
+      s.prev_length -= 2;
+      do {
+        if (++s.strstart <= max_insert) {
+          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+          s.head[s.ins_h] = s.strstart;
+          /***/
+        }
+      } while (--s.prev_length !== 0);
+      s.match_available = 0;
+      s.match_length = MIN_MATCH - 1;
+      s.strstart++;
+
+      if (bflush) {
+        /*** FLUSH_BLOCK(s, 0); ***/
+        flush_block_only(s, false);
+        if (s.strm.avail_out === 0) {
+          return BS_NEED_MORE;
+        }
+        /***/
+      }
+
+    } else if (s.match_available) {
+      /* If there was no match at the previous position, output a
+       * single literal. If there was a match but the current match
+       * is longer, truncate the previous match to a single literal.
+       */
+      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
+      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
+
+      if (bflush) {
+        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
+        flush_block_only(s, false);
+        /***/
+      }
+      s.strstart++;
+      s.lookahead--;
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+    } else {
+      /* There is no previous match to compare with, wait for
+       * the next step to decide.
+       */
+      s.match_available = 1;
+      s.strstart++;
+      s.lookahead--;
     }
-    // if the first and only other argument besides the resultSelector is an array
-    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
+  }
+  //Assert (flush != Z_NO_FLUSH, "no flush?");
+  if (s.match_available) {
+    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
+    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
+    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
+
+    s.match_available = 0;
+  }
+  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));
-}
-exports.combineLatest = combineLatest;
+    /***/
+  }
 
-},{"../operator/combineLatest":102,"../util/isArray":148,"../util/isScheduler":152,"./ArrayObservable":79}],91:[function(require,module,exports){
-"use strict";
-var DeferObservable_1 = require('./DeferObservable');
-exports.defer = DeferObservable_1.DeferObservable.create;
+  return BS_BLOCK_DONE;
+}
 
-},{"./DeferObservable":81}],92:[function(require,module,exports){
-"use strict";
-var EmptyObservable_1 = require('./EmptyObservable');
-exports.empty = EmptyObservable_1.EmptyObservable.create;
 
-},{"./EmptyObservable":82}],93:[function(require,module,exports){
-"use strict";
-var FromObservable_1 = require('./FromObservable');
-exports.from = FromObservable_1.FromObservable.create;
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one.  Do not maintain a hash table.  (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
+ */
+function deflate_rle(s, flush) {
+  var bflush;            /* set if current block must be flushed */
+  var prev;              /* byte at distance one to match */
+  var scan, strend;      /* scan goes up to strend for length of run */
 
-},{"./FromObservable":85}],94:[function(require,module,exports){
-"use strict";
-var FromEventObservable_1 = require('./FromEventObservable');
-exports.fromEvent = FromEventObservable_1.FromEventObservable.create;
+  var _win = s.window;
 
-},{"./FromEventObservable":84}],95:[function(require,module,exports){
-"use strict";
-var PromiseObservable_1 = require('./PromiseObservable');
-exports.fromPromise = PromiseObservable_1.PromiseObservable.create;
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the longest run, plus one for the unrolled loop.
+     */
+    if (s.lookahead <= MAX_MATCH) {
+      fill_window(s);
+      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) { break; } /* flush the current block */
+    }
 
-},{"./PromiseObservable":88}],96:[function(require,module,exports){
-"use strict";
-var merge_1 = require('../operator/merge');
-exports.merge = merge_1.mergeStatic;
+    /* See how many times the previous byte repeats */
+    s.match_length = 0;
+    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
+      scan = s.strstart - 1;
+      prev = _win[scan];
+      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
+        strend = s.strstart + MAX_MATCH;
+        do {
+          /*jshint noempty:false*/
+        } while (prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 scan < strend);
+        s.match_length = MAX_MATCH - (strend - scan);
+        if (s.match_length > s.lookahead) {
+          s.match_length = s.lookahead;
+        }
+      }
+      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+    }
 
-},{"../operator/merge":114}],97:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('./ArrayObservable');
-exports.of = ArrayObservable_1.ArrayObservable.of;
+    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+    if (s.match_length >= MIN_MATCH) {
+      //check_match(s, s.strstart, s.strstart - 1, s.match_length);
 
-},{"./ArrayObservable":79}],98:[function(require,module,exports){
-"use strict";
-var ErrorObservable_1 = require('./ErrorObservable');
-exports._throw = ErrorObservable_1.ErrorObservable.create;
+      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
+      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
 
-},{"./ErrorObservable":83}],99:[function(require,module,exports){
-"use strict";
-var zip_1 = require('../operator/zip');
-exports.zip = zip_1.zipStatic;
+      s.lookahead -= s.match_length;
+      s.strstart += s.match_length;
+      s.match_length = 0;
+    } else {
+      /* No match, output a literal byte */
+      //Tracevv((stderr,"%c", s->window[s->strstart]));
+      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+
+      s.lookahead--;
+      s.strstart++;
+    }
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+    }
+  }
+  s.insert = 0;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+  return BS_BLOCK_DONE;
+}
 
-},{"../operator/zip":132}],100:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Buffers the source Observable values until `closingNotifier` emits.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when another Observable emits.</span>
- *
- * <img src="./img/buffer.png" width="100%">
- *
- * Buffers the incoming Observable values until the given `closingNotifier`
- * Observable emits a value, at which point it emits the buffer on the output
- * Observable and starts a new buffer internally, awaiting the next time
- * `closingNotifier` emits.
- *
- * @example <caption>On every click, emit array of most recent interval events</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var interval = Rx.Observable.interval(1000);
- * var buffered = interval.buffer(clicks);
- * buffered.subscribe(x => console.log(x));
- *
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link window}
- *
- * @param {Observable<any>} closingNotifier An Observable that signals the
- * buffer to be emitted on the output Observable.
- * @return {Observable<T[]>} An Observable of buffers, which are arrays of
- * values.
- * @method buffer
- * @owner Observable
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
  */
-function buffer(closingNotifier) {
-    return this.lift(new BufferOperator(closingNotifier));
-}
-exports.buffer = buffer;
-var BufferOperator = (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
+function deflate_huff(s, flush) {
+  var bflush;             /* set if current block must be flushed */
+
+  for (;;) {
+    /* Make sure that we have a literal to write. */
+    if (s.lookahead === 0) {
+      fill_window(s);
+      if (s.lookahead === 0) {
+        if (flush === Z_NO_FLUSH) {
+          return BS_NEED_MORE;
+        }
+        break;      /* flush the current block */
+      }
     }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        _super.call(this, destination);
-        this.buffer = [];
-        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
+
+    /* Output a literal byte */
+    s.match_length = 0;
+    //Tracevv((stderr,"%c", s->window[s->strstart]));
+    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+    s.lookahead--;
+    s.strstart++;
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
     }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+  }
+  s.insert = 0;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+  return BS_BLOCK_DONE;
+}
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],101:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Catches errors on the observable to be handled by returning a new observable or throwing an error.
- * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
- *  is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
- *  is returned by the `selector` will be used to continue the observable chain.
- * @return {Observable} an observable that originates from either the source or the observable returned by the
- *  catch `selector` function.
- * @method catch
- * @owner Observable
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
  */
-function _catch(selector) {
-    var operator = new CatchOperator(selector);
-    var caught = this.lift(operator);
-    return (operator.caught = caught);
+function Config(good_length, max_lazy, nice_length, max_chain, func) {
+  this.good_length = good_length;
+  this.max_lazy = max_lazy;
+  this.nice_length = nice_length;
+  this.max_chain = max_chain;
+  this.func = func;
+}
+
+var configuration_table;
+
+configuration_table = [
+  /*      good lazy nice chain */
+  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
+  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
+  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
+  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
+
+  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
+  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
+  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
+  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
+  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
+  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
+];
+
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+function lm_init(s) {
+  s.window_size = 2 * s.w_size;
+
+  /*** CLEAR_HASH(s); ***/
+  zero(s.head); // Fill with NIL (= 0);
+
+  /* Set the default configuration parameters:
+   */
+  s.max_lazy_match = configuration_table[s.level].max_lazy;
+  s.good_match = configuration_table[s.level].good_length;
+  s.nice_match = configuration_table[s.level].nice_length;
+  s.max_chain_length = configuration_table[s.level].max_chain;
+
+  s.strstart = 0;
+  s.block_start = 0;
+  s.lookahead = 0;
+  s.insert = 0;
+  s.match_length = s.prev_length = MIN_MATCH - 1;
+  s.match_available = 0;
+  s.ins_h = 0;
+}
+
+
+function DeflateState() {
+  this.strm = null;            /* pointer back to this zlib stream */
+  this.status = 0;            /* as the name implies */
+  this.pending_buf = null;      /* output still pending */
+  this.pending_buf_size = 0;  /* size of pending_buf */
+  this.pending_out = 0;       /* next pending byte to output to the stream */
+  this.pending = 0;           /* nb of bytes in the pending buffer */
+  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
+  this.gzhead = null;         /* gzip header information to write */
+  this.gzindex = 0;           /* where in extra, name, or comment */
+  this.method = Z_DEFLATED; /* can only be DEFLATED */
+  this.last_flush = -1;   /* value of flush param for previous deflate call */
+
+  this.w_size = 0;  /* LZ77 window size (32K by default) */
+  this.w_bits = 0;  /* log2(w_size)  (8..16) */
+  this.w_mask = 0;  /* w_size - 1 */
+
+  this.window = null;
+  /* Sliding window. Input bytes are read into the second half of the window,
+   * and move to the first half later to keep a dictionary of at least wSize
+   * bytes. With this organization, matches are limited to a distance of
+   * wSize-MAX_MATCH bytes, but this ensures that IO is always
+   * performed with a length multiple of the block size.
+   */
+
+  this.window_size = 0;
+  /* Actual size of window: 2*wSize, except when the user input buffer
+   * is directly used as sliding window.
+   */
+
+  this.prev = null;
+  /* Link to older string with same hash index. To limit the size of this
+   * array to 64K, this link is maintained only for the last 32K strings.
+   * An index in this array is thus a window index modulo 32K.
+   */
+
+  this.head = null;   /* Heads of the hash chains or NIL. */
+
+  this.ins_h = 0;       /* hash index of string to be inserted */
+  this.hash_size = 0;   /* number of elements in hash table */
+  this.hash_bits = 0;   /* log2(hash_size) */
+  this.hash_mask = 0;   /* hash_size-1 */
+
+  this.hash_shift = 0;
+  /* Number of bits by which ins_h must be shifted at each input
+   * step. It must be such that after MIN_MATCH steps, the oldest
+   * byte no longer takes part in the hash key, that is:
+   *   hash_shift * MIN_MATCH >= hash_bits
+   */
+
+  this.block_start = 0;
+  /* Window position at the beginning of the current output block. Gets
+   * negative when the window is moved backwards.
+   */
+
+  this.match_length = 0;      /* length of best match */
+  this.prev_match = 0;        /* previous match */
+  this.match_available = 0;   /* set if previous match exists */
+  this.strstart = 0;          /* start of string to insert */
+  this.match_start = 0;       /* start of matching string */
+  this.lookahead = 0;         /* number of valid bytes ahead in window */
+
+  this.prev_length = 0;
+  /* Length of the best match at previous step. Matches not greater than this
+   * are discarded. This is used in the lazy match evaluation.
+   */
+
+  this.max_chain_length = 0;
+  /* To speed up deflation, hash chains are never searched beyond this
+   * length.  A higher limit improves compression ratio but degrades the
+   * speed.
+   */
+
+  this.max_lazy_match = 0;
+  /* Attempt to find a better match only when the current match is strictly
+   * smaller than this value. This mechanism is used only for compression
+   * levels >= 4.
+   */
+  // That's alias to max_lazy_match, don't use directly
+  //this.max_insert_length = 0;
+  /* Insert new strings in the hash table only if the match length is not
+   * greater than this length. This saves time but degrades compression.
+   * max_insert_length is used only for compression levels <= 3.
+   */
+
+  this.level = 0;     /* compression level (1..9) */
+  this.strategy = 0;  /* favor or force Huffman coding*/
+
+  this.good_match = 0;
+  /* Use a faster search when the previous match is longer than this */
+
+  this.nice_match = 0; /* Stop searching when current match exceeds this */
+
+              /* used by trees.c: */
+
+  /* Didn't use ct_data typedef below to suppress compiler warning */
+
+  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
+  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
+
+  // Use flat array of DOUBLE size, with interleaved fata,
+  // because JS does not support effective
+  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
+  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
+  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
+  zero(this.dyn_ltree);
+  zero(this.dyn_dtree);
+  zero(this.bl_tree);
+
+  this.l_desc   = null;         /* desc. for literal tree */
+  this.d_desc   = null;         /* desc. for distance tree */
+  this.bl_desc  = null;         /* desc. for bit length tree */
+
+  //ush bl_count[MAX_BITS+1];
+  this.bl_count = new utils.Buf16(MAX_BITS + 1);
+  /* number of codes at each bit length for an optimal tree */
+
+  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
+  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
+  zero(this.heap);
+
+  this.heap_len = 0;               /* number of elements in the heap */
+  this.heap_max = 0;               /* element of largest frequency */
+  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+   * The same heap array is used to build all trees.
+   */
+
+  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
+  zero(this.depth);
+  /* Depth of each subtree used as tie breaker for trees of equal frequency
+   */
+
+  this.l_buf = 0;          /* buffer index for literals or lengths */
+
+  this.lit_bufsize = 0;
+  /* Size of match buffer for literals/lengths.  There are 4 reasons for
+   * limiting lit_bufsize to 64K:
+   *   - frequencies can be kept in 16 bit counters
+   *   - if compression is not successful for the first block, all input
+   *     data is still in the window so we can still emit a stored block even
+   *     when input comes from standard input.  (This can also be done for
+   *     all blocks if lit_bufsize is not greater than 32K.)
+   *   - if compression is not successful for a file smaller than 64K, we can
+   *     even emit a stored file instead of a stored block (saving 5 bytes).
+   *     This is applicable only for zip (not gzip or zlib).
+   *   - creating new Huffman trees less frequently may not provide fast
+   *     adaptation to changes in the input data statistics. (Take for
+   *     example a binary file with poorly compressible code followed by
+   *     a highly compressible string table.) Smaller buffer sizes give
+   *     fast adaptation but have of course the overhead of transmitting
+   *     trees more frequently.
+   *   - I can't count above 4
+   */
+
+  this.last_lit = 0;      /* running index in l_buf */
+
+  this.d_buf = 0;
+  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
+   * the same number of elements. To use different lengths, an extra flag
+   * array would be necessary.
+   */
+
+  this.opt_len = 0;       /* bit length of current block with optimal trees */
+  this.static_len = 0;    /* bit length of current block with static trees */
+  this.matches = 0;       /* number of string matches in current block */
+  this.insert = 0;        /* bytes at end of window left to insert */
+
+
+  this.bi_buf = 0;
+  /* Output buffer. bits are inserted starting at the bottom (least
+   * significant bits).
+   */
+  this.bi_valid = 0;
+  /* Number of valid bits in bi_buf.  All bits above the last valid bit
+   * are always zero.
+   */
+
+  // Used for window memory init. We safely ignore it for JS. That makes
+  // sense only for pointers and memory check tools.
+  //this.high_water = 0;
+  /* High water mark offset in window for initialized bytes -- bytes above
+   * this are set to zero in order to avoid memory check warnings when
+   * longest match routines access bytes past the input.  This is then
+   * updated to the new high water mark.
+   */
 }
-exports._catch = _catch;
-var CatchOperator = (function () {
-    function CatchOperator(selector) {
-        this.selector = selector;
+
+
+function deflateResetKeep(strm) {
+  var s;
+
+  if (!strm || !strm.state) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+  strm.total_in = strm.total_out = 0;
+  strm.data_type = Z_UNKNOWN;
+
+  s = strm.state;
+  s.pending = 0;
+  s.pending_out = 0;
+
+  if (s.wrap < 0) {
+    s.wrap = -s.wrap;
+    /* was made negative by deflate(..., Z_FINISH); */
+  }
+  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
+  strm.adler = (s.wrap === 2) ?
+    0  // crc32(0, Z_NULL, 0)
+  :
+    1; // adler32(0, Z_NULL, 0)
+  s.last_flush = Z_NO_FLUSH;
+  trees._tr_init(s);
+  return Z_OK;
+}
+
+
+function deflateReset(strm) {
+  var ret = deflateResetKeep(strm);
+  if (ret === Z_OK) {
+    lm_init(strm.state);
+  }
+  return ret;
+}
+
+
+function deflateSetHeader(strm, head) {
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
+  strm.state.gzhead = head;
+  return Z_OK;
+}
+
+
+function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
+  if (!strm) { // === Z_NULL
+    return Z_STREAM_ERROR;
+  }
+  var wrap = 1;
+
+  if (level === Z_DEFAULT_COMPRESSION) {
+    level = 6;
+  }
+
+  if (windowBits < 0) { /* suppress zlib wrapper */
+    wrap = 0;
+    windowBits = -windowBits;
+  }
+
+  else if (windowBits > 15) {
+    wrap = 2;           /* write gzip wrapper instead */
+    windowBits -= 16;
+  }
+
+
+  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
+    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+    strategy < 0 || strategy > Z_FIXED) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+
+  if (windowBits === 8) {
+    windowBits = 9;
+  }
+  /* until 256-byte window bug fixed */
+
+  var s = new DeflateState();
+
+  strm.state = s;
+  s.strm = strm;
+
+  s.wrap = wrap;
+  s.gzhead = null;
+  s.w_bits = windowBits;
+  s.w_size = 1 << s.w_bits;
+  s.w_mask = s.w_size - 1;
+
+  s.hash_bits = memLevel + 7;
+  s.hash_size = 1 << s.hash_bits;
+  s.hash_mask = s.hash_size - 1;
+  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
+
+  s.window = new utils.Buf8(s.w_size * 2);
+  s.head = new utils.Buf16(s.hash_size);
+  s.prev = new utils.Buf16(s.w_size);
+
+  // Don't need mem init magic for JS.
+  //s.high_water = 0;  /* nothing written to s->window yet */
+
+  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+  s.pending_buf_size = s.lit_bufsize * 4;
+
+  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+  //s->pending_buf = (uchf *) overlay;
+  s.pending_buf = new utils.Buf8(s.pending_buf_size);
+
+  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
+  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+  s.d_buf = 1 * s.lit_bufsize;
+
+  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+  s.l_buf = (1 + 2) * s.lit_bufsize;
+
+  s.level = level;
+  s.strategy = strategy;
+  s.method = method;
+
+  return deflateReset(strm);
+}
+
+function deflateInit(strm, level) {
+  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+}
+
+
+function deflate(strm, flush) {
+  var old_flush, s;
+  var beg, val; // for gzip header write only
+
+  if (!strm || !strm.state ||
+    flush > Z_BLOCK || flush < 0) {
+    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
+  }
+
+  s = strm.state;
+
+  if (!strm.output ||
+      (!strm.input && strm.avail_in !== 0) ||
+      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
+    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
+  }
+
+  s.strm = strm; /* just in case */
+  old_flush = s.last_flush;
+  s.last_flush = flush;
+
+  /* Write the header */
+  if (s.status === INIT_STATE) {
+
+    if (s.wrap === 2) { // GZIP header
+      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
+      put_byte(s, 31);
+      put_byte(s, 139);
+      put_byte(s, 8);
+      if (!s.gzhead) { // s->gzhead == Z_NULL
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, s.level === 9 ? 2 :
+                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
+                     4 : 0));
+        put_byte(s, OS_CODE);
+        s.status = BUSY_STATE;
+      }
+      else {
+        put_byte(s, (s.gzhead.text ? 1 : 0) +
+                    (s.gzhead.hcrc ? 2 : 0) +
+                    (!s.gzhead.extra ? 0 : 4) +
+                    (!s.gzhead.name ? 0 : 8) +
+                    (!s.gzhead.comment ? 0 : 16)
+        );
+        put_byte(s, s.gzhead.time & 0xff);
+        put_byte(s, (s.gzhead.time >> 8) & 0xff);
+        put_byte(s, (s.gzhead.time >> 16) & 0xff);
+        put_byte(s, (s.gzhead.time >> 24) & 0xff);
+        put_byte(s, s.level === 9 ? 2 :
+                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
+                     4 : 0));
+        put_byte(s, s.gzhead.os & 0xff);
+        if (s.gzhead.extra && s.gzhead.extra.length) {
+          put_byte(s, s.gzhead.extra.length & 0xff);
+          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
+        }
+        if (s.gzhead.hcrc) {
+          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
+        }
+        s.gzindex = 0;
+        s.status = EXTRA_STATE;
+      }
     }
-    CatchOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    };
-    return CatchOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var CatchSubscriber = (function (_super) {
-    __extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        _super.call(this, destination);
-        this.selector = selector;
-        this.caught = caught;
+    else // DEFLATE header
+    {
+      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
+      var level_flags = -1;
+
+      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
+        level_flags = 0;
+      } else if (s.level < 6) {
+        level_flags = 1;
+      } else if (s.level === 6) {
+        level_flags = 2;
+      } else {
+        level_flags = 3;
+      }
+      header |= (level_flags << 6);
+      if (s.strstart !== 0) { header |= PRESET_DICT; }
+      header += 31 - (header % 31);
+
+      s.status = BUSY_STATE;
+      putShortMSB(s, header);
+
+      /* Save the adler32 of the preset dictionary: */
+      if (s.strstart !== 0) {
+        putShortMSB(s, strm.adler >>> 16);
+        putShortMSB(s, strm.adler & 0xffff);
+      }
+      strm.adler = 1; // adler32(0L, Z_NULL, 0);
     }
-    // NOTE: overriding `error` instead of `_error` because we don't want
-    // to have this flag this subscriber as `isStopped`.
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.unsubscribe();
-            this.destination.remove(this);
-            subscribeToResult_1.subscribeToResult(this, result);
+  }
+
+//#ifdef GZIP
+  if (s.status === EXTRA_STATE) {
+    if (s.gzhead.extra/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+
+      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            break;
+          }
         }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
+        s.gzindex++;
+      }
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (s.gzindex === s.gzhead.extra.length) {
+        s.gzindex = 0;
+        s.status = NAME_STATE;
+      }
+    }
+    else {
+      s.status = NAME_STATE;
+    }
+  }
+  if (s.status === NAME_STATE) {
+    if (s.gzhead.name/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+      //int val;
+
+      do {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            val = 1;
+            break;
+          }
+        }
+        // JS specific: little magic to add zero terminator to end of string
+        if (s.gzindex < s.gzhead.name.length) {
+          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
+        } else {
+          val = 0;
+        }
+        put_byte(s, val);
+      } while (val !== 0);
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],102:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var isArray_1 = require('../util/isArray');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var none = {};
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * <img src="./img/combineLatest.png" width="100%">
- *
- * `combineLatest` combines the values from this Observable with values from
- * Observables passed as arguments. This is done by subscribing to each
- * Observable, in order, and collecting an array of each of the most recent
- * values any time any of the input Observables emits, then either taking that
- * array and passing it as arguments to an optional `project` function and
- * emitting the return value of that, or just emitting the array of recent
- * values directly if there is no `project` function.
- *
- * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>
- * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
- * var height = Rx.Observable.of(1.76, 1.77, 1.78);
- * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {Observable} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method combineLatest
- * @owner Observable
- */
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (val === 0) {
+        s.gzindex = 0;
+        s.status = COMMENT_STATE;
+      }
     }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
+    else {
+      s.status = COMMENT_STATE;
     }
-    // if the first and only other argument besides the resultSelector is an array
-    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
+  }
+  if (s.status === COMMENT_STATE) {
+    if (s.gzhead.comment/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+      //int val;
+
+      do {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            val = 1;
+            break;
+          }
+        }
+        // JS specific: little magic to add zero terminator to end of string
+        if (s.gzindex < s.gzhead.comment.length) {
+          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
+        } else {
+          val = 0;
+        }
+        put_byte(s, val);
+      } while (val !== 0);
+
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (val === 0) {
+        s.status = HCRC_STATE;
+      }
     }
-    observables.unshift(this);
-    return new ArrayObservable_1.ArrayObservable(observables).lift(new CombineLatestOperator(project));
-}
-exports.combineLatest = combineLatest;
-/* tslint:enable:max-line-length */
-var CombineLatestOperator = (function () {
-    function CombineLatestOperator(project) {
-        this.project = project;
+    else {
+      s.status = HCRC_STATE;
     }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new CombineLatestSubscriber(subscriber, this.project));
-    };
-    return CombineLatestOperator;
-}());
-exports.CombineLatestOperator = CombineLatestOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var CombineLatestSubscriber = (function (_super) {
-    __extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, project) {
-        _super.call(this, destination);
-        this.project = project;
-        this.active = 0;
-        this.values = [];
-        this.observables = [];
+  }
+  if (s.status === HCRC_STATE) {
+    if (s.gzhead.hcrc) {
+      if (s.pending + 2 > s.pending_buf_size) {
+        flush_pending(strm);
+      }
+      if (s.pending + 2 <= s.pending_buf_size) {
+        put_byte(s, strm.adler & 0xff);
+        put_byte(s, (strm.adler >> 8) & 0xff);
+        strm.adler = 0; //crc32(0L, Z_NULL, 0);
+        s.status = BUSY_STATE;
+      }
     }
-    CombineLatestSubscriber.prototype._next = function (observable) {
-        this.values.push(none);
-        this.observables.push(observable);
-    };
-    CombineLatestSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
-            }
+    else {
+      s.status = BUSY_STATE;
+    }
+  }
+//#endif
+
+  /* Flush as much pending output as possible */
+  if (s.pending !== 0) {
+    flush_pending(strm);
+    if (strm.avail_out === 0) {
+      /* Since avail_out is 0, deflate will be called again with
+       * more output space, but possibly with both pending and
+       * avail_in equal to zero. There won't be anything to do,
+       * but this is not an error situation so make sure we
+       * return OK instead of BUF_ERROR at next call of deflate:
+       */
+      s.last_flush = -1;
+      return Z_OK;
+    }
+
+    /* Make sure there is something to do and avoid duplicate consecutive
+     * flushes. For repeated and useless calls with Z_FINISH, we keep
+     * returning Z_STREAM_END instead of Z_BUF_ERROR.
+     */
+  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
+    flush !== Z_FINISH) {
+    return err(strm, Z_BUF_ERROR);
+  }
+
+  /* User must not provide more input after the first FINISH: */
+  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
+    return err(strm, Z_BUF_ERROR);
+  }
+
+  /* Start a new block or continue the current one.
+   */
+  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
+    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
+    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
+      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
+        configuration_table[s.level].func(s, flush));
+
+    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
+      s.status = FINISH_STATE;
+    }
+    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
+      if (strm.avail_out === 0) {
+        s.last_flush = -1;
+        /* avoid BUF_ERROR next call, see above */
+      }
+      return Z_OK;
+      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+       * of deflate should use the same flush parameter to make sure
+       * that the flush is complete. So we don't have to output an
+       * empty block here, this will be done at next call. This also
+       * ensures that for a very small output buffer, we emit at most
+       * one empty block.
+       */
+    }
+    if (bstate === BS_BLOCK_DONE) {
+      if (flush === Z_PARTIAL_FLUSH) {
+        trees._tr_align(s);
+      }
+      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
+
+        trees._tr_stored_block(s, 0, 0, false);
+        /* For a full flush, this empty block will be recognized
+         * as a special marker by inflate_sync().
+         */
+        if (flush === Z_FULL_FLUSH) {
+          /*** CLEAR_HASH(s); ***/             /* forget history */
+          zero(s.head); // Fill with NIL (= 0);
+
+          if (s.lookahead === 0) {
+            s.strstart = 0;
+            s.block_start = 0;
+            s.insert = 0;
+          }
         }
-    };
-    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var values = this.values;
-        var oldVal = values[outerIndex];
-        var toRespond = !this.toRespond
-            ? 0
-            : oldVal === none ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.project) {
-                this._tryProject(values);
+      }
+      flush_pending(strm);
+      if (strm.avail_out === 0) {
+        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+        return Z_OK;
+      }
+    }
+  }
+  //Assert(strm->avail_out > 0, "bug2");
+  //if (strm.avail_out <= 0) { throw new Error("bug2");}
+
+  if (flush !== Z_FINISH) { return Z_OK; }
+  if (s.wrap <= 0) { return Z_STREAM_END; }
+
+  /* Write the trailer */
+  if (s.wrap === 2) {
+    put_byte(s, strm.adler & 0xff);
+    put_byte(s, (strm.adler >> 8) & 0xff);
+    put_byte(s, (strm.adler >> 16) & 0xff);
+    put_byte(s, (strm.adler >> 24) & 0xff);
+    put_byte(s, strm.total_in & 0xff);
+    put_byte(s, (strm.total_in >> 8) & 0xff);
+    put_byte(s, (strm.total_in >> 16) & 0xff);
+    put_byte(s, (strm.total_in >> 24) & 0xff);
+  }
+  else
+  {
+    putShortMSB(s, strm.adler >>> 16);
+    putShortMSB(s, strm.adler & 0xffff);
+  }
+
+  flush_pending(strm);
+  /* If avail_out is zero, the application will call deflate again
+   * to flush the rest.
+   */
+  if (s.wrap > 0) { s.wrap = -s.wrap; }
+  /* write the trailer only once! */
+  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
+}
+
+function deflateEnd(strm) {
+  var status;
+
+  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  status = strm.state.status;
+  if (status !== INIT_STATE &&
+    status !== EXTRA_STATE &&
+    status !== NAME_STATE &&
+    status !== COMMENT_STATE &&
+    status !== HCRC_STATE &&
+    status !== BUSY_STATE &&
+    status !== FINISH_STATE
+  ) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+  strm.state = null;
+
+  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
+}
+
+
+/* =========================================================================
+ * Initializes the compression dictionary from the given byte
+ * sequence without producing any compressed output.
+ */
+function deflateSetDictionary(strm, dictionary) {
+  var dictLength = dictionary.length;
+
+  var s;
+  var str, n;
+  var wrap;
+  var avail;
+  var next;
+  var input;
+  var tmpDict;
+
+  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  s = strm.state;
+  wrap = s.wrap;
+
+  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
+    return Z_STREAM_ERROR;
+  }
+
+  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+  if (wrap === 1) {
+    /* adler32(strm->adler, dictionary, dictLength); */
+    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
+  }
+
+  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */
+
+  /* if dictionary would fill window, just replace the history */
+  if (dictLength >= s.w_size) {
+    if (wrap === 0) {            /* already empty otherwise */
+      /*** CLEAR_HASH(s); ***/
+      zero(s.head); // Fill with NIL (= 0);
+      s.strstart = 0;
+      s.block_start = 0;
+      s.insert = 0;
+    }
+    /* use the tail */
+    // dictionary = dictionary.slice(dictLength - s.w_size);
+    tmpDict = new utils.Buf8(s.w_size);
+    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
+    dictionary = tmpDict;
+    dictLength = s.w_size;
+  }
+  /* insert dictionary into window and hash */
+  avail = strm.avail_in;
+  next = strm.next_in;
+  input = strm.input;
+  strm.avail_in = dictLength;
+  strm.next_in = 0;
+  strm.input = dictionary;
+  fill_window(s);
+  while (s.lookahead >= MIN_MATCH) {
+    str = s.strstart;
+    n = s.lookahead - (MIN_MATCH - 1);
+    do {
+      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
+
+      s.prev[str & s.w_mask] = s.head[s.ins_h];
+
+      s.head[s.ins_h] = str;
+      str++;
+    } while (--n);
+    s.strstart = str;
+    s.lookahead = MIN_MATCH - 1;
+    fill_window(s);
+  }
+  s.strstart += s.lookahead;
+  s.block_start = s.strstart;
+  s.insert = s.lookahead;
+  s.lookahead = 0;
+  s.match_length = s.prev_length = MIN_MATCH - 1;
+  s.match_available = 0;
+  strm.next_in = next;
+  strm.input = input;
+  strm.avail_in = avail;
+  s.wrap = wrap;
+  return Z_OK;
+}
+
+
+exports.deflateInit = deflateInit;
+exports.deflateInit2 = deflateInit2;
+exports.deflateReset = deflateReset;
+exports.deflateResetKeep = deflateResetKeep;
+exports.deflateSetHeader = deflateSetHeader;
+exports.deflate = deflate;
+exports.deflateEnd = deflateEnd;
+exports.deflateSetDictionary = deflateSetDictionary;
+exports.deflateInfo = 'pako deflate (from Nodeca project)';
+
+/* Not implemented
+exports.deflateBound = deflateBound;
+exports.deflateCopy = deflateCopy;
+exports.deflateParams = deflateParams;
+exports.deflatePending = deflatePending;
+exports.deflatePrime = deflatePrime;
+exports.deflateTune = deflateTune;
+*/
+
+},{"../utils/common":26,"./adler32":28,"./crc32":30,"./messages":36,"./trees":37}],32:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+function GZheader() {
+  /* true if compressed data believed to be text */
+  this.text       = 0;
+  /* modification time */
+  this.time       = 0;
+  /* extra flags (not used when writing a gzip file) */
+  this.xflags     = 0;
+  /* operating system */
+  this.os         = 0;
+  /* pointer to extra field or Z_NULL if none */
+  this.extra      = null;
+  /* extra field length (valid if extra != Z_NULL) */
+  this.extra_len  = 0; // Actually, we don't need it in JS,
+                       // but leave for few code modifications
+
+  //
+  // Setup limits is not necessary because in js we should not preallocate memory
+  // for inflate use constant limit in 65536 bytes
+  //
+
+  /* space at extra (only when reading header) */
+  // this.extra_max  = 0;
+  /* pointer to zero-terminated file name or Z_NULL */
+  this.name       = '';
+  /* space at name (only when reading header) */
+  // this.name_max   = 0;
+  /* pointer to zero-terminated comment or Z_NULL */
+  this.comment    = '';
+  /* space at comment (only when reading header) */
+  // this.comm_max   = 0;
+  /* true if there was or will be a header crc */
+  this.hcrc       = 0;
+  /* true when done reading gzip header (not used when writing a gzip file) */
+  this.done       = false;
+}
+
+module.exports = GZheader;
+
+},{}],33:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+// See state defs from inflate.js
+var BAD = 30;       /* got a data error -- remain here until reset */
+var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
+
+/*
+   Decode literal, length, and distance codes and write out the resulting
+   literal and match bytes until either not enough input or output is
+   available, an end-of-block is encountered, or a data error is encountered.
+   When large enough input and output buffers are supplied to inflate(), for
+   example, a 16K input buffer and a 64K output buffer, more than 95% of the
+   inflate execution time is spent in this routine.
+
+   Entry assumptions:
+
+        state.mode === LEN
+        strm.avail_in >= 6
+        strm.avail_out >= 258
+        start >= strm.avail_out
+        state.bits < 8
+
+   On return, state.mode is one of:
+
+        LEN -- ran out of enough output space or enough available input
+        TYPE -- reached end of block code, inflate() to interpret next block
+        BAD -- error in block data
+
+   Notes:
+
+    - The maximum input bits used by a length/distance pair is 15 bits for the
+      length code, 5 bits for the length extra, 15 bits for the distance code,
+      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
+      Therefore if strm.avail_in >= 6, then there is enough input to avoid
+      checking for available input while decoding.
+
+    - The maximum bytes that a single length/distance pair can output is 258
+      bytes, which is the maximum length that can be coded.  inflate_fast()
+      requires strm.avail_out >= 258 for each loop to avoid checking for
+      output space.
+ */
+module.exports = function inflate_fast(strm, start) {
+  var state;
+  var _in;                    /* local strm.input */
+  var last;                   /* have enough input while in < last */
+  var _out;                   /* local strm.output */
+  var beg;                    /* inflate()'s initial strm.output */
+  var end;                    /* while out < end, enough space available */
+//#ifdef INFLATE_STRICT
+  var dmax;                   /* maximum distance from zlib header */
+//#endif
+  var wsize;                  /* window size or zero if not using window */
+  var whave;                  /* valid bytes in the window */
+  var wnext;                  /* window write index */
+  // Use `s_window` instead `window`, avoid conflict with instrumentation tools
+  var s_window;               /* allocated sliding window, if wsize != 0 */
+  var hold;                   /* local strm.hold */
+  var bits;                   /* local strm.bits */
+  var lcode;                  /* local strm.lencode */
+  var dcode;                  /* local strm.distcode */
+  var lmask;                  /* mask for first level of length codes */
+  var dmask;                  /* mask for first level of distance codes */
+  var here;                   /* retrieved table entry */
+  var op;                     /* code bits, operation, extra bits, or */
+                              /*  window position, window bytes to copy */
+  var len;                    /* match length, unused bytes */
+  var dist;                   /* match distance */
+  var from;                   /* where to copy match from */
+  var from_source;
+
+
+  var input, output; // JS specific, because we have no pointers
+
+  /* copy state to local variables */
+  state = strm.state;
+  //here = state.here;
+  _in = strm.next_in;
+  input = strm.input;
+  last = _in + (strm.avail_in - 5);
+  _out = strm.next_out;
+  output = strm.output;
+  beg = _out - (start - strm.avail_out);
+  end = _out + (strm.avail_out - 257);
+//#ifdef INFLATE_STRICT
+  dmax = state.dmax;
+//#endif
+  wsize = state.wsize;
+  whave = state.whave;
+  wnext = state.wnext;
+  s_window = state.window;
+  hold = state.hold;
+  bits = state.bits;
+  lcode = state.lencode;
+  dcode = state.distcode;
+  lmask = (1 << state.lenbits) - 1;
+  dmask = (1 << state.distbits) - 1;
+
+
+  /* decode literals and length/distances until end-of-block or not enough
+     input data or output space */
+
+  top:
+  do {
+    if (bits < 15) {
+      hold += input[_in++] << bits;
+      bits += 8;
+      hold += input[_in++] << bits;
+      bits += 8;
+    }
+
+    here = lcode[hold & lmask];
+
+    dolen:
+    for (;;) { // Goto emulation
+      op = here >>> 24/*here.bits*/;
+      hold >>>= op;
+      bits -= op;
+      op = (here >>> 16) & 0xff/*here.op*/;
+      if (op === 0) {                          /* literal */
+        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+        //        "inflate:         literal '%c'\n" :
+        //        "inflate:         literal 0x%02x\n", here.val));
+        output[_out++] = here & 0xffff/*here.val*/;
+      }
+      else if (op & 16) {                     /* length base */
+        len = here & 0xffff/*here.val*/;
+        op &= 15;                           /* number of extra bits */
+        if (op) {
+          if (bits < op) {
+            hold += input[_in++] << bits;
+            bits += 8;
+          }
+          len += hold & ((1 << op) - 1);
+          hold >>>= op;
+          bits -= op;
+        }
+        //Tracevv((stderr, "inflate:         length %u\n", len));
+        if (bits < 15) {
+          hold += input[_in++] << bits;
+          bits += 8;
+          hold += input[_in++] << bits;
+          bits += 8;
+        }
+        here = dcode[hold & dmask];
+
+        dodist:
+        for (;;) { // goto emulation
+          op = here >>> 24/*here.bits*/;
+          hold >>>= op;
+          bits -= op;
+          op = (here >>> 16) & 0xff/*here.op*/;
+
+          if (op & 16) {                      /* distance base */
+            dist = here & 0xffff/*here.val*/;
+            op &= 15;                       /* number of extra bits */
+            if (bits < op) {
+              hold += input[_in++] << bits;
+              bits += 8;
+              if (bits < op) {
+                hold += input[_in++] << bits;
+                bits += 8;
+              }
+            }
+            dist += hold & ((1 << op) - 1);
+//#ifdef INFLATE_STRICT
+            if (dist > dmax) {
+              strm.msg = 'invalid distance too far back';
+              state.mode = BAD;
+              break top;
+            }
+//#endif
+            hold >>>= op;
+            bits -= op;
+            //Tracevv((stderr, "inflate:         distance %u\n", dist));
+            op = _out - beg;                /* max distance in output */
+            if (dist > op) {                /* see if copy from window */
+              op = dist - op;               /* distance back in window */
+              if (op > whave) {
+                if (state.sane) {
+                  strm.msg = 'invalid distance too far back';
+                  state.mode = BAD;
+                  break top;
+                }
+
+// (!) This block is disabled in zlib defaults,
+// don't enable it for binary compatibility
+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+//                if (len <= op - whave) {
+//                  do {
+//                    output[_out++] = 0;
+//                  } while (--len);
+//                  continue top;
+//                }
+//                len -= op - whave;
+//                do {
+//                  output[_out++] = 0;
+//                } while (--op > whave);
+//                if (op === 0) {
+//                  from = _out - dist;
+//                  do {
+//                    output[_out++] = output[from++];
+//                  } while (--len);
+//                  continue top;
+//                }
+//#endif
+              }
+              from = 0; // window index
+              from_source = s_window;
+              if (wnext === 0) {           /* very common case */
+                from += wsize - op;
+                if (op < len) {         /* some from window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = _out - dist;  /* rest from output */
+                  from_source = output;
+                }
+              }
+              else if (wnext < op) {      /* wrap around window */
+                from += wsize + wnext - op;
+                op -= wnext;
+                if (op < len) {         /* some from end of window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = 0;
+                  if (wnext < len) {  /* some from start of window */
+                    op = wnext;
+                    len -= op;
+                    do {
+                      output[_out++] = s_window[from++];
+                    } while (--op);
+                    from = _out - dist;      /* rest from output */
+                    from_source = output;
+                  }
+                }
+              }
+              else {                      /* contiguous in window */
+                from += wnext - op;
+                if (op < len) {         /* some from window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = _out - dist;  /* rest from output */
+                  from_source = output;
+                }
+              }
+              while (len > 2) {
+                output[_out++] = from_source[from++];
+                output[_out++] = from_source[from++];
+                output[_out++] = from_source[from++];
+                len -= 3;
+              }
+              if (len) {
+                output[_out++] = from_source[from++];
+                if (len > 1) {
+                  output[_out++] = from_source[from++];
+                }
+              }
             }
             else {
-                this.destination.next(values.slice());
+              from = _out - dist;          /* copy direct from output */
+              do {                        /* minimum length is three */
+                output[_out++] = output[from++];
+                output[_out++] = output[from++];
+                output[_out++] = output[from++];
+                len -= 3;
+              } while (len > 2);
+              if (len) {
+                output[_out++] = output[from++];
+                if (len > 1) {
+                  output[_out++] = output[from++];
+                }
+              }
             }
+          }
+          else if ((op & 64) === 0) {          /* 2nd level distance code */
+            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
+            continue dodist;
+          }
+          else {
+            strm.msg = 'invalid distance code';
+            state.mode = BAD;
+            break top;
+          }
+
+          break; // need to emulate goto via "continue"
         }
-    };
-    CombineLatestSubscriber.prototype._tryProject = function (values) {
-        var result;
-        try {
-            result = this.project.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.CombineLatestSubscriber = CombineLatestSubscriber;
+      }
+      else if ((op & 64) === 0) {              /* 2nd level length code */
+        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
+        continue dolen;
+      }
+      else if (op & 32) {                     /* end-of-block */
+        //Tracevv((stderr, "inflate:         end of block\n"));
+        state.mode = TYPE;
+        break top;
+      }
+      else {
+        strm.msg = 'invalid literal/length code';
+        state.mode = BAD;
+        break top;
+      }
 
-},{"../OuterSubscriber":30,"../observable/ArrayObservable":79,"../util/isArray":148,"../util/subscribeToResult":154}],103:[function(require,module,exports){
-"use strict";
-var isScheduler_1 = require('../util/isScheduler');
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
-/**
- * Creates an output Observable which sequentially emits all values from every
- * given input Observable after the current Observable.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * Joins this Observable with multiple other Observables by subscribing to them
- * one at a time, starting with the source, and merging their results into the
- * output Observable. Will wait for each Observable to complete before moving
- * on to the next.
- *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = timer.concat(sequence);
- * result.subscribe(x => console.log(x));
- *
- * @example <caption>Concatenate 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = timer1.concat(timer2, timer3);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- *
- * @param {Observable} other An input Observable to concatenate after the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional Scheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @method concat
- * @owner Observable
- */
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+      break; // need to emulate goto via "continue"
     }
-    return concatStatic.apply(void 0, [this].concat(observables));
-}
-exports.concat = concat;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which sequentially emits all values from every
- * given input Observable after the current Observable.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * Joins multiple Observables together by subscribing to them one at a time and
- * merging their results into the output Observable. Will wait for each
- * Observable to complete before moving on to the next.
- *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = Rx.Observable.concat(timer, sequence);
- * result.subscribe(x => console.log(x));
- *
- * @example <caption>Concatenate 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = Rx.Observable.concat(timer1, timer2, timer3);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- *
- * @param {Observable} input1 An input Observable to concatenate with others.
- * @param {Observable} input2 An input Observable to concatenate with others.
- * More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional Scheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @static true
- * @name concat
- * @owner Observable
+  } while (_in < last && _out < end);
+
+  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+  len = bits >> 3;
+  _in -= len;
+  bits -= len << 3;
+  hold &= (1 << bits) - 1;
+
+  /* update state and return */
+  strm.next_in = _in;
+  strm.next_out = _out;
+  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
+  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
+  state.hold = hold;
+  state.bits = bits;
+  return;
+};
+
+},{}],34:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+var utils         = require('../utils/common');
+var adler32       = require('./adler32');
+var crc32         = require('./crc32');
+var inflate_fast  = require('./inffast');
+var inflate_table = require('./inftrees');
+
+var CODES = 0;
+var LENS = 1;
+var DISTS = 2;
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+/* Allowed flush values; see deflate() and inflate() below for details */
+//var Z_NO_FLUSH      = 0;
+//var Z_PARTIAL_FLUSH = 1;
+//var Z_SYNC_FLUSH    = 2;
+//var Z_FULL_FLUSH    = 3;
+var Z_FINISH        = 4;
+var Z_BLOCK         = 5;
+var Z_TREES         = 6;
+
+
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
  */
-function concatStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var scheduler = null;
-    var args = observables;
-    if (isScheduler_1.isScheduler(args[observables.length - 1])) {
-        scheduler = args.pop();
+var Z_OK            = 0;
+var Z_STREAM_END    = 1;
+var Z_NEED_DICT     = 2;
+//var Z_ERRNO         = -1;
+var Z_STREAM_ERROR  = -2;
+var Z_DATA_ERROR    = -3;
+var Z_MEM_ERROR     = -4;
+var Z_BUF_ERROR     = -5;
+//var Z_VERSION_ERROR = -6;
+
+/* The deflate compression method */
+var Z_DEFLATED  = 8;
+
+
+/* STATES ====================================================================*/
+/* ===========================================================================*/
+
+
+var    HEAD = 1;       /* i: waiting for magic header */
+var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
+var    TIME = 3;       /* i: waiting for modification time (gzip) */
+var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
+var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
+var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
+var    NAME = 7;       /* i: waiting for end of file name (gzip) */
+var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
+var    HCRC = 9;       /* i: waiting for header crc (gzip) */
+var    DICTID = 10;    /* i: waiting for dictionary check value */
+var    DICT = 11;      /* waiting for inflateSetDictionary() call */
+var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
+var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
+var        STORED = 14;    /* i: waiting for stored size (length and complement) */
+var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
+var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
+var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
+var        LENLENS = 18;   /* i: waiting for code length code lengths */
+var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
+var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
+var            LEN = 21;       /* i: waiting for length/lit/eob code */
+var            LENEXT = 22;    /* i: waiting for length extra bits */
+var            DIST = 23;      /* i: waiting for distance code */
+var            DISTEXT = 24;   /* i: waiting for distance extra bits */
+var            MATCH = 25;     /* o: waiting for output space to copy string */
+var            LIT = 26;       /* o: waiting for output space to write literal */
+var    CHECK = 27;     /* i: waiting for 32-bit check value */
+var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
+var    DONE = 29;      /* finished check, done -- remain here until reset */
+var    BAD = 30;       /* got a data error -- remain here until reset */
+var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
+var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
+
+/* ===========================================================================*/
+
+
+
+var ENOUGH_LENS = 852;
+var ENOUGH_DISTS = 592;
+//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
+
+var MAX_WBITS = 15;
+/* 32K LZ77 window */
+var DEF_WBITS = MAX_WBITS;
+
+
+function zswap32(q) {
+  return  (((q >>> 24) & 0xff) +
+          ((q >>> 8) & 0xff00) +
+          ((q & 0xff00) << 8) +
+          ((q & 0xff) << 24));
+}
+
+
+function InflateState() {
+  this.mode = 0;             /* current inflate mode */
+  this.last = false;          /* true if processing last block */
+  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
+  this.havedict = false;      /* true if dictionary provided */
+  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
+  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
+  this.check = 0;             /* protected copy of check value */
+  this.total = 0;             /* protected copy of output count */
+  // TODO: may be {}
+  this.head = null;           /* where to save gzip header information */
+
+  /* sliding window */
+  this.wbits = 0;             /* log base 2 of requested window size */
+  this.wsize = 0;             /* window size or zero if not using window */
+  this.whave = 0;             /* valid bytes in the window */
+  this.wnext = 0;             /* window write index */
+  this.window = null;         /* allocated sliding window, if needed */
+
+  /* bit accumulator */
+  this.hold = 0;              /* input bit accumulator */
+  this.bits = 0;              /* number of bits in "in" */
+
+  /* for string and stored block copying */
+  this.length = 0;            /* literal or length of data to copy */
+  this.offset = 0;            /* distance back to copy string from */
+
+  /* for table and code decoding */
+  this.extra = 0;             /* extra bits needed */
+
+  /* fixed and dynamic code tables */
+  this.lencode = null;          /* starting table for length/literal codes */
+  this.distcode = null;         /* starting table for distance codes */
+  this.lenbits = 0;           /* index bits for lencode */
+  this.distbits = 0;          /* index bits for distcode */
+
+  /* dynamic table building */
+  this.ncode = 0;             /* number of code length code lengths */
+  this.nlen = 0;              /* number of length code lengths */
+  this.ndist = 0;             /* number of distance code lengths */
+  this.have = 0;              /* number of code lengths in lens[] */
+  this.next = null;              /* next available space in codes[] */
+
+  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
+  this.work = new utils.Buf16(288); /* work area for code table building */
+
+  /*
+   because we don't have pointers in js, we use lencode and distcode directly
+   as buffers so we don't need codes
+  */
+  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
+  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
+  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
+  this.sane = 0;                   /* if false, allow invalid distance too far */
+  this.back = 0;                   /* bits back of last unprocessed length/lit */
+  this.was = 0;                    /* initial length of match */
+}
+
+function inflateResetKeep(strm) {
+  var state;
+
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  strm.total_in = strm.total_out = state.total = 0;
+  strm.msg = ''; /*Z_NULL*/
+  if (state.wrap) {       /* to support ill-conceived Java test suite */
+    strm.adler = state.wrap & 1;
+  }
+  state.mode = HEAD;
+  state.last = 0;
+  state.havedict = 0;
+  state.dmax = 32768;
+  state.head = null/*Z_NULL*/;
+  state.hold = 0;
+  state.bits = 0;
+  //state.lencode = state.distcode = state.next = state.codes;
+  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
+  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
+
+  state.sane = 1;
+  state.back = -1;
+  //Tracev((stderr, "inflate: reset\n"));
+  return Z_OK;
+}
+
+function inflateReset(strm) {
+  var state;
+
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  state.wsize = 0;
+  state.whave = 0;
+  state.wnext = 0;
+  return inflateResetKeep(strm);
+
+}
+
+function inflateReset2(strm, windowBits) {
+  var wrap;
+  var state;
+
+  /* get the state */
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+
+  /* extract wrap request from windowBits parameter */
+  if (windowBits < 0) {
+    wrap = 0;
+    windowBits = -windowBits;
+  }
+  else {
+    wrap = (windowBits >> 4) + 1;
+    if (windowBits < 48) {
+      windowBits &= 15;
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1));
+  }
+
+  /* set number of window bits, free window if different */
+  if (windowBits && (windowBits < 8 || windowBits > 15)) {
+    return Z_STREAM_ERROR;
+  }
+  if (state.window !== null && state.wbits !== windowBits) {
+    state.window = null;
+  }
+
+  /* update state and reset the rest of it */
+  state.wrap = wrap;
+  state.wbits = windowBits;
+  return inflateReset(strm);
 }
-exports.concatStatic = concatStatic;
 
-},{"../observable/ArrayObservable":79,"../util/isScheduler":152,"./mergeAll":115}],104:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var async_1 = require('../scheduler/async');
-/**
- * Emits a value from the source Observable only after a particular time span
- * has passed without another source emission.
- *
- * <span class="informal">It's like {@link delay}, but passes only the most
- * recent value from each burst of emissions.</span>
- *
- * <img src="./img/debounceTime.png" width="100%">
- *
- * `debounceTime` delays values emitted by the source Observable, but drops
- * previous pending delayed emissions if a new value arrives on the source
- * Observable. This operator keeps track of the most recent value from the
- * source Observable, and emits that only when `dueTime` enough time has passed
- * without any other value appearing on the source Observable. If a new value
- * appears before `dueTime` silence occurs, the previous value will be dropped
- * and will not be emitted on the output Observable.
- *
- * This is a rate-limiting operator, because it is impossible for more than one
- * value to be emitted in any time window of duration `dueTime`, but it is also
- * a delay-like operator since output emissions do not occur at the same time as
- * they did on the source Observable. Optionally takes a {@link Scheduler} for
- * managing timers.
- *
- * @example <caption>Emit the most recent click after a burst of clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.debounceTime(1000);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} dueTime The timeout duration in milliseconds (or the time
- * unit determined internally by the optional `scheduler`) for the window of
- * time required to wait for emission silence before emitting the most recent
- * source value.
- * @param {Scheduler} [scheduler=async] The {@link Scheduler} to use for
- * managing the timers that handle the timeout for each value.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified `dueTime`, and may drop some values if they occur
- * too frequently.
- * @method debounceTime
- * @owner Observable
- */
-function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return this.lift(new DebounceTimeOperator(dueTime, scheduler));
+function inflateInit2(strm, windowBits) {
+  var ret;
+  var state;
+
+  if (!strm) { return Z_STREAM_ERROR; }
+  //strm.msg = Z_NULL;                 /* in case we return an error */
+
+  state = new InflateState();
+
+  //if (state === Z_NULL) return Z_MEM_ERROR;
+  //Tracev((stderr, "inflate: allocated\n"));
+  strm.state = state;
+  state.window = null/*Z_NULL*/;
+  ret = inflateReset2(strm, windowBits);
+  if (ret !== Z_OK) {
+    strm.state = null/*Z_NULL*/;
+  }
+  return ret;
 }
-exports.debounceTime = debounceTime;
-var DebounceTimeOperator = (function () {
-    function DebounceTimeOperator(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    DebounceTimeOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    };
-    return DebounceTimeOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DebounceTimeSubscriber = (function (_super) {
-    __extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        _super.call(this, destination);
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-        this.debouncedSubscription = null;
-        this.lastValue = null;
-        this.hasValue = false;
-    }
-    DebounceTimeSubscriber.prototype._next = function (value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    };
-    DebounceTimeSubscriber.prototype._complete = function () {
-        this.debouncedNext();
-        this.destination.complete();
-    };
-    DebounceTimeSubscriber.prototype.debouncedNext = function () {
-        this.clearDebounce();
-        if (this.hasValue) {
-            this.destination.next(this.lastValue);
-            this.lastValue = null;
-            this.hasValue = false;
-        }
-    };
-    DebounceTimeSubscriber.prototype.clearDebounce = function () {
-        var debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    };
-    return DebounceTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
+
+function inflateInit(strm) {
+  return inflateInit2(strm, DEF_WBITS);
 }
 
-},{"../Subscriber":35,"../scheduler/async":138}],105:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
- * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
- * If a comparator function is not provided, an equality check is used by default.
- * As the internal HashSet of this operator grows larger and larger, care should be taken in the domain of inputs this operator may see.
- * An optional parameter is also provided such that an Observable can be provided to queue the internal HashSet to flush the values it holds.
- * @param {function} [compare] optional comparison function called to test if an item is distinct from previous items in the source.
- * @param {Observable} [flushes] optional Observable for flushing the internal HashSet of the operator.
- * @return {Observable} an Observable that emits items from the source Observable with distinct values.
- * @method distinct
- * @owner Observable
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding.  Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter.  This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time.  However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
  */
-function distinct(compare, flushes) {
-    return this.lift(new DistinctOperator(compare, flushes));
+var virgin = true;
+
+var lenfix, distfix; // We have no pointers in JS, so keep tables separate
+
+function fixedtables(state) {
+  /* build fixed huffman tables if first call (may not be thread safe) */
+  if (virgin) {
+    var sym;
+
+    lenfix = new utils.Buf32(512);
+    distfix = new utils.Buf32(32);
+
+    /* literal/length table */
+    sym = 0;
+    while (sym < 144) { state.lens[sym++] = 8; }
+    while (sym < 256) { state.lens[sym++] = 9; }
+    while (sym < 280) { state.lens[sym++] = 7; }
+    while (sym < 288) { state.lens[sym++] = 8; }
+
+    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
+
+    /* distance table */
+    sym = 0;
+    while (sym < 32) { state.lens[sym++] = 5; }
+
+    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
+
+    /* do this just once */
+    virgin = false;
+  }
+
+  state.lencode = lenfix;
+  state.lenbits = 9;
+  state.distcode = distfix;
+  state.distbits = 5;
 }
-exports.distinct = distinct;
-var DistinctOperator = (function () {
-    function DistinctOperator(compare, flushes) {
-        this.compare = compare;
-        this.flushes = flushes;
-    }
-    DistinctOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new DistinctSubscriber(subscriber, this.compare, this.flushes));
-    };
-    return DistinctOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+/*
+ Update the window with the last wsize (normally 32K) bytes written before
+ returning.  If window does not exist yet, create it.  This is only called
+ when a window is already in use, or when output has been written during this
+ inflate call, but the end of the deflate stream has not been reached yet.
+ It is also called to create a window for dictionary data when a dictionary
+ is loaded.
+
+ Providing output buffers larger than 32K to inflate() should provide a speed
+ advantage, since only the last 32K of output is copied to the sliding window
+ upon return from inflate(), and since all distances after the first 32K of
+ output will fall in the output data, making match copies simpler and faster.
+ The advantage may be dependent on the size of the processor's data caches.
  */
-var DistinctSubscriber = (function (_super) {
-    __extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, compare, flushes) {
-        _super.call(this, destination);
-        this.values = [];
-        if (typeof compare === 'function') {
-            this.compare = compare;
+function updatewindow(strm, src, end, copy) {
+  var dist;
+  var state = strm.state;
+
+  /* if it hasn't been done already, allocate space for the window */
+  if (state.window === null) {
+    state.wsize = 1 << state.wbits;
+    state.wnext = 0;
+    state.whave = 0;
+
+    state.window = new utils.Buf8(state.wsize);
+  }
+
+  /* copy state->wsize or less output bytes into the circular window */
+  if (copy >= state.wsize) {
+    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
+    state.wnext = 0;
+    state.whave = state.wsize;
+  }
+  else {
+    dist = state.wsize - state.wnext;
+    if (dist > copy) {
+      dist = copy;
+    }
+    //zmemcpy(state->window + state->wnext, end - copy, dist);
+    utils.arraySet(state.window, src, end - copy, dist, state.wnext);
+    copy -= dist;
+    if (copy) {
+      //zmemcpy(state->window, end - copy, copy);
+      utils.arraySet(state.window, src, end - copy, copy, 0);
+      state.wnext = copy;
+      state.whave = state.wsize;
+    }
+    else {
+      state.wnext += dist;
+      if (state.wnext === state.wsize) { state.wnext = 0; }
+      if (state.whave < state.wsize) { state.whave += dist; }
+    }
+  }
+  return 0;
+}
+
+function inflate(strm, flush) {
+  var state;
+  var input, output;          // input/output buffers
+  var next;                   /* next input INDEX */
+  var put;                    /* next output INDEX */
+  var have, left;             /* available input and output */
+  var hold;                   /* bit buffer */
+  var bits;                   /* bits in bit buffer */
+  var _in, _out;              /* save starting available input and output */
+  var copy;                   /* number of stored or match bytes to copy */
+  var from;                   /* where to copy match bytes from */
+  var from_source;
+  var here = 0;               /* current decoding table entry */
+  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
+  //var last;                   /* parent table entry */
+  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
+  var len;                    /* length to copy for repeats, bits to drop */
+  var ret;                    /* return code */
+  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
+  var opts;
+
+  var n; // temporary var for NEED_BITS
+
+  var order = /* permutation of code lengths */
+    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
+
+
+  if (!strm || !strm.state || !strm.output ||
+      (!strm.input && strm.avail_in !== 0)) {
+    return Z_STREAM_ERROR;
+  }
+
+  state = strm.state;
+  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
+
+
+  //--- LOAD() ---
+  put = strm.next_out;
+  output = strm.output;
+  left = strm.avail_out;
+  next = strm.next_in;
+  input = strm.input;
+  have = strm.avail_in;
+  hold = state.hold;
+  bits = state.bits;
+  //---
+
+  _in = have;
+  _out = left;
+  ret = Z_OK;
+
+  inf_leave: // goto emulation
+  for (;;) {
+    switch (state.mode) {
+      case HEAD:
+        if (state.wrap === 0) {
+          state.mode = TYPEDO;
+          break;
         }
-        if (flushes) {
-            this.add(subscribeToResult_1.subscribeToResult(this, flushes));
+        //=== NEEDBITS(16);
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
+          state.check = 0/*crc32(0L, Z_NULL, 0)*/;
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+          state.mode = FLAGS;
+          break;
         }
-    }
-    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.length = 0;
-    };
-    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DistinctSubscriber.prototype._next = function (value) {
-        var found = false;
-        var values = this.values;
-        var len = values.length;
-        try {
-            for (var i = 0; i < len; i++) {
-                if (this.compare(values[i], value)) {
-                    found = true;
-                    return;
-                }
-            }
+        state.flags = 0;           /* expect zlib header */
+        if (state.head) {
+          state.head.done = false;
         }
-        catch (err) {
-            this.destination.error(err);
-            return;
+        if (!(state.wrap & 1) ||   /* check if zlib header allowed */
+          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
+          strm.msg = 'incorrect header check';
+          state.mode = BAD;
+          break;
         }
-        this.values.push(value);
-        this.destination.next(value);
-    };
-    DistinctSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    return DistinctSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.DistinctSubscriber = DistinctSubscriber;
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],106:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.
- * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
- * If a comparator function is not provided, an equality check is used by default.
- * @param {function} [compare] optional comparison function called to test if an item is distinct from the previous item in the source.
- * @return {Observable} an Observable that emits items from the source Observable with distinct values.
- * @method distinctUntilChanged
- * @owner Observable
- */
-function distinctUntilChanged(compare, keySelector) {
-    return this.lift(new DistinctUntilChangedOperator(compare, keySelector));
-}
-exports.distinctUntilChanged = distinctUntilChanged;
-var DistinctUntilChangedOperator = (function () {
-    function DistinctUntilChangedOperator(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    };
-    return DistinctUntilChangedOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DistinctUntilChangedSubscriber = (function (_super) {
-    __extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        _super.call(this, destination);
-        this.keySelector = keySelector;
-        this.hasKey = false;
-        if (typeof compare === 'function') {
-            this.compare = compare;
+        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
+          strm.msg = 'unknown compression method';
+          state.mode = BAD;
+          break;
         }
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var keySelector = this.keySelector;
-        var key = value;
-        if (keySelector) {
-            key = tryCatch_1.tryCatch(this.keySelector)(value);
-            if (key === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
+        //--- DROPBITS(4) ---//
+        hold >>>= 4;
+        bits -= 4;
+        //---//
+        len = (hold & 0x0f)/*BITS(4)*/ + 8;
+        if (state.wbits === 0) {
+          state.wbits = len;
+        }
+        else if (len > state.wbits) {
+          strm.msg = 'invalid window size';
+          state.mode = BAD;
+          break;
         }
-        var result = false;
-        if (this.hasKey) {
-            result = tryCatch_1.tryCatch(this.compare)(this.key, key);
-            if (result === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
+        state.dmax = 1 << len;
+        //Tracev((stderr, "inflate:   zlib header ok\n"));
+        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
+        state.mode = hold & 0x200 ? DICTID : TYPE;
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        break;
+      case FLAGS:
+        //=== NEEDBITS(16); */
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.flags = hold;
+        if ((state.flags & 0xff) !== Z_DEFLATED) {
+          strm.msg = 'unknown compression method';
+          state.mode = BAD;
+          break;
         }
-        else {
-            this.hasKey = true;
+        if (state.flags & 0xe000) {
+          strm.msg = 'unknown header flags set';
+          state.mode = BAD;
+          break;
         }
-        if (Boolean(result) === false) {
-            this.key = key;
-            this.destination.next(value);
+        if (state.head) {
+          state.head.text = ((hold >> 8) & 1);
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = TIME;
+        /* falls through */
+      case TIME:
+        //=== NEEDBITS(32); */
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if (state.head) {
+          state.head.time = hold;
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC4(state.check, hold)
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          hbuf[2] = (hold >>> 16) & 0xff;
+          hbuf[3] = (hold >>> 24) & 0xff;
+          state.check = crc32(state.check, hbuf, 4, 0);
+          //===
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = OS;
+        /* falls through */
+      case OS:
+        //=== NEEDBITS(16); */
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if (state.head) {
+          state.head.xflags = (hold & 0xff);
+          state.head.os = (hold >> 8);
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = EXLEN;
+        /* falls through */
+      case EXLEN:
+        if (state.flags & 0x0400) {
+          //=== NEEDBITS(16); */
+          while (bits < 16) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.length = hold;
+          if (state.head) {
+            state.head.extra_len = hold;
+          }
+          if (state.flags & 0x0200) {
+            //=== CRC2(state.check, hold);
+            hbuf[0] = hold & 0xff;
+            hbuf[1] = (hold >>> 8) & 0xff;
+            state.check = crc32(state.check, hbuf, 2, 0);
+            //===//
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+        }
+        else if (state.head) {
+          state.head.extra = null/*Z_NULL*/;
+        }
+        state.mode = EXTRA;
+        /* falls through */
+      case EXTRA:
+        if (state.flags & 0x0400) {
+          copy = state.length;
+          if (copy > have) { copy = have; }
+          if (copy) {
+            if (state.head) {
+              len = state.head.extra_len - state.length;
+              if (!state.head.extra) {
+                // Use untyped array for more convenient processing later
+                state.head.extra = new Array(state.head.extra_len);
+              }
+              utils.arraySet(
+                state.head.extra,
+                input,
+                next,
+                // extra field is limited to 65536 bytes
+                // - no need for additional size check
+                copy,
+                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
+                len
+              );
+              //zmemcpy(state.head.extra + len, next,
+              //        len + copy > state.head.extra_max ?
+              //        state.head.extra_max - len : copy);
+            }
+            if (state.flags & 0x0200) {
+              state.check = crc32(state.check, input, copy, next);
+            }
+            have -= copy;
+            next += copy;
+            state.length -= copy;
+          }
+          if (state.length) { break inf_leave; }
+        }
+        state.length = 0;
+        state.mode = NAME;
+        /* falls through */
+      case NAME:
+        if (state.flags & 0x0800) {
+          if (have === 0) { break inf_leave; }
+          copy = 0;
+          do {
+            // TODO: 2 or 1 bytes?
+            len = input[next + copy++];
+            /* use constant limit because in js we should not preallocate memory */
+            if (state.head && len &&
+                (state.length < 65536 /*state.head.name_max*/)) {
+              state.head.name += String.fromCharCode(len);
+            }
+          } while (len && copy < have);
+
+          if (state.flags & 0x0200) {
+            state.check = crc32(state.check, input, copy, next);
+          }
+          have -= copy;
+          next += copy;
+          if (len) { break inf_leave; }
+        }
+        else if (state.head) {
+          state.head.name = null;
+        }
+        state.length = 0;
+        state.mode = COMMENT;
+        /* falls through */
+      case COMMENT:
+        if (state.flags & 0x1000) {
+          if (have === 0) { break inf_leave; }
+          copy = 0;
+          do {
+            len = input[next + copy++];
+            /* use constant limit because in js we should not preallocate memory */
+            if (state.head && len &&
+                (state.length < 65536 /*state.head.comm_max*/)) {
+              state.head.comment += String.fromCharCode(len);
+            }
+          } while (len && copy < have);
+          if (state.flags & 0x0200) {
+            state.check = crc32(state.check, input, copy, next);
+          }
+          have -= copy;
+          next += copy;
+          if (len) { break inf_leave; }
+        }
+        else if (state.head) {
+          state.head.comment = null;
+        }
+        state.mode = HCRC;
+        /* falls through */
+      case HCRC:
+        if (state.flags & 0x0200) {
+          //=== NEEDBITS(16); */
+          while (bits < 16) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          if (hold !== (state.check & 0xffff)) {
+            strm.msg = 'header crc mismatch';
+            state.mode = BAD;
+            break;
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+        }
+        if (state.head) {
+          state.head.hcrc = ((state.flags >> 9) & 1);
+          state.head.done = true;
+        }
+        strm.adler = state.check = 0;
+        state.mode = TYPE;
+        break;
+      case DICTID:
+        //=== NEEDBITS(32); */
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        strm.adler = state.check = zswap32(hold);
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = DICT;
+        /* falls through */
+      case DICT:
+        if (state.havedict === 0) {
+          //--- RESTORE() ---
+          strm.next_out = put;
+          strm.avail_out = left;
+          strm.next_in = next;
+          strm.avail_in = have;
+          state.hold = hold;
+          state.bits = bits;
+          //---
+          return Z_NEED_DICT;
+        }
+        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
+        state.mode = TYPE;
+        /* falls through */
+      case TYPE:
+        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
+        /* falls through */
+      case TYPEDO:
+        if (state.last) {
+          //--- BYTEBITS() ---//
+          hold >>>= bits & 7;
+          bits -= bits & 7;
+          //---//
+          state.mode = CHECK;
+          break;
         }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35,"../util/errorObject":147,"../util/tryCatch":156}],107:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Perform a side effect for every emission on the source Observable, but return
- * an Observable that is identical to the source.
- *
- * <span class="informal">Intercepts each emission on the source and runs a
- * function, but returns an output which is identical to the source.</span>
- *
- * <img src="./img/do.png" width="100%">
- *
- * Returns a mirrored Observable of the source Observable, but modified so that
- * the provided Observer is called to perform a side effect for every value,
- * error, and completion emitted by the source. Any errors that are thrown in
- * the aforementioned Observer or handlers are safely sent down the error path
- * of the output Observable.
- *
- * This operator is useful for debugging your Observables for the correct values
- * or performing other side effects.
- *
- * Note: this is different to a `subscribe` on the Observable. If the Observable
- * returned by `do` is not subscribed, the side effects specified by the
- * Observer will never happen. `do` therefore simply spies on existing
- * execution, it does not trigger an execution to happen like `subscribe` does.
- *
- * @example <caption>Map every every click to the clientX position of that click, while also logging the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks
- *   .do(ev => console.log(ev))
- *   .map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link map}
- * @see {@link subscribe}
- *
- * @param {Observer|function} [nextOrObserver] A normal Observer object or a
- * callback for `next`.
- * @param {function} [error] Callback for errors in the source.
- * @param {function} [complete] Callback for the completion of the source.
- * @return {Observable} An Observable identical to the source, but runs the
- * specified Observer or callback(s) for each item.
- * @method do
- * @name do
- * @owner Observable
- */
-function _do(nextOrObserver, error, complete) {
-    return this.lift(new DoOperator(nextOrObserver, error, complete));
-}
-exports._do = _do;
-var DoOperator = (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DoSubscriber = (function (_super) {
-    __extends(DoSubscriber, _super);
-    function DoSubscriber(destination, nextOrObserver, error, complete) {
-        _super.call(this, destination);
-        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-        safeSubscriber.syncErrorThrowable = true;
-        this.add(safeSubscriber);
-        this.safeSubscriber = safeSubscriber;
-    }
-    DoSubscriber.prototype._next = function (value) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.next(value);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
+        //=== NEEDBITS(3); */
+        while (bits < 3) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.last = (hold & 0x01)/*BITS(1)*/;
+        //--- DROPBITS(1) ---//
+        hold >>>= 1;
+        bits -= 1;
+        //---//
+
+        switch ((hold & 0x03)/*BITS(2)*/) {
+          case 0:                             /* stored block */
+            //Tracev((stderr, "inflate:     stored block%s\n",
+            //        state.last ? " (last)" : ""));
+            state.mode = STORED;
+            break;
+          case 1:                             /* fixed block */
+            fixedtables(state);
+            //Tracev((stderr, "inflate:     fixed codes block%s\n",
+            //        state.last ? " (last)" : ""));
+            state.mode = LEN_;             /* decode codes */
+            if (flush === Z_TREES) {
+              //--- DROPBITS(2) ---//
+              hold >>>= 2;
+              bits -= 2;
+              //---//
+              break inf_leave;
+            }
+            break;
+          case 2:                             /* dynamic block */
+            //Tracev((stderr, "inflate:     dynamic codes block%s\n",
+            //        state.last ? " (last)" : ""));
+            state.mode = TABLE;
+            break;
+          case 3:
+            strm.msg = 'invalid block type';
+            state.mode = BAD;
+        }
+        //--- DROPBITS(2) ---//
+        hold >>>= 2;
+        bits -= 2;
+        //---//
+        break;
+      case STORED:
+        //--- BYTEBITS() ---// /* go to byte boundary */
+        hold >>>= bits & 7;
+        bits -= bits & 7;
+        //---//
+        //=== NEEDBITS(32); */
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
+          strm.msg = 'invalid stored block lengths';
+          state.mode = BAD;
+          break;
         }
-        else {
-            this.destination.next(value);
+        state.length = hold & 0xffff;
+        //Tracev((stderr, "inflate:       stored length %u\n",
+        //        state.length));
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = COPY_;
+        if (flush === Z_TREES) { break inf_leave; }
+        /* falls through */
+      case COPY_:
+        state.mode = COPY;
+        /* falls through */
+      case COPY:
+        copy = state.length;
+        if (copy) {
+          if (copy > have) { copy = have; }
+          if (copy > left) { copy = left; }
+          if (copy === 0) { break inf_leave; }
+          //--- zmemcpy(put, next, copy); ---
+          utils.arraySet(output, input, next, copy, put);
+          //---//
+          have -= copy;
+          next += copy;
+          left -= copy;
+          put += copy;
+          state.length -= copy;
+          break;
         }
-    };
-    DoSubscriber.prototype._error = function (err) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.error(err);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
+        //Tracev((stderr, "inflate:       stored end\n"));
+        state.mode = TYPE;
+        break;
+      case TABLE:
+        //=== NEEDBITS(14); */
+        while (bits < 14) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
+        //--- DROPBITS(5) ---//
+        hold >>>= 5;
+        bits -= 5;
+        //---//
+        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
+        //--- DROPBITS(5) ---//
+        hold >>>= 5;
+        bits -= 5;
+        //---//
+        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
+        //--- DROPBITS(4) ---//
+        hold >>>= 4;
+        bits -= 4;
+        //---//
+//#ifndef PKZIP_BUG_WORKAROUND
+        if (state.nlen > 286 || state.ndist > 30) {
+          strm.msg = 'too many length or distance symbols';
+          state.mode = BAD;
+          break;
         }
-        else {
-            this.destination.error(err);
+//#endif
+        //Tracev((stderr, "inflate:       table sizes ok\n"));
+        state.have = 0;
+        state.mode = LENLENS;
+        /* falls through */
+      case LENLENS:
+        while (state.have < state.ncode) {
+          //=== NEEDBITS(3);
+          while (bits < 3) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
+          //--- DROPBITS(3) ---//
+          hold >>>= 3;
+          bits -= 3;
+          //---//
+        }
+        while (state.have < 19) {
+          state.lens[order[state.have++]] = 0;
+        }
+        // We have separate tables & no pointers. 2 commented lines below not needed.
+        //state.next = state.codes;
+        //state.lencode = state.next;
+        // Switch to use dynamic table
+        state.lencode = state.lendyn;
+        state.lenbits = 7;
+
+        opts = { bits: state.lenbits };
+        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
+        state.lenbits = opts.bits;
+
+        if (ret) {
+          strm.msg = 'invalid code lengths set';
+          state.mode = BAD;
+          break;
         }
-    };
-    DoSubscriber.prototype._complete = function () {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.complete();
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
+        //Tracev((stderr, "inflate:       code lengths ok\n"));
+        state.have = 0;
+        state.mode = CODELENS;
+        /* falls through */
+      case CODELENS:
+        while (state.have < state.nlen + state.ndist) {
+          for (;;) {
+            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
+            here_bits = here >>> 24;
+            here_op = (here >>> 16) & 0xff;
+            here_val = here & 0xffff;
+
+            if ((here_bits) <= bits) { break; }
+            //--- PULLBYTE() ---//
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+            //---//
+          }
+          if (here_val < 16) {
+            //--- DROPBITS(here.bits) ---//
+            hold >>>= here_bits;
+            bits -= here_bits;
+            //---//
+            state.lens[state.have++] = here_val;
+          }
+          else {
+            if (here_val === 16) {
+              //=== NEEDBITS(here.bits + 2);
+              n = here_bits + 2;
+              while (bits < n) {
+                if (have === 0) { break inf_leave; }
+                have--;
+                hold += input[next++] << bits;
+                bits += 8;
+              }
+              //===//
+              //--- DROPBITS(here.bits) ---//
+              hold >>>= here_bits;
+              bits -= here_bits;
+              //---//
+              if (state.have === 0) {
+                strm.msg = 'invalid bit length repeat';
+                state.mode = BAD;
+                break;
+              }
+              len = state.lens[state.have - 1];
+              copy = 3 + (hold & 0x03);//BITS(2);
+              //--- DROPBITS(2) ---//
+              hold >>>= 2;
+              bits -= 2;
+              //---//
+            }
+            else if (here_val === 17) {
+              //=== NEEDBITS(here.bits + 3);
+              n = here_bits + 3;
+              while (bits < n) {
+                if (have === 0) { break inf_leave; }
+                have--;
+                hold += input[next++] << bits;
+                bits += 8;
+              }
+              //===//
+              //--- DROPBITS(here.bits) ---//
+              hold >>>= here_bits;
+              bits -= here_bits;
+              //---//
+              len = 0;
+              copy = 3 + (hold & 0x07);//BITS(3);
+              //--- DROPBITS(3) ---//
+              hold >>>= 3;
+              bits -= 3;
+              //---//
+            }
+            else {
+              //=== NEEDBITS(here.bits + 7);
+              n = here_bits + 7;
+              while (bits < n) {
+                if (have === 0) { break inf_leave; }
+                have--;
+                hold += input[next++] << bits;
+                bits += 8;
+              }
+              //===//
+              //--- DROPBITS(here.bits) ---//
+              hold >>>= here_bits;
+              bits -= here_bits;
+              //---//
+              len = 0;
+              copy = 11 + (hold & 0x7f);//BITS(7);
+              //--- DROPBITS(7) ---//
+              hold >>>= 7;
+              bits -= 7;
+              //---//
+            }
+            if (state.have + copy > state.nlen + state.ndist) {
+              strm.msg = 'invalid bit length repeat';
+              state.mode = BAD;
+              break;
+            }
+            while (copy--) {
+              state.lens[state.have++] = len;
+            }
+          }
         }
-        else {
-            this.destination.complete();
+
+        /* handle error breaks in while */
+        if (state.mode === BAD) { break; }
+
+        /* check for end-of-block code (better have one) */
+        if (state.lens[256] === 0) {
+          strm.msg = 'invalid code -- missing end-of-block';
+          state.mode = BAD;
+          break;
         }
-    };
-    return DoSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":35}],108:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Recursively projects each source value to an Observable which is merged in
- * the output Observable.
- *
- * <span class="informal">It's similar to {@link mergeMap}, but applies the
- * projection function to every source value as well as every output value.
- * It's recursive.</span>
- *
- * <img src="./img/expand.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger. *Expand* will re-emit on the output
- * Observable every source value. Then, each output value is given to the
- * `project` function which returns an inner Observable to be merged on the
- * output Observable. Those output values resulting from the projection are also
- * given to the `project` function to produce new output values. This is how
- * *expand* behaves recursively.
- *
- * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var powersOfTwo = clicks
- *   .mapTo(1)
- *   .expand(x => Rx.Observable.of(2 * x).delay(1000))
- *   .take(10);
- * powersOfTwo.subscribe(x => console.log(x));
- *
- * @see {@link mergeMap}
- * @see {@link mergeScan}
- *
- * @param {function(value: T, index: number) => Observable} project A function
- * that, when applied to an item emitted by the source or the output Observable,
- * returns an Observable.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to
- * each projected inner Observable.
- * @return {Observable} An Observable that emits the source values and also
- * result of applying the projection function to each value emitted on the
- * output Observable and and merging the results of the Observables obtained
- * from this transformation.
- * @method expand
- * @owner Observable
- */
-function expand(project, concurrent, scheduler) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (scheduler === void 0) { scheduler = undefined; }
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return this.lift(new ExpandOperator(project, concurrent, scheduler));
-}
-exports.expand = expand;
-var ExpandOperator = (function () {
-    function ExpandOperator(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    ExpandOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    };
-    return ExpandOperator;
-}());
-exports.ExpandOperator = ExpandOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ExpandSubscriber = (function (_super) {
-    __extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        _super.call(this, destination);
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-        this.index = 0;
-        this.active = 0;
-        this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            this.buffer = [];
+        /* build code tables -- note: do not change the lenbits or distbits
+           values here (9 and 6) without reading the comments in inftrees.h
+           concerning the ENOUGH constants, which depend on those values */
+        state.lenbits = 9;
+
+        opts = { bits: state.lenbits };
+        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
+        // We have separate tables & no pointers. 2 commented lines below not needed.
+        // state.next_index = opts.table_index;
+        state.lenbits = opts.bits;
+        // state.lencode = state.next;
+
+        if (ret) {
+          strm.msg = 'invalid literal/lengths set';
+          state.mode = BAD;
+          break;
         }
-    }
-    ExpandSubscriber.dispatch = function (arg) {
-        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-        subscriber.subscribeToProjection(result, value, index);
-    };
-    ExpandSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
+
+        state.distbits = 6;
+        //state.distcode.copy(state.codes);
+        // Switch to use dynamic table
+        state.distcode = state.distdyn;
+        opts = { bits: state.distbits };
+        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
+        // We have separate tables & no pointers. 2 commented lines below not needed.
+        // state.next_index = opts.table_index;
+        state.distbits = opts.bits;
+        // state.distcode = state.next;
+
+        if (ret) {
+          strm.msg = 'invalid distances set';
+          state.mode = BAD;
+          break;
         }
-        var index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            var result = tryCatch_1.tryCatch(this.project)(value, index);
-            if (result === errorObject_1.errorObject) {
-                destination.error(errorObject_1.errorObject.e);
-            }
-            else if (!this.scheduler) {
-                this.subscribeToProjection(result, value, index);
-            }
-            else {
-                var state = { subscriber: this, result: result, value: value, index: index };
-                this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-            }
+        //Tracev((stderr, 'inflate:       codes ok\n'));
+        state.mode = LEN_;
+        if (flush === Z_TREES) { break inf_leave; }
+        /* falls through */
+      case LEN_:
+        state.mode = LEN;
+        /* falls through */
+      case LEN:
+        if (have >= 6 && left >= 258) {
+          //--- RESTORE() ---
+          strm.next_out = put;
+          strm.avail_out = left;
+          strm.next_in = next;
+          strm.avail_in = have;
+          state.hold = hold;
+          state.bits = bits;
+          //---
+          inflate_fast(strm, _out);
+          //--- LOAD() ---
+          put = strm.next_out;
+          output = strm.output;
+          left = strm.avail_out;
+          next = strm.next_in;
+          input = strm.input;
+          have = strm.avail_in;
+          hold = state.hold;
+          bits = state.bits;
+          //---
+
+          if (state.mode === TYPE) {
+            state.back = -1;
+          }
+          break;
         }
-        else {
-            this.buffer.push(value);
+        state.back = 0;
+        for (;;) {
+          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if (here_bits <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        if (here_op && (here_op & 0xf0) === 0) {
+          last_bits = here_bits;
+          last_op = here_op;
+          last_val = here_val;
+          for (;;) {
+            here = state.lencode[last_val +
+                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
+            here_bits = here >>> 24;
+            here_op = (here >>> 16) & 0xff;
+            here_val = here & 0xffff;
+
+            if ((last_bits + here_bits) <= bits) { break; }
+            //--- PULLBYTE() ---//
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+            //---//
+          }
+          //--- DROPBITS(last.bits) ---//
+          hold >>>= last_bits;
+          bits -= last_bits;
+          //---//
+          state.back += last_bits;
+        }
+        //--- DROPBITS(here.bits) ---//
+        hold >>>= here_bits;
+        bits -= here_bits;
+        //---//
+        state.back += here_bits;
+        state.length = here_val;
+        if (here_op === 0) {
+          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+          //        "inflate:         literal '%c'\n" :
+          //        "inflate:         literal 0x%02x\n", here.val));
+          state.mode = LIT;
+          break;
         }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
+        if (here_op & 32) {
+          //Tracevv((stderr, "inflate:         end of block\n"));
+          state.back = -1;
+          state.mode = TYPE;
+          break;
         }
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
+        if (here_op & 64) {
+          strm.msg = 'invalid literal/length code';
+          state.mode = BAD;
+          break;
         }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
+        state.extra = here_op & 15;
+        state.mode = LENEXT;
+        /* falls through */
+      case LENEXT:
+        if (state.extra) {
+          //=== NEEDBITS(state.extra);
+          n = state.extra;
+          while (bits < n) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
+          //--- DROPBITS(state.extra) ---//
+          hold >>>= state.extra;
+          bits -= state.extra;
+          //---//
+          state.back += state.extra;
+        }
+        //Tracevv((stderr, "inflate:         length %u\n", state.length));
+        state.was = state.length;
+        state.mode = DIST;
+        /* falls through */
+      case DIST:
+        for (;;) {
+          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if ((here_bits) <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        if ((here_op & 0xf0) === 0) {
+          last_bits = here_bits;
+          last_op = here_op;
+          last_val = here_val;
+          for (;;) {
+            here = state.distcode[last_val +
+                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
+            here_bits = here >>> 24;
+            here_op = (here >>> 16) & 0xff;
+            here_val = here & 0xffff;
+
+            if ((last_bits + here_bits) <= bits) { break; }
+            //--- PULLBYTE() ---//
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+            //---//
+          }
+          //--- DROPBITS(last.bits) ---//
+          hold >>>= last_bits;
+          bits -= last_bits;
+          //---//
+          state.back += last_bits;
+        }
+        //--- DROPBITS(here.bits) ---//
+        hold >>>= here_bits;
+        bits -= here_bits;
+        //---//
+        state.back += here_bits;
+        if (here_op & 64) {
+          strm.msg = 'invalid distance code';
+          state.mode = BAD;
+          break;
         }
-    };
-    return ExpandSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.ExpandSubscriber = ExpandSubscriber;
-
-},{"../OuterSubscriber":30,"../util/errorObject":147,"../util/subscribeToResult":154,"../util/tryCatch":156}],109:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Filter items emitted by the source Observable by only emitting those that
- * satisfy a specified predicate.
- *
- * <span class="informal">Like
- * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
- * it only emits a value from the source if it passes a criterion function.</span>
- *
- * <img src="./img/filter.png" width="100%">
- *
- * Similar to the well-known `Array.prototype.filter` method, this operator
- * takes values from the source Observable, passes them through a `predicate`
- * function and only emits those values that yielded `true`.
- *
- * @example <caption>Emit only click events whose target was a DIV element</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');
- * clicksOnDivs.subscribe(x => console.log(x));
- *
- * @see {@link distinct}
- * @see {@link distinctKey}
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- * @see {@link ignoreElements}
- * @see {@link partition}
- * @see {@link skip}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted, if `false` the value is not passed to the output
- * Observable. The `index` parameter is the number `i` for the i-th source
- * emission that has happened since the subscription, starting from the number
- * `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable} An Observable of values from the source that were
- * allowed by the `predicate` function.
- * @method filter
- * @owner Observable
- */
-function filter(predicate, thisArg) {
-    return this.lift(new FilterOperator(predicate, thisArg));
-}
-exports.filter = filter;
-var FilterOperator = (function () {
-    function FilterOperator(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    FilterOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    };
-    return FilterOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FilterSubscriber = (function (_super) {
-    __extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.count = 0;
-        this.predicate = predicate;
-    }
-    // the try catch block below is left specifically for
-    // optimization and perf reasons. a tryCatcher is not necessary here.
-    FilterSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
+        state.offset = here_val;
+        state.extra = (here_op) & 15;
+        state.mode = DISTEXT;
+        /* falls through */
+      case DISTEXT:
+        if (state.extra) {
+          //=== NEEDBITS(state.extra);
+          n = state.extra;
+          while (bits < n) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
+          //--- DROPBITS(state.extra) ---//
+          hold >>>= state.extra;
+          bits -= state.extra;
+          //---//
+          state.back += state.extra;
+        }
+//#ifdef INFLATE_STRICT
+        if (state.offset > state.dmax) {
+          strm.msg = 'invalid distance too far back';
+          state.mode = BAD;
+          break;
         }
-        catch (err) {
-            this.destination.error(err);
-            return;
+//#endif
+        //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
+        state.mode = MATCH;
+        /* falls through */
+      case MATCH:
+        if (left === 0) { break inf_leave; }
+        copy = _out - left;
+        if (state.offset > copy) {         /* copy from window */
+          copy = state.offset - copy;
+          if (copy > state.whave) {
+            if (state.sane) {
+              strm.msg = 'invalid distance too far back';
+              state.mode = BAD;
+              break;
+            }
+// (!) This block is disabled in zlib defaults,
+// don't enable it for binary compatibility
+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+//          Trace((stderr, "inflate.c too far\n"));
+//          copy -= state.whave;
+//          if (copy > state.length) { copy = state.length; }
+//          if (copy > left) { copy = left; }
+//          left -= copy;
+//          state.length -= copy;
+//          do {
+//            output[put++] = 0;
+//          } while (--copy);
+//          if (state.length === 0) { state.mode = LEN; }
+//          break;
+//#endif
+          }
+          if (copy > state.wnext) {
+            copy -= state.wnext;
+            from = state.wsize - copy;
+          }
+          else {
+            from = state.wnext - copy;
+          }
+          if (copy > state.length) { copy = state.length; }
+          from_source = state.window;
         }
-        if (result) {
-            this.destination.next(value);
+        else {                              /* copy from output */
+          from_source = output;
+          from = put - state.offset;
+          copy = state.length;
         }
-    };
-    return FilterSubscriber;
-}(Subscriber_1.Subscriber));
+        if (copy > left) { copy = left; }
+        left -= copy;
+        state.length -= copy;
+        do {
+          output[put++] = from_source[from++];
+        } while (--copy);
+        if (state.length === 0) { state.mode = LEN; }
+        break;
+      case LIT:
+        if (left === 0) { break inf_leave; }
+        output[put++] = state.length;
+        left--;
+        state.mode = LEN;
+        break;
+      case CHECK:
+        if (state.wrap) {
+          //=== NEEDBITS(32);
+          while (bits < 32) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            // Use '|' instead of '+' to make sure that result is signed
+            hold |= input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          _out -= left;
+          strm.total_out += _out;
+          state.total += _out;
+          if (_out) {
+            strm.adler = state.check =
+                /*UPDATE(state.check, put - _out, _out);*/
+                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
 
-},{"../Subscriber":35}],110:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var Subscription_1 = require('../Subscription');
-/**
- * Returns an Observable that mirrors the source Observable, but will call a specified function when
- * the source terminates on complete or error.
- * @param {function} callback function to be called when source terminates.
- * @return {Observable} an Observable that mirrors the source, but will call the specified function on termination.
- * @method finally
- * @owner Observable
- */
-function _finally(callback) {
-    return this.lift(new FinallyOperator(callback));
-}
-exports._finally = _finally;
-var FinallyOperator = (function () {
-    function FinallyOperator(callback) {
-        this.callback = callback;
-    }
-    FinallyOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new FinallySubscriber(subscriber, this.callback));
-    };
-    return FinallyOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FinallySubscriber = (function (_super) {
-    __extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        _super.call(this, destination);
-        this.add(new Subscription_1.Subscription(callback));
+          }
+          _out = left;
+          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
+          if ((state.flags ? hold : zswap32(hold)) !== state.check) {
+            strm.msg = 'incorrect data check';
+            state.mode = BAD;
+            break;
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+          //Tracev((stderr, "inflate:   check matches trailer\n"));
+        }
+        state.mode = LENGTH;
+        /* falls through */
+      case LENGTH:
+        if (state.wrap && state.flags) {
+          //=== NEEDBITS(32);
+          while (bits < 32) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          if (hold !== (state.total & 0xffffffff)) {
+            strm.msg = 'incorrect length check';
+            state.mode = BAD;
+            break;
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+          //Tracev((stderr, "inflate:   length matches trailer\n"));
+        }
+        state.mode = DONE;
+        /* falls through */
+      case DONE:
+        ret = Z_STREAM_END;
+        break inf_leave;
+      case BAD:
+        ret = Z_DATA_ERROR;
+        break inf_leave;
+      case MEM:
+        return Z_MEM_ERROR;
+      case SYNC:
+        /* falls through */
+      default:
+        return Z_STREAM_ERROR;
     }
-    return FinallySubscriber;
-}(Subscriber_1.Subscriber));
+  }
 
-},{"../Subscriber":35,"../Subscription":36}],111:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var EmptyError_1 = require('../util/EmptyError');
-/**
- * Emits only the first value (or the first value that meets some condition)
- * emitted by the source Observable.
- *
- * <span class="informal">Emits only the first value. Or emits only the first
- * value that passes some test.</span>
- *
- * <img src="./img/first.png" width="100%">
- *
- * If called with no arguments, `first` emits the first value of the source
- * Observable, then completes. If called with a `predicate` function, `first`
- * emits the first value of the source that matches the specified condition. It
- * may also take a `resultSelector` function to produce the output value from
- * the input value, and a `defaultValue` to emit in case the source completes
- * before it is able to emit a valid value. Throws an error if `defaultValue`
- * was not provided and a matching element is not found.
- *
- * @example <caption>Emit only the first click that happens on the DOM</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.first();
- * result.subscribe(x => console.log(x));
- *
- * @example <caption>Emits the first click that happens on a DIV</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.first(ev => ev.target.tagName === 'DIV');
- * result.subscribe(x => console.log(x));
- *
- * @see {@link filter}
- * @see {@link find}
- * @see {@link take}
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]
- * An optional function called with each item to test for condition matching.
- * @param {function(value: T, index: number): R} [resultSelector] A function to
- * produce the value on the output Observable based on the values
- * and the indices of the source Observable. The arguments passed to this
- * function are:
- * - `value`: the value that was emitted on the source.
- * - `index`: the "index" of the value from the source.
- * @param {R} [defaultValue] The default value emitted in case no valid value
- * was found on the source.
- * @return {Observable<T|R>} an Observable of the first item that matches the
- * condition.
- * @method first
- * @owner Observable
- */
-function first(predicate, resultSelector, defaultValue) {
-    return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));
-}
-exports.first = first;
-var FirstOperator = (function () {
-    function FirstOperator(predicate, resultSelector, defaultValue, source) {
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-    }
-    FirstOperator.prototype.call = function (observer, source) {
-        return source._subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));
-    };
-    return FirstOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FirstSubscriber = (function (_super) {
-    __extends(FirstSubscriber, _super);
-    function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-        this.index = 0;
-        this.hasCompleted = false;
+  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
+
+  /*
+     Return from inflate(), updating the total counts and the check value.
+     If there was no progress during the inflate() call, return a buffer
+     error.  Call updatewindow() to create and/or update the window state.
+     Note: a memory error from inflate() is non-recoverable.
+   */
+
+  //--- RESTORE() ---
+  strm.next_out = put;
+  strm.avail_out = left;
+  strm.next_in = next;
+  strm.avail_in = have;
+  state.hold = hold;
+  state.bits = bits;
+  //---
+
+  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
+                      (state.mode < CHECK || flush !== Z_FINISH))) {
+    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
+      state.mode = MEM;
+      return Z_MEM_ERROR;
     }
-    FirstSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this._tryPredicate(value, index);
-        }
-        else {
-            this._emit(value, index);
-        }
-    };
-    FirstSubscriber.prototype._tryPredicate = function (value, index) {
-        var result;
-        try {
-            result = this.predicate(value, index, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this._emit(value, index);
-        }
-    };
-    FirstSubscriber.prototype._emit = function (value, index) {
-        if (this.resultSelector) {
-            this._tryResultSelector(value, index);
-            return;
-        }
-        this._emitFinal(value);
-    };
-    FirstSubscriber.prototype._tryResultSelector = function (value, index) {
-        var result;
-        try {
-            result = this.resultSelector(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this._emitFinal(result);
-    };
-    FirstSubscriber.prototype._emitFinal = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-        this.hasCompleted = true;
-    };
-    FirstSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {
-            destination.next(this.defaultValue);
-            destination.complete();
-        }
-        else if (!this.hasCompleted) {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return FirstSubscriber;
-}(Subscriber_1.Subscriber));
+  }
+  _in -= strm.avail_in;
+  _out -= strm.avail_out;
+  strm.total_in += _in;
+  strm.total_out += _out;
+  state.total += _out;
+  if (state.wrap && _out) {
+    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
+      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
+  }
+  strm.data_type = state.bits + (state.last ? 64 : 0) +
+                    (state.mode === TYPE ? 128 : 0) +
+                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
+  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
+    ret = Z_BUF_ERROR;
+  }
+  return ret;
+}
 
-},{"../Subscriber":35,"../util/EmptyError":144}],112:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var EmptyError_1 = require('../util/EmptyError');
-/**
- * Returns an Observable that emits only the last item emitted by the source Observable.
- * It optionally takes a predicate function as a parameter, in which case, rather than emitting
- * the last item from the source Observable, the resulting Observable will emit the last item
- * from the source Observable that satisfies the predicate.
- *
- * <img src="./img/last.png" width="100%">
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- * @param {function} predicate - the condition any source emitted item has to satisfy.
- * @return {Observable} an Observable that emits only the last item satisfying the given condition
- * from the source, or an NoSuchElementException if no such items are emitted.
- * @throws - Throws if no items that match the predicate are emitted by the source Observable.
- * @method last
- * @owner Observable
- */
-function last(predicate, resultSelector, defaultValue) {
-    return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));
+function inflateEnd(strm) {
+
+  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  var state = strm.state;
+  if (state.window) {
+    state.window = null;
+  }
+  strm.state = null;
+  return Z_OK;
 }
-exports.last = last;
-var LastOperator = (function () {
-    function LastOperator(predicate, resultSelector, defaultValue, source) {
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-    }
-    LastOperator.prototype.call = function (observer, source) {
-        return source._subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));
-    };
-    return LastOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var LastSubscriber = (function (_super) {
-    __extends(LastSubscriber, _super);
-    function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-        this.hasValue = false;
-        this.index = 0;
-        if (typeof defaultValue !== 'undefined') {
-            this.lastValue = defaultValue;
-            this.hasValue = true;
-        }
-    }
-    LastSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this._tryPredicate(value, index);
-        }
-        else {
-            if (this.resultSelector) {
-                this._tryResultSelector(value, index);
-                return;
-            }
-            this.lastValue = value;
-            this.hasValue = true;
-        }
-    };
-    LastSubscriber.prototype._tryPredicate = function (value, index) {
-        var result;
-        try {
-            result = this.predicate(value, index, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            if (this.resultSelector) {
-                this._tryResultSelector(value, index);
-                return;
-            }
-            this.lastValue = value;
-            this.hasValue = true;
-        }
-    };
-    LastSubscriber.prototype._tryResultSelector = function (value, index) {
-        var result;
-        try {
-            result = this.resultSelector(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.lastValue = result;
-        this.hasValue = true;
-    };
-    LastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.hasValue) {
-            destination.next(this.lastValue);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return LastSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":35,"../util/EmptyError":144}],113:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Applies a given `project` function to each value emitted by the source
- * Observable, and emits the resulting values as an Observable.
- *
- * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
- * it passes each source value through a transformation function to get
- * corresponding output values.</span>
- *
- * <img src="./img/map.png" width="100%">
- *
- * Similar to the well known `Array.prototype.map` function, this operator
- * applies a projection to each value and emits that projection in the output
- * Observable.
- *
- * @example <caption>Map every every click to the clientX position of that click</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks.map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link mapTo}
- * @see {@link pluck}
- *
- * @param {function(value: T, index: number): R} project The function to apply
- * to each `value` emitted by the source Observable. The `index` parameter is
- * the number `i` for the i-th emission that has happened since the
- * subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to define what `this` is in the
- * `project` function.
- * @return {Observable<R>} An Observable that emits the values from the source
- * Observable transformed by the given `project` function.
- * @method map
- * @owner Observable
- */
-function map(project, thisArg) {
-    if (typeof project !== 'function') {
-        throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-    }
-    return this.lift(new MapOperator(project, thisArg));
+function inflateGetHeader(strm, head) {
+  var state;
+
+  /* check state */
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
+
+  /* save header structure */
+  state.head = head;
+  head.done = false;
+  return Z_OK;
 }
-exports.map = map;
-var MapOperator = (function () {
-    function MapOperator(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
+
+function inflateSetDictionary(strm, dictionary) {
+  var dictLength = dictionary.length;
+
+  var state;
+  var dictid;
+  var ret;
+
+  /* check state */
+  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
+  state = strm.state;
+
+  if (state.wrap !== 0 && state.mode !== DICT) {
+    return Z_STREAM_ERROR;
+  }
+
+  /* check for correct dictionary identifier */
+  if (state.mode === DICT) {
+    dictid = 1; /* adler32(0, null, 0)*/
+    /* dictid = adler32(dictid, dictionary, dictLength); */
+    dictid = adler32(dictid, dictionary, dictLength, 0);
+    if (dictid !== state.check) {
+      return Z_DATA_ERROR;
     }
-    MapOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    };
-    return MapOperator;
-}());
-exports.MapOperator = MapOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MapSubscriber = (function (_super) {
-    __extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        _super.call(this, destination);
-        this.project = project;
-        this.count = 0;
-        this.thisArg = thisArg || this;
+  }
+  /* copy dictionary to window using updatewindow(), which will amend the
+   existing dictionary if appropriate */
+  ret = updatewindow(strm, dictionary, dictLength, dictLength);
+  if (ret) {
+    state.mode = MEM;
+    return Z_MEM_ERROR;
+  }
+  state.havedict = 1;
+  // Tracev((stderr, "inflate:   dictionary set\n"));
+  return Z_OK;
+}
+
+exports.inflateReset = inflateReset;
+exports.inflateReset2 = inflateReset2;
+exports.inflateResetKeep = inflateResetKeep;
+exports.inflateInit = inflateInit;
+exports.inflateInit2 = inflateInit2;
+exports.inflate = inflate;
+exports.inflateEnd = inflateEnd;
+exports.inflateGetHeader = inflateGetHeader;
+exports.inflateSetDictionary = inflateSetDictionary;
+exports.inflateInfo = 'pako inflate (from Nodeca project)';
+
+/* Not implemented
+exports.inflateCopy = inflateCopy;
+exports.inflateGetDictionary = inflateGetDictionary;
+exports.inflateMark = inflateMark;
+exports.inflatePrime = inflatePrime;
+exports.inflateSync = inflateSync;
+exports.inflateSyncPoint = inflateSyncPoint;
+exports.inflateUndermine = inflateUndermine;
+*/
+
+},{"../utils/common":26,"./adler32":28,"./crc32":30,"./inffast":33,"./inftrees":35}],35:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+var utils = require('../utils/common');
+
+var MAXBITS = 15;
+var ENOUGH_LENS = 852;
+var ENOUGH_DISTS = 592;
+//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
+
+var CODES = 0;
+var LENS = 1;
+var DISTS = 2;
+
+var lbase = [ /* Length codes 257..285 base */
+  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
+];
+
+var lext = [ /* Length codes 257..285 extra */
+  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
+];
+
+var dbase = [ /* Distance codes 0..29 base */
+  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+  8193, 12289, 16385, 24577, 0, 0
+];
+
+var dext = [ /* Distance codes 0..29 extra */
+  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+  28, 28, 29, 29, 64, 64
+];
+
+module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
+{
+  var bits = opts.bits;
+      //here = opts.here; /* table entry for duplication */
+
+  var len = 0;               /* a code's length in bits */
+  var sym = 0;               /* index of code symbols */
+  var min = 0, max = 0;          /* minimum and maximum code lengths */
+  var root = 0;              /* number of index bits for root table */
+  var curr = 0;              /* number of index bits for current table */
+  var drop = 0;              /* code bits to drop for sub-table */
+  var left = 0;                   /* number of prefix codes available */
+  var used = 0;              /* code entries in table used */
+  var huff = 0;              /* Huffman code */
+  var incr;              /* for incrementing code, index */
+  var fill;              /* index for replicating entries */
+  var low;               /* low bits for current root entry */
+  var mask;              /* mask for low root bits */
+  var next;             /* next available space in table */
+  var base = null;     /* base value table to use */
+  var base_index = 0;
+//  var shoextra;    /* extra bits table to use */
+  var end;                    /* use base and extra for symbol > end */
+  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
+  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
+  var extra = null;
+  var extra_index = 0;
+
+  var here_bits, here_op, here_val;
+
+  /*
+   Process a set of code lengths to create a canonical Huffman code.  The
+   code lengths are lens[0..codes-1].  Each length corresponds to the
+   symbols 0..codes-1.  The Huffman code is generated by first sorting the
+   symbols by length from short to long, and retaining the symbol order
+   for codes with equal lengths.  Then the code starts with all zero bits
+   for the first code of the shortest length, and the codes are integer
+   increments for the same length, and zeros are appended as the length
+   increases.  For the deflate format, these bits are stored backwards
+   from their more natural integer increment ordering, and so when the
+   decoding tables are built in the large loop below, the integer codes
+   are incremented backwards.
+
+   This routine assumes, but does not check, that all of the entries in
+   lens[] are in the range 0..MAXBITS.  The caller must assure this.
+   1..MAXBITS is interpreted as that code length.  zero means that that
+   symbol does not occur in this code.
+
+   The codes are sorted by computing a count of codes for each length,
+   creating from that a table of starting indices for each length in the
+   sorted table, and then entering the symbols in order in the sorted
+   table.  The sorted table is work[], with that space being provided by
+   the caller.
+
+   The length counts are used for other purposes as well, i.e. finding
+   the minimum and maximum length codes, determining if there are any
+   codes at all, checking for a valid set of lengths, and looking ahead
+   at length counts to determine sub-table sizes when building the
+   decoding tables.
+   */
+
+  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+  for (len = 0; len <= MAXBITS; len++) {
+    count[len] = 0;
+  }
+  for (sym = 0; sym < codes; sym++) {
+    count[lens[lens_index + sym]]++;
+  }
+
+  /* bound code lengths, force root to be within code lengths */
+  root = bits;
+  for (max = MAXBITS; max >= 1; max--) {
+    if (count[max] !== 0) { break; }
+  }
+  if (root > max) {
+    root = max;
+  }
+  if (max === 0) {                     /* no symbols to code at all */
+    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
+    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
+    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
+    table[table_index++] = (1 << 24) | (64 << 16) | 0;
+
+
+    //table.op[opts.table_index] = 64;
+    //table.bits[opts.table_index] = 1;
+    //table.val[opts.table_index++] = 0;
+    table[table_index++] = (1 << 24) | (64 << 16) | 0;
+
+    opts.bits = 1;
+    return 0;     /* no symbols, but wait for decoding to report error */
+  }
+  for (min = 1; min < max; min++) {
+    if (count[min] !== 0) { break; }
+  }
+  if (root < min) {
+    root = min;
+  }
+
+  /* check for an over-subscribed or incomplete set of lengths */
+  left = 1;
+  for (len = 1; len <= MAXBITS; len++) {
+    left <<= 1;
+    left -= count[len];
+    if (left < 0) {
+      return -1;
+    }        /* over-subscribed */
+  }
+  if (left > 0 && (type === CODES || max !== 1)) {
+    return -1;                      /* incomplete set */
+  }
+
+  /* generate offsets into symbol table for each length for sorting */
+  offs[1] = 0;
+  for (len = 1; len < MAXBITS; len++) {
+    offs[len + 1] = offs[len] + count[len];
+  }
+
+  /* sort symbols by length, by symbol order within each length */
+  for (sym = 0; sym < codes; sym++) {
+    if (lens[lens_index + sym] !== 0) {
+      work[offs[lens[lens_index + sym]]++] = sym;
     }
-    // NOTE: This looks unoptimized, but it's actually purposefully NOT
-    // using try/catch optimizations.
-    MapSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return MapSubscriber;
-}(Subscriber_1.Subscriber));
+  }
 
-},{"../Subscriber":35}],114:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
-var isScheduler_1 = require('../util/isScheduler');
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (either the source or an
- * Observable given as argument), and simply forwards (without doing any
- * transformation) all the values from all the input Observables to the output
- * Observable. The output Observable only completes once all input Observables
- * have completed. Any error delivered by an input Observable will be immediately
- * emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = clicks.merge(timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = timer1.merge(timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {Observable} other An input Observable to merge with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The Scheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} an Observable that emits items that are the result of
- * every input Observable.
- * @method merge
- * @owner Observable
- */
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+  /*
+   Create and fill in decoding tables.  In this loop, the table being
+   filled is at next and has curr index bits.  The code being used is huff
+   with length len.  That code is converted to an index by dropping drop
+   bits off of the bottom.  For codes where len is less than drop + curr,
+   those top drop + curr - len bits are incremented through all values to
+   fill the table with replicated entries.
+
+   root is the number of index bits for the root table.  When len exceeds
+   root, sub-tables are created pointed to by the root entry with an index
+   of the low root bits of huff.  This is saved in low to check for when a
+   new sub-table should be started.  drop is zero when the root table is
+   being filled, and drop is root when sub-tables are being filled.
+
+   When a new sub-table is needed, it is necessary to look ahead in the
+   code lengths to determine what size sub-table is needed.  The length
+   counts are used for this, and so count[] is decremented as codes are
+   entered in the tables.
+
+   used keeps track of how many table entries have been allocated from the
+   provided *table space.  It is checked for LENS and DIST tables against
+   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+   the initial root table size constants.  See the comments in inftrees.h
+   for more information.
+
+   sym increments through all symbols, and the loop terminates when
+   all codes of length max, i.e. all codes, have been processed.  This
+   routine permits incomplete codes, so another loop after this one fills
+   in the rest of the decoding tables with invalid code markers.
+   */
+
+  /* set up for code type */
+  // poor man optimization - use if-else instead of switch,
+  // to avoid deopts in old v8
+  if (type === CODES) {
+    base = extra = work;    /* dummy value--not used */
+    end = 19;
+
+  } else if (type === LENS) {
+    base = lbase;
+    base_index -= 257;
+    extra = lext;
+    extra_index -= 257;
+    end = 256;
+
+  } else {                    /* DISTS */
+    base = dbase;
+    extra = dext;
+    end = -1;
+  }
+
+  /* initialize opts for loop */
+  huff = 0;                   /* starting code */
+  sym = 0;                    /* starting code symbol */
+  len = min;                  /* starting code length */
+  next = table_index;              /* current table to fill in */
+  curr = root;                /* current table index bits */
+  drop = 0;                   /* current bits to drop from code for index */
+  low = -1;                   /* trigger new sub-table when len > root */
+  used = 1 << root;          /* use root table entries */
+  mask = used - 1;            /* mask for comparing low */
+
+  /* check available table space */
+  if ((type === LENS && used > ENOUGH_LENS) ||
+    (type === DISTS && used > ENOUGH_DISTS)) {
+    return 1;
+  }
+
+  /* process all codes and make table entries */
+  for (;;) {
+    /* create table entry */
+    here_bits = len - drop;
+    if (work[sym] < end) {
+      here_op = 0;
+      here_val = work[sym];
     }
-    observables.unshift(this);
-    return mergeStatic.apply(this, observables);
-}
-exports.merge = merge;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (as arguments), and simply
- * forwards (without doing any transformation) all the values from all the input
- * Observables to the output Observable. The output Observable only completes
- * once all input Observables have completed. Any error delivered by an input
- * Observable will be immediately emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = Rx.Observable.merge(clicks, timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {Observable} input1 An input Observable to merge with others.
- * @param {Observable} input2 An input Observable to merge with others.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The Scheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} an Observable that emits items that are the result of
- * every input Observable.
- * @static true
- * @name merge
- * @owner Observable
- */
-function mergeStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+    else if (work[sym] > end) {
+      here_op = extra[extra_index + work[sym]];
+      here_val = base[base_index + work[sym]];
     }
-    var concurrent = Number.POSITIVE_INFINITY;
-    var scheduler = null;
-    var last = observables[observables.length - 1];
-    if (isScheduler_1.isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
+    else {
+      here_op = 32 + 64;         /* end of block */
+      here_val = 0;
     }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
+
+    /* replicate for those indices with low len bits equal to huff */
+    incr = 1 << (len - drop);
+    fill = 1 << curr;
+    min = fill;                 /* save offset to next table */
+    do {
+      fill -= incr;
+      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
+    } while (fill !== 0);
+
+    /* backwards increment the len-bit code huff */
+    incr = 1 << (len - 1);
+    while (huff & incr) {
+      incr >>= 1;
+    }
+    if (incr !== 0) {
+      huff &= incr - 1;
+      huff += incr;
+    } else {
+      huff = 0;
     }
-    if (observables.length === 1) {
-        return observables[0];
+
+    /* go to next symbol, update count, len */
+    sym++;
+    if (--count[len] === 0) {
+      if (len === max) { break; }
+      len = lens[lens_index + work[sym]];
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));
-}
-exports.mergeStatic = mergeStatic;
 
-},{"../observable/ArrayObservable":79,"../util/isScheduler":152,"./mergeAll":115}],115:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    /* create new sub-table if needed */
+    if (len > root && (huff & mask) !== low) {
+      /* if first time, transition to sub-tables */
+      if (drop === 0) {
+        drop = root;
+      }
+
+      /* increment past last table */
+      next += min;            /* here min is 1 << curr */
+
+      /* determine length of next table */
+      curr = len - drop;
+      left = 1 << curr;
+      while (curr + drop < max) {
+        left -= count[curr + drop];
+        if (left <= 0) { break; }
+        curr++;
+        left <<= 1;
+      }
+
+      /* check for enough space */
+      used += 1 << curr;
+      if ((type === LENS && used > ENOUGH_LENS) ||
+        (type === DISTS && used > ENOUGH_DISTS)) {
+        return 1;
+      }
+
+      /* point entry in root table to sub-table */
+      low = huff & mask;
+      /*table.op[low] = curr;
+      table.bits[low] = root;
+      table.val[low] = next - opts.table_index;*/
+      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
+    }
+  }
+
+  /* fill in remaining table entry if code is incomplete (guaranteed to have
+   at most one remaining entry, since if the code is incomplete, the
+   maximum code length that was allowed to get this far is one bit) */
+  if (huff !== 0) {
+    //table.op[next + huff] = 64;            /* invalid code marker */
+    //table.bits[next + huff] = len - drop;
+    //table.val[next + huff] = 0;
+    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
+  }
+
+  /* set return parameters */
+  //opts.table_index += used;
+  opts.bits = root;
+  return 0;
 };
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Converts a higher-order Observable into a first-order Observable which
- * concurrently delivers all values that are emitted on the inner Observables.
- *
- * <span class="informal">Flattens an Observable-of-Observables.</span>
- *
- * <img src="./img/mergeAll.png" width="100%">
- *
- * `mergeAll` subscribes to an Observable that emits Observables, also known as
- * a higher-order Observable. Each time it observes one of these emitted inner
- * Observables, it subscribes to that and delivers all the values from the
- * inner Observable on the output Observable. The output Observable only
- * completes once all inner Observables have completed. Any error delivered by
- * a inner Observable will be immediately emitted on the output Observable.
- *
- * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));
- * var firstOrder = higherOrder.mergeAll();
- * firstOrder.subscribe(x => console.log(x));
- *
- * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));
- * var firstOrder = higherOrder.mergeAll(2);
- * firstOrder.subscribe(x => console.log(x));
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link exhaust}
- * @see {@link merge}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switch}
- * @see {@link zipAll}
- *
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits values coming from all the
- * inner Observables emitted by the source Observable.
- * @method mergeAll
- * @owner Observable
+
+},{"../utils/common":26}],36:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+module.exports = {
+  2:      'need dictionary',     /* Z_NEED_DICT       2  */
+  1:      'stream end',          /* Z_STREAM_END      1  */
+  0:      '',                    /* Z_OK              0  */
+  '-1':   'file error',          /* Z_ERRNO         (-1) */
+  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
+  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
+  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
+  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
+  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
+};
+
+},{}],37:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+/* eslint-disable space-unary-ops */
+
+var utils = require('../utils/common');
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+//var Z_FILTERED          = 1;
+//var Z_HUFFMAN_ONLY      = 2;
+//var Z_RLE               = 3;
+var Z_FIXED               = 4;
+//var Z_DEFAULT_STRATEGY  = 0;
+
+/* Possible values of the data_type field (though see inflate()) */
+var Z_BINARY              = 0;
+var Z_TEXT                = 1;
+//var Z_ASCII             = 1; // = Z_TEXT
+var Z_UNKNOWN             = 2;
+
+/*============================================================================*/
+
+
+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
+
+// From zutil.h
+
+var STORED_BLOCK = 0;
+var STATIC_TREES = 1;
+var DYN_TREES    = 2;
+/* The three kinds of block type */
+
+var MIN_MATCH    = 3;
+var MAX_MATCH    = 258;
+/* The minimum and maximum match lengths */
+
+// From deflate.h
+/* ===========================================================================
+ * Internal compression state.
  */
-function mergeAll(concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return this.lift(new MergeAllOperator(concurrent));
+
+var LENGTH_CODES  = 29;
+/* number of length codes, not counting the special END_BLOCK code */
+
+var LITERALS      = 256;
+/* number of literal bytes 0..255 */
+
+var L_CODES       = LITERALS + 1 + LENGTH_CODES;
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+var D_CODES       = 30;
+/* number of distance codes */
+
+var BL_CODES      = 19;
+/* number of codes used to transfer the bit lengths */
+
+var HEAP_SIZE     = 2 * L_CODES + 1;
+/* maximum heap size */
+
+var MAX_BITS      = 15;
+/* All codes must not exceed MAX_BITS bits */
+
+var Buf_size      = 16;
+/* size of bit buffer in bi_buf */
+
+
+/* ===========================================================================
+ * Constants
+ */
+
+var MAX_BL_BITS = 7;
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+var END_BLOCK   = 256;
+/* end of block literal code */
+
+var REP_3_6     = 16;
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+var REPZ_3_10   = 17;
+/* repeat a zero length 3-10 times  (3 bits of repeat count) */
+
+var REPZ_11_138 = 18;
+/* repeat a zero length 11-138 times  (7 bits of repeat count) */
+
+/* eslint-disable comma-spacing,array-bracket-spacing */
+var extra_lbits =   /* extra bits for each length code */
+  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
+
+var extra_dbits =   /* extra bits for each distance code */
+  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
+
+var extra_blbits =  /* extra bits for each bit length code */
+  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
+
+var bl_order =
+  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
+/* eslint-enable comma-spacing,array-bracket-spacing */
+
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+// We pre-fill arrays with 0 to avoid uninitialized gaps
+
+var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
+
+// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
+var static_ltree  = new Array((L_CODES + 2) * 2);
+zero(static_ltree);
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+var static_dtree  = new Array(D_CODES * 2);
+zero(static_dtree);
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+var _dist_code    = new Array(DIST_CODE_LEN);
+zero(_dist_code);
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
+zero(_length_code);
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+var base_length   = new Array(LENGTH_CODES);
+zero(base_length);
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+var base_dist     = new Array(D_CODES);
+zero(base_dist);
+/* First normalized distance for each code (0 = distance of 1) */
+
+
+function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
+
+  this.static_tree  = static_tree;  /* static tree or NULL */
+  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
+  this.extra_base   = extra_base;   /* base index for extra_bits */
+  this.elems        = elems;        /* max number of elements in the tree */
+  this.max_length   = max_length;   /* max bit length for the codes */
+
+  // show if `static_tree` has data or dummy - needed for monomorphic objects
+  this.has_stree    = static_tree && static_tree.length;
 }
-exports.mergeAll = mergeAll;
-var MergeAllOperator = (function () {
-    function MergeAllOperator(concurrent) {
-        this.concurrent = concurrent;
-    }
-    MergeAllOperator.prototype.call = function (observer, source) {
-        return source._subscribe(new MergeAllSubscriber(observer, this.concurrent));
-    };
-    return MergeAllOperator;
-}());
-exports.MergeAllOperator = MergeAllOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+var static_l_desc;
+var static_d_desc;
+var static_bl_desc;
+
+
+function TreeDesc(dyn_tree, stat_desc) {
+  this.dyn_tree = dyn_tree;     /* the dynamic tree */
+  this.max_code = 0;            /* largest code with non zero frequency */
+  this.stat_desc = stat_desc;   /* the corresponding static tree */
+}
+
+
+
+function d_code(dist) {
+  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
+}
+
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
  */
-var MergeAllSubscriber = (function (_super) {
-    __extends(MergeAllSubscriber, _super);
-    function MergeAllSubscriber(destination, concurrent) {
-        _super.call(this, destination);
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-    }
-    MergeAllSubscriber.prototype._next = function (observable) {
-        if (this.active < this.concurrent) {
-            this.active++;
-            this.add(subscribeToResult_1.subscribeToResult(this, observable));
-        }
-        else {
-            this.buffer.push(observable);
-        }
-    };
-    MergeAllSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeAllSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeAllSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeAllSubscriber = MergeAllSubscriber;
+function put_short(s, w) {
+//    put_byte(s, (uch)((w) & 0xff));
+//    put_byte(s, (uch)((ush)(w) >> 8));
+  s.pending_buf[s.pending++] = (w) & 0xff;
+  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
+}
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],116:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link mergeAll}.</span>
- *
- * <img src="./img/mergeMap.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger.
- *
- * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>
- * var letters = Rx.Observable.of('a', 'b', 'c');
- * var result = letters.mergeMap(x =>
- *   Rx.Observable.interval(1000).map(i => x+i)
- * );
- * result.subscribe(x => console.log(x));
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link merge}
- * @see {@link mergeAll}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switchMap}
- *
- * @param {function(value: T, ?index: number): Observable} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
- * A function to produce the value on the output Observable based on the values
- * and the indices of the source (outer) emission and the inner Observable
- * emission. The arguments passed to this function are:
- * - `outerValue`: the value that came from the source
- * - `innerValue`: the value that came from the projected Observable
- * - `outerIndex`: the "index" of the value that came from the source
- * - `innerIndex`: the "index" of the value from the projected Observable
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional `resultSelector`) to each item emitted
- * by the source Observable and merging the results of the Observables obtained
- * from this transformation.
- * @method mergeMap
- * @owner Observable
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
  */
-function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-        resultSelector = null;
-    }
-    return this.lift(new MergeMapOperator(project, resultSelector, concurrent));
+function send_bits(s, value, length) {
+  if (s.bi_valid > (Buf_size - length)) {
+    s.bi_buf |= (value << s.bi_valid) & 0xffff;
+    put_short(s, s.bi_buf);
+    s.bi_buf = value >> (Buf_size - s.bi_valid);
+    s.bi_valid += length - Buf_size;
+  } else {
+    s.bi_buf |= (value << s.bi_valid) & 0xffff;
+    s.bi_valid += length;
+  }
 }
-exports.mergeMap = mergeMap;
-var MergeMapOperator = (function () {
-    function MergeMapOperator(project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source._subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-exports.MergeMapOperator = MergeMapOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+function send_code(s, c, tree) {
+  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
+}
+
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
  */
-var MergeMapSubscriber = (function (_super) {
-    __extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        _super.call(this, destination);
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-        this.index = 0;
-    }
-    MergeMapSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeMapSubscriber.prototype._tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    };
-    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-        this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (this.resultSelector) {
-            this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        else {
-            this.destination.next(innerValue);
-        }
-    };
-    MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {
-        var result;
-        try {
-            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeMapSubscriber = MergeMapSubscriber;
+function bi_reverse(code, len) {
+  var res = 0;
+  do {
+    res |= code & 1;
+    code >>>= 1;
+    res <<= 1;
+  } while (--len > 0);
+  return res >>> 1;
+}
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],117:[function(require,module,exports){
-"use strict";
-var MulticastObservable_1 = require('../observable/MulticastObservable');
-var ConnectableObservable_1 = require('../observable/ConnectableObservable');
-/**
- * Returns an Observable that emits the results of invoking a specified selector on items
- * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.
- *
- * <img src="./img/multicast.png" width="100%">
- *
- * @param {Function|Subject} Factory function to create an intermediate subject through
- * which the source sequence's elements will be multicast to the selector function
- * or Subject to push source elements into.
- * @param {Function} Optional selector function that can use the multicasted source stream
- * as many times as needed, without causing multiple subscriptions to the source stream.
- * Subscribers to the given source will receive all notifications of the source from the
- * time of the subscription forward.
- * @return {Observable} an Observable that emits the results of invoking the selector
- * on the items emitted by a `ConnectableObservable` that shares a single subscription to
- * the underlying stream.
- * @method multicast
- * @owner Observable
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
  */
-function multicast(subjectOrSubjectFactory, selector) {
-    var subjectFactory;
-    if (typeof subjectOrSubjectFactory === 'function') {
-        subjectFactory = subjectOrSubjectFactory;
+function bi_flush(s) {
+  if (s.bi_valid === 16) {
+    put_short(s, s.bi_buf);
+    s.bi_buf = 0;
+    s.bi_valid = 0;
+
+  } else if (s.bi_valid >= 8) {
+    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
+    s.bi_buf >>= 8;
+    s.bi_valid -= 8;
+  }
+}
+
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ *    above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ *     array bl_count contains the frequencies for each bit length.
+ *     The length opt_len is updated; static_len is also updated if stree is
+ *     not null.
+ */
+function gen_bitlen(s, desc)
+//    deflate_state *s;
+//    tree_desc *desc;    /* the tree descriptor */
+{
+  var tree            = desc.dyn_tree;
+  var max_code        = desc.max_code;
+  var stree           = desc.stat_desc.static_tree;
+  var has_stree       = desc.stat_desc.has_stree;
+  var extra           = desc.stat_desc.extra_bits;
+  var base            = desc.stat_desc.extra_base;
+  var max_length      = desc.stat_desc.max_length;
+  var h;              /* heap index */
+  var n, m;           /* iterate over the tree elements */
+  var bits;           /* bit length */
+  var xbits;          /* extra bits */
+  var f;              /* frequency */
+  var overflow = 0;   /* number of elements with bit length too large */
+
+  for (bits = 0; bits <= MAX_BITS; bits++) {
+    s.bl_count[bits] = 0;
+  }
+
+  /* In a first pass, compute the optimal bit lengths (which may
+   * overflow in the case of the bit length tree).
+   */
+  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
+
+  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
+    n = s.heap[h];
+    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
+    if (bits > max_length) {
+      bits = max_length;
+      overflow++;
     }
-    else {
-        subjectFactory = function subjectFactory() {
-            return subjectOrSubjectFactory;
-        };
+    tree[n * 2 + 1]/*.Len*/ = bits;
+    /* We overwrite tree[n].Dad which is no longer needed */
+
+    if (n > max_code) { continue; } /* not a leaf node */
+
+    s.bl_count[bits]++;
+    xbits = 0;
+    if (n >= base) {
+      xbits = extra[n - base];
     }
-    return !selector ?
-        new ConnectableObservable_1.ConnectableObservable(this, subjectFactory) :
-        new MulticastObservable_1.MulticastObservable(this, subjectFactory, selector);
+    f = tree[n * 2]/*.Freq*/;
+    s.opt_len += f * (bits + xbits);
+    if (has_stree) {
+      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
+    }
+  }
+  if (overflow === 0) { return; }
+
+  // Trace((stderr,"\nbit length overflow\n"));
+  /* This happens for example on obj2 and pic of the Calgary corpus */
+
+  /* Find the first bit length which could increase: */
+  do {
+    bits = max_length - 1;
+    while (s.bl_count[bits] === 0) { bits--; }
+    s.bl_count[bits]--;      /* move one leaf down the tree */
+    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
+    s.bl_count[max_length]--;
+    /* The brother of the overflow item also moves one step up,
+     * but this does not affect bl_count[max_length]
+     */
+    overflow -= 2;
+  } while (overflow > 0);
+
+  /* Now recompute all bit lengths, scanning in increasing frequency.
+   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+   * lengths instead of fixing only the wrong ones. This idea is taken
+   * from 'ar' written by Haruhiko Okumura.)
+   */
+  for (bits = max_length; bits !== 0; bits--) {
+    n = s.bl_count[bits];
+    while (n !== 0) {
+      m = s.heap[--h];
+      if (m > max_code) { continue; }
+      if (tree[m * 2 + 1]/*.Len*/ !== bits) {
+        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
+        tree[m * 2 + 1]/*.Len*/ = bits;
+      }
+      n--;
+    }
+  }
 }
-exports.multicast = multicast;
 
-},{"../observable/ConnectableObservable":80,"../observable/MulticastObservable":87}],118:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var Notification_1 = require('../Notification');
-/**
- * @see {@link Notification}
- *
- * @param scheduler
- * @param delay
- * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}
- * @method observeOn
- * @owner Observable
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ *     zero code length.
  */
-function observeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return this.lift(new ObserveOnOperator(scheduler, delay));
+function gen_codes(tree, max_code, bl_count)
+//    ct_data *tree;             /* the tree to decorate */
+//    int max_code;              /* largest code with non zero frequency */
+//    ushf *bl_count;            /* number of codes at each bit length */
+{
+  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
+  var code = 0;              /* running code value */
+  var bits;                  /* bit index */
+  var n;                     /* code index */
+
+  /* The distribution counts are first used to generate the code values
+   * without bit reversal.
+   */
+  for (bits = 1; bits <= MAX_BITS; bits++) {
+    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
+  }
+  /* Check that the bit counts in bl_count are consistent. The last code
+   * must be all ones.
+   */
+  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+  //        "inconsistent bit counts");
+  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+  for (n = 0;  n <= max_code; n++) {
+    var len = tree[n * 2 + 1]/*.Len*/;
+    if (len === 0) { continue; }
+    /* Now reverse the bits */
+    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
+
+    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+  }
 }
-exports.observeOn = observeOn;
-var ObserveOnOperator = (function () {
-    function ObserveOnOperator(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    };
-    return ObserveOnOperator;
-}());
-exports.ObserveOnOperator = ObserveOnOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ObserveOnSubscriber = (function (_super) {
-    __extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        _super.call(this, destination);
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination;
-        notification.observe(destination);
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification_1.Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification_1.Notification.createError(err));
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification_1.Notification.createComplete());
-    };
-    return ObserveOnSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ObserveOnSubscriber = ObserveOnSubscriber;
-var ObserveOnMessage = (function () {
-    function ObserveOnMessage(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-    return ObserveOnMessage;
-}());
-exports.ObserveOnMessage = ObserveOnMessage;
 
-},{"../Notification":27,"../Subscriber":35}],119:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Groups pairs of consecutive emissions together and emits them as an array of
- * two values.
- *
- * <span class="informal">Puts the current value and previous value together as
- * an array, and emits that.</span>
- *
- * <img src="./img/pairwise.png" width="100%">
- *
- * The Nth emission from the source Observable will cause the output Observable
- * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
- * pair. For this reason, `pairwise` emits on the second and subsequent
- * emissions from the source Observable, but not on the first emission, because
- * there is no previous value in that case.
- *
- * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var pairs = clicks.pairwise();
- * var distance = pairs.map(pair => {
- *   var x0 = pair[0].clientX;
- *   var y0 = pair[0].clientY;
- *   var x1 = pair[1].clientX;
- *   var y1 = pair[1].clientY;
- *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
- * });
- * distance.subscribe(x => console.log(x));
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- *
- * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of
- * consecutive values from the source Observable.
- * @method pairwise
- * @owner Observable
- */
-function pairwise() {
-    return this.lift(new PairwiseOperator());
-}
-exports.pairwise = pairwise;
-var PairwiseOperator = (function () {
-    function PairwiseOperator() {
-    }
-    PairwiseOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new PairwiseSubscriber(subscriber));
-    };
-    return PairwiseOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
  */
-var PairwiseSubscriber = (function (_super) {
-    __extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        _super.call(this, destination);
-        this.hasPrev = false;
+function tr_static_init() {
+  var n;        /* iterates over tree elements */
+  var bits;     /* bit counter */
+  var length;   /* length value */
+  var code;     /* code value */
+  var dist;     /* distance index */
+  var bl_count = new Array(MAX_BITS + 1);
+  /* number of codes at each bit length for an optimal tree */
+
+  // do check in _tr_init()
+  //if (static_init_done) return;
+
+  /* For some embedded targets, global variables are not initialized: */
+/*#ifdef NO_INIT_GLOBAL_POINTERS
+  static_l_desc.static_tree = static_ltree;
+  static_l_desc.extra_bits = extra_lbits;
+  static_d_desc.static_tree = static_dtree;
+  static_d_desc.extra_bits = extra_dbits;
+  static_bl_desc.extra_bits = extra_blbits;
+#endif*/
+
+  /* Initialize the mapping length (0..255) -> length code (0..28) */
+  length = 0;
+  for (code = 0; code < LENGTH_CODES - 1; code++) {
+    base_length[code] = length;
+    for (n = 0; n < (1 << extra_lbits[code]); n++) {
+      _length_code[length++] = code;
     }
-    PairwiseSubscriber.prototype._next = function (value) {
-        if (this.hasPrev) {
-            this.destination.next([this.prev, value]);
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-    };
-    return PairwiseSubscriber;
-}(Subscriber_1.Subscriber));
+  }
+  //Assert (length == 256, "tr_static_init: length != 256");
+  /* Note that the length 255 (match length 258) can be represented
+   * in two different ways: code 284 + 5 bits or code 285, so we
+   * overwrite length_code[255] to use the best encoding:
+   */
+  _length_code[length - 1] = code;
 
-},{"../Subscriber":35}],120:[function(require,module,exports){
-"use strict";
-var map_1 = require('./map');
-/**
- * Maps each source value (an object) to its specified nested property.
- *
- * <span class="informal">Like {@link map}, but meant only for picking one of
- * the nested properties of every emitted object.</span>
- *
- * <img src="./img/pluck.png" width="100%">
- *
- * Given a list of strings describing a path to an object property, retrieves
- * the value of a specified nested property from all values in the source
- * Observable. If a property can't be resolved, it will return `undefined` for
- * that value.
- *
- * @example <caption>Map every every click to the tagName of the clicked target element</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var tagNames = clicks.pluck('target', 'tagName');
- * tagNames.subscribe(x => console.log(x));
- *
- * @see {@link map}
- *
- * @param {...string} properties The nested properties to pluck from each source
- * value (an object).
- * @return {Observable} Returns a new Observable of property values from the
- * source values.
- * @method pluck
- * @owner Observable
- */
-function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i - 0] = arguments[_i];
+  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+  dist = 0;
+  for (code = 0; code < 16; code++) {
+    base_dist[code] = dist;
+    for (n = 0; n < (1 << extra_dbits[code]); n++) {
+      _dist_code[dist++] = code;
     }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
+  }
+  //Assert (dist == 256, "tr_static_init: dist != 256");
+  dist >>= 7; /* from now on, all distances are divided by 128 */
+  for (; code < D_CODES; code++) {
+    base_dist[code] = dist << 7;
+    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
+      _dist_code[256 + dist++] = code;
     }
-    return map_1.map.call(this, plucker(properties, length));
-}
-exports.pluck = pluck;
-function plucker(props, length) {
-    var mapper = function (x) {
-        var currentProp = x;
-        for (var i = 0; i < length; i++) {
-            var p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
+  }
+  //Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+  /* Construct the codes of the static literal tree */
+  for (bits = 0; bits <= MAX_BITS; bits++) {
+    bl_count[bits] = 0;
+  }
+
+  n = 0;
+  while (n <= 143) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 8;
+    n++;
+    bl_count[8]++;
+  }
+  while (n <= 255) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 9;
+    n++;
+    bl_count[9]++;
+  }
+  while (n <= 279) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 7;
+    n++;
+    bl_count[7]++;
+  }
+  while (n <= 287) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 8;
+    n++;
+    bl_count[8]++;
+  }
+  /* Codes 286 and 287 do not exist, but we must include them in the
+   * tree construction to get a canonical Huffman tree (longest code
+   * all ones)
+   */
+  gen_codes(static_ltree, L_CODES + 1, bl_count);
+
+  /* The static distance tree is trivial: */
+  for (n = 0; n < D_CODES; n++) {
+    static_dtree[n * 2 + 1]/*.Len*/ = 5;
+    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
+  }
+
+  // Now data ready and we can init static trees
+  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
+  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
+  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
+
+  //static_init_done = true;
 }
 
-},{"./map":113}],121:[function(require,module,exports){
-"use strict";
-var Subject_1 = require('../Subject');
-var multicast_1 = require('./multicast');
-/**
- * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
- * before it begins emitting items to those Observers that have subscribed to it.
- *
- * <img src="./img/publish.png" width="100%">
- *
- * @param {Function} Optional selector function which can use the multicasted source sequence as many times as needed,
- * without causing multiple subscriptions to the source sequence.
- * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
- * @return a ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.
- * @method publish
- * @owner Observable
+
+/* ===========================================================================
+ * Initialize a new block.
  */
-function publish(selector) {
-    return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast.call(this, new Subject_1.Subject());
+function init_block(s) {
+  var n; /* iterates over tree elements */
+
+  /* Initialize the trees. */
+  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
+  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
+  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
+
+  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
+  s.opt_len = s.static_len = 0;
+  s.last_lit = s.matches = 0;
 }
-exports.publish = publish;
 
-},{"../Subject":33,"./multicast":117}],122:[function(require,module,exports){
-"use strict";
-var ReplaySubject_1 = require('../ReplaySubject');
-var multicast_1 = require('./multicast');
-/**
- * @param bufferSize
- * @param windowTime
- * @param scheduler
- * @return {ConnectableObservable<T>}
- * @method publishReplay
- * @owner Observable
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
  */
-function publishReplay(bufferSize, windowTime, scheduler) {
-    if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-    if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-    return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler));
+function bi_windup(s)
+{
+  if (s.bi_valid > 8) {
+    put_short(s, s.bi_buf);
+  } else if (s.bi_valid > 0) {
+    //put_byte(s, (Byte)s->bi_buf);
+    s.pending_buf[s.pending++] = s.bi_buf;
+  }
+  s.bi_buf = 0;
+  s.bi_valid = 0;
 }
-exports.publishReplay = publishReplay;
 
-},{"../ReplaySubject":31,"./multicast":117}],123:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Applies an accumulator function over the source Observable, and returns each
- * intermediate result, with an optional seed value.
- *
- * <span class="informal">It's like {@link reduce}, but emits the current
- * accumulation whenever the source emits a value.</span>
- *
- * <img src="./img/scan.png" width="100%">
- *
- * Combines together all values emitted on the source, using an accumulator
- * function that knows how to join a new source value into the accumulation from
- * the past. Is similar to {@link reduce}, but emits the intermediate
- * accumulations.
- *
- * Returns an Observable that applies a specified `accumulator` function to each
- * item emitted by the source Observable. If a `seed` value is specified, then
- * that value will be used as the initial value for the accumulator. If no seed
- * value is specified, the first item of the source is used as the seed.
- *
- * @example <caption>Count the number of click events</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var ones = clicks.mapTo(1);
- * var seed = 0;
- * var count = ones.scan((acc, one) => acc + one, seed);
- * count.subscribe(x => console.log(x));
- *
- * @see {@link expand}
- * @see {@link mergeScan}
- * @see {@link reduce}
- *
- * @param {function(acc: R, value: T, index: number): R} accumulator
- * The accumulator function called on each source value.
- * @param {T|R} [seed] The initial accumulation value.
- * @return {Observable<R>} An observable of the accumulated values.
- * @method scan
- * @owner Observable
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
  */
-function scan(accumulator, seed) {
-    return this.lift(new ScanOperator(accumulator, seed));
+function copy_block(s, buf, len, header)
+//DeflateState *s;
+//charf    *buf;    /* the input data */
+//unsigned len;     /* its length */
+//int      header;  /* true if block header must be written */
+{
+  bi_windup(s);        /* align on byte boundary */
+
+  if (header) {
+    put_short(s, len);
+    put_short(s, ~len);
+  }
+//  while (len--) {
+//    put_byte(s, *buf++);
+//  }
+  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
+  s.pending += len;
 }
-exports.scan = scan;
-var ScanOperator = (function () {
-    function ScanOperator(accumulator, seed) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-    }
-    ScanOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed));
-    };
-    return ScanOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ScanSubscriber = (function (_super) {
-    __extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, seed) {
-        _super.call(this, destination);
-        this.accumulator = accumulator;
-        this.index = 0;
-        this.accumulatorSet = false;
-        this.seed = seed;
-        this.accumulatorSet = typeof seed !== 'undefined';
-    }
-    Object.defineProperty(ScanSubscriber.prototype, "seed", {
-        get: function () {
-            return this._seed;
-        },
-        set: function (value) {
-            this.accumulatorSet = true;
-            this._seed = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ScanSubscriber.prototype._next = function (value) {
-        if (!this.accumulatorSet) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    };
-    ScanSubscriber.prototype._tryNext = function (value) {
-        var index = this.index++;
-        var result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    };
-    return ScanSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":35}],124:[function(require,module,exports){
-"use strict";
-var multicast_1 = require('./multicast');
-var Subject_1 = require('../Subject');
-function shareSubjectFactory() {
-    return new Subject_1.Subject();
-}
-/**
- * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
- * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
- * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
- * This is an alias for .publish().refCount().
- *
- * <img src="./img/share.png" width="100%">
- *
- * @return {Observable<T>} an Observable that upon connection causes the source Observable to emit items to its Observers
- * @method share
- * @owner Observable
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
  */
-function share() {
-    return multicast_1.multicast.call(this, shareSubjectFactory).refCount();
+function smaller(tree, n, m, depth) {
+  var _n2 = n * 2;
+  var _m2 = m * 2;
+  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
+         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
+}
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+function pqdownheap(s, tree, k)
+//    deflate_state *s;
+//    ct_data *tree;  /* the tree to restore */
+//    int k;               /* node to move down */
+{
+  var v = s.heap[k];
+  var j = k << 1;  /* left son of k */
+  while (j <= s.heap_len) {
+    /* Set j to the smallest of the two sons: */
+    if (j < s.heap_len &&
+      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
+      j++;
+    }
+    /* Exit if v is smaller than both sons */
+    if (smaller(tree, v, s.heap[j], s.depth)) { break; }
+
+    /* Exchange v with the smallest son */
+    s.heap[k] = s.heap[j];
+    k = j;
+
+    /* And continue down the tree, setting j to the left son of k */
+    j <<= 1;
+  }
+  s.heap[k] = v;
 }
-exports.share = share;
-;
 
-},{"../Subject":33,"./multicast":117}],125:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Returns an Observable that skips `n` items emitted by an Observable.
- *
- * <img src="./img/skip.png" width="100%">
- *
- * @param {Number} the `n` of times, items emitted by source Observable should be skipped.
- * @return {Observable} an Observable that skips values emitted by the source Observable.
- *
- * @method skip
- * @owner Observable
+
+// inlined manually
+// var SMALLEST = 1;
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
  */
-function skip(total) {
-    return this.lift(new SkipOperator(total));
+function compress_block(s, ltree, dtree)
+//    deflate_state *s;
+//    const ct_data *ltree; /* literal tree */
+//    const ct_data *dtree; /* distance tree */
+{
+  var dist;           /* distance of matched string */
+  var lc;             /* match length or unmatched char (if dist == 0) */
+  var lx = 0;         /* running index in l_buf */
+  var code;           /* the code to send */
+  var extra;          /* number of extra bits to send */
+
+  if (s.last_lit !== 0) {
+    do {
+      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
+      lc = s.pending_buf[s.l_buf + lx];
+      lx++;
+
+      if (dist === 0) {
+        send_code(s, lc, ltree); /* send a literal byte */
+        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+      } else {
+        /* Here, lc is the match length - MIN_MATCH */
+        code = _length_code[lc];
+        send_code(s, code + LITERALS + 1, ltree); /* send the length code */
+        extra = extra_lbits[code];
+        if (extra !== 0) {
+          lc -= base_length[code];
+          send_bits(s, lc, extra);       /* send the extra length bits */
+        }
+        dist--; /* dist is now the match distance - 1 */
+        code = d_code(dist);
+        //Assert (code < D_CODES, "bad d_code");
+
+        send_code(s, code, dtree);       /* send the distance code */
+        extra = extra_dbits[code];
+        if (extra !== 0) {
+          dist -= base_dist[code];
+          send_bits(s, dist, extra);   /* send the extra distance bits */
+        }
+      } /* literal or match pair ? */
+
+      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+      //       "pendingBuf overflow");
+
+    } while (lx < s.last_lit);
+  }
+
+  send_code(s, END_BLOCK, ltree);
 }
-exports.skip = skip;
-var SkipOperator = (function () {
-    function SkipOperator(total) {
-        this.total = total;
-    }
-    SkipOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new SkipSubscriber(subscriber, this.total));
-    };
-    return SkipOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ *     and corresponding code. The length opt_len is updated; static_len is
+ *     also updated if stree is not null. The field max_code is set.
  */
-var SkipSubscriber = (function (_super) {
-    __extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        _super.call(this, destination);
-        this.total = total;
-        this.count = 0;
+function build_tree(s, desc)
+//    deflate_state *s;
+//    tree_desc *desc; /* the tree descriptor */
+{
+  var tree     = desc.dyn_tree;
+  var stree    = desc.stat_desc.static_tree;
+  var has_stree = desc.stat_desc.has_stree;
+  var elems    = desc.stat_desc.elems;
+  var n, m;          /* iterate over heap elements */
+  var max_code = -1; /* largest code with non zero frequency */
+  var node;          /* new node being created */
+
+  /* Construct the initial heap, with least frequent element in
+   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+   * heap[0] is not used.
+   */
+  s.heap_len = 0;
+  s.heap_max = HEAP_SIZE;
+
+  for (n = 0; n < elems; n++) {
+    if (tree[n * 2]/*.Freq*/ !== 0) {
+      s.heap[++s.heap_len] = max_code = n;
+      s.depth[n] = 0;
+
+    } else {
+      tree[n * 2 + 1]/*.Len*/ = 0;
     }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber_1.Subscriber));
+  }
 
-},{"../Subscriber":35}],126:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
- *
- * <img src="./img/skipUntil.png" width="100%">
- *
- * @param {Observable} the second Observable that has to emit an item before the source Observable's elements begin to
- * be mirrored by the resulting Observable.
- * @return {Observable<T>} an Observable that skips items from the source Observable until the second Observable emits
- * an item, then emits the remaining items.
- * @method skipUntil
- * @owner Observable
- */
-function skipUntil(notifier) {
-    return this.lift(new SkipUntilOperator(notifier));
-}
-exports.skipUntil = skipUntil;
-var SkipUntilOperator = (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new SkipUntilSubscriber(subscriber, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SkipUntilSubscriber = (function (_super) {
-    __extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        _super.call(this, destination);
-        this.hasValue = false;
-        this.isInnerStopped = false;
-        this.add(subscribeToResult_1.subscribeToResult(this, notifier));
+  /* The pkzip format requires that at least one distance code exists,
+   * and that at least one bit should be sent even if there is only one
+   * possible code. So to avoid special checks later on we force at least
+   * two codes of non zero frequency.
+   */
+  while (s.heap_len < 2) {
+    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
+    tree[node * 2]/*.Freq*/ = 1;
+    s.depth[node] = 0;
+    s.opt_len--;
+
+    if (has_stree) {
+      s.static_len -= stree[node * 2 + 1]/*.Len*/;
     }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype._complete = function () {
-        if (this.isInnerStopped) {
-            _super.prototype._complete.call(this);
-        }
-        else {
-            this.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-        this.isInnerStopped = true;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+    /* node is 0 or 1 so it does not have extra bits */
+  }
+  desc.max_code = max_code;
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],127:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var ScalarObservable_1 = require('../observable/ScalarObservable');
-var EmptyObservable_1 = require('../observable/EmptyObservable');
-var concat_1 = require('./concat');
-var isScheduler_1 = require('../util/isScheduler');
-/**
- * Returns an Observable that emits the items in a specified Iterable before it begins to emit items emitted by the
- * source Observable.
- *
- * <img src="./img/startWith.png" width="100%">
- *
- * @param {Values} an Iterable that contains the items you want the modified Observable to emit first.
- * @return {Observable} an Observable that emits the items in the specified Iterable and then emits the items
- * emitted by the source Observable.
- * @method startWith
- * @owner Observable
+  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+   * establish sub-heaps of increasing lengths:
+   */
+  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
+
+  /* Construct the Huffman tree by repeatedly combining the least two
+   * frequent nodes.
+   */
+  node = elems;              /* next internal node of the tree */
+  do {
+    //pqremove(s, tree, n);  /* n = node of least frequency */
+    /*** pqremove ***/
+    n = s.heap[1/*SMALLEST*/];
+    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
+    pqdownheap(s, tree, 1/*SMALLEST*/);
+    /***/
+
+    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
+
+    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
+    s.heap[--s.heap_max] = m;
+
+    /* Create a new node father of n and m */
+    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
+    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
+    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
+
+    /* and insert the new node in the heap */
+    s.heap[1/*SMALLEST*/] = node++;
+    pqdownheap(s, tree, 1/*SMALLEST*/);
+
+  } while (s.heap_len >= 2);
+
+  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
+
+  /* At this point, the fields freq and dad are set. We can now
+   * generate the bit lengths.
+   */
+  gen_bitlen(s, desc);
+
+  /* The field len is now set, we can generate the bit codes */
+  gen_codes(tree, max_code, s.bl_count);
+}
+
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
  */
-function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i - 0] = arguments[_i];
-    }
-    var scheduler = array[array.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        array.pop();
-    }
-    else {
-        scheduler = null;
+function scan_tree(s, tree, max_code)
+//    deflate_state *s;
+//    ct_data *tree;   /* the tree to be scanned */
+//    int max_code;    /* and its largest code of non zero frequency */
+{
+  var n;                     /* iterates over all tree elements */
+  var prevlen = -1;          /* last emitted length */
+  var curlen;                /* length of current code */
+
+  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
+
+  var count = 0;             /* repeat count of the current code */
+  var max_count = 7;         /* max repeat count */
+  var min_count = 4;         /* min repeat count */
+
+  if (nextlen === 0) {
+    max_count = 138;
+    min_count = 3;
+  }
+  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
+
+  for (n = 0; n <= max_code; n++) {
+    curlen = nextlen;
+    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
+
+    if (++count < max_count && curlen === nextlen) {
+      continue;
+
+    } else if (count < min_count) {
+      s.bl_tree[curlen * 2]/*.Freq*/ += count;
+
+    } else if (curlen !== 0) {
+
+      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
+      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
+
+    } else if (count <= 10) {
+      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
+
+    } else {
+      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
     }
-    var len = array.length;
-    if (len === 1) {
-        return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this);
+
+    count = 0;
+    prevlen = curlen;
+
+    if (nextlen === 0) {
+      max_count = 138;
+      min_count = 3;
+
+    } else if (curlen === nextlen) {
+      max_count = 6;
+      min_count = 3;
+
+    } else {
+      max_count = 7;
+      min_count = 4;
     }
-    else if (len > 1) {
-        return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this);
+  }
+}
+
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+function send_tree(s, tree, max_code)
+//    deflate_state *s;
+//    ct_data *tree; /* the tree to be scanned */
+//    int max_code;       /* and its largest code of non zero frequency */
+{
+  var n;                     /* iterates over all tree elements */
+  var prevlen = -1;          /* last emitted length */
+  var curlen;                /* length of current code */
+
+  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
+
+  var count = 0;             /* repeat count of the current code */
+  var max_count = 7;         /* max repeat count */
+  var min_count = 4;         /* min repeat count */
+
+  /* tree[max_code+1].Len = -1; */  /* guard already set */
+  if (nextlen === 0) {
+    max_count = 138;
+    min_count = 3;
+  }
+
+  for (n = 0; n <= max_code; n++) {
+    curlen = nextlen;
+    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
+
+    if (++count < max_count && curlen === nextlen) {
+      continue;
+
+    } else if (count < min_count) {
+      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
+
+    } else if (curlen !== 0) {
+      if (curlen !== prevlen) {
+        send_code(s, curlen, s.bl_tree);
+        count--;
+      }
+      //Assert(count >= 3 && count <= 6, " 3_6?");
+      send_code(s, REP_3_6, s.bl_tree);
+      send_bits(s, count - 3, 2);
+
+    } else if (count <= 10) {
+      send_code(s, REPZ_3_10, s.bl_tree);
+      send_bits(s, count - 3, 3);
+
+    } else {
+      send_code(s, REPZ_11_138, s.bl_tree);
+      send_bits(s, count - 11, 7);
     }
-    else {
-        return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this);
+
+    count = 0;
+    prevlen = curlen;
+    if (nextlen === 0) {
+      max_count = 138;
+      min_count = 3;
+
+    } else if (curlen === nextlen) {
+      max_count = 6;
+      min_count = 3;
+
+    } else {
+      max_count = 7;
+      min_count = 4;
     }
+  }
 }
-exports.startWith = startWith;
 
-},{"../observable/ArrayObservable":79,"../observable/EmptyObservable":82,"../observable/ScalarObservable":89,"../util/isScheduler":152,"./concat":103}],128:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable, emitting values only from the most recently projected Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link switch}.</span>
- *
- * <img src="./img/switchMap.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an (so-called "inner") Observable. Each time it observes one of these
- * inner Observables, the output Observable begins emitting the items emitted by
- * that inner Observable. When a new inner Observable is emitted, `switchMap`
- * stops emitting items from the earlier-emitted inner Observable and begins
- * emitting items from the new one. It continues to behave like this for
- * subsequent inner Observables.
- *
- * @example <caption>Rerun an interval Observable on every click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));
- * result.subscribe(x => console.log(x));
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link mergeMap}
- * @see {@link switch}
- * @see {@link switchMapTo}
- *
- * @param {function(value: T, ?index: number): Observable} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
- * A function to produce the value on the output Observable based on the values
- * and the indices of the source (outer) emission and the inner Observable
- * emission. The arguments passed to this function are:
- * - `outerValue`: the value that came from the source
- * - `innerValue`: the value that came from the projected Observable
- * - `outerIndex`: the "index" of the value that came from the source
- * - `innerIndex`: the "index" of the value from the projected Observable
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional `resultSelector`) to each item emitted
- * by the source Observable and taking only the values from the most recently
- * projected inner Observable.
- * @method switchMap
- * @owner Observable
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
  */
-function switchMap(project, resultSelector) {
-    return this.lift(new SwitchMapOperator(project, resultSelector));
-}
-exports.switchMap = switchMap;
-var SwitchMapOperator = (function () {
-    function SwitchMapOperator(project, resultSelector) {
-        this.project = project;
-        this.resultSelector = resultSelector;
+function build_bl_tree(s) {
+  var max_blindex;  /* index of last bit length code of non zero freq */
+
+  /* Determine the bit length frequencies for literal and distance trees */
+  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
+  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
+
+  /* Build the bit length tree: */
+  build_tree(s, s.bl_desc);
+  /* opt_len now includes the length of the tree representations, except
+   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+   */
+
+  /* Determine the number of bit length codes to send. The pkzip format
+   * requires that at least 4 bit length codes be sent. (appnote.txt says
+   * 3 but the actual value used is 4.)
+   */
+  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
+    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
+      break;
     }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector));
-    };
-    return SwitchMapOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+  }
+  /* Update opt_len to include the bit length tree and counts */
+  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
+  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+  //        s->opt_len, s->static_len));
+
+  return max_blindex;
+}
+
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
  */
-var SwitchMapSubscriber = (function (_super) {
-    __extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project, resultSelector) {
-        _super.call(this, destination);
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.index = 0;
-    }
-    SwitchMapSubscriber.prototype._next = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    };
-    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (this.resultSelector) {
-            this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        else {
-            this.destination.next(innerValue);
-        }
-    };
-    SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        var result;
-        try {
-            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+function send_all_trees(s, lcodes, dcodes, blcodes)
+//    deflate_state *s;
+//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+  var rank;                    /* index in bl_order */
+
+  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+  //        "too many codes");
+  //Tracev((stderr, "\nbl counts: "));
+  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
+  send_bits(s, dcodes - 1,   5);
+  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
+  for (rank = 0; rank < blcodes; rank++) {
+    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
+  }
+  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],129:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError');
-var EmptyObservable_1 = require('../observable/EmptyObservable');
-/**
- * Emits only the first `count` values emitted by the source Observable.
- *
- * <span class="informal">Takes the first `count` values from the source, then
- * completes.</span>
- *
- * <img src="./img/take.png" width="100%">
- *
- * `take` returns an Observable that emits only the first `count` values emitted
- * by the source Observable. If the source emits fewer than `count` values then
- * all of its values are emitted. After that, it completes, regardless if the
- * source completes.
- *
- * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>
- * var interval = Rx.Observable.interval(1000);
- * var five = interval.take(5);
- * five.subscribe(x => console.log(x));
- *
- * @see {@link takeLast}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of `next` values to emit.
- * @return {Observable<T>} An Observable that emits only the first `count`
- * values emitted by the source Observable, or all of the values from the source
- * if the source emits fewer than `count` values.
- * @method take
- * @owner Observable
+  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
+  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
+  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ *    a) There are no non-portable control characters belonging to the
+ *       "black list" (0..6, 14..25, 28..31).
+ *    b) There is at least one printable character belonging to the
+ *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ *   "gray list" that is ignored in this detection algorithm:
+ *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
  */
-function take(count) {
-    if (count === 0) {
-        return new EmptyObservable_1.EmptyObservable();
+function detect_data_type(s) {
+  /* black_mask is the bit mask of black-listed bytes
+   * set bits 0..6, 14..25, and 28..31
+   * 0xf3ffc07f = binary 11110011111111111100000001111111
+   */
+  var black_mask = 0xf3ffc07f;
+  var n;
+
+  /* Check for non-textual ("black-listed") bytes. */
+  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
+    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
+      return Z_BINARY;
     }
-    else {
-        return this.lift(new TakeOperator(count));
+  }
+
+  /* Check for textual ("white-listed") bytes. */
+  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
+      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
+    return Z_TEXT;
+  }
+  for (n = 32; n < LITERALS; n++) {
+    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
+      return Z_TEXT;
     }
+  }
+
+  /* There are no "black-listed" or "white-listed" bytes:
+   * this stream either is empty or has tolerated ("gray-listed") bytes only.
+   */
+  return Z_BINARY;
 }
-exports.take = take;
-var TakeOperator = (function () {
-    function TakeOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new TakeSubscriber(subscriber, this.total));
-    };
-    return TakeOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var TakeSubscriber = (function (_super) {
-    __extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        _super.call(this, destination);
-        this.total = total;
-        this.count = 0;
-    }
-    TakeSubscriber.prototype._next = function (value) {
-        var total = this.total;
-        if (++this.count <= total) {
-            this.destination.next(value);
-            if (this.count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    };
-    return TakeSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":35,"../observable/EmptyObservable":82,"../util/ArgumentOutOfRangeError":143}],130:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Emits the values emitted by the source Observable until a `notifier`
- * Observable emits a value.
- *
- * <span class="informal">Lets values pass until a second Observable,
- * `notifier`, emits something. Then, it completes.</span>
- *
- * <img src="./img/takeUntil.png" width="100%">
- *
- * `takeUntil` subscribes and begins mirroring the source Observable. It also
- * monitors a second Observable, `notifier` that you provide. If the `notifier`
- * emits a value or a complete notification, the output Observable stops
- * mirroring the source Observable and completes.
- *
- * @example <caption>Tick every second until the first click happens</caption>
- * var interval = Rx.Observable.interval(1000);
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = interval.takeUntil(clicks);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link take}
- * @see {@link takeLast}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @param {Observable} notifier The Observable whose first emitted value will
- * cause the output Observable of `takeUntil` to stop emitting values from the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the values from the source
- * Observable until such time as `notifier` emits its first value.
- * @method takeUntil
- * @owner Observable
+
+var static_init_done = false;
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
  */
-function takeUntil(notifier) {
-    return this.lift(new TakeUntilOperator(notifier));
+function _tr_init(s)
+{
+
+  if (!static_init_done) {
+    tr_static_init();
+    static_init_done = true;
+  }
+
+  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
+  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
+  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
+
+  s.bi_buf = 0;
+  s.bi_valid = 0;
+
+  /* Initialize the first block of the first file: */
+  init_block(s);
 }
-exports.takeUntil = takeUntil;
-var TakeUntilOperator = (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new TakeUntilSubscriber(subscriber, this.notifier));
-    };
-    return TakeUntilOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var TakeUntilSubscriber = (function (_super) {
-    __extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination, notifier) {
-        _super.call(this, destination);
-        this.notifier = notifier;
-        this.add(subscribeToResult_1.subscribeToResult(this, notifier));
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-        // noop
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],131:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Combines the source Observable with other Observables to create an Observable
- * whose values are calculated from the latest values of each, only when the
- * source emits.
- *
- * <span class="informal">Whenever the source Observable emits a value, it
- * computes a formula using that value plus the latest values from other input
- * Observables, then emits the output of that formula.</span>
- *
- * <img src="./img/withLatestFrom.png" width="100%">
- *
- * `withLatestFrom` combines each value from the source Observable (the
- * instance) with the latest values from the other input Observables only when
- * the source emits a value, optionally using a `project` function to determine
- * the value to be emitted on the output Observable. All input Observables must
- * emit at least one value before the output Observable will emit a value.
- *
- * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var result = clicks.withLatestFrom(timer);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link combineLatest}
- *
- * @param {Observable} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Function} [project] Projection function for combining values
- * together. Receives all values in order of the Observables passed, where the
- * first parameter is a value from the source Observable. (e.g.
- * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not
- * passed, arrays will be emitted on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method withLatestFrom
- * @owner Observable
+
+/* ===========================================================================
+ * Send a stored block
  */
-function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i - 0] = arguments[_i];
-    }
-    var project;
-    if (typeof args[args.length - 1] === 'function') {
-        project = args.pop();
-    }
-    var observables = args;
-    return this.lift(new WithLatestFromOperator(observables, project));
+function _tr_stored_block(s, buf, stored_len, last)
+//DeflateState *s;
+//charf *buf;       /* input block */
+//ulg stored_len;   /* length of input block */
+//int last;         /* one if this is the last block for a file */
+{
+  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
+  copy_block(s, buf, stored_len, true); /* with header */
 }
-exports.withLatestFrom = withLatestFrom;
-/* tslint:enable:max-line-length */
-var WithLatestFromOperator = (function () {
-    function WithLatestFromOperator(observables, project) {
-        this.observables = observables;
-        this.project = project;
-    }
-    WithLatestFromOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    };
-    return WithLatestFromOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
  */
-var WithLatestFromSubscriber = (function (_super) {
-    __extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        _super.call(this, destination);
-        this.observables = observables;
-        this.project = project;
-        this.toRespond = [];
-        var len = observables.length;
-        this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            this.toRespond.push(i);
-        }
-        for (var i = 0; i < len; i++) {
-            var observable = observables[i];
-            this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
-        }
-    }
-    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        var toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            var found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype.notifyComplete = function () {
-        // noop
-    };
-    WithLatestFromSubscriber.prototype._next = function (value) {
-        if (this.toRespond.length === 0) {
-            var args = [value].concat(this.values);
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return WithLatestFromSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+function _tr_align(s) {
+  send_bits(s, STATIC_TREES << 1, 3);
+  send_code(s, END_BLOCK, static_ltree);
+  bi_flush(s);
+}
 
-},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],132:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var isArray_1 = require('../util/isArray');
-var Subscriber_1 = require('../Subscriber');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var iterator_1 = require('../symbol/iterator');
-/**
- * @param observables
- * @return {Observable<R>}
- * @method zip
- * @owner Observable
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
  */
-function zipProto() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    observables.unshift(this);
-    return zipStatic.apply(this, observables);
+function _tr_flush_block(s, buf, stored_len, last)
+//DeflateState *s;
+//charf *buf;       /* input block, or NULL if too old */
+//ulg stored_len;   /* length of input block */
+//int last;         /* one if this is the last block for a file */
+{
+  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
+  var max_blindex = 0;        /* index of last bit length code of non zero freq */
+
+  /* Build the Huffman trees unless a stored block is forced */
+  if (s.level > 0) {
+
+    /* Check if the file is binary or text */
+    if (s.strm.data_type === Z_UNKNOWN) {
+      s.strm.data_type = detect_data_type(s);
+    }
+
+    /* Construct the literal and distance trees */
+    build_tree(s, s.l_desc);
+    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+    //        s->static_len));
+
+    build_tree(s, s.d_desc);
+    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+    //        s->static_len));
+    /* At this point, opt_len and static_len are the total bit lengths of
+     * the compressed block data, excluding the tree representations.
+     */
+
+    /* Build the bit length tree for the above two trees, and get the index
+     * in bl_order of the last bit length code to send.
+     */
+    max_blindex = build_bl_tree(s);
+
+    /* Determine the best encoding. Compute the block lengths in bytes. */
+    opt_lenb = (s.opt_len + 3 + 7) >>> 3;
+    static_lenb = (s.static_len + 3 + 7) >>> 3;
+
+    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+    //        s->last_lit));
+
+    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
+
+  } else {
+    // Assert(buf != (char*)0, "lost buf");
+    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+  }
+
+  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
+    /* 4: two words for the lengths */
+
+    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+     * Otherwise we can't have processed more than WSIZE input bytes since
+     * the last block flush, because compression would have been
+     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+     * transform a block into a stored block.
+     */
+    _tr_stored_block(s, buf, stored_len, last);
+
+  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
+
+    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
+    compress_block(s, static_ltree, static_dtree);
+
+  } else {
+    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
+    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
+    compress_block(s, s.dyn_ltree, s.dyn_dtree);
+  }
+  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+  /* The above check is made mod 2^32, for files larger than 512 MB
+   * and uLong implemented on 32 bits.
+   */
+  init_block(s);
+
+  if (last) {
+    bi_windup(s);
+  }
+  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+  //       s->compressed_len-7*last));
 }
-exports.zipProto = zipProto;
-/* tslint:enable:max-line-length */
-/**
- * @param observables
- * @return {Observable<R>}
- * @static true
- * @name zip
- * @owner Observable
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
  */
-function zipStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+function _tr_tally(s, dist, lc)
+//    deflate_state *s;
+//    unsigned dist;  /* distance of matched string */
+//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+  //var out_length, in_length, dcode;
+
+  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
+  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
+
+  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
+  s.last_lit++;
+
+  if (dist === 0) {
+    /* lc is the unmatched char */
+    s.dyn_ltree[lc * 2]/*.Freq*/++;
+  } else {
+    s.matches++;
+    /* Here, lc is the match length - MIN_MATCH */
+    dist--;             /* dist = match distance - 1 */
+    //Assert((ush)dist < (ush)MAX_DIST(s) &&
+    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
+
+    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
+    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
+  }
+
+// (!) This block is disabled in zlib defaults,
+// don't enable it for binary compatibility
+
+//#ifdef TRUNCATE_BLOCK
+//  /* Try to guess if it is profitable to stop the current block here */
+//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
+//    /* Compute an upper bound for the compressed length */
+//    out_length = s.last_lit*8;
+//    in_length = s.strstart - s.block_start;
+//
+//    for (dcode = 0; dcode < D_CODES; dcode++) {
+//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
+//    }
+//    out_length >>>= 3;
+//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+//    //       s->last_lit, in_length, out_length,
+//    //       100L - out_length*100L/in_length));
+//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
+//      return true;
+//    }
+//  }
+//#endif
+
+  return (s.last_lit === s.lit_bufsize - 1);
+  /* We avoid equality with lit_bufsize because of wraparound at 64K
+   * on 16 bit machines and because stored blocks are restricted to
+   * 64K-1 bytes.
+   */
+}
+
+exports._tr_init  = _tr_init;
+exports._tr_stored_block = _tr_stored_block;
+exports._tr_flush_block  = _tr_flush_block;
+exports._tr_tally = _tr_tally;
+exports._tr_align = _tr_align;
+
+},{"../utils/common":26}],38:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+function ZStream() {
+  /* next input byte */
+  this.input = null; // JS specific, because we have no pointers
+  this.next_in = 0;
+  /* number of bytes available at input */
+  this.avail_in = 0;
+  /* total number of input bytes read so far */
+  this.total_in = 0;
+  /* next output byte should be put there */
+  this.output = null; // JS specific, because we have no pointers
+  this.next_out = 0;
+  /* remaining free space at output */
+  this.avail_out = 0;
+  /* total number of bytes output so far */
+  this.total_out = 0;
+  /* last error message, NULL if no error */
+  this.msg = ''/*Z_NULL*/;
+  /* not visible by applications */
+  this.state = null;
+  /* best guess about the data type: binary or text */
+  this.data_type = 2/*Z_UNKNOWN*/;
+  /* adler32 value of the uncompressed data */
+  this.adler = 0;
+}
+
+module.exports = ZStream;
+
+},{}],39:[function(require,module,exports){
+(function (process){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+  // if the path tries to go above the root, `up` ends up > 0
+  var up = 0;
+  for (var i = parts.length - 1; i >= 0; i--) {
+    var last = parts[i];
+    if (last === '.') {
+      parts.splice(i, 1);
+    } else if (last === '..') {
+      parts.splice(i, 1);
+      up++;
+    } else if (up) {
+      parts.splice(i, 1);
+      up--;
     }
-    var project = observables[observables.length - 1];
-    if (typeof project === 'function') {
-        observables.pop();
+  }
+
+  // if the path is allowed to go above the root, restore leading ..s
+  if (allowAboveRoot) {
+    for (; up--; up) {
+      parts.unshift('..');
     }
-    return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project));
+  }
+
+  return parts;
 }
-exports.zipStatic = zipStatic;
-var ZipOperator = (function () {
-    function ZipOperator(project) {
-        this.project = project;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source._subscribe(new ZipSubscriber(subscriber, this.project));
-    };
-    return ZipOperator;
-}());
-exports.ZipOperator = ZipOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ZipSubscriber = (function (_super) {
-    __extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, project, values) {
-        if (values === void 0) { values = Object.create(null); }
-        _super.call(this, destination);
-        this.index = 0;
-        this.iterators = [];
-        this.active = 0;
-        this.project = (typeof project === 'function') ? project : null;
-        this.values = values;
+
+// Split a filename into [root, dir, basename, ext], unix version
+// 'root' is just a slash, or nothing.
+var splitPathRe =
+    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+var splitPath = function(filename) {
+  return splitPathRe.exec(filename).slice(1);
+};
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+  var resolvedPath = '',
+      resolvedAbsolute = false;
+
+  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+    var path = (i >= 0) ? arguments[i] : process.cwd();
+
+    // Skip empty and invalid entries
+    if (typeof path !== 'string') {
+      throw new TypeError('Arguments to path.resolve must be strings');
+    } else if (!path) {
+      continue;
     }
-    ZipSubscriber.prototype._next = function (value) {
-        var iterators = this.iterators;
-        var index = this.index++;
-        if (isArray_1.isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[iterator_1.$$iterator] === 'function') {
-            iterators.push(new StaticIterator(value[iterator_1.$$iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value, index));
-        }
-    };
-    ZipSubscriber.prototype._complete = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        this.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                this.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--; // not an observable
-            }
-        }
-    };
-    ZipSubscriber.prototype.notifyInactive = function () {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ZipSubscriber.prototype.checkIterators = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        var destination = this.destination;
-        // abort if not all of them have values
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        var shouldComplete = false;
-        var args = [];
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            var result = iterator.next();
-            // check to see if it's completed now that you've gotten
-            // the next value.
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.project) {
-            this._tryProject(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return ZipSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ZipSubscriber = ZipSubscriber;
-var StaticIterator = (function () {
-    function StaticIterator(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
+
+    resolvedPath = path + '/' + resolvedPath;
+    resolvedAbsolute = path.charAt(0) === '/';
+  }
+
+  // At this point the path should be resolved to a full absolute path, but
+  // handle relative paths to be safe (might happen when process.cwd() fails)
+
+  // Normalize the path
+  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+    return !!p;
+  }), !resolvedAbsolute).join('/');
+
+  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+  var isAbsolute = exports.isAbsolute(path),
+      trailingSlash = substr(path, -1) === '/';
+
+  // Normalize the path
+  path = normalizeArray(filter(path.split('/'), function(p) {
+    return !!p;
+  }), !isAbsolute).join('/');
+
+  if (!path && !isAbsolute) {
+    path = '.';
+  }
+  if (path && trailingSlash) {
+    path += '/';
+  }
+
+  return (isAbsolute ? '/' : '') + path;
+};
+
+// posix version
+exports.isAbsolute = function(path) {
+  return path.charAt(0) === '/';
+};
+
+// posix version
+exports.join = function() {
+  var paths = Array.prototype.slice.call(arguments, 0);
+  return exports.normalize(filter(paths, function(p, index) {
+    if (typeof p !== 'string') {
+      throw new TypeError('Arguments to path.join must be strings');
     }
-    StaticIterator.prototype.hasValue = function () {
-        return true;
-    };
-    StaticIterator.prototype.next = function () {
-        var result = this.nextResult;
-        this.nextResult = this.iterator.next();
-        return result;
-    };
-    StaticIterator.prototype.hasCompleted = function () {
-        var nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    };
-    return StaticIterator;
-}());
-var StaticArrayIterator = (function () {
-    function StaticArrayIterator(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
+    return p;
+  }).join('/'));
+};
+
+
+// path.relative(from, to)
+// posix version
+exports.relative = function(from, to) {
+  from = exports.resolve(from).substr(1);
+  to = exports.resolve(to).substr(1);
+
+  function trim(arr) {
+    var start = 0;
+    for (; start < arr.length; start++) {
+      if (arr[start] !== '') break;
     }
-    StaticArrayIterator.prototype[iterator_1.$$iterator] = function () {
-        return this;
-    };
-    StaticArrayIterator.prototype.next = function (value) {
-        var i = this.index++;
-        var array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    };
-    StaticArrayIterator.prototype.hasValue = function () {
-        return this.array.length > this.index;
-    };
-    StaticArrayIterator.prototype.hasCompleted = function () {
-        return this.array.length === this.index;
-    };
-    return StaticArrayIterator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ZipBufferIterator = (function (_super) {
-    __extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable, index) {
-        _super.call(this, destination);
-        this.parent = parent;
-        this.observable = observable;
-        this.index = index;
-        this.stillUnsubscribed = true;
-        this.buffer = [];
-        this.isComplete = false;
+
+    var end = arr.length - 1;
+    for (; end >= 0; end--) {
+      if (arr[end] !== '') break;
     }
-    ZipBufferIterator.prototype[iterator_1.$$iterator] = function () {
-        return this;
-    };
-    // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next
-    //    this is legit because `next()` will never be called by a subscription in this case.
-    ZipBufferIterator.prototype.next = function () {
-        var buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    };
-    ZipBufferIterator.prototype.hasValue = function () {
-        return this.buffer.length > 0;
-    };
-    ZipBufferIterator.prototype.hasCompleted = function () {
-        return this.buffer.length === 0 && this.isComplete;
-    };
-    ZipBufferIterator.prototype.notifyComplete = function () {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    };
-    ZipBufferIterator.prototype.subscribe = function (value, index) {
-        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
-    };
-    return ZipBufferIterator;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":30,"../Subscriber":35,"../observable/ArrayObservable":79,"../symbol/iterator":140,"../util/isArray":148,"../util/subscribeToResult":154}],133:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscription_1 = require('../Subscription');
-/**
- * A unit of work to be executed in a {@link Scheduler}. An action is typically
- * created from within a Scheduler and an RxJS user does not need to concern
- * themselves about creating and manipulating an Action.
- *
- * ```ts
- * class Action<T> extends Subscription {
- *   new (scheduler: Scheduler, work: (state?: T) => void);
- *   schedule(state?: T, delay: number = 0): Subscription;
- * }
- * ```
- *
- * @class Action<T>
- */
-var Action = (function (_super) {
-    __extends(Action, _super);
-    function Action(scheduler, work) {
-        _super.call(this);
+    if (start > end) return [];
+    return arr.slice(start, end - start + 1);
+  }
+
+  var fromParts = trim(from.split('/'));
+  var toParts = trim(to.split('/'));
+
+  var length = Math.min(fromParts.length, toParts.length);
+  var samePartsLength = length;
+  for (var i = 0; i < length; i++) {
+    if (fromParts[i] !== toParts[i]) {
+      samePartsLength = i;
+      break;
     }
-    /**
-     * Schedules this action on its parent Scheduler for execution. May be passed
-     * some context object, `state`. May happen at some point in the future,
-     * according to the `delay` parameter, if specified.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler.
-     * @return {void}
-     */
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        return this;
-    };
-    return Action;
-}(Subscription_1.Subscription));
-exports.Action = Action;
+  }
 
-},{"../Subscription":36}],134:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  var outputParts = [];
+  for (var i = samePartsLength; i < fromParts.length; i++) {
+    outputParts.push('..');
+  }
+
+  outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+  return outputParts.join('/');
 };
-var root_1 = require('../util/root');
-var Action_1 = require('./Action');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var AsyncAction = (function (_super) {
-    __extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        _super.call(this, scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-        this.pending = false;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (this.closed) {
-            return this;
-        }
-        // Always replace the current state with the new state.
-        this.state = state;
-        // Set the pending flag indicating that this action has been scheduled, or
-        // has recursively rescheduled itself.
-        this.pending = true;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        //
-        // Important implementation note:
-        //
-        // Actions only execute once by default, unless rescheduled from within the
-        // scheduled callback. This allows us to implement single and repeat
-        // actions via the same code path, without adding API surface area, as well
-        // as mimic traditional recursion but across asynchronous boundaries.
-        //
-        // However, JS runtimes and timers distinguish between intervals achieved by
-        // serial `setTimeout` calls vs. a single `setInterval` call. An interval of
-        // serial `setTimeout` calls can be individually delayed, which delays
-        // scheduling the next `setTimeout`, and so on. `setInterval` attempts to
-        // guarantee the interval callback will be invoked more precisely to the
-        // interval period, regardless of load.
-        //
-        // Therefore, we use `setInterval` to schedule single and repeat actions.
-        // If the action reschedules itself with the same delay, the interval is not
-        // canceled. If the action doesn't reschedule, or reschedules with a
-        // different delay, the interval will be canceled after scheduled callback
-        // execution.
-        //
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.delay = delay;
-        // If this action has already an async Id, don't request a new one.
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    };
-    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        // If this action is rescheduled with the same delay time, don't clear the interval id.
-        if (delay !== null && this.delay === delay) {
-            return id;
-        }
-        // Otherwise, if the action's delay time is different from the current delay,
-        // clear the interval id
-        return root_1.root.clearInterval(id) && undefined || undefined;
-    };
-    /**
-     * Immediately executes this action and the `work` it contains.
-     * @return {any}
-     */
-    AsyncAction.prototype.execute = function (state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        var error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            // Dequeue if the action didn't reschedule itself. Don't call
-            // unsubscribe(), because the action could reschedule later.
-            // For example:
-            // ```
-            // scheduler.schedule(function doWork(counter) {
-            //   /* ... I'm a busy worker bee ... */
-            //   var originalAction = this;
-            //   /* wait 100ms before rescheduling the action */
-            //   setTimeout(function () {
-            //     originalAction.schedule(counter + 1);
-            //   }, 100);
-            // }, 1000);
-            // ```
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    };
-    AsyncAction.prototype._execute = function (state, delay) {
-        var errored = false;
-        var errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    };
-    AsyncAction.prototype._unsubscribe = function () {
-        var id = this.id;
-        var scheduler = this.scheduler;
-        var actions = scheduler.actions;
-        var index = actions.indexOf(this);
-        this.work = null;
-        this.delay = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-    };
-    return AsyncAction;
-}(Action_1.Action));
-exports.AsyncAction = AsyncAction;
 
-},{"../util/root":153,"./Action":133}],135:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Scheduler_1 = require('../Scheduler');
-var AsyncScheduler = (function (_super) {
-    __extends(AsyncScheduler, _super);
-    function AsyncScheduler() {
-        _super.apply(this, arguments);
-        this.actions = [];
-        /**
-         * A flag to indicate whether the Scheduler is currently executing a batch of
-         * queued actions.
-         * @type {boolean}
-         */
-        this.active = false;
-        /**
-         * An internal ID used to track the latest asynchronous task such as those
-         * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
-         * others.
-         * @type {any}
-         */
-        this.scheduled = undefined;
-    }
-    AsyncScheduler.prototype.flush = function (action) {
-        var actions = this.actions;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        var error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift()); // exhaust the scheduler queue
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler_1.Scheduler));
-exports.AsyncScheduler = AsyncScheduler;
+exports.sep = '/';
+exports.delimiter = ':';
 
-},{"../Scheduler":32}],136:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+exports.dirname = function(path) {
+  var result = splitPath(path),
+      root = result[0],
+      dir = result[1];
+
+  if (!root && !dir) {
+    // No dirname whatsoever
+    return '.';
+  }
+
+  if (dir) {
+    // It has a dirname, strip trailing slash
+    dir = dir.substr(0, dir.length - 1);
+  }
+
+  return root + dir;
 };
-var AsyncAction_1 = require('./AsyncAction');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var QueueAction = (function (_super) {
-    __extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        _super.call(this, scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-    }
-    QueueAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay > 0) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    };
-    QueueAction.prototype.execute = function (state, delay) {
-        return (delay > 0 || this.closed) ?
-            _super.prototype.execute.call(this, state, delay) :
-            this._execute(state, delay);
-    };
-    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        // If delay is greater than 0, enqueue as an async action.
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        // Otherwise flush the scheduler starting with this action.
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction_1.AsyncAction));
-exports.QueueAction = QueueAction;
 
-},{"./AsyncAction":134}],137:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+
+exports.basename = function(path, ext) {
+  var f = splitPath(path)[2];
+  // TODO: make this comparison case-insensitive on windows?
+  if (ext && f.substr(-1 * ext.length) === ext) {
+    f = f.substr(0, f.length - ext.length);
+  }
+  return f;
 };
-var AsyncScheduler_1 = require('./AsyncScheduler');
-var QueueScheduler = (function (_super) {
-    __extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        _super.apply(this, arguments);
-    }
-    return QueueScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.QueueScheduler = QueueScheduler;
 
-},{"./AsyncScheduler":135}],138:[function(require,module,exports){
-"use strict";
-var AsyncAction_1 = require('./AsyncAction');
-var AsyncScheduler_1 = require('./AsyncScheduler');
-exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
 
-},{"./AsyncAction":134,"./AsyncScheduler":135}],139:[function(require,module,exports){
-"use strict";
-var QueueAction_1 = require('./QueueAction');
-var QueueScheduler_1 = require('./QueueScheduler');
-exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
+exports.extname = function(path) {
+  return splitPath(path)[3];
+};
 
-},{"./QueueAction":136,"./QueueScheduler":137}],140:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-var Symbol = root_1.root.Symbol;
-if (typeof Symbol === 'function') {
-    if (Symbol.iterator) {
-        exports.$$iterator = Symbol.iterator;
-    }
-    else if (typeof Symbol.for === 'function') {
-        exports.$$iterator = Symbol.for('iterator');
-    }
-}
-else {
-    if (root_1.root.Set && typeof new root_1.root.Set()['@@iterator'] === 'function') {
-        // Bug for mozilla version
-        exports.$$iterator = '@@iterator';
-    }
-    else if (root_1.root.Map) {
-        // es6-shim specific logic
-        var keys = Object.getOwnPropertyNames(root_1.root.Map.prototype);
-        for (var i = 0; i < keys.length; ++i) {
-            var key = keys[i];
-            if (key !== 'entries' && key !== 'size' && root_1.root.Map.prototype[key] === root_1.root.Map.prototype['entries']) {
-                exports.$$iterator = key;
-                break;
-            }
-        }
-    }
-    else {
-        exports.$$iterator = '@@iterator';
+function filter (xs, f) {
+    if (xs.filter) return xs.filter(f);
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        if (f(xs[i], i, xs)) res.push(xs[i]);
     }
+    return res;
 }
 
-},{"../util/root":153}],141:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-function getSymbolObservable(context) {
-    var $$observable;
-    var Symbol = context.Symbol;
-    if (typeof Symbol === 'function') {
-        if (Symbol.observable) {
-            $$observable = Symbol.observable;
-        }
-        else {
-            $$observable = Symbol('observable');
-            Symbol.observable = $$observable;
-        }
-    }
-    else {
-        $$observable = '@@observable';
+// String.prototype.substr - negative index don't work in IE8
+var substr = 'ab'.substr(-1) === 'b'
+    ? function (str, start, len) { return str.substr(start, len) }
+    : function (str, start, len) {
+        if (start < 0) start = str.length + start;
+        return str.substr(start, len);
     }
-    return $$observable;
-}
-exports.getSymbolObservable = getSymbolObservable;
-exports.$$observable = getSymbolObservable(root_1.root);
+;
 
-},{"../util/root":153}],142:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-var Symbol = root_1.root.Symbol;
-exports.$$rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?
-    Symbol.for('rxSubscriber') : '@@rxSubscriber';
+}).call(this,require('_process'))
 
-},{"../util/root":153}],143:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an element was queried at a certain index of an
- * Observable, but no such index or position exists in that sequence.
- *
- * @see {@link elementAt}
- * @see {@link take}
- * @see {@link takeLast}
- *
- * @class ArgumentOutOfRangeError
- */
-var ArgumentOutOfRangeError = (function (_super) {
-    __extends(ArgumentOutOfRangeError, _super);
-    function ArgumentOutOfRangeError() {
-        var err = _super.call(this, 'argument out of range');
-        this.name = err.name = 'ArgumentOutOfRangeError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return ArgumentOutOfRangeError;
-}(Error));
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;
+},{"_process":7}],40:[function(require,module,exports){
+'use strict';
 
-},{}],144:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an Observable or a sequence was queried but has no
- * elements.
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link single}
- *
- * @class EmptyError
- */
-var EmptyError = (function (_super) {
-    __extends(EmptyError, _super);
-    function EmptyError() {
-        var err = _super.call(this, 'no elements in sequence');
-        this.name = err.name = 'EmptyError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return EmptyError;
-}(Error));
-exports.EmptyError = EmptyError;
+module.exports = Pbf;
 
-},{}],145:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an action is invalid because the object has been
- * unsubscribed.
- *
- * @see {@link Subject}
- * @see {@link BehaviorSubject}
- *
- * @class ObjectUnsubscribedError
- */
-var ObjectUnsubscribedError = (function (_super) {
-    __extends(ObjectUnsubscribedError, _super);
-    function ObjectUnsubscribedError() {
-        var err = _super.call(this, 'object unsubscribed');
-        this.name = err.name = 'ObjectUnsubscribedError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return ObjectUnsubscribedError;
-}(Error));
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError;
+var ieee754 = require('ieee754');
 
-},{}],146:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when one or more errors have occurred during the
- * `unsubscribe` of a {@link Subscription}.
- */
-var UnsubscriptionError = (function (_super) {
-    __extends(UnsubscriptionError, _super);
-    function UnsubscriptionError(errors) {
-        _super.call(this);
-        this.errors = errors;
-        var err = Error.call(this, errors ?
-            errors.length + " errors occurred during unsubscription:\n  " + errors.map(function (err, i) { return ((i + 1) + ") " + err.toString()); }).join('\n  ') : '');
-        this.name = err.name = 'UnsubscriptionError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return UnsubscriptionError;
-}(Error));
-exports.UnsubscriptionError = UnsubscriptionError;
+function Pbf(buf) {
+    this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
+    this.pos = 0;
+    this.type = 0;
+    this.length = this.buf.length;
+}
 
-},{}],147:[function(require,module,exports){
-"use strict";
-// typeof any so that it we don't have to cast when comparing a result to the error object
-exports.errorObject = { e: {} };
+Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
+Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
+Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
+Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
 
-},{}],148:[function(require,module,exports){
-"use strict";
-exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });
+var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
+    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
 
-},{}],149:[function(require,module,exports){
-"use strict";
-function isFunction(x) {
-    return typeof x === 'function';
-}
-exports.isFunction = isFunction;
+// Threshold chosen based on both benchmarking and knowledge about browser string
+// data structures (which currently switch structure types at 12 bytes or more)
+var TEXT_DECODER_MIN_LENGTH = 12;
+var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');
 
-},{}],150:[function(require,module,exports){
-"use strict";
-function isObject(x) {
-    return x != null && typeof x === 'object';
-}
-exports.isObject = isObject;
+Pbf.prototype = {
 
-},{}],151:[function(require,module,exports){
-"use strict";
-function isPromise(value) {
-    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-exports.isPromise = isPromise;
+    destroy: function() {
+        this.buf = null;
+    },
 
-},{}],152:[function(require,module,exports){
-"use strict";
-function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-exports.isScheduler = isScheduler;
-
-},{}],153:[function(require,module,exports){
-(function (global){
-"use strict";
-var objectTypes = {
-    'boolean': false,
-    'function': true,
-    'object': true,
-    'number': false,
-    'string': false,
-    'undefined': false
-};
-exports.root = (objectTypes[typeof self] && self) || (objectTypes[typeof window] && window);
-var freeGlobal = objectTypes[typeof global] && global;
-if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
-    exports.root = freeGlobal;
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],154:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-var isArray_1 = require('./isArray');
-var isPromise_1 = require('./isPromise');
-var Observable_1 = require('../Observable');
-var iterator_1 = require('../symbol/iterator');
-var InnerSubscriber_1 = require('../InnerSubscriber');
-var observable_1 = require('../symbol/observable');
-function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {
-    var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);
-    if (destination.closed) {
-        return null;
-    }
-    if (result instanceof Observable_1.Observable) {
-        if (result._isScalar) {
-            destination.next(result.value);
-            destination.complete();
-            return null;
-        }
-        else {
-            return result.subscribe(destination);
-        }
-    }
-    if (isArray_1.isArray(result)) {
-        for (var i = 0, len = result.length; i < len && !destination.closed; i++) {
-            destination.next(result[i]);
-        }
-        if (!destination.closed) {
-            destination.complete();
-        }
-    }
-    else if (isPromise_1.isPromise(result)) {
-        result.then(function (value) {
-            if (!destination.closed) {
-                destination.next(value);
-                destination.complete();
-            }
-        }, function (err) { return destination.error(err); })
-            .then(null, function (err) {
-            // Escaping the Promise trap: globally throw unhandled errors
-            root_1.root.setTimeout(function () { throw err; });
-        });
-        return destination;
-    }
-    else if (typeof result[iterator_1.$$iterator] === 'function') {
-        var iterator = result[iterator_1.$$iterator]();
-        do {
-            var item = iterator.next();
-            if (item.done) {
-                destination.complete();
-                break;
-            }
-            destination.next(item.value);
-            if (destination.closed) {
-                break;
-            }
-        } while (true);
-    }
-    else if (typeof result[observable_1.$$observable] === 'function') {
-        var obs = result[observable_1.$$observable]();
-        if (typeof obs.subscribe !== 'function') {
-            destination.error(new Error('invalid observable'));
-        }
-        else {
-            return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));
-        }
-    }
-    else {
-        destination.error(new TypeError('unknown type returned'));
-    }
-    return null;
-}
-exports.subscribeToResult = subscribeToResult;
-
-},{"../InnerSubscriber":26,"../Observable":28,"../symbol/iterator":140,"../symbol/observable":141,"./isArray":148,"./isPromise":151,"./root":153}],155:[function(require,module,exports){
-"use strict";
-var Subscriber_1 = require('../Subscriber');
-var rxSubscriber_1 = require('../symbol/rxSubscriber');
-function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriber_1.$$rxSubscriber]) {
-            return nextOrObserver[rxSubscriber_1.$$rxSubscriber]();
-        }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber_1.Subscriber();
-    }
-    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-}
-exports.toSubscriber = toSubscriber;
-
-},{"../Subscriber":35,"../symbol/rxSubscriber":142}],156:[function(require,module,exports){
-"use strict";
-var errorObject_1 = require('./errorObject');
-var tryCatchTarget;
-function tryCatcher() {
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject_1.errorObject.e = e;
-        return errorObject_1.errorObject;
-    }
-}
-function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-exports.tryCatch = tryCatch;
-;
-
-},{"./errorObject":147}],157:[function(require,module,exports){
-// threejs.org/license
-(function(l,sa){"object"===typeof exports&&"undefined"!==typeof module?sa(exports):"function"===typeof define&&define.amd?define(["exports"],sa):sa(l.THREE=l.THREE||{})})(this,function(l){function sa(){}function B(a,b){this.x=a||0;this.y=b||0}function da(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:ee++});this.uuid=T.generateUUID();this.sourceFile=this.name="";this.image=void 0!==a?a:da.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:da.DEFAULT_MAPPING;this.wrapS=void 0!==c?
-c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new B(0,0);this.repeat=new B(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function ga(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Db(a,b,c){this.uuid=T.generateUUID();
-this.width=a;this.height=b;this.scissor=new ga(0,0,a,b);this.scissorTest=!1;this.viewport=new ga(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new da(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Eb(a,b,c){Db.call(this,a,b,c);this.activeMipMapLevel=
-this.activeCubeFace=0}function ba(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function q(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function J(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Xa(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];da.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Fb(a,b,c){var d=a[0];if(0>=
-d||0<d)return a;var e=b*c,f=fe[e];void 0===f&&(f=new Float32Array(e),fe[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function ge(a,b){var c=he[b];void 0===c&&(c=new Int32Array(b),he[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function Ie(a,b){a.uniform1f(this.addr,b)}function Je(a,b){a.uniform1i(this.addr,b)}function Ke(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function Le(a,b){void 0!==b.x?a.uniform3f(this.addr,
-b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,b)}function Me(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function Ne(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function Oe(a,b){a.uniformMatrix3fv(this.addr,!1,b.elements||b)}function Pe(a,b){a.uniformMatrix4fv(this.addr,!1,b.elements||b)}function Qe(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||ie,d)}function Re(a,b,c){var d=c.allocTextureUnit();
-a.uniform1i(this.addr,d);c.setTextureCube(b||je,d)}function ke(a,b){a.uniform2iv(this.addr,b)}function le(a,b){a.uniform3iv(this.addr,b)}function me(a,b){a.uniform4iv(this.addr,b)}function Se(a){switch(a){case 5126:return Ie;case 35664:return Ke;case 35665:return Le;case 35666:return Me;case 35674:return Ne;case 35675:return Oe;case 35676:return Pe;case 35678:return Qe;case 35680:return Re;case 5124:case 35670:return Je;case 35667:case 35671:return ke;case 35668:case 35672:return le;case 35669:case 35673:return me}}
-function Te(a,b){a.uniform1fv(this.addr,b)}function Ue(a,b){a.uniform1iv(this.addr,b)}function Ve(a,b){a.uniform2fv(this.addr,Fb(b,this.size,2))}function We(a,b){a.uniform3fv(this.addr,Fb(b,this.size,3))}function Xe(a,b){a.uniform4fv(this.addr,Fb(b,this.size,4))}function Ye(a,b){a.uniformMatrix2fv(this.addr,!1,Fb(b,this.size,4))}function Ze(a,b){a.uniformMatrix3fv(this.addr,!1,Fb(b,this.size,9))}function $e(a,b){a.uniformMatrix4fv(this.addr,!1,Fb(b,this.size,16))}function af(a,b,c){var d=b.length,
-e=ge(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||ie,e[a])}function bf(a,b,c){var d=b.length,e=ge(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||je,e[a])}function cf(a){switch(a){case 5126:return Te;case 35664:return Ve;case 35665:return We;case 35666:return Xe;case 35674:return Ye;case 35675:return Ze;case 35676:return $e;case 35678:return af;case 35680:return bf;case 5124:case 35670:return Ue;case 35667:case 35671:return ke;case 35668:case 35672:return le;
-case 35669:case 35673:return me}}function df(a,b,c){this.id=a;this.addr=c;this.setValue=Se(b.type)}function ef(a,b,c){this.id=a;this.addr=c;this.size=b.size;this.setValue=cf(b.type)}function ne(a){this.id=a;this.seq=[];this.map={}}function Ya(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d!==c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=h.length;for(zd.lastIndex=0;;){var m=zd.exec(h),w=zd.lastIndex,
-n=m[1],p=m[3];"]"===m[2]&&(n|=0);if(void 0===p||"["===p&&w+2===k){h=g;e=void 0===p?new df(n,e,f):new ef(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else p=g.map[n],void 0===p&&(p=new ne(n),n=g,g=p,n.seq.push(g),n.map[g.id]=g),g=p}}}function O(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function mc(a,b){this.min=void 0!==a?a:new B(Infinity,Infinity);this.max=void 0!==b?b:new B(-Infinity,-Infinity)}function ff(a,b){var c,d,e,f,g,h,k,m,w,n,p=a.context,r=a.state,x,l,D,u,v,I;this.render=
-function(y,E,H){if(0!==b.length){y=new q;var F=H.w/H.z,M=.5*H.z,ca=.5*H.w,K=16/H.w,ja=new B(K*F,K),Aa=new q(1,1,0),eb=new B(1,1),Ka=new mc;Ka.min.set(H.x,H.y);Ka.max.set(H.x+(H.z-16),H.y+(H.w-16));if(void 0===u){var K=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),N=new Uint16Array([0,1,2,0,2,3]);x=p.createBuffer();l=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,x);p.bufferData(p.ARRAY_BUFFER,K,p.STATIC_DRAW);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,l);p.bufferData(p.ELEMENT_ARRAY_BUFFER,N,p.STATIC_DRAW);
-v=p.createTexture();I=p.createTexture();r.bindTexture(p.TEXTURE_2D,v);p.texImage2D(p.TEXTURE_2D,0,p.RGB,16,16,0,p.RGB,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);r.bindTexture(p.TEXTURE_2D,I);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,16,16,0,p.RGBA,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,
-p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);var K=D={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
-fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},N=p.createProgram(),P=p.createShader(p.FRAGMENT_SHADER),
-R=p.createShader(p.VERTEX_SHADER),S="precision "+a.getPrecision()+" float;\n";p.shaderSource(P,S+K.fragmentShader);p.shaderSource(R,S+K.vertexShader);p.compileShader(P);p.compileShader(R);p.attachShader(N,P);p.attachShader(N,R);p.linkProgram(N);u=N;w=p.getAttribLocation(u,"position");n=p.getAttribLocation(u,"uv");c=p.getUniformLocation(u,"renderType");d=p.getUniformLocation(u,"map");e=p.getUniformLocation(u,"occlusionMap");f=p.getUniformLocation(u,"opacity");g=p.getUniformLocation(u,"color");h=p.getUniformLocation(u,
-"scale");k=p.getUniformLocation(u,"rotation");m=p.getUniformLocation(u,"screenPosition")}p.useProgram(u);r.initAttributes();r.enableAttribute(w);r.enableAttribute(n);r.disableUnusedAttributes();p.uniform1i(e,0);p.uniform1i(d,1);p.bindBuffer(p.ARRAY_BUFFER,x);p.vertexAttribPointer(w,2,p.FLOAT,!1,16,0);p.vertexAttribPointer(n,2,p.FLOAT,!1,16,8);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,l);r.disable(p.CULL_FACE);r.setDepthWrite(!1);N=0;for(P=b.length;N<P;N++)if(K=16/H.w,ja.set(K*F,K),R=b[N],y.set(R.matrixWorld.elements[12],
-R.matrixWorld.elements[13],R.matrixWorld.elements[14]),y.applyMatrix4(E.matrixWorldInverse),y.applyProjection(E.projectionMatrix),Aa.copy(y),eb.x=H.x+Aa.x*M+M-8,eb.y=H.y+Aa.y*ca+ca-8,!0===Ka.containsPoint(eb)){r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,null);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,v);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGB,eb.x,eb.y,16,16,0);p.uniform1i(c,0);p.uniform2f(h,ja.x,ja.y);p.uniform3f(m,Aa.x,Aa.y,Aa.z);r.disable(p.BLEND);r.enable(p.DEPTH_TEST);p.drawElements(p.TRIANGLES,
-6,p.UNSIGNED_SHORT,0);r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,I);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGBA,eb.x,eb.y,16,16,0);p.uniform1i(c,1);r.disable(p.DEPTH_TEST);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,v);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);R.positionScreen.copy(Aa);R.customUpdateCallback?R.customUpdateCallback(R):R.updateLensFlares();p.uniform1i(c,2);r.enable(p.BLEND);for(var S=0,gf=R.lensFlares.length;S<gf;S++){var V=R.lensFlares[S];.001<V.opacity&&.001<
-V.scale&&(Aa.x=V.x,Aa.y=V.y,Aa.z=V.z,K=V.size*V.scale/H.w,ja.x=K*F,ja.y=K,p.uniform3f(m,Aa.x,Aa.y,Aa.z),p.uniform2f(h,ja.x,ja.y),p.uniform1f(k,V.rotation),p.uniform1f(f,V.opacity),p.uniform3f(g,V.color.r,V.color.g,V.color.b),r.setBlending(V.blending,V.blendEquation,V.blendSrc,V.blendDst),a.setTexture2D(V.texture,1),p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0))}}r.enable(p.CULL_FACE);r.enable(p.DEPTH_TEST);r.setDepthWrite(!0);a.resetGLState()}}}function hf(a,b){var c,d,e,f,g,h,k,m,w,n,p,r,x,l,
-D,u,v;function I(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var y=a.context,E=a.state,H,F,M,ca,K=new q,ja=new ba,Aa=new q;this.render=function(q,Ka){if(0!==b.length){if(void 0===M){var N=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),P=new Uint16Array([0,1,2,0,2,3]);H=y.createBuffer();F=y.createBuffer();y.bindBuffer(y.ARRAY_BUFFER,H);y.bufferData(y.ARRAY_BUFFER,N,y.STATIC_DRAW);y.bindBuffer(y.ELEMENT_ARRAY_BUFFER,F);y.bufferData(y.ELEMENT_ARRAY_BUFFER,
-P,y.STATIC_DRAW);var N=y.createProgram(),P=y.createShader(y.VERTEX_SHADER),R=y.createShader(y.FRAGMENT_SHADER);y.shaderSource(P,["precision "+a.getPrecision()+" float;","uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
-y.shaderSource(R,["precision "+a.getPrecision()+" float;","uniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
-y.compileShader(P);y.compileShader(R);y.attachShader(N,P);y.attachShader(N,R);y.linkProgram(N);M=N;u=y.getAttribLocation(M,"position");v=y.getAttribLocation(M,"uv");c=y.getUniformLocation(M,"uvOffset");d=y.getUniformLocation(M,"uvScale");e=y.getUniformLocation(M,"rotation");f=y.getUniformLocation(M,"scale");g=y.getUniformLocation(M,"color");h=y.getUniformLocation(M,"map");k=y.getUniformLocation(M,"opacity");m=y.getUniformLocation(M,"modelViewMatrix");w=y.getUniformLocation(M,"projectionMatrix");n=
-y.getUniformLocation(M,"fogType");p=y.getUniformLocation(M,"fogDensity");r=y.getUniformLocation(M,"fogNear");x=y.getUniformLocation(M,"fogFar");l=y.getUniformLocation(M,"fogColor");D=y.getUniformLocation(M,"alphaTest");N=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");N.width=8;N.height=8;P=N.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);ca=new da(N);ca.needsUpdate=!0}y.useProgram(M);E.initAttributes();E.enableAttribute(u);E.enableAttribute(v);E.disableUnusedAttributes();
-E.disable(y.CULL_FACE);E.enable(y.BLEND);y.bindBuffer(y.ARRAY_BUFFER,H);y.vertexAttribPointer(u,2,y.FLOAT,!1,16,0);y.vertexAttribPointer(v,2,y.FLOAT,!1,16,8);y.bindBuffer(y.ELEMENT_ARRAY_BUFFER,F);y.uniformMatrix4fv(w,!1,Ka.projectionMatrix.elements);E.activeTexture(y.TEXTURE0);y.uniform1i(h,0);P=N=0;(R=q.fog)?(y.uniform3f(l,R.color.r,R.color.g,R.color.b),R&&R.isFog?(y.uniform1f(r,R.near),y.uniform1f(x,R.far),y.uniform1i(n,1),P=N=1):R&&R.isFogExp2&&(y.uniform1f(p,R.density),y.uniform1i(n,2),P=N=2)):
-(y.uniform1i(n,0),P=N=0);for(var R=0,S=b.length;R<S;R++){var B=b[R];B.modelViewMatrix.multiplyMatrices(Ka.matrixWorldInverse,B.matrixWorld);B.z=-B.modelViewMatrix.elements[14]}b.sort(I);for(var V=[],R=0,S=b.length;R<S;R++){var B=b[R],ta=B.material;!1!==ta.visible&&(y.uniform1f(D,ta.alphaTest),y.uniformMatrix4fv(m,!1,B.modelViewMatrix.elements),B.matrixWorld.decompose(K,ja,Aa),V[0]=Aa.x,V[1]=Aa.y,B=0,q.fog&&ta.fog&&(B=P),N!==B&&(y.uniform1i(n,B),N=B),null!==ta.map?(y.uniform2f(c,ta.map.offset.x,ta.map.offset.y),
-y.uniform2f(d,ta.map.repeat.x,ta.map.repeat.y)):(y.uniform2f(c,0,0),y.uniform2f(d,1,1)),y.uniform1f(k,ta.opacity),y.uniform3f(g,ta.color.r,ta.color.g,ta.color.b),y.uniform1f(e,ta.rotation),y.uniform2fv(f,V),E.setBlending(ta.blending,ta.blendEquation,ta.blendSrc,ta.blendDst),E.setDepthTest(ta.depthTest),E.setDepthWrite(ta.depthWrite),ta.map?a.setTexture2D(ta.map,0):a.setTexture2D(ca,0),y.drawElements(y.TRIANGLES,6,y.UNSIGNED_SHORT,0))}E.enable(y.CULL_FACE);a.resetGLState()}}}function U(){Object.defineProperty(this,
-"id",{value:oe++});this.uuid=T.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.shading=2;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=
-!1;this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.premultipliedAlpha=!1;this.overdraw=0;this._needsUpdate=this.visible=!0}function Fa(a){U.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=
-this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}function Za(a){U.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=
-this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Ba(a,b){this.min=void 0!==a?a:new q(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new q(-Infinity,-Infinity,-Infinity)}function Ca(a,b){this.center=void 0!==a?a:new q;this.radius=void 0!==b?b:0}function Ia(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}
-function va(a,b){this.normal=void 0!==a?a:new q(1,0,0);this.constant=void 0!==b?b:0}function nc(a,b,c,d,e,f){this.planes=[void 0!==a?a:new va,void 0!==b?b:new va,void 0!==c?c:new va,void 0!==d?d:new va,void 0!==e?e:new va,void 0!==f?f:new va]}function pe(a,b,c,d){function e(b,c,d,e){var f=b.geometry,g;g=D;var h=b.customDepthMaterial;d&&(g=u,h=b.customDistanceMaterial);h?g=h:(h=!1,c.morphTargets&&(f&&f.isBufferGeometry?h=f.morphAttributes&&f.morphAttributes.position&&0<f.morphAttributes.position.length:
-f&&f.isGeometry&&(h=f.morphTargets&&0<f.morphTargets.length)),b=b.isSkinnedMesh&&c.skinning,f=0,h&&(f|=1),b&&(f|=2),g=g[f]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(f=g.uuid,h=c.uuid,b=v[f],void 0===b&&(b={},v[f]=b),f=b[h],void 0===f&&(f=g.clone(),b[h]=f),g=f);g.visible=c.visible;g.wireframe=c.wireframe;h=c.side;ja.renderSingleSided&&2==h&&(h=0);ja.renderReverseSided&&(0===h?h=1:1===h&&(h=0));g.side=h;g.clipShadows=c.clipShadows;g.clippingPlanes=c.clippingPlanes;g.wireframeLinewidth=
-c.wireframeLinewidth;g.linewidth=c.linewidth;d&&void 0!==g.uniforms.lightPos&&g.uniforms.lightPos.value.copy(e);return g}function f(a,b,c){if(!1!==a.visible){0!==(a.layers.mask&b.layers.mask)&&(a.isMesh||a.isLine||a.isPoints)&&a.castShadow&&(!1===a.frustumCulled||!0===k.intersectsObject(a))&&!0===a.material.visible&&(a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld),l.push(a));a=a.children;for(var d=0,e=a.length;d<e;d++)f(a[d],b,c)}}var g=a.context,h=a.state,k=new nc,m=new J,
-w=b.shadows,n=new B,p=new B(d.maxTextureSize,d.maxTextureSize),r=new q,x=new q,l=[],D=Array(4),u=Array(4),v={},I=[new q(1,0,0),new q(-1,0,0),new q(0,0,1),new q(0,0,-1),new q(0,1,0),new q(0,-1,0)],y=[new q(0,1,0),new q(0,1,0),new q(0,1,0),new q(0,1,0),new q(0,0,1),new q(0,0,-1)],E=[new ga,new ga,new ga,new ga,new ga,new ga];b=new Za;b.depthPacking=3201;b.clipping=!0;d=Gb.distanceRGBA;for(var H=La.clone(d.uniforms),F=0;4!==F;++F){var M=0!==(F&1),ca=0!==(F&2),K=b.clone();K.morphTargets=M;K.skinning=
-ca;D[F]=K;M=new Fa({defines:{USE_SHADOWMAP:""},uniforms:H,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader,morphTargets:M,skinning:ca,clipping:!0});u[F]=M}var ja=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,d){if(!1!==ja.enabled&&(!1!==ja.autoUpdate||!1!==ja.needsUpdate)&&0!==w.length){h.clearColor(1,1,1,1);h.disable(g.BLEND);h.setDepthTest(!0);h.setScissorTest(!1);for(var v,u,q=0,D=w.length;q<
-D;q++){var H=w[q],F=H.shadow;if(void 0===F)console.warn("THREE.WebGLShadowMap:",H,"has no shadow.");else{var M=F.camera;n.copy(F.mapSize);n.min(p);if(H&&H.isPointLight){v=6;u=!0;var K=n.x,ca=n.y;E[0].set(2*K,ca,K,ca);E[1].set(0,ca,K,ca);E[2].set(3*K,ca,K,ca);E[3].set(K,ca,K,ca);E[4].set(3*K,0,K,ca);E[5].set(K,0,K,ca);n.x*=4;n.y*=2}else v=1,u=!1;null===F.map&&(F.map=new Db(n.x,n.y,{minFilter:1003,magFilter:1003,format:1023}),M.updateProjectionMatrix());F&&F.isSpotLightShadow&&F.update(H);K=F.map;F=
-F.matrix;x.setFromMatrixPosition(H.matrixWorld);M.position.copy(x);a.setRenderTarget(K);a.clear();for(K=0;K<v;K++){u?(r.copy(M.position),r.add(I[K]),M.up.copy(y[K]),M.lookAt(r),h.viewport(E[K])):(r.setFromMatrixPosition(H.target.matrixWorld),M.lookAt(r));M.updateMatrixWorld();M.matrixWorldInverse.getInverse(M.matrixWorld);F.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);F.multiply(M.projectionMatrix);F.multiply(M.matrixWorldInverse);m.multiplyMatrices(M.projectionMatrix,M.matrixWorldInverse);k.setFromMatrix(m);
-l.length=0;f(b,d,M);for(var ca=0,B=l.length;ca<B;ca++){var C=l[ca],z=c.update(C),G=C.material;if(G&&G.isMultiMaterial)for(var $a=z.groups,G=G.materials,Ad=0,Da=$a.length;Ad<Da;Ad++){var Ra=$a[Ad],Pa=G[Ra.materialIndex];!0===Pa.visible&&(Pa=e(C,Pa,u,x),a.renderBufferDirect(M,null,z,Pa,C,Ra))}else Pa=e(C,G,u,x),a.renderBufferDirect(M,null,z,Pa,C,null)}}}}v=a.getClearColor();u=a.getClearAlpha();a.setClearColor(v,u);ja.needsUpdate=!1}}}function ab(a,b){this.origin=void 0!==a?a:new q;this.direction=void 0!==
-b?b:new q}function bb(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||bb.DefaultOrder}function Yc(){this.mask=1}function z(){Object.defineProperty(this,"id",{value:qe++});this.uuid=T.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=z.DefaultUp.clone();var a=new q,b=new bb,c=new ba,d=new q(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{enumerable:!0,
-value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new J},normalMatrix:{value:new Ia}});this.matrix=new J;this.matrixWorld=new J;this.matrixAutoUpdate=z.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Yc;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={};this.onBeforeRender=function(){};this.onAfterRender=function(){}}function gb(a,b){this.start=
-void 0!==a?a:new q;this.end=void 0!==b?b:new q}function wa(a,b,c){this.a=void 0!==a?a:new q;this.b=void 0!==b?b:new q;this.c=void 0!==c?c:new q}function ea(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new q;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new O;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function Ma(a){U.call(this);this.type="MeshBasicMaterial";this.color=new O(16777215);this.aoMap=this.map=null;this.aoMapIntensity=
-1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function C(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=T.generateUUID();this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;
-this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function Zc(a,b){return new C(new Uint16Array(a),b)}function $c(a,b){return new C(new Uint32Array(a),b)}function ha(a,b){return new C(new Float32Array(a),b)}function Q(){Object.defineProperty(this,"id",{value:ad++});this.uuid=T.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=
-[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function re(){Object.defineProperty(this,"id",{value:ad++});this.uuid=T.generateUUID();this.name="";this.type="DirectGeometry";this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];
-this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function G(){Object.defineProperty(this,"id",{value:ad++});this.uuid=T.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function ya(a,b){z.call(this);this.type="Mesh";this.geometry=void 0!==
-a?a:new G;this.material=void 0!==b?b:new Ma({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function hb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,k,m,B,C){var Ka=f/m,N=g/B,P=f/2,R=g/2,S=k/2;g=m+1;for(var z=B+1,V=f=0,G=new q,L=0;L<z;L++)for(var O=L*N-R,J=0;J<g;J++)G[a]=(J*Ka-P)*d,G[b]=O*e,G[c]=S,n[l]=G.x,n[l+1]=G.y,n[l+2]=G.z,G[a]=0,G[b]=0,G[c]=0<k?1:-1,p[l]=G.x,p[l+1]=G.y,p[l+2]=G.z,r[t]=J/m,r[t+1]=1-L/B,l+=3,t+=2,f+=1;for(L=0;L<B;L++)for(J=0;J<m;J++)a=u+J+g*(L+1),b=u+(J+1)+
-g*(L+1),c=u+(J+1)+g*L,w[D]=u+J+g*L,w[D+1]=a,w[D+2]=c,w[D+3]=a,w[D+4]=b,w[D+5]=c,D+=6,V+=6;h.addGroup(v,V,C);v+=V;u+=f}G.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=function(a,b,c){return a=0+(a+1)*(b+1)*2+(a+1)*(c+1)*2+(c+1)*(b+1)*2}(d,e,f),m=function(a,b,c){a=0+a*b*2+a*c*2+c*b*2;return 6*a}(d,e,f),w=new (65535<m?Uint32Array:Uint16Array)(m),
-n=new Float32Array(3*k),p=new Float32Array(3*k),r=new Float32Array(2*k),l=0,t=0,D=0,u=0,v=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(new C(w,1));this.addAttribute("position",new C(n,3));this.addAttribute("normal",new C(p,3));this.addAttribute("uv",new C(r,2))}function ib(a,b,c,d){G.call(this);this.type="PlaneBufferGeometry";this.parameters=
-{width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=b/d;b=new Float32Array(g*h*3);a=new Float32Array(g*h*3);for(var w=new Float32Array(g*h*2),n=0,p=0,r=0;r<h;r++)for(var l=r*m-f,t=0;t<g;t++)b[n]=t*k-e,b[n+1]=-l,a[n+2]=1,w[p]=t/c,w[p+1]=1-r/d,n+=3,p+=2;n=0;e=new (65535<b.length/3?Uint32Array:Uint16Array)(c*d*6);for(r=0;r<d;r++)for(t=0;t<c;t++)f=t+g*(r+1),h=t+1+g*(r+1),k=t+1+g*r,e[n]=t+g*r,e[n+1]=f,e[n+2]=k,e[n+3]=f,e[n+4]=
-h,e[n+5]=k,n+=6;this.setIndex(new C(e,1));this.addAttribute("position",new C(b,3));this.addAttribute("normal",new C(a,3));this.addAttribute("uv",new C(w,2))}function Z(){z.call(this);this.type="Camera";this.matrixWorldInverse=new J;this.projectionMatrix=new J}function Ea(a,b,c,d){Z.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=
-0;this.updateProjectionMatrix()}function Hb(a,b,c,d,e,f){Z.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function jf(a,b,c){var d,e,f;return{setMode:function(a){d=a},setIndex:function(c){c.array instanceof Uint32Array&&b.get("OES_element_index_uint")?(e=a.UNSIGNED_INT,f=4):(e=a.UNSIGNED_SHORT,f=2)},render:function(b,h){a.drawElements(d,h,e,b*f);
-c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)},renderInstances:function(g,h,k){var m=b.get("ANGLE_instanced_arrays");null===m?console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(m.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES&&(c.faces+=g.maxInstancedCount*k/3))}}}function kf(a,b,c){var d;return{setMode:function(a){d=a},render:function(b,
-f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES&&(c.faces+=f/3)},renderInstances:function(e){var f=b.get("ANGLE_instanced_arrays");if(null===f)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var g=e.attributes.position,g=g&&g.isInterleavedBufferAttribute?g.data.count:g.count;f.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES&&
-(c.faces+=e.maxInstancedCount*g/3)}}}}function lf(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];var c;switch(b.type){case "DirectionalLight":c={direction:new q,color:new O,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new B};break;case "SpotLight":c={position:new q,direction:new q,color:new O,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new B};break;case "PointLight":c={position:new q,color:new O,distance:0,decay:0,shadow:!1,
-shadowBias:0,shadowRadius:1,shadowMapSize:new B};break;case "HemisphereLight":c={direction:new q,skyColor:new O,groundColor:new O}}return a[b.id]=c}}}function mf(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function se(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",
-b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),mf(c));return d}function te(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+a);}}function Bd(a,b){var c=te(b);return"vec4 "+a+"( vec4 value ) { return "+
-c[0]+"ToLinear"+c[1]+"; }"}function nf(a,b){var c=te(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+c[0]+c[1]+"; }"}function of(a,b){var c;switch(b){case 1:c="Linear";break;case 2:c="Reinhard";break;case 3:c="Uncharted2";break;case 4:c="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+c+"ToneMapping( color ); }"}function pf(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":
-"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(oc).join("\n")}function qf(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function oc(a){return""!==a}function ue(a,b){return a.replace(/NUM_DIR_LIGHTS/g,
-b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Cd(a){return a.replace(/#include +<([\w\d.]+)>/g,function(a,c){var d=X[c];if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Cd(d)})}function ve(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+
-" ]");return a})}function rf(a,b,c,d){var e=a.context,f=c.extensions,g=c.defines,h=c.__webglShader.vertexShader,k=c.__webglShader.fragmentShader,m="SHADOWMAP_TYPE_BASIC";1===d.shadowMapType?m="SHADOWMAP_TYPE_PCF":2===d.shadowMapType&&(m="SHADOWMAP_TYPE_PCF_SOFT");var w="ENVMAP_TYPE_CUBE",n="ENVMAP_MODE_REFLECTION",p="ENVMAP_BLENDING_MULTIPLY";if(d.envMap){switch(c.envMap.mapping){case 301:case 302:w="ENVMAP_TYPE_CUBE";break;case 306:case 307:w="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:w="ENVMAP_TYPE_EQUIREC";
-break;case 305:w="ENVMAP_TYPE_SPHERE"}switch(c.envMap.mapping){case 302:case 304:n="ENVMAP_MODE_REFRACTION"}switch(c.combine){case 0:p="ENVMAP_BLENDING_MULTIPLY";break;case 1:p="ENVMAP_BLENDING_MIX";break;case 2:p="ENVMAP_BLENDING_ADD"}}var r=0<a.gammaFactor?a.gammaFactor:1,f=pf(f,d,a.extensions),l=qf(g),t=e.createProgram();c.isRawShaderMaterial?(g=[l,"\n"].filter(oc).join("\n"),m=[f,l,"\n"].filter(oc).join("\n")):(g=["precision "+d.precision+" float;","precision "+d.precision+" int;","#define SHADER_NAME "+
-c.__webglShader.name,l,d.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+r,"#define MAX_BONES "+d.maxBones,d.map?"#define USE_MAP":"",d.envMap?"#define USE_ENVMAP":"",d.envMap?"#define "+n:"",d.lightMap?"#define USE_LIGHTMAP":"",d.aoMap?"#define USE_AOMAP":"",d.emissiveMap?"#define USE_EMISSIVEMAP":"",d.bumpMap?"#define USE_BUMPMAP":"",d.normalMap?"#define USE_NORMALMAP":"",d.displacementMap&&d.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",d.specularMap?"#define USE_SPECULARMAP":
-"",d.roughnessMap?"#define USE_ROUGHNESSMAP":"",d.metalnessMap?"#define USE_METALNESSMAP":"",d.alphaMap?"#define USE_ALPHAMAP":"",d.vertexColors?"#define USE_COLOR":"",d.flatShading?"#define FLAT_SHADED":"",d.skinning?"#define USE_SKINNING":"",d.useVertexTexture?"#define BONE_TEXTURE":"",d.morphTargets?"#define USE_MORPHTARGETS":"",d.morphNormals&&!1===d.flatShading?"#define USE_MORPHNORMALS":"",d.doubleSided?"#define DOUBLE_SIDED":"",d.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+
-d.numClippingPlanes,d.shadowMapEnabled?"#define USE_SHADOWMAP":"",d.shadowMapEnabled?"#define "+m:"",d.sizeAttenuation?"#define USE_SIZEATTENUATION":"",d.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",d.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;",
-"attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;",
-"\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(oc).join("\n"),m=[f,"precision "+d.precision+" float;","precision "+d.precision+" int;","#define SHADER_NAME "+c.__webglShader.name,l,d.alphaTest?"#define ALPHATEST "+d.alphaTest:"","#define GAMMA_FACTOR "+r,d.useFog&&d.fog?"#define USE_FOG":"",d.useFog&&d.fogExp?"#define FOG_EXP2":"",d.map?"#define USE_MAP":
-"",d.envMap?"#define USE_ENVMAP":"",d.envMap?"#define "+w:"",d.envMap?"#define "+n:"",d.envMap?"#define "+p:"",d.lightMap?"#define USE_LIGHTMAP":"",d.aoMap?"#define USE_AOMAP":"",d.emissiveMap?"#define USE_EMISSIVEMAP":"",d.bumpMap?"#define USE_BUMPMAP":"",d.normalMap?"#define USE_NORMALMAP":"",d.specularMap?"#define USE_SPECULARMAP":"",d.roughnessMap?"#define USE_ROUGHNESSMAP":"",d.metalnessMap?"#define USE_METALNESSMAP":"",d.alphaMap?"#define USE_ALPHAMAP":"",d.vertexColors?"#define USE_COLOR":
-"",d.flatShading?"#define FLAT_SHADED":"",d.doubleSided?"#define DOUBLE_SIDED":"",d.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+d.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+(d.numClippingPlanes-d.numClipIntersection),d.shadowMapEnabled?"#define USE_SHADOWMAP":"",d.shadowMapEnabled?"#define "+m:"",d.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",d.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",d.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",d.logarithmicDepthBuffer&&
-a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",d.envMap&&a.extensions.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==d.toneMapping?"#define TONE_MAPPING":"",0!==d.toneMapping?X.tonemapping_pars_fragment:"",0!==d.toneMapping?of("toneMapping",d.toneMapping):"",d.outputEncoding||d.mapEncoding||d.envMapEncoding||d.emissiveMapEncoding?X.encodings_pars_fragment:"",d.mapEncoding?Bd("mapTexelToLinear",d.mapEncoding):
-"",d.envMapEncoding?Bd("envMapTexelToLinear",d.envMapEncoding):"",d.emissiveMapEncoding?Bd("emissiveMapTexelToLinear",d.emissiveMapEncoding):"",d.outputEncoding?nf("linearToOutputTexel",d.outputEncoding):"",d.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(oc).join("\n"));h=Cd(h,d);h=ue(h,d);k=Cd(k,d);k=ue(k,d);c.isShaderMaterial||(h=ve(h),k=ve(k));k=m+k;h=se(e,e.VERTEX_SHADER,g+h);k=se(e,e.FRAGMENT_SHADER,k);e.attachShader(t,h);e.attachShader(t,k);void 0!==c.index0AttributeName?
-e.bindAttribLocation(t,0,c.index0AttributeName):!0===d.morphTargets&&e.bindAttribLocation(t,0,"position");e.linkProgram(t);d=e.getProgramInfoLog(t);w=e.getShaderInfoLog(h);n=e.getShaderInfoLog(k);r=p=!0;if(!1===e.getProgramParameter(t,e.LINK_STATUS))p=!1,console.error("THREE.WebGLProgram: shader error: ",e.getError(),"gl.VALIDATE_STATUS",e.getProgramParameter(t,e.VALIDATE_STATUS),"gl.getProgramInfoLog",d,w,n);else if(""!==d)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",d);else if(""===
-w||""===n)r=!1;r&&(this.diagnostics={runnable:p,material:c,programLog:d,vertexShader:{log:w,prefix:g},fragmentShader:{log:n,prefix:m}});e.deleteShader(h);e.deleteShader(k);var q;this.getUniforms=function(){void 0===q&&(q=new Ya(e,t,a));return q};var u;this.getAttributes=function(){if(void 0===u){for(var a={},b=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=e.getActiveAttrib(t,c).name;a[d]=e.getAttribLocation(t,d)}u=a}return u};this.destroy=function(){e.deleteProgram(t);this.program=
-void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=sf++;this.code=b;this.usedTimes=1;this.program=t;this.vertexShader=h;this.fragmentShader=k;return this}function tf(a,b){function c(a,b){var c;a?a&&a.isTexture?c=a.encoding:a&&a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),
-c=a.texture.encoding):c=3E3;3E3===c&&b&&(c=3007);return c}var d=[],e={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},f="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking".split(" ");
-this.getParameters=function(d,f,k,m,w,n){var p=e[d.type],r;b.floatVertexTextures&&n&&n.skeleton&&n.skeleton.useVertexTexture?r=1024:(r=Math.floor((b.maxVertexUniforms-20)/4),void 0!==n&&n&&n.isSkinnedMesh&&(r=Math.min(n.skeleton.bones.length,r),r<n.skeleton.bones.length&&console.warn("WebGLRenderer: too many bones - "+n.skeleton.bones.length+", this GPU supports just "+r+" (try OpenGL instead of ANGLE)")));var l=a.getPrecision();null!==d.precision&&(l=b.getMaxPrecision(d.precision),l!==d.precision&&
-console.warn("THREE.WebGLProgram.getParameters:",d.precision,"not supported, using",l,"instead."));var t=a.getCurrentRenderTarget();return{shaderID:p,precision:l,supportsVertexTextures:b.vertexTextures,outputEncoding:c(t?t.texture:null,a.gammaOutput),map:!!d.map,mapEncoding:c(d.map,a.gammaInput),envMap:!!d.envMap,envMapMode:d.envMap&&d.envMap.mapping,envMapEncoding:c(d.envMap,a.gammaInput),envMapCubeUV:!!d.envMap&&(306===d.envMap.mapping||307===d.envMap.mapping),lightMap:!!d.lightMap,aoMap:!!d.aoMap,
-emissiveMap:!!d.emissiveMap,emissiveMapEncoding:c(d.emissiveMap,a.gammaInput),bumpMap:!!d.bumpMap,normalMap:!!d.normalMap,displacementMap:!!d.displacementMap,roughnessMap:!!d.roughnessMap,metalnessMap:!!d.metalnessMap,specularMap:!!d.specularMap,alphaMap:!!d.alphaMap,combine:d.combine,vertexColors:d.vertexColors,fog:!!k,useFog:d.fog,fogExp:k&&k.isFogExp2,flatShading:1===d.shading,sizeAttenuation:d.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,skinning:d.skinning,maxBones:r,useVertexTexture:b.floatVertexTextures&&
-n&&n.skeleton&&n.skeleton.useVertexTexture,morphTargets:d.morphTargets,morphNormals:d.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:f.directional.length,numPointLights:f.point.length,numSpotLights:f.spot.length,numHemiLights:f.hemi.length,numClippingPlanes:m,numClipIntersection:w,shadowMapEnabled:a.shadowMap.enabled&&n.receiveShadow&&0<f.shadows.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,
-premultipliedAlpha:d.premultipliedAlpha,alphaTest:d.alphaTest,doubleSided:2===d.side,flipSided:1===d.side,depthPacking:void 0!==d.depthPacking?d.depthPacking:!1}};this.getProgramCode=function(a,b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(a.fragmentShader),c.push(a.vertexShader));if(void 0!==a.defines)for(var d in a.defines)c.push(d),c.push(a.defines[d]);for(d=0;d<f.length;d++)c.push(b[f[d]]);return c.join()};this.acquireProgram=function(b,c,e){for(var f,w=0,n=d.length;w<n;w++){var p=d[w];if(p.code===
-e){f=p;++f.usedTimes;break}}void 0===f&&(f=new rf(a,e,b,c),d.push(f));return f};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=d.indexOf(a);d[b]=d[d.length-1];d.pop();a.destroy()}};this.programs=d}function uf(a,b,c){function d(a){var h=a.target;a=f[h.id];null!==a.index&&e(a.index);var k=a.attributes,m;for(m in k)e(k[m]);h.removeEventListener("dispose",d);delete f[h.id];m=b.get(h);m.wireframe&&e(m.wireframe);b["delete"](h);h=b.get(a);h.wireframe&&e(h.wireframe);b["delete"](a);c.memory.geometries--}
-function e(c){var d;d=c.isInterleavedBufferAttribute?b.get(c.data).__webglBuffer:b.get(c).__webglBuffer;void 0!==d&&(a.deleteBuffer(d),c.isInterleavedBufferAttribute?b["delete"](c.data):b["delete"](c))}var f={};return{get:function(a){var b=a.geometry;if(void 0!==f[b.id])return f[b.id];b.addEventListener("dispose",d);var e;b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new G).setFromObject(a)),e=b._bufferGeometry);f[b.id]=e;c.memory.geometries++;return e}}}function vf(a,
-b,c){function d(c,d){var e=c.isInterleavedBufferAttribute?c.data:c,k=b.get(e);void 0===k.__webglBuffer?(k.__webglBuffer=a.createBuffer(),a.bindBuffer(d,k.__webglBuffer),a.bufferData(d,e.array,e.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW),k.version=e.version):k.version!==e.version&&(a.bindBuffer(d,k.__webglBuffer),!1===e.dynamic?a.bufferData(d,e.array,a.STATIC_DRAW):-1===e.updateRange.count?a.bufferSubData(d,0,e.array):0===e.updateRange.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):
-(a.bufferSubData(d,e.updateRange.offset*e.array.BYTES_PER_ELEMENT,e.array.subarray(e.updateRange.offset,e.updateRange.offset+e.updateRange.count)),e.updateRange.count=0),k.version=e.version)}var e=new uf(a,b,c);return{getAttributeBuffer:function(a){return a.isInterleavedBufferAttribute?b.get(a.data).__webglBuffer:b.get(a).__webglBuffer},getWireframeAttribute:function(c){var e=b.get(c);if(void 0!==e.wireframe)return e.wireframe;var h=[],k=c.index,m=c.attributes;c=m.position;if(null!==k)for(var k=k.array,
-m=0,w=k.length;m<w;m+=3){var n=k[m+0],p=k[m+1],r=k[m+2];h.push(n,p,p,r,r,n)}else for(k=m.position.array,m=0,w=k.length/3-1;m<w;m+=3)n=m+0,p=m+1,r=m+2,h.push(n,p,p,r,r,n);h=new C(new (65535<c.count?Uint32Array:Uint16Array)(h),1);d(h,a.ELEMENT_ARRAY_BUFFER);return e.wireframe=h},update:function(b){var c=e.get(b);b.geometry.isGeometry&&c.updateFromObject(b);b=c.index;var h=c.attributes;null!==b&&d(b,a.ELEMENT_ARRAY_BUFFER);for(var k in h)d(h[k],a.ARRAY_BUFFER);b=c.morphAttributes;for(k in b)for(var h=
-b[k],m=0,w=h.length;m<w;m++)d(h[m],a.ARRAY_BUFFER);return c}}}function wf(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}
-function k(a){return T.isPowerOfTwo(a.width)&&T.isPowerOfTwo(a.height)}function m(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function w(b){b=b.target;b.removeEventListener("dispose",w);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d["delete"](b)}q.textures--}function n(b){b=b.target;b.removeEventListener("dispose",n);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==
-e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b&&b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d["delete"](b.texture);d["delete"](b)}q.textures--}function p(b,g){var m=d.get(b);if(0<b.version&&m.__version!==b.version){var p=b.image;
-if(void 0===p)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===p.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===m.__webglInit&&(m.__webglInit=!0,b.addEventListener("dispose",w),m.__webglTexture=a.createTexture(),q.textures++);c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_2D,m.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
-b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var n=h(b.image,e.maxTextureSize);if((1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(n))if(p=n,p instanceof HTMLImageElement||p instanceof HTMLCanvasElement){var l=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");l.width=T.nearestPowerOfTwo(p.width);l.height=T.nearestPowerOfTwo(p.height);l.getContext("2d").drawImage(p,0,0,l.width,l.height);console.warn("THREE.WebGLRenderer: image is not power of two ("+
-p.width+"x"+p.height+"). Resized to "+l.width+"x"+l.height,p);n=l}else n=p;var p=k(n),l=f(b.format),x=f(b.type);r(a.TEXTURE_2D,b,p);var t=b.mipmaps;if(b&&b.isDepthTexture){t=a.DEPTH_COMPONENT;if(1015===b.type){if(!u)throw Error("Float Depth Texture only supported in WebGL2.0");t=a.DEPTH_COMPONENT32F}else u&&(t=a.DEPTH_COMPONENT16);1027===b.format&&(t=a.DEPTH_STENCIL);c.texImage2D(a.TEXTURE_2D,0,t,n.width,n.height,0,l,x,null)}else if(b&&b.isDataTexture)if(0<t.length&&p){for(var K=0,ja=t.length;K<ja;K++)n=
-t[K],c.texImage2D(a.TEXTURE_2D,K,l,n.width,n.height,0,l,x,n.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,l,n.width,n.height,0,l,x,n.data);else if(b&&b.isCompressedTexture)for(K=0,ja=t.length;K<ja;K++)n=t[K],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(l)?c.compressedTexImage2D(a.TEXTURE_2D,K,l,n.width,n.height,0,n.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(a.TEXTURE_2D,
-K,l,n.width,n.height,0,l,x,n.data);else if(0<t.length&&p){K=0;for(ja=t.length;K<ja;K++)n=t[K],c.texImage2D(a.TEXTURE_2D,K,l,l,x,n);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,l,l,x,n);b.generateMipmaps&&p&&a.generateMipmap(a.TEXTURE_2D);m.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_2D,m.__webglTexture)}function r(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f(g.wrapT)),a.texParameteri(c,
-a.TEXTURE_MAG_FILTER,f(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,m(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,m(g.minFilter)),1003!==g.minFilter&&
-1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=
-g.anisotropy)}function l(b,e,g,h){var k=f(e.texture.format),m=f(e.texture.type);c.texImage2D(h,0,k,e.width,e.height,0,k,m,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function t(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,
-b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var q=g.memory,u="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext;this.setTexture2D=p;this.setTextureCube=function(b,g){var m=d.get(b);if(6===b.image.length)if(0<b.version&&
-m.__version!==b.version){m.__image__webglTextureCube||(b.addEventListener("dispose",w),m.__image__webglTextureCube=a.createTexture(),q.textures++);c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_CUBE_MAP,m.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);for(var p=b&&b.isCompressedTexture,n=b.image[0]&&b.image[0].isDataTexture,l=[],x=0;6>x;x++)l[x]=p||n?n?b.image[x].image:b.image[x]:h(b.image[x],e.maxCubemapSize);var t=k(l[0]),u=f(b.format),ja=f(b.type);r(a.TEXTURE_CUBE_MAP,
-b,t);for(x=0;6>x;x++)if(p)for(var B,C=l[x].mipmaps,z=0,N=C.length;z<N;z++)B=C[z],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(u)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+x,z,u,B.width,B.height,0,B.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+x,z,u,B.width,B.height,0,u,ja,B.data);else n?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+x,0,u,l[x].width,
-l[x].height,0,u,ja,l[x].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+x,0,u,u,ja,l[x]);b.generateMipmaps&&t&&a.generateMipmap(a.TEXTURE_CUBE_MAP);m.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+g),c.bindTexture(a.TEXTURE_CUBE_MAP,m.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",
-n);f.__webglTexture=a.createTexture();q.textures++;var g=b&&b.isWebGLRenderTargetCube,h=k(b);if(g){e.__webglFramebuffer=[];for(var m=0;6>m;m++)e.__webglFramebuffer[m]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(g){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);r(a.TEXTURE_CUBE_MAP,b.texture,h);for(m=0;6>m;m++)l(e.__webglFramebuffer[m],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+m);b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,
-null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),r(a.TEXTURE_2D,b.texture,h),l(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=b&&b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER,
-e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);p(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,
-a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),t(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),t(e.__webglDepthbuffer,
-b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture;e.generateMipmaps&&k(b)&&1003!==e.minFilter&&1006!==e.minFilter&&(b=b&&b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function xf(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},"delete":function(b){delete a[b.uuid]},clear:function(){a={}}}}function yf(a,b,c){function d(b,
-c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==E[b]&&(a.enable(b),E[b]=!0)}function f(b){!1!==E[b]&&(a.disable(b),E[b]=!1)}function g(b,d,g,h,k,m,p,n){0!==b?e(a.BLEND):f(a.BLEND);if(b!==F||n!==G)2===b?n?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,
-a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.SRC_ALPHA,a.ONE)):3===b?n?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):4===b?n?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):n?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),
-a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)),F=b,G=n;if(5===b){k=k||d;m=m||g;p=p||h;if(d!==M||k!==B)a.blendEquationSeparate(c(d),c(k)),M=d,B=k;if(g!==ca||h!==K||m!==C||p!==z)a.blendFuncSeparate(c(g),c(h),c(m),c(p)),ca=g,K=h,C=m,z=p}else z=C=B=K=ca=M=null}function h(a){t.setFunc(a)}function k(b){N!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),
-N=b)}function m(b){0!==b?(e(a.CULL_FACE),b!==P&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);P=b}function w(b){void 0===b&&(b=a.TEXTURE0+O-1);L!==b&&(a.activeTexture(b),L=b)}function n(a,b,c,d){l.setClear(a,b,c,d)}function p(a){t.setClear(a)}function r(a){q.setClear(a)}var l=new function(){var b=!1,c=new ga,d=null,e=new ga;return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g){c.set(b,
-d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(0,0,0,1)}}},t=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);
-break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},q=new function(){var b=!1,c=null,d=null,g=null,h=null,k=null,m=null,p=null,n=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==
-e)a.stencilFunc(b,c,e),d=b,g=c,h=e},setOp:function(b,c,d){if(k!==b||m!==c||p!==d)a.stencilOp(b,c,d),k=b,m=c,p=d},setLocked:function(a){b=a},setClear:function(b){n!==b&&(a.clearStencil(b),n=b)},reset:function(){b=!1;n=p=m=k=h=g=d=c=null}}},u=a.getParameter(a.MAX_VERTEX_ATTRIBS),v=new Uint8Array(u),I=new Uint8Array(u),y=new Uint8Array(u),E={},H=null,F=null,M=null,ca=null,K=null,B=null,C=null,z=null,G=!1,N=null,P=null,R=null,S=null,J=null,V=null,O=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),L=null,Q={},
-T=new ga,U=new ga,fb={};fb[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);fb[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);return{buffers:{color:l,depth:t,stencil:q},init:function(){n(0,0,0,1);p(1);r(0);e(a.DEPTH_TEST);h(3);k(!1);m(1);e(a.CULL_FACE);e(a.BLEND);g(1)},initAttributes:function(){for(var a=0,b=v.length;a<b;a++)v[a]=0},enableAttribute:function(c){v[c]=1;0===I[c]&&(a.enableVertexAttribArray(c),I[c]=1);0!==y[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,
-0),y[c]=0)},enableAttributeAndDivisor:function(b,c,d){v[b]=1;0===I[b]&&(a.enableVertexAttribArray(b),I[b]=1);y[b]!==c&&(d.vertexAttribDivisorANGLE(b,c),y[b]=c)},disableUnusedAttributes:function(){for(var b=0,c=I.length;b!==c;++b)I[b]!==v[b]&&(a.disableVertexAttribArray(b),I[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===H&&(H=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),
-d=0;d<c.length;d++)H.push(c[d]);return H},setBlending:g,setColorWrite:function(a){l.setMask(a)},setDepthTest:function(a){t.setTest(a)},setDepthWrite:function(a){t.setMask(a)},setDepthFunc:h,setStencilTest:function(a){q.setTest(a)},setStencilWrite:function(a){q.setMask(a)},setStencilFunc:function(a,b,c){q.setFunc(a,b,c)},setStencilOp:function(a,b,c){q.setOp(a,b,c)},setFlipSided:k,setCullFace:m,setLineWidth:function(b){b!==R&&(a.lineWidth(b),R=b)},setPolygonOffset:function(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),
-S!==c||J!==d)a.polygonOffset(c,d),S=c,J=d}else f(a.POLYGON_OFFSET_FILL)},getScissorTest:function(){return V},setScissorTest:function(b){(V=b)?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:w,bindTexture:function(b,c){null===L&&w();var d=Q[L];void 0===d&&(d={type:void 0,texture:void 0},Q[L]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||fb[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(b){console.error(b)}},texImage2D:function(){try{a.texImage2D.apply(a,
-arguments)}catch(b){console.error(b)}},clearColor:n,clearDepth:p,clearStencil:r,scissor:function(b){!1===T.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),T.copy(b))},viewport:function(b){!1===U.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),U.copy(b))},reset:function(){for(var b=0;b<I.length;b++)1===I[b]&&(a.disableVertexAttribArray(b),I[b]=0);E={};L=H=null;Q={};P=N=F=null;l.reset();t.reset();q.reset()}}}function zf(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&
-0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=!0===c.logarithmicDepthBuffer&&!!b.get("EXT_frag_depth");var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),
-h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),m=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),w=a.getParameter(a.MAX_VERTEX_ATTRIBS),n=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),p=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),l=0<h,t=!!b.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):
-0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:m,maxAttributes:w,maxVertexUniforms:n,maxVaryings:p,maxFragmentUniforms:r,vertexTextures:l,floatFragmentTextures:t,floatVertexTextures:l&&t}}function Af(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];var d;switch(c){case "WEBGL_depth_texture":d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");
-break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||
-a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function Bf(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;
-k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new va,k=new Ia,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=
-!1;a()};this.setState=function(c,h,k,r,l,t){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var q=4*k,u=l.clippingState||null;m.value=u;u=b(c,r,q,t);for(c=0;c!==q;++c)u[c]=d[c];l.clippingState=u;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Dd(a){function b(a,b,c,d){!0===M&&(a*=d,b*=d,c*=d);Y.clearColor(a,b,c,d)}function c(){Y.init();Y.scissor(X.copy(ha).multiplyScalar(Qa));Y.viewport($a.copy(fa).multiplyScalar(Qa));b(Da.r,Da.g,Da.b,Ra)}function d(){W=Q=null;
-U="";L=-1;Y.reset()}function e(a){a.preventDefault();d();c();ea.clear()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);ea["delete"](a)}function g(a){var b=ea.get(a).program;a.program=void 0;void 0!==b&&va.releaseProgram(b)}function h(a,b){return Math.abs(b[0])-Math.abs(a[0])}function k(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.material.program&&b.material.program&&a.material.program!==b.material.program?a.material.program.id-
-b.material.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function m(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function w(a,b,c,d,e){var f;c.transparent?(d=z,f=++Ka):(d=B,f=++C);f=d[f];void 0!==f?(f.id=a.id,f.object=a,f.geometry=b,f.material=c,f.z=Z.z,f.group=e):(f={id:a.id,object:a,geometry:b,material:c,z:Z.z,group:e},d.push(f))}function n(a){if(!oa.intersectsSphere(a))return!1;
-var b=ba.numPlanes;if(0===b)return!0;var c=S.clippingPlanes,d=a.center;a=-a.radius;var e=0;do if(c[e].distanceToPoint(d)<a)return!1;while(++e!==b);return!0}function p(a,b){if(!1!==a.visible){if(0!==(a.layers.mask&b.layers.mask))if(a.isLight)K.push(a);else if(a.isSprite){var c;(c=!1===a.frustumCulled)||(na.center.set(0,0,0),na.radius=.7071067811865476,na.applyMatrix4(a.matrixWorld),c=!0===n(na));c&&P.push(a)}else if(a.isLensFlare)R.push(a);else if(a.isImmediateRenderObject)!0===S.sortObjects&&(Z.setFromMatrixPosition(a.matrixWorld),
-Z.applyProjection(ra)),w(a,null,a.material,Z.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),(c=!1===a.frustumCulled)||(c=a.geometry,null===c.boundingSphere&&c.computeBoundingSphere(),na.copy(c.boundingSphere).applyMatrix4(a.matrixWorld),c=!0===n(na)),c){var d=a.material;if(!0===d.visible)if(!0===S.sortObjects&&(Z.setFromMatrixPosition(a.matrixWorld),Z.applyProjection(ra)),c=qa.update(a),d.isMultiMaterial)for(var e=c.groups,f=d.materials,d=0,g=e.length;d<g;d++){var h=
-e[d],k=f[h.materialIndex];!0===k.visible&&w(a,c,k,Z.z,h)}else w(a,c,d,Z.z,null)}c=a.children;d=0;for(g=c.length;d<g;d++)p(c[d],b)}}function r(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d,g=g.group;h.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,h.matrixWorld);h.normalMatrix.getNormalMatrix(h.modelViewMatrix);h.onBeforeRender(S,b,c,k,m,g);if(h.isImmediateRenderObject){l(m);var p=t(c,b.fog,m,h);U="";h.render(function(a){S.renderBufferImmediate(a,
-p,m)})}else S.renderBufferDirect(c,b.fog,k,m,h,g);h.onAfterRender(S,b,c,k,m,g)}}function l(a){2===a.side?Y.disable(A.CULL_FACE):Y.enable(A.CULL_FACE);Y.setFlipSided(1===a.side);!0===a.transparent?Y.setBlending(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,a.premultipliedAlpha):Y.setBlending(0);Y.setDepthFunc(a.depthFunc);Y.setDepthTest(a.depthTest);Y.setDepthWrite(a.depthWrite);Y.setColorWrite(a.colorWrite);Y.setPolygonOffset(a.polygonOffset,
-a.polygonOffsetFactor,a.polygonOffsetUnits)}function t(a,b,c,d){da=0;var e=ea.get(c);pa&&(sa||a!==W)&&ba.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===W&&c.id===L);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==aa.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===ba.numPlanes&&e.numIntersection===ba.numIntersection||(c.needsUpdate=!0));if(c.needsUpdate){a:{var h=ea.get(c),k=va.getParameters(c,
-aa,b,ba.numPlanes,ba.numIntersection,d),m=va.getProgramCode(c,k),p=h.program,n=!0;if(void 0===p)c.addEventListener("dispose",f);else if(p.code!==m)g(c);else if(void 0!==k.shaderID)break a;else n=!1;n&&(k.shaderID?(p=Gb[k.shaderID],h.__webglShader={name:c.type,uniforms:La.clone(p.uniforms),vertexShader:p.vertexShader,fragmentShader:p.fragmentShader}):h.__webglShader={name:c.type,uniforms:c.uniforms,vertexShader:c.vertexShader,fragmentShader:c.fragmentShader},c.__webglShader=h.__webglShader,p=va.acquireProgram(c,
-k,m),h.program=p,c.program=p);k=p.getAttributes();if(c.morphTargets)for(m=c.numSupportedMorphTargets=0;m<S.maxMorphTargets;m++)0<=k["morphTarget"+m]&&c.numSupportedMorphTargets++;if(c.morphNormals)for(m=c.numSupportedMorphNormals=0;m<S.maxMorphNormals;m++)0<=k["morphNormal"+m]&&c.numSupportedMorphNormals++;k=h.__webglShader.uniforms;if(!c.isShaderMaterial&&!c.isRawShaderMaterial||!0===c.clipping)h.numClippingPlanes=ba.numPlanes,h.numIntersection=ba.numIntersection,k.clippingPlanes=ba.uniform;h.fog=
-b;h.lightsHash=aa.hash;c.lights&&(k.ambientLightColor.value=aa.ambient,k.directionalLights.value=aa.directional,k.spotLights.value=aa.spot,k.pointLights.value=aa.point,k.hemisphereLights.value=aa.hemi,k.directionalShadowMap.value=aa.directionalShadowMap,k.directionalShadowMatrix.value=aa.directionalShadowMatrix,k.spotShadowMap.value=aa.spotShadowMap,k.spotShadowMatrix.value=aa.spotShadowMatrix,k.pointShadowMap.value=aa.pointShadowMap,k.pointShadowMatrix.value=aa.pointShadowMatrix);m=h.program.getUniforms();
-k=Ya.seqWithValue(m.seq,k);h.uniformsList=k}c.needsUpdate=!1}var w=!1,n=p=!1,h=e.program,k=h.getUniforms(),m=e.__webglShader.uniforms;h.id!==Q&&(A.useProgram(h.program),Q=h.id,n=p=w=!0);c.id!==L&&(L=c.id,p=!0);if(w||a!==W){k.set(A,a,"projectionMatrix");ia.logarithmicDepthBuffer&&k.setValue(A,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));a!==W&&(W=a,n=p=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)w=k.map.cameraPosition,void 0!==w&&w.setValue(A,Z.setFromMatrixPosition(a.matrixWorld));
-(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&k.setValue(A,"viewMatrix",a.matrixWorldInverse);k.set(A,S,"toneMappingExposure");k.set(A,S,"toneMappingWhitePoint")}c.skinning&&(k.setOptional(A,d,"bindMatrix"),k.setOptional(A,d,"bindMatrixInverse"),a=d.skeleton)&&(ia.floatVertexTextures&&a.useVertexTexture?(k.set(A,a,"boneTexture"),k.set(A,a,"boneTextureWidth"),k.set(A,a,"boneTextureHeight")):k.setOptional(A,a,"boneMatrices"));
-if(p){c.lights&&(a=n,m.ambientLightColor.needsUpdate=a,m.directionalLights.needsUpdate=a,m.pointLights.needsUpdate=a,m.spotLights.needsUpdate=a,m.hemisphereLights.needsUpdate=a);b&&c.fog&&(m.fogColor.value=b.color,b.isFog?(m.fogNear.value=b.near,m.fogFar.value=b.far):b.isFogExp2&&(m.fogDensity.value=b.density));if(c.isMeshBasicMaterial||c.isMeshLambertMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.isMeshDepthMaterial){m.opacity.value=c.opacity;m.diffuse.value=c.color;c.emissive&&m.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);
-m.map.value=c.map;m.specularMap.value=c.specularMap;m.alphaMap.value=c.alphaMap;c.aoMap&&(m.aoMap.value=c.aoMap,m.aoMapIntensity.value=c.aoMapIntensity);var r;c.map?r=c.map:c.specularMap?r=c.specularMap:c.displacementMap?r=c.displacementMap:c.normalMap?r=c.normalMap:c.bumpMap?r=c.bumpMap:c.roughnessMap?r=c.roughnessMap:c.metalnessMap?r=c.metalnessMap:c.alphaMap?r=c.alphaMap:c.emissiveMap&&(r=c.emissiveMap);void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),b=r.offset,r=r.repeat,m.offsetRepeat.value.set(b.x,
-b.y,r.x,r.y));m.envMap.value=c.envMap;m.flipEnvMap.value=c.envMap&&c.envMap.isCubeTexture?-1:1;m.reflectivity.value=c.reflectivity;m.refractionRatio.value=c.refractionRatio}c.isLineBasicMaterial?(m.diffuse.value=c.color,m.opacity.value=c.opacity):c.isLineDashedMaterial?(m.diffuse.value=c.color,m.opacity.value=c.opacity,m.dashSize.value=c.dashSize,m.totalSize.value=c.dashSize+c.gapSize,m.scale.value=c.scale):c.isPointsMaterial?(m.diffuse.value=c.color,m.opacity.value=c.opacity,m.size.value=c.size*
-Qa,m.scale.value=.5*pc,m.map.value=c.map,null!==c.map&&(r=c.map.offset,c=c.map.repeat,m.offsetRepeat.value.set(r.x,r.y,c.x,c.y))):c.isMeshLambertMaterial?(c.lightMap&&(m.lightMap.value=c.lightMap,m.lightMapIntensity.value=c.lightMapIntensity),c.emissiveMap&&(m.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(m.specular.value=c.specular,m.shininess.value=Math.max(c.shininess,1E-4),c.lightMap&&(m.lightMap.value=c.lightMap,m.lightMapIntensity.value=c.lightMapIntensity),c.emissiveMap&&(m.emissiveMap.value=
-c.emissiveMap),c.bumpMap&&(m.bumpMap.value=c.bumpMap,m.bumpScale.value=c.bumpScale),c.normalMap&&(m.normalMap.value=c.normalMap,m.normalScale.value.copy(c.normalScale)),c.displacementMap&&(m.displacementMap.value=c.displacementMap,m.displacementScale.value=c.displacementScale,m.displacementBias.value=c.displacementBias)):c.isMeshPhysicalMaterial?(m.clearCoat.value=c.clearCoat,m.clearCoatRoughness.value=c.clearCoatRoughness,D(m,c)):c.isMeshStandardMaterial?D(m,c):c.isMeshDepthMaterial?c.displacementMap&&
-(m.displacementMap.value=c.displacementMap,m.displacementScale.value=c.displacementScale,m.displacementBias.value=c.displacementBias):c.isMeshNormalMaterial&&(m.opacity.value=c.opacity);Ya.upload(A,e.uniformsList,m,S)}k.set(A,d,"modelViewMatrix");k.set(A,d,"normalMatrix");k.setValue(A,"modelMatrix",d.matrixWorld);return h}function D(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);
-b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}function u(a){var b;
-if(1E3===a)return A.REPEAT;if(1001===a)return A.CLAMP_TO_EDGE;if(1002===a)return A.MIRRORED_REPEAT;if(1003===a)return A.NEAREST;if(1004===a)return A.NEAREST_MIPMAP_NEAREST;if(1005===a)return A.NEAREST_MIPMAP_LINEAR;if(1006===a)return A.LINEAR;if(1007===a)return A.LINEAR_MIPMAP_NEAREST;if(1008===a)return A.LINEAR_MIPMAP_LINEAR;if(1009===a)return A.UNSIGNED_BYTE;if(1017===a)return A.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return A.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return A.UNSIGNED_SHORT_5_6_5;if(1010===
-a)return A.BYTE;if(1011===a)return A.SHORT;if(1012===a)return A.UNSIGNED_SHORT;if(1013===a)return A.INT;if(1014===a)return A.UNSIGNED_INT;if(1015===a)return A.FLOAT;if(1016===a&&(b=ka.get("OES_texture_half_float"),null!==b))return b.HALF_FLOAT_OES;if(1021===a)return A.ALPHA;if(1022===a)return A.RGB;if(1023===a)return A.RGBA;if(1024===a)return A.LUMINANCE;if(1025===a)return A.LUMINANCE_ALPHA;if(1026===a)return A.DEPTH_COMPONENT;if(1027===a)return A.DEPTH_STENCIL;if(100===a)return A.FUNC_ADD;if(101===
-a)return A.FUNC_SUBTRACT;if(102===a)return A.FUNC_REVERSE_SUBTRACT;if(200===a)return A.ZERO;if(201===a)return A.ONE;if(202===a)return A.SRC_COLOR;if(203===a)return A.ONE_MINUS_SRC_COLOR;if(204===a)return A.SRC_ALPHA;if(205===a)return A.ONE_MINUS_SRC_ALPHA;if(206===a)return A.DST_ALPHA;if(207===a)return A.ONE_MINUS_DST_ALPHA;if(208===a)return A.DST_COLOR;if(209===a)return A.ONE_MINUS_DST_COLOR;if(210===a)return A.SRC_ALPHA_SATURATE;if(2001===a||2002===a||2003===a||2004===a)if(b=ka.get("WEBGL_compressed_texture_s3tc"),
-null!==b){if(2001===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===a||2101===a||2102===a||2103===a)if(b=ka.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(2100===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===
-a&&(b=ka.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(103===a||104===a)if(b=ka.get("EXT_blend_minmax"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=ka.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}console.log("THREE.WebGLRenderer","82");a=a||{};var v=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),I=void 0!==a.context?a.context:null,y=void 0!==a.alpha?a.alpha:
-!1,E=void 0!==a.depth?a.depth:!0,H=void 0!==a.stencil?a.stencil:!0,F=void 0!==a.antialias?a.antialias:!1,M=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,ca=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,K=[],B=[],C=-1,z=[],Ka=-1,N=new Float32Array(8),P=[],R=[];this.domElement=v;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=
-this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var S=this,Q=null,V=null,T=null,L=-1,U="",W=null,X=new ga,fb=null,$a=new ga,da=0,Da=new O(0),Ra=0,Pa=v.width,pc=v.height,Qa=1,ha=new ga(0,0,Pa,pc),la=!1,fa=new ga(0,0,Pa,pc),oa=new nc,ba=new Bf,pa=!1,sa=!1,na=new Ca,ra=new J,Z=new q,aa={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],
-spotShadowMatrix:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},ma={calls:0,vertices:0,faces:0,points:0};this.info={render:ma,memory:{geometries:0,textures:0},programs:null};var A;try{y={alpha:y,depth:E,stencil:H,antialias:F,premultipliedAlpha:M,preserveDrawingBuffer:ca};A=I||v.getContext("webgl",y)||v.getContext("experimental-webgl",y);if(null===A){if(null!==v.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";throw"Error creating WebGL context.";
-}void 0===A.getShaderPrecisionFormat&&(A.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});v.addEventListener("webglcontextlost",e,!1)}catch(Cf){console.error("THREE.WebGLRenderer: "+Cf)}var ka=new Af(A);ka.get("WEBGL_depth_texture");ka.get("OES_texture_float");ka.get("OES_texture_float_linear");ka.get("OES_texture_half_float");ka.get("OES_texture_half_float_linear");ka.get("OES_standard_derivatives");ka.get("ANGLE_instanced_arrays");ka.get("OES_element_index_uint")&&
-(G.MaxIndex=4294967296);var ia=new zf(A,ka,a),Y=new yf(A,ka,u),ea=new xf,ua=new wf(A,ka,Y,ea,ia,u,this.info),qa=new vf(A,ea,this.info),va=new tf(this,ia),za=new lf;this.info.programs=va.programs;var Ga=new kf(A,ka,ma),Ha=new jf(A,ka,ma),Ia=new Hb(-1,1,1,-1,0,1),wa=new Ea,Ba=new ya(new ib(2,2),new Ma({depthTest:!1,depthWrite:!1,fog:!1}));a=Gb.cube;var xa=new ya(new hb(5,5,5),new Fa({uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}));
-c();this.context=A;this.capabilities=ia;this.extensions=ka;this.properties=ea;this.state=Y;var Ja=new pe(this,aa,qa,ia);this.shadowMap=Ja;var Na=new hf(this,P),Oa=new ff(this,R);this.getContext=function(){return A};this.getContextAttributes=function(){return A.getContextAttributes()};this.forceContextLoss=function(){ka.get("WEBGL_lose_context").loseContext()};this.getMaxAnisotropy=function(){return ia.getMaxAnisotropy()};this.getPrecision=function(){return ia.precision};this.getPixelRatio=function(){return Qa};
-this.setPixelRatio=function(a){void 0!==a&&(Qa=a,this.setSize(fa.z,fa.w,!1))};this.getSize=function(){return{width:Pa,height:pc}};this.setSize=function(a,b,c){Pa=a;pc=b;v.width=a*Qa;v.height=b*Qa;!1!==c&&(v.style.width=a+"px",v.style.height=b+"px");this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){Y.viewport(fa.set(a,b,c,d))};this.setScissor=function(a,b,c,d){Y.scissor(ha.set(a,b,c,d))};this.setScissorTest=function(a){Y.setScissorTest(la=a)};this.getClearColor=function(){return Da};this.setClearColor=
-function(a,c){Da.set(a);Ra=void 0!==c?c:1;b(Da.r,Da.g,Da.b,Ra)};this.getClearAlpha=function(){return Ra};this.setClearAlpha=function(a){Ra=a;b(Da.r,Da.g,Da.b,Ra)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=A.COLOR_BUFFER_BIT;if(void 0===b||b)d|=A.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=A.STENCIL_BUFFER_BIT;A.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,
-b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.resetGLState=d;this.dispose=function(){z=[];Ka=-1;B=[];C=-1;v.removeEventListener("webglcontextlost",e,!1)};this.renderBufferImmediate=function(a,b,c){Y.initAttributes();var d=ea.get(a);a.hasPositions&&!d.position&&(d.position=A.createBuffer());a.hasNormals&&!d.normal&&(d.normal=A.createBuffer());a.hasUvs&&!d.uv&&(d.uv=A.createBuffer());a.hasColors&&!d.color&&(d.color=A.createBuffer());b=b.getAttributes();a.hasPositions&&(A.bindBuffer(A.ARRAY_BUFFER,
-d.position),A.bufferData(A.ARRAY_BUFFER,a.positionArray,A.DYNAMIC_DRAW),Y.enableAttribute(b.position),A.vertexAttribPointer(b.position,3,A.FLOAT,!1,0,0));if(a.hasNormals){A.bindBuffer(A.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&1===c.shading)for(var e=0,f=3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,m=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=m;g[e+3]=h;g[e+4]=k;g[e+5]=m;g[e+6]=h;g[e+7]=k;g[e+8]=m}A.bufferData(A.ARRAY_BUFFER,
-a.normalArray,A.DYNAMIC_DRAW);Y.enableAttribute(b.normal);A.vertexAttribPointer(b.normal,3,A.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(A.bindBuffer(A.ARRAY_BUFFER,d.uv),A.bufferData(A.ARRAY_BUFFER,a.uvArray,A.DYNAMIC_DRAW),Y.enableAttribute(b.uv),A.vertexAttribPointer(b.uv,2,A.FLOAT,!1,0,0));a.hasColors&&0!==c.vertexColors&&(A.bindBuffer(A.ARRAY_BUFFER,d.color),A.bufferData(A.ARRAY_BUFFER,a.colorArray,A.DYNAMIC_DRAW),Y.enableAttribute(b.color),A.vertexAttribPointer(b.color,3,A.FLOAT,!1,0,0));Y.disableUnusedAttributes();
-A.drawArrays(A.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){l(d);var g=t(a,b,d,e),k=!1;a=c.id+"_"+g.id+"_"+d.wireframe;a!==U&&(U=a,k=!0);b=e.morphTargetInfluences;if(void 0!==b){var m=[];a=0;for(var p=b.length;a<p;a++)k=b[a],m.push([k,a]);m.sort(h);8<m.length&&(m.length=8);var n=c.morphAttributes;a=0;for(p=m.length;a<p;a++)k=m[a],N[a]=k[0],0!==k[0]?(b=k[1],!0===d.morphTargets&&n.position&&c.addAttribute("morphTarget"+a,n.position[b]),!0===d.morphNormals&&n.normal&&
-c.addAttribute("morphNormal"+a,n.normal[b])):(!0===d.morphTargets&&c.removeAttribute("morphTarget"+a),!0===d.morphNormals&&c.removeAttribute("morphNormal"+a));a=m.length;for(b=N.length;a<b;a++)N[a]=0;g.getUniforms().setValue(A,"morphTargetInfluences",N);k=!0}b=c.index;p=c.attributes.position;m=1;!0===d.wireframe&&(b=qa.getWireframeAttribute(c),m=2);null!==b?(a=Ha,a.setIndex(b)):a=Ga;if(k){a:{var k=void 0,w;if(c&&c.isInstancedBufferGeometry&&(w=ka.get("ANGLE_instanced_arrays"),null===w)){console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
-break a}void 0===k&&(k=0);Y.initAttributes();var n=c.attributes,g=g.getAttributes(),r=d.defaultAttributeValues,v;for(v in g){var q=g[v];if(0<=q){var u=n[v];if(void 0!==u){var y=A.FLOAT,D=u.array,H=u.normalized;D instanceof Float32Array?y=A.FLOAT:D instanceof Float64Array?console.warn("Unsupported data buffer format: Float64Array"):D instanceof Uint16Array?y=A.UNSIGNED_SHORT:D instanceof Int16Array?y=A.SHORT:D instanceof Uint32Array?y=A.UNSIGNED_INT:D instanceof Int32Array?y=A.INT:D instanceof Int8Array?
-y=A.BYTE:D instanceof Uint8Array&&(y=A.UNSIGNED_BYTE);var D=u.itemSize,F=qa.getAttributeBuffer(u);if(u.isInterleavedBufferAttribute){var I=u.data,E=I.stride,u=u.offset;I&&I.isInstancedInterleavedBuffer?(Y.enableAttributeAndDivisor(q,I.meshPerAttribute,w),void 0===c.maxInstancedCount&&(c.maxInstancedCount=I.meshPerAttribute*I.count)):Y.enableAttribute(q);A.bindBuffer(A.ARRAY_BUFFER,F);A.vertexAttribPointer(q,D,y,H,E*I.array.BYTES_PER_ELEMENT,(k*E+u)*I.array.BYTES_PER_ELEMENT)}else u.isInstancedBufferAttribute?
-(Y.enableAttributeAndDivisor(q,u.meshPerAttribute,w),void 0===c.maxInstancedCount&&(c.maxInstancedCount=u.meshPerAttribute*u.count)):Y.enableAttribute(q),A.bindBuffer(A.ARRAY_BUFFER,F),A.vertexAttribPointer(q,D,y,H,0,k*D*u.array.BYTES_PER_ELEMENT)}else if(void 0!==r&&(y=r[v],void 0!==y))switch(y.length){case 2:A.vertexAttrib2fv(q,y);break;case 3:A.vertexAttrib3fv(q,y);break;case 4:A.vertexAttrib4fv(q,y);break;default:A.vertexAttrib1fv(q,y)}}}Y.disableUnusedAttributes()}null!==b&&A.bindBuffer(A.ELEMENT_ARRAY_BUFFER,
-qa.getAttributeBuffer(b))}w=0;null!==b?w=b.count:void 0!==p&&(w=p.count);b=c.drawRange.start*m;p=null!==f?f.start*m:0;v=Math.max(b,p);f=Math.max(0,Math.min(w,b+c.drawRange.count*m,p+(null!==f?f.count*m:Infinity))-1-v+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)Y.setLineWidth(d.wireframeLinewidth*(null===V?Qa:1)),a.setMode(A.LINES);else switch(e.drawMode){case 0:a.setMode(A.TRIANGLES);break;case 1:a.setMode(A.TRIANGLE_STRIP);break;case 2:a.setMode(A.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===
-d&&(d=1),Y.setLineWidth(d*(null===V?Qa:1)),e.isLineSegments?a.setMode(A.LINES):a.setMode(A.LINE_STRIP)):e.isPoints&&a.setMode(A.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,v,f):a.render(v,f)}};this.render=function(a,c,d,e){if(void 0!==c&&!0!==c.isCamera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{U="";L=-1;W=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===c.parent&&c.updateMatrixWorld();c.matrixWorldInverse.getInverse(c.matrixWorld);
-ra.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse);oa.setFromMatrix(ra);K.length=0;Ka=C=-1;P.length=0;R.length=0;sa=this.localClippingEnabled;pa=ba.init(this.clippingPlanes,sa,c);p(a,c);B.length=C+1;z.length=Ka+1;!0===S.sortObjects&&(B.sort(k),z.sort(m));pa&&ba.beginShadows();for(var f=K,g=0,h=0,n=f.length;h<n;h++){var w=f[h];w.castShadow&&(aa.shadows[g++]=w)}aa.shadows.length=g;Ja.render(a,c);for(var f=K,l=w=0,x=0,t,v,q,u,y=c.matrixWorldInverse,D=0,H=0,F=0,I=0,g=0,h=f.length;g<h;g++)if(n=
-f[g],t=n.color,v=n.intensity,q=n.distance,u=n.shadow&&n.shadow.map?n.shadow.map.texture:null,n.isAmbientLight)w+=t.r*v,l+=t.g*v,x+=t.b*v;else if(n.isDirectionalLight){var E=za.get(n);E.color.copy(n.color).multiplyScalar(n.intensity);E.direction.setFromMatrixPosition(n.matrixWorld);Z.setFromMatrixPosition(n.target.matrixWorld);E.direction.sub(Z);E.direction.transformDirection(y);if(E.shadow=n.castShadow)E.shadowBias=n.shadow.bias,E.shadowRadius=n.shadow.radius,E.shadowMapSize=n.shadow.mapSize;aa.directionalShadowMap[D]=
-u;aa.directionalShadowMatrix[D]=n.shadow.matrix;aa.directional[D++]=E}else if(n.isSpotLight){E=za.get(n);E.position.setFromMatrixPosition(n.matrixWorld);E.position.applyMatrix4(y);E.color.copy(t).multiplyScalar(v);E.distance=q;E.direction.setFromMatrixPosition(n.matrixWorld);Z.setFromMatrixPosition(n.target.matrixWorld);E.direction.sub(Z);E.direction.transformDirection(y);E.coneCos=Math.cos(n.angle);E.penumbraCos=Math.cos(n.angle*(1-n.penumbra));E.decay=0===n.distance?0:n.decay;if(E.shadow=n.castShadow)E.shadowBias=
-n.shadow.bias,E.shadowRadius=n.shadow.radius,E.shadowMapSize=n.shadow.mapSize;aa.spotShadowMap[F]=u;aa.spotShadowMatrix[F]=n.shadow.matrix;aa.spot[F++]=E}else if(n.isPointLight){E=za.get(n);E.position.setFromMatrixPosition(n.matrixWorld);E.position.applyMatrix4(y);E.color.copy(n.color).multiplyScalar(n.intensity);E.distance=n.distance;E.decay=0===n.distance?0:n.decay;if(E.shadow=n.castShadow)E.shadowBias=n.shadow.bias,E.shadowRadius=n.shadow.radius,E.shadowMapSize=n.shadow.mapSize;aa.pointShadowMap[H]=
-u;void 0===aa.pointShadowMatrix[H]&&(aa.pointShadowMatrix[H]=new J);Z.setFromMatrixPosition(n.matrixWorld).negate();aa.pointShadowMatrix[H].identity().setPosition(Z);aa.point[H++]=E}else n.isHemisphereLight&&(E=za.get(n),E.direction.setFromMatrixPosition(n.matrixWorld),E.direction.transformDirection(y),E.direction.normalize(),E.skyColor.copy(n.color).multiplyScalar(v),E.groundColor.copy(n.groundColor).multiplyScalar(v),aa.hemi[I++]=E);aa.ambient[0]=w;aa.ambient[1]=l;aa.ambient[2]=x;aa.directional.length=
-D;aa.spot.length=F;aa.point.length=H;aa.hemi.length=I;aa.hash=D+","+H+","+F+","+I+","+aa.shadows.length;pa&&ba.endShadows();ma.calls=0;ma.vertices=0;ma.faces=0;ma.points=0;void 0===d&&(d=null);this.setRenderTarget(d);f=a.background;null===f?b(Da.r,Da.g,Da.b,Ra):f&&f.isColor&&(b(f.r,f.g,f.b,1),e=!0);(this.autoClear||e)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);f&&f.isCubeTexture?(wa.projectionMatrix.copy(c.projectionMatrix),wa.matrixWorld.extractRotation(c.matrixWorld),
-wa.matrixWorldInverse.getInverse(wa.matrixWorld),xa.material.uniforms.tCube.value=f,xa.modelViewMatrix.multiplyMatrices(wa.matrixWorldInverse,xa.matrixWorld),qa.update(xa),S.renderBufferDirect(wa,null,xa.geometry,xa.material,xa,null)):f&&f.isTexture&&(Ba.material.map=f,qa.update(Ba),S.renderBufferDirect(Ia,null,Ba.geometry,Ba.material,Ba,null));a.overrideMaterial?(e=a.overrideMaterial,r(B,a,c,e),r(z,a,c,e)):(Y.setBlending(0),r(B,a,c),r(z,a,c));Na.render(a,c);Oa.render(a,c,$a);d&&ua.updateRenderTargetMipmap(d);
-Y.setDepthTest(!0);Y.setDepthWrite(!0);Y.setColorWrite(!0)}};this.setFaceCulling=function(a,b){Y.setCullFace(a);Y.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=da;a>=ia.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+ia.maxTextures);da+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),
-a=!0),b=b.texture);ua.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ua.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&
-6===b.image.length?ua.setTextureCube(b,c):ua.setTextureCubeDynamic(b,c)}}();this.getCurrentRenderTarget=function(){return V};this.setRenderTarget=function(a){(V=a)&&void 0===ea.get(a).__webglFramebuffer&&ua.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ea.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,X.copy(a.scissor),fb=a.scissorTest,$a.copy(a.viewport)):(c=null,X.copy(ha).multiplyScalar(Qa),fb=la,$a.copy(fa).multiplyScalar(Qa));T!==c&&(A.bindFramebuffer(A.FRAMEBUFFER,
-c),T=c);Y.scissor(X);Y.setScissorTest(fb);Y.viewport($a);b&&(b=ea.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(!1===(a&&a.isWebGLRenderTarget))console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");else{var g=ea.get(a).__webglFramebuffer;if(g){var h=!1;g!==T&&(A.bindFramebuffer(A.FRAMEBUFFER,
-g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&u(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||u(n)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ka.get("OES_texture_float")||ka.get("WEBGL_color_buffer_float"))||1016===n&&ka.get("EXT_color_buffer_half_float")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&&
-b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,u(m),u(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,T)}}}}}function Ib(a,b){this.name="";this.color=new O(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name="";this.color=
-new O(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function jb(){z.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Ed(a,b,c,d,e){z.call(this);this.lensFlares=[];this.positionScreen=new q;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function kb(a){U.call(this);this.type="SpriteMaterial";this.color=new O(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function qc(a){z.call(this);
-this.type="Sprite";this.material=void 0!==a?a:new kb}function rc(){z.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function lb(a,b,c,d,e,f,g,h,k,m,w,n){da.call(this,null,f,g,h,k,m,d,e,w,n);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function bd(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new J;a=a||[];this.bones=a.slice(0);
-this.useVertexTexture?(a=Math.sqrt(4*this.bones.length),a=T.nextPowerOfTwo(Math.ceil(a)),this.boneTextureHeight=this.boneTextureWidth=a=Math.max(a,4),this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new lb(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,1023,1015)):this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton bonInverses is the wrong length."),
-this.boneInverses=[],b=0,a=this.bones.length;b<a;b++)this.boneInverses.push(new J)}function cd(a){z.call(this);this.type="Bone";this.skin=a}function dd(a,b,c){ya.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new J;this.bindMatrixInverse=new J;a=[];if(this.geometry&&void 0!==this.geometry.bones){for(var d,e=0,f=this.geometry.bones.length;e<f;++e)d=this.geometry.bones[e],b=new cd(this),a.push(b),b.name=d.name,b.position.fromArray(d.pos),b.quaternion.fromArray(d.rotq),
-void 0!==d.scl&&b.scale.fromArray(d.scl);e=0;for(f=this.geometry.bones.length;e<f;++e)d=this.geometry.bones[e],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?a[d.parent].add(a[e]):this.add(a[e])}this.normalizeSkinWeights();this.updateMatrixWorld(!0);this.bind(new bd(a,void 0,c),this.matrixWorld)}function oa(a){U.call(this);this.type="LineBasicMaterial";this.color=new O(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;this.setValues(a)}function Ta(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),
-new la(a,b);z.call(this);this.type="Line";this.geometry=void 0!==a?a:new G;this.material=void 0!==b?b:new oa({color:16777215*Math.random()})}function la(a,b){Ta.call(this,a,b);this.type="LineSegments"}function xa(a){U.call(this);this.type="PointsMaterial";this.color=new O(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Kb(a,b){z.call(this);this.type="Points";this.geometry=void 0!==a?a:new G;this.material=void 0!==b?b:new xa({color:16777215*Math.random()})}
-function sc(){z.call(this);this.type="Group"}function ed(a,b,c,d,e,f,g,h,k){function m(){requestAnimationFrame(m);a.readyState>=a.HAVE_CURRENT_DATA&&(w.needsUpdate=!0)}da.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var w=this;m()}function Lb(a,b,c,d,e,f,g,h,k,m,w,n){da.call(this,null,f,g,h,k,m,d,e,w,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function fd(a,b,c,d,e,f,g,h,k){da.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function tc(a,b,c,d,e,f,g,
-h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");da.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.type=void 0!==c?c:1012;this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Mb(a){function b(a,b){return a-b}G.call(this);var c=[0,0],d={},e=["a","b","c"];if(a&&a.isGeometry){var f=a.vertices,g=a.faces,h=0,k=new Uint32Array(6*g.length);
-a=0;for(var m=g.length;a<m;a++)for(var w=g[a],n=0;3>n;n++){c[0]=w[e[n]];c[1]=w[e[(n+1)%3]];c.sort(b);var p=c.toString();void 0===d[p]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[p]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;a<m;a++)for(n=0;2>n;n++)d=f[k[2*a+n]],h=6*a+3*n,c[h+0]=d.x,c[h+1]=d.y,c[h+2]=d.z;this.addAttribute("position",new C(c,3))}else if(a&&a.isBufferGeometry){if(null!==a.index){m=a.index.array;f=a.attributes.position;e=a.groups;h=0;0===e.length&&a.addGroup(0,m.length);k=new Uint32Array(2*m.length);
-g=0;for(w=e.length;g<w;++g){a=e[g];n=a.start;p=a.count;a=n;for(var r=n+p;a<r;a+=3)for(n=0;3>n;n++)c[0]=m[a+n],c[1]=m[a+(n+1)%3],c.sort(b),p=c.toString(),void 0===d[p]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[p]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;a<m;a++)for(n=0;2>n;n++)h=6*a+3*n,d=k[2*a+n],c[h+0]=f.getX(d),c[h+1]=f.getY(d),c[h+2]=f.getZ(d)}else for(f=a.attributes.position.array,h=f.length/3,k=h/3,c=new Float32Array(6*h),a=0,m=k;a<m;a++)for(n=0;3>n;n++)h=18*a+6*n,k=9*a+3*n,c[h+0]=f[k],c[h+1]=f[k+1],
-c[h+2]=f[k+2],d=9*a+(n+1)%3*3,c[h+3]=f[d],c[h+4]=f[d+1],c[h+5]=f[d+2];this.addAttribute("position",new C(c,3))}}function Nb(a,b,c){G.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f,g,h,k,m,w=b+1;for(f=0;f<=c;f++)for(m=f/c,g=0;g<=b;g++)k=g/b,h=a(k,m),d.push(h.x,h.y,h.z),e.push(k,m);a=[];var n;for(f=0;f<c;f++)for(g=0;g<b;g++)h=f*w+g,k=f*w+g+1,m=(f+1)*w+g+1,n=(f+1)*w+g,a.push(h,k,n),a.push(k,m,n);this.setIndex((65535<a.length?$c:Zc)(a,1));this.addAttribute("position",
-ha(d,3));this.addAttribute("uv",ha(e,2));this.computeVertexNormals()}function uc(a,b,c){Q.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function ua(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){var d=3*b;c.x=a[d+0];c.y=a[d+1];c.z=a[d+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}G.call(this);this.type="PolyhedronBufferGeometry";this.parameters=
-{vertices:a,indices:b,radius:c,detail:d};c=c||1;var h=[],k=[];(function(a){for(var c=new q,d=new q,g=new q,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k=c,l=d,D=g,u=Math.pow(2,a),v=[],I,y;for(I=0;I<=u;I++){v[I]=[];var E=k.clone().lerp(D,I/u),H=l.clone().lerp(D,I/u),F=u-I;for(y=0;y<=F;y++)v[I][y]=0===y&&I===u?E:E.clone().lerp(H,y/F)}for(I=0;I<u;I++)for(y=0;y<2*(u-I)-1;y++)k=Math.floor(y/2),0===y%2?(e(v[I][k+1]),e(v[I+1][k]),e(v[I][k])):(e(v[I][k+1]),e(v[I+1][k+1]),e(v[I+1][k]))}})(d||
-0);(function(a){for(var b=new q,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new q,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new q,b=new q,c=new q,d=new q,e=new B,f=new B,l=new B,D=0,u=0;D<h.length;D+=9,u+=6){a.set(h[D+0],h[D+1],h[D+2]);b.set(h[D+3],h[D+4],h[D+5]);c.set(h[D+6],h[D+
-7],h[D+8]);e.set(k[u+0],k[u+1]);f.set(k[u+2],k[u+3]);l.set(k[u+4],k[u+5]);d.copy(a).add(b).add(c).divideScalar(3);var v=Math.atan2(d.z,-d.x);g(e,u+0,a,v);g(f,u+2,b,v);g(l,u+4,c,v)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",ha(h,3));this.addAttribute("normal",ha(h.slice(),3));this.addAttribute("uv",ha(k,2));this.normalizeNormals();this.boundingSphere=new Ca(new q,
-c)}function Ob(a,b){ua.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function vc(a,b){Q.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Pb(a,b){ua.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters=
-{radius:a,detail:b}}function wc(a,b){Q.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2;ua.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters=
-{radius:a,detail:b}}function xc(a,b){Q.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Rb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;ua.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,
-6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function yc(a,b){Q.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rb(a,b));this.mergeVertices()}function zc(a,b,c,d){Q.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};
-this.fromBufferGeometry(new ua(a,b,c,d));this.mergeVertices()}function Sb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(n=0;n<=d;n++){var w=n/d*Math.PI*2,l=Math.sin(w),w=-Math.cos(w);k.x=w*m.x+l*e.x;k.y=w*m.y+l*e.y;k.z=w*m.z+l*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;p.push(h.x,h.y,h.z)}}G.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||
-1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new q,k=new q,m=new B,w,n,p=[],r=[],l=[],t=[];for(w=0;w<b;w++)f(w);f(!1===e?b:0);for(w=0;w<=b;w++)for(n=0;n<=d;n++)m.x=w/b,m.y=n/d,l.push(m.x,m.y);(function(){for(n=1;n<=b;n++)for(w=1;w<=d;w++){var a=(d+1)*n+(w-1),c=(d+1)*n+w,e=(d+1)*(n-1)+w;t.push((d+1)*(n-1)+(w-1),a,e);t.push(a,c,e)}})();this.setIndex((65535<t.length?$c:Zc)(t,1));this.addAttribute("position",ha(p,3));
-this.addAttribute("normal",ha(r,3));this.addAttribute("uv",ha(l,2))}function Ac(a,b,c,d,e,f){Q.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Sb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Tb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);
-e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}G.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||100;b=b||40;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=(d+1)*(c+1),k=d*c*6,k=new C(new (65535<k?Uint32Array:Uint16Array)(k),1),m=new C(new Float32Array(3*h),3),w=new C(new Float32Array(3*h),3),h=new C(new Float32Array(2*h),2),n,p,r=0,l=0,t=new q,D=new q,u=new B,v=new q,I=new q,y=new q,E=new q,
-H=new q;for(n=0;n<=c;++n)for(p=n/c*e*Math.PI*2,g(p,e,f,a,v),g(p+.01,e,f,a,I),E.subVectors(I,v),H.addVectors(I,v),y.crossVectors(E,H),H.crossVectors(y,E),y.normalize(),H.normalize(),p=0;p<=d;++p){var F=p/d*Math.PI*2,M=-b*Math.cos(F),F=b*Math.sin(F);t.x=v.x+(M*H.x+F*y.x);t.y=v.y+(M*H.y+F*y.y);t.z=v.z+(M*H.z+F*y.z);m.setXYZ(r,t.x,t.y,t.z);D.subVectors(t,v).normalize();w.setXYZ(r,D.x,D.y,D.z);u.x=n/c;u.y=p/d;h.setXY(r,u.x,u.y);r++}for(p=1;p<=c;p++)for(n=1;n<=d;n++)a=(d+1)*p+(n-1),b=(d+1)*p+n,e=(d+1)*
-(p-1)+n,k.setX(l,(d+1)*(p-1)+(n-1)),l++,k.setX(l,a),l++,k.setX(l,e),l++,k.setX(l,a),l++,k.setX(l,b),l++,k.setX(l,e),l++;this.setIndex(k);this.addAttribute("position",m);this.addAttribute("normal",w);this.addAttribute("uv",h)}function Bc(a,b,c,d,e,f,g){Q.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");this.fromBufferGeometry(new Tb(a,
-b,c,d,e,f));this.mergeVertices()}function Ub(a,b,c,d,e){G.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=b||40;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=(c+1)*(d+1),g=c*d*6,g=new (65535<g?Uint32Array:Uint16Array)(g),h=new Float32Array(3*f),k=new Float32Array(3*f),f=new Float32Array(2*f),m=0,w=0,n=0,p=new q,r=new q,l=new q,t,D;for(t=0;t<=c;t++)for(D=0;D<=d;D++){var u=D/d*e,v=t/c*Math.PI*2;r.x=(a+b*Math.cos(v))*
-Math.cos(u);r.y=(a+b*Math.cos(v))*Math.sin(u);r.z=b*Math.sin(v);h[m]=r.x;h[m+1]=r.y;h[m+2]=r.z;p.x=a*Math.cos(u);p.y=a*Math.sin(u);l.subVectors(r,p).normalize();k[m]=l.x;k[m+1]=l.y;k[m+2]=l.z;f[w]=D/d;f[w+1]=t/c;m+=3;w+=2}for(t=1;t<=c;t++)for(D=1;D<=d;D++)a=(d+1)*(t-1)+D-1,b=(d+1)*(t-1)+D,e=(d+1)*t+D,g[n]=(d+1)*t+D-1,g[n+1]=a,g[n+2]=e,g[n+3]=a,g[n+4]=b,g[n+5]=e,n+=6;this.setIndex(new C(g,1));this.addAttribute("position",new C(h,3));this.addAttribute("normal",new C(k,3));this.addAttribute("uv",new C(f,
-2))}function Cc(a,b,c,d,e){Q.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Ub(a,b,c,d,e))}function za(a,b){"undefined"!==typeof a&&(Q.call(this),this.type="ExtrudeGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeFaceNormals())}function Dc(a,b){b=b||{};var c=b.font;if(!1===(c&&c.isFont))return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new Q;
-c=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);za.call(this,c,b);this.type="TextGeometry"}function mb(a,b,c,d,e,f,g){G.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||50;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||
-6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;for(var h=f+g,k=(b+1)*(c+1),m=new C(new Float32Array(3*k),3),w=new C(new Float32Array(3*k),3),k=new C(new Float32Array(2*k),2),n=0,p=[],l=new q,x=0;x<=c;x++){for(var t=[],D=x/c,u=0;u<=b;u++){var v=u/b,I=-a*Math.cos(d+v*e)*Math.sin(f+D*g),y=a*Math.cos(f+D*g),E=a*Math.sin(d+v*e)*Math.sin(f+D*g);l.set(I,y,E).normalize();m.setXYZ(n,I,y,E);w.setXYZ(n,l.x,l.y,l.z);k.setXY(n,v,1-D);t.push(n);n++}p.push(t)}d=[];for(x=0;x<
-c;x++)for(u=0;u<b;u++)e=p[x][u+1],g=p[x][u],n=p[x+1][u],l=p[x+1][u+1],(0!==x||0<f)&&d.push(e,g,l),(x!==c-1||h<Math.PI)&&d.push(g,n,l);this.setIndex(new (65535<m.count?$c:Zc)(d,1));this.addAttribute("position",m);this.addAttribute("normal",w);this.addAttribute("uv",k);this.boundingSphere=new Ca(new q,a)}function Vb(a,b,c,d,e,f,g){Q.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new mb(a,
-b,c,d,e,f,g))}function Wb(a,b,c,d,e,f){G.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||20;b=b||50;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=(c+1)*(d+1),h=c*d*6,h=new C(new (65535<h?Uint32Array:Uint16Array)(h),1),k=new C(new Float32Array(3*g),3),m=new C(new Float32Array(3*g),3),g=new C(new Float32Array(2*g),2),w=0,n=0,p,l=a,x=(b-a)/
-d,t=new q,D=new B,u;for(a=0;a<=d;a++){for(u=0;u<=c;u++)p=e+u/c*f,t.x=l*Math.cos(p),t.y=l*Math.sin(p),k.setXYZ(w,t.x,t.y,t.z),m.setXYZ(w,0,0,1),D.x=(t.x/b+1)/2,D.y=(t.y/b+1)/2,g.setXY(w,D.x,D.y),w++;l+=x}for(a=0;a<d;a++)for(b=a*(c+1),u=0;u<c;u++)e=p=u+b,f=p+c+1,w=p+c+2,p+=1,h.setX(n,e),n++,h.setX(n,f),n++,h.setX(n,w),n++,h.setX(n,e),n++,h.setX(n,w),n++,h.setX(n,p),n++;this.setIndex(h);this.addAttribute("position",k);this.addAttribute("normal",m);this.addAttribute("uv",g)}function Ec(a,b,c,d,e,f){Q.call(this);
-this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Wb(a,b,c,d,e,f))}function Fc(a,b,c,d){Q.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new ib(a,b,c,d))}function Xb(a,b,c,d){G.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||
-2*Math.PI;d=T.clamp(d,0,2*Math.PI);for(var e=(b+1)*a.length,f=b*a.length*6,g=new C(new (65535<f?Uint32Array:Uint16Array)(f),1),h=new C(new Float32Array(3*e),3),k=new C(new Float32Array(2*e),2),m=0,w=0,n=1/b,p=new q,l=new B,e=0;e<=b;e++)for(var f=c+e*n*d,x=Math.sin(f),t=Math.cos(f),f=0;f<=a.length-1;f++)p.x=a[f].x*x,p.y=a[f].y,p.z=a[f].x*t,h.setXYZ(m,p.x,p.y,p.z),l.x=e/b,l.y=f/(a.length-1),k.setXY(m,l.x,l.y),m++;for(e=0;e<b;e++)for(f=0;f<a.length-1;f++)c=f+e*a.length,m=c+a.length,n=c+a.length+1,p=
-c+1,g.setX(w,c),w++,g.setX(w,m),w++,g.setX(w,p),w++,g.setX(w,m),w++,g.setX(w,n),w++,g.setX(w,p),w++;this.setIndex(g);this.addAttribute("position",h);this.addAttribute("uv",k);this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,g=new q,h=new q,k=new q,c=b*a.length*3,f=e=0;e<a.length;e++,f+=3)g.x=d[f+0],g.y=d[f+1],g.z=d[f+2],h.x=d[c+f+0],h.y=d[c+f+1],h.z=d[c+f+2],k.addVectors(g,h).normalize(),d[f+0]=d[c+f+0]=k.x,d[f+1]=d[c+f+1]=k.y,d[f+2]=d[c+f+2]=k.z}function Gc(a,b,c,d){Q.call(this);
-this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Xb(a,b,c,d));this.mergeVertices()}function cb(a,b){Q.call(this);this.type="ShapeGeometry";!1===Array.isArray(a)&&(a=[a]);this.addShapeList(a,b);this.computeFaceNormals()}function Yb(a,b){function c(a,b){return a-b}G.call(this);var d=Math.cos(T.DEG2RAD*(void 0!==b?b:1)),e=[0,0],f={},g=["a","b","c"],h;a&&a.isBufferGeometry?(h=new Q,h.fromBufferGeometry(a)):h=a.clone();h.mergeVertices();
-h.computeFaceNormals();var k=h.vertices;h=h.faces;for(var m=0,w=h.length;m<w;m++)for(var n=h[m],p=0;3>p;p++){e[0]=n[g[p]];e[1]=n[g[(p+1)%3]];e.sort(c);var l=e.toString();void 0===f[l]?f[l]={vert1:e[0],vert2:e[1],face1:m,face2:void 0}:f[l].face2=m}e=[];for(l in f)if(g=f[l],void 0===g.face2||h[g.face1].normal.dot(h[g.face2].normal)<=d)m=k[g.vert1],e.push(m.x),e.push(m.y),e.push(m.z),m=k[g.vert2],e.push(m.x),e.push(m.y),e.push(m.z);this.addAttribute("position",new C(new Float32Array(e),3))}function Ua(a,
-b,c,d,e,f,g,h){function k(c){var e,f,k,n=new B,p=new q,l=0,w=!0===c?a:b,I=!0===c?1:-1;f=u;for(e=1;e<=d;e++)x.setXYZ(u,0,y*I,0),t.setXYZ(u,0,I,0),n.x=.5,n.y=.5,D.setXY(u,n.x,n.y),u++;k=u;for(e=0;e<=d;e++){var z=e/d*h+g,C=Math.cos(z),z=Math.sin(z);p.x=w*z;p.y=y*I;p.z=w*C;x.setXYZ(u,p.x,p.y,p.z);t.setXYZ(u,0,I,0);n.x=.5*C+.5;n.y=.5*z*I+.5;D.setXY(u,n.x,n.y);u++}for(e=0;e<d;e++)n=f+e,p=k+e,!0===c?(r.setX(v,p),v++,r.setX(v,p+1)):(r.setX(v,p+1),v++,r.setX(v,p)),v++,r.setX(v,n),v++,l+=3;m.addGroup(E,l,!0===
-c?1:2);E+=l}G.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var l=0;!1===f&&(0<a&&l++,0<b&&l++);var n=function(){var a=(d+1)*(e+1);!1===f&&(a+=(d+1)*l+d*l);return a}(),p=function(){var a=d*e*6;!1===f&&(a+=d*l*3);
-return a}(),r=new C(new (65535<p?Uint32Array:Uint16Array)(p),1),x=new C(new Float32Array(3*n),3),t=new C(new Float32Array(3*n),3),D=new C(new Float32Array(2*n),2),u=0,v=0,I=[],y=c/2,E=0;(function(){var f,k,n=new q,p=new q,l=0,w=(b-a)/c;for(k=0;k<=e;k++){var B=[],z=k/e,C=z*(b-a)+a;for(f=0;f<=d;f++){var N=f/d,P=N*h+g,R=Math.sin(P),P=Math.cos(P);p.x=C*R;p.y=-z*c+y;p.z=C*P;x.setXYZ(u,p.x,p.y,p.z);n.set(R,w,P).normalize();t.setXYZ(u,n.x,n.y,n.z);D.setXY(u,N,1-z);B.push(u);u++}I.push(B)}for(f=0;f<d;f++)for(k=
-0;k<e;k++)n=I[k+1][f],p=I[k+1][f+1],w=I[k][f+1],r.setX(v,I[k][f]),v++,r.setX(v,n),v++,r.setX(v,w),v++,r.setX(v,n),v++,r.setX(v,p),v++,r.setX(v,w),v++,l+=6;m.addGroup(E,l,0);E+=l})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(r);this.addAttribute("position",x);this.addAttribute("normal",t);this.addAttribute("uv",D)}function nb(a,b,c,d,e,f,g,h){Q.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,
-thetaLength:h};this.fromBufferGeometry(new Ua(a,b,c,d,e,f,g,h));this.mergeVertices()}function Hc(a,b,c,d,e,f,g){nb.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Ic(a,b,c,d,e,f,g){Ua.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Zb(a,b,c,d){G.call(this);
-this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||50;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=b+2,f=new Float32Array(3*e),g=new Float32Array(3*e),e=new Float32Array(2*e);g[2]=1;e[0]=.5;e[1]=.5;for(var h=0,k=3,m=2;h<=b;h++,k+=3,m+=2){var l=c+h/b*d;f[k]=a*Math.cos(l);f[k+1]=a*Math.sin(l);g[k+2]=1;e[m]=(f[k]/a+1)/2;e[m+1]=(f[k+1]/a+1)/2}c=[];for(k=1;k<=b;k++)c.push(k,k+1,0);this.setIndex(new C(new Uint16Array(c),
-1));this.addAttribute("position",new C(f,3));this.addAttribute("normal",new C(g,3));this.addAttribute("uv",new C(e,2));this.boundingSphere=new Ca(new q,a)}function Jc(a,b,c,d){Q.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new Zb(a,b,c,d))}function ob(a,b,c,d,e,f){Q.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new hb(a,
-b,c,d,e,f));this.mergeVertices()}function $b(){Fa.call(this,{uniforms:La.merge([W.lights,{opacity:{value:1}}]),vertexShader:X.shadow_vert,fragmentShader:X.shadow_frag});this.transparent=this.lights=!0;Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(a){this.uniforms.opacity.value=a}}})}function ac(a){Fa.call(this,a);this.type="RawShaderMaterial"}function Kc(a){this.uuid=T.generateUUID();this.type="MultiMaterial";this.materials=a instanceof
-Array?a:[];this.visible=!0}function Oa(a){U.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new O(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new O(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new B(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=
-this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function pb(a){Oa.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function db(a){U.call(this);this.type="MeshPhongMaterial";this.color=
-new O(16777215);this.specular=new O(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new O(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new B(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;
-this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function qb(a){U.call(this,a);this.type="MeshNormalMaterial";this.wireframe=!1;this.wireframeLinewidth=1;this.morphTargets=this.lights=this.fog=!1;this.setValues(a)}function rb(a){U.call(this);this.type="MeshLambertMaterial";this.color=new O(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=
-new O(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function sb(a){U.call(this);this.type="LineDashedMaterial";this.color=new O(16777215);this.scale=this.linewidth=1;this.dashSize=3;this.gapSize=1;this.lights=!1;this.setValues(a)}
-function Fd(a,b,c){var d=this,e=!1,f=0,g=0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)}}function Ja(a){this.manager=void 0!==a?a:Ga}function we(a){this.manager=void 0!==a?a:Ga;this._parser=null}function Gd(a){this.manager=
-void 0!==a?a:Ga;this._parser=null}function Lc(a){this.manager=void 0!==a?a:Ga}function Hd(a){this.manager=void 0!==a?a:Ga}function gd(a){this.manager=void 0!==a?a:Ga}function pa(a,b){z.call(this);this.type="Light";this.color=new O(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function hd(a,b,c){pa.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(z.DefaultUp);this.updateMatrix();this.groundColor=new O(b)}function tb(a){this.camera=a;this.bias=0;this.radius=
-1;this.mapSize=new B(512,512);this.map=null;this.matrix=new J}function id(){tb.call(this,new Ea(50,1,.5,500))}function jd(a,b,c,d,e,f){pa.call(this,a,b);this.type="SpotLight";this.position.copy(z.DefaultUp);this.updateMatrix();this.target=new z;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=
-new id}function kd(a,b,c,d){pa.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new tb(new Ea(90,1,.5,500))}function ld(a){tb.call(this,new Hb(-5,5,5,-5,.5,500))}function md(a,b){pa.call(this,a,b);this.type="DirectionalLight";this.position.copy(z.DefaultUp);this.updateMatrix();this.target=new z;this.shadow=new ld}
-function nd(a,b){pa.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function qa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function od(a,b,c,d){qa.call(this,a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function Mc(a,b,c,d){qa.call(this,a,b,c,d)}function pd(a,b,c,d){qa.call(this,a,b,c,d)}function ub(a,b,c,d){if(void 0===a)throw Error("track name is undefined");
-if(void 0===b||0===b.length)throw Error("no keyframes in track named "+a);this.name=a;this.times=ma.convertArray(b,this.TimeBufferType);this.values=ma.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function bc(a,b,c,d){ub.call(this,a,b,c,d)}function qd(a,b,c,d){qa.call(this,a,b,c,d)}function Nc(a,b,c,d){ub.call(this,a,b,c,d)}function cc(a,b,c,d){ub.call(this,a,b,c,d)}function rd(a,b,c,d){ub.call(this,a,b,c,d)}function sd(a,
-b,c){ub.call(this,a,b,c)}function td(a,b,c,d){ub.call(this,a,b,c,d)}function vb(a,b,c,d){ub.apply(this,arguments)}function Ha(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=T.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function ud(a){this.manager=void 0!==a?a:Ga;this.textures={}}function Id(a){this.manager=void 0!==a?a:Ga}function wb(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function Jd(a){"boolean"===
-typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:Ga;this.withCredentials=!1}function xe(a){this.manager=void 0!==a?a:Ga;this.texturePath=""}function ia(){}function Sa(a,b){this.v1=a;this.v2=b}function Oc(){this.curves=[];this.autoClose=!1}function Va(a,b,c,d,e,f,g,h){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g;this.aRotation=h||0}function xb(a){this.points=
-void 0===a?[]:a}function yb(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d}function zb(a,b,c){this.v0=a;this.v1=b;this.v2=c}function Ab(){Pc.apply(this,arguments);this.holes=[]}function Pc(a){Oc.call(this);this.currentPoint=new B;a&&this.fromPoints(a)}function Kd(){this.subPaths=[];this.currentPath=null}function Ld(a){this.data=a}function ye(a){this.manager=void 0!==a?a:Ga}function Md(){void 0===Nd&&(Nd=new (window.AudioContext||window.webkitAudioContext));return Nd}function Od(a){this.manager=
-void 0!==a?a:Ga}function ze(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Ea;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Ea;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function vd(a,b,c){z.call(this);this.type="CubeCamera";var d=new Ea(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new q(1,0,0));this.add(d);var e=new Ea(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new q(-1,0,0));this.add(e);var f=new Ea(90,1,a,b);f.up.set(0,0,1);f.lookAt(new q(0,
-1,0));this.add(f);var g=new Ea(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new q(0,-1,0));this.add(g);var h=new Ea(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new q(0,0,1));this.add(h);var k=new Ea(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new q(0,0,-1));this.add(k);this.renderTarget=new Eb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,p=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,
-d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=p;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function Pd(){z.call(this);this.type="AudioListener";this.context=Md();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function dc(a){z.call(this);this.type="Audio";this.context=a.context;this.source=this.context.createBufferSource();
-this.source.onended=this.onEnded.bind(this);this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function Qd(a){dc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function Rd(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);
-a.getOutput().connect(this.analyser)}function wd(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function fa(a,b,c){this.path=b;this.parsedPath=c||fa.parseTrackName(b);this.node=fa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Sd(a){this.uuid=T.generateUUID();
-this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!==d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Td(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;
-b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=
-!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ud(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ae(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Bb(){G.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function Vd(a,b,c,d){this.uuid=T.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===
-d}function ec(a,b){this.uuid=T.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function fc(a,b,c){ec.call(this,a,b);this.meshPerAttribute=c||1}function gc(a,b,c){C.call(this,a,b);this.meshPerAttribute=c||1}function Wd(a,b,c,d){this.ray=new ab(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");
-return this.Points}}})}function Be(a,b){return a.distance-b.distance}function Xd(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)Xd(a[d],b,c,!0)}}function Yd(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function Zd(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function na(a,b){ya.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;
-this.createAnimation("__default",0,c-1,c/1);this.setAnimationWeight("__default",1)}function Qc(a){z.call(this);this.material=a;this.render=function(a){}}function Rc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new G;b=new ha(6*b,3);c.addAttribute("position",b);la.call(this,c,new oa({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}
-function hc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;a=new G;for(var b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new ha(b,3));b=new oa({fog:!1});this.cone=new la(a,b);this.add(this.cone);this.update()}function ic(a){this.bones=this.getBoneList(a);for(var b=new Q,
-c=0;c<this.bones.length;c++){var d=this.bones[c];d.parent&&d.parent.isBone&&(b.vertices.push(new q),b.vertices.push(new q),b.colors.push(new O(0,0,1)),b.colors.push(new O(0,1,0)))}b.dynamic=!0;c=new oa({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});la.call(this,b,c);this.root=a;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.update()}function jc(a,b){this.light=a;this.light.updateMatrixWorld();var c=new mb(b,4,2),d=new Ma({wireframe:!0,fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);
-ya.call(this,c,d);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1}function kc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.colors=[new O,new O];var c=new Vb(b,4,2);c.rotateX(-Math.PI/2);for(var d=0;8>d;d++)c.faces[d].color=this.colors[4>d?0:1];d=new Ma({vertexColors:1,wireframe:!0});this.lightSphere=new ya(c,d);this.add(this.lightSphere);this.update()}function Sc(a,b,c,d){b=b||1;c=new O(void 0!==c?c:4473924);d=new O(void 0!==
-d?d:8947848);for(var e=b/2,f=2*a/b,g=[],h=[],k=0,m=0,l=-a;k<=b;k++,l+=f){g.push(-a,0,l,a,0,l);g.push(l,0,-a,l,0,a);var n=k===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}a=new G;a.addAttribute("position",new ha(g,3));a.addAttribute("color",new ha(h,3));g=new oa({vertexColors:2});la.call(this,a,g)}function Tc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");
-c=new G;b=new ha(6*b,3);c.addAttribute("position",b);la.call(this,c,new oa({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function lc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new G;c.addAttribute("position",new ha([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new oa({fog:!1});this.add(new Ta(c,d));c=new G;c.addAttribute("position",new ha([0,0,0,0,0,1],3));this.add(new Ta(c,d));this.update()}
-function Uc(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.vertices.push(new q);d.colors.push(new O(b));void 0===f[a]&&(f[a]=[]);f[a].push(d.vertices.length-1)}var d=new Q,e=new oa({color:16777215,vertexColors:1}),f={};b("n1","n2",16755200);b("n2","n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);
-b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1","cf2",3355443);b("cf3","cf4",3355443);la.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=f;this.update()}function Vc(a,b){var c=void 0!==b?b:8947848;this.object=a;this.box=
-new Ba;ya.call(this,new ob(1,1,1),new Ma({color:c,wireframe:!0}))}function Wc(a,b){void 0===b&&(b=16776960);var c=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),d=new Float32Array(24),e=new G;e.setIndex(new C(c,1));e.addAttribute("position",new C(d,3));la.call(this,e,new oa({color:b}));void 0!==a&&this.update(a)}function Cb(a,b,c,d,e,f){z.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);this.position.copy(b);this.line=new Ta(Ce,new oa({color:d}));
-this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ya(De,new Ma({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function xd(a){a=a||1;var b=new Float32Array([0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a]),c=new Float32Array([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1]);a=new G;a.addAttribute("position",new C(b,3));a.addAttribute("color",new C(c,3));b=new oa({vertexColors:2});la.call(this,a,b)}function Ee(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.");
-$d.call(this,a);this.type="catmullrom";this.closed=!0}function yd(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}});void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");
-for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(sa.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)?!0:!1},
-removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;var c=[],d,e=b.length;for(d=0;d<e;d++)c[d]=b[d];for(d=0;d<e;d++)c[d].call(this,a)}}}});var Fe={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},Ge={UVMapping:300,CubeReflectionMapping:301,
-CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},ae={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},be={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008},T={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a=
-"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,
-b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*
-T.DEG2RAD},radToDeg:function(a){return a*T.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};B.prototype={constructor:B,isVector2:!0,get width(){return this.x},set width(a){this.x=a},get height(){return this.y},set height(a){this.y=a},set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=
-a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==
-b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
-this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a):this.y=this.x=0;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,
-a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new B,b=new B);a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},floor:function(){this.x=Math.floor(this.x);this.y=
-Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*
-this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.multiplyScalar(a/
-this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+
-1];return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}};da.DEFAULT_IMAGE=void 0;da.DEFAULT_MAPPING=300;da.prototype={constructor:da,isTexture:!0,set needsUpdate(a){!0===a&&this.version++},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=
-a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.4,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,
-repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=T.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),g.width=c.width,g.height=c.height,g.getContext("2d").drawImage(c,
-0,0,c.width,c.height));g=2048<g.width||2048<g.height?g.toDataURL("image/jpeg",.6):g.toDataURL("image/png");d[e]={uuid:f,url:g}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.multiply(this.repeat);a.add(this.offset);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>
-a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}};Object.assign(da.prototype,sa.prototype);var ee=0;ga.prototype={constructor:ga,isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;
-return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,
-this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},
-addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){isFinite(a)?
-(this.x*=a,this.y*=a,this.z*=a,this.w*=a):this.w=this.z=this.y=this.x=0;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=
-0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):
-h>m?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);
-this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new ga,b=new ga);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);
-this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);
-this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},
-normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=
-a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];this.w=a.array[b+3];return this}};Object.assign(Db.prototype,sa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,
-0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Eb.prototype=Object.create(Db.prototype);Eb.prototype.constructor=Eb;Eb.prototype.isWebGLRenderTargetCube=!0;ba.prototype={constructor:ba,get x(){return this._x},
-set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get w(){return this._w},set w(a){this._w=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();
-return this},setFromEuler:function(a,b){if(!1===(a&&a.isEuler))throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=Math.cos(a._x/2),d=Math.cos(a._y/2),e=Math.cos(a._z/2),f=Math.sin(a._x/2),g=Math.sin(a._y/2),h=Math.sin(a._z/2),k=a.order;"XYZ"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):"YXZ"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):"ZXY"===k?(this._x=
-f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):"ZYX"===k?(this._x=f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):"YZX"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e-f*g*h):"XZY"===k&&(this._x=f*d*e-c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e+f*g*h);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=
-Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+
-h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a,b;return function(c,d){void 0===a&&(a=new q);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*
-a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),
-this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;
-0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b*k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===
-this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};Object.assign(ba,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,
-b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var l=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==l||m!==n){f=1-g;var p=h*d+k*l+m*n+c*e,r=0<=p?1:-1,x=1-p*p;x>Number.EPSILON&&(x=Math.sqrt(x),p=Math.atan2(x,p*r),f=Math.sin(f*p)/x,g=Math.sin(g*p)/x);r*=g;h=h*f+d*r;k=k*f+l*r;m=m*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});q.prototype={constructor:q,isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},
-setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,
-this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=
-a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),
-this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a;return function(b){!1===(b&&b.isEuler)&&console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");void 0===a&&(a=new ba);return this.applyQuaternion(a.setFromEuler(b))}}(),
-applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new ba);return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];return this},applyProjection:function(a){var b=
-this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a;return function(b){void 0===a&&(a=new J);
-a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new J);a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyProjection(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=
-a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a,b;return function(c,
-d){void 0===a&&(a=new q,b=new q);a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},
-roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+
-Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,
-b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a;return function(b){void 0===a&&(a=new q);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0===
-a&&(a=new q);return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(T.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;
-this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){return this.setFromMatrixColumn(a,3)},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){if("number"===typeof a){console.warn("THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).");
-var c=a;a=b;b=c}return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];return this}};J.prototype={constructor:J,isMatrix4:!0,
-set:function(a,b,c,d,e,f,g,h,k,m,l,n,p,r,x,t){var q=this.elements;q[0]=a;q[4]=b;q[8]=c;q[12]=d;q[1]=e;q[5]=f;q[9]=g;q[13]=h;q[2]=k;q[6]=m;q[10]=l;q[14]=n;q[3]=p;q[7]=r;q[11]=x;q[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new J).fromArray(this.elements)},copy:function(a){this.elements.set(a.elements);return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,
-b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a;return function(b){void 0===a&&(a=new q);var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*
-f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){!1===(a&&a.isEuler)&&console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,l=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-l*d;b[9]=-c*g;b[2]=l-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===
-a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a+l*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=l+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a-l*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=l-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,l=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+l,b[1]=g*e,b[5]=l*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=l-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*
-e+m,b[10]=a-l*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+l,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=l*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,k=e+e;a=c*g;var m=c*h,c=c*k,l=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(l+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+l);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=
-0;b[14]=0;b[15]=1;return this},lookAt:function(){var a,b,c;return function(d,e,f){void 0===a&&(a=new q,b=new q,c=new q);var g=this.elements;c.subVectors(d,e).normalize();0===c.lengthSq()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.lengthSq()&&(c.z+=1E-4,a.crossVectors(f,c).normalize());b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
-this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],l=c[5],n=c[9],p=c[13],r=c[2],x=c[6],t=c[10],q=c[14],u=c[3],v=c[7],I=c[11],c=c[15],y=d[0],E=d[4],H=d[8],F=d[12],M=d[1],B=d[5],K=d[9],z=d[13],C=d[2],G=d[6],J=d[10],N=d[14],P=d[3],R=d[7],S=d[11],d=d[15];e[0]=f*y+g*M+h*C+k*P;e[4]=f*E+g*B+h*G+k*R;e[8]=f*H+g*K+h*J+k*S;e[12]=
-f*F+g*z+h*N+k*d;e[1]=m*y+l*M+n*C+p*P;e[5]=m*E+l*B+n*G+p*R;e[9]=m*H+l*K+n*J+p*S;e[13]=m*F+l*z+n*N+p*d;e[2]=r*y+x*M+t*C+q*P;e[6]=r*E+x*B+t*G+q*R;e[10]=r*H+x*K+t*J+q*S;e[14]=r*F+x*z+t*N+q*d;e[3]=u*y+v*M+I*C+c*P;e[7]=u*E+v*B+I*G+c*R;e[11]=u*H+v*K+I*J+c*S;e[15]=u*F+v*z+I*N+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];
-c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix4(this),a.toArray(b,c);return b}}(),applyToBuffer:function(){var a;return function(b,
-c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],k=a[13],m=a[2],l=a[6],n=a[10],p=a[14];return a[3]*(+e*h*l-d*k*l-e*g*n+c*k*n+d*g*p-c*h*p)+a[7]*(+b*h*p-b*k*n+e*f*n-d*f*p+d*k*m-e*h*m)+a[11]*(+b*k*l-b*g*p-e*f*l+c*f*p+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*l+b*g*n+
-d*f*l-c*f*n+c*h*m)},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated - just use .toArray instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new q);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");
-return a.setFromMatrixColumn(this,3)}}(),setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements,e=d[0],f=d[1],g=d[2],h=d[3],k=d[4],m=d[5],l=d[6],n=d[7],p=d[8],r=d[9],x=d[10],t=d[11],q=d[12],u=d[13],v=d[14],d=d[15],I=r*v*n-u*x*n+u*l*t-m*v*t-r*l*d+m*x*d,y=q*x*n-p*v*n-q*l*t+k*v*t+p*l*d-k*x*d,E=p*u*n-q*r*n+q*m*t-k*u*t-p*m*d+k*r*d,H=q*r*l-p*u*l-q*m*x+k*u*x+p*m*v-k*r*v,F=e*I+f*y+g*E+h*H;if(0===F){if(!0===b)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");
-console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");return this.identity()}F=1/F;c[0]=I*F;c[1]=(u*x*h-r*v*h-u*g*t+f*v*t+r*g*d-f*x*d)*F;c[2]=(m*v*h-u*l*h+u*g*n-f*v*n-m*g*d+f*l*d)*F;c[3]=(r*l*h-m*x*h-r*g*n+f*x*n+m*g*t-f*l*t)*F;c[4]=y*F;c[5]=(p*v*h-q*x*h+q*g*t-e*v*t-p*g*d+e*x*d)*F;c[6]=(q*l*h-k*v*h-q*g*n+e*v*n+k*g*d-e*l*d)*F;c[7]=(k*x*h-p*l*h+p*g*n-e*x*n-k*g*t+e*l*t)*F;c[8]=E*F;c[9]=(q*r*h-p*u*h-q*f*t+e*u*t+p*f*d-e*r*d)*F;c[10]=(k*u*h-q*m*h+q*f*n-e*u*n-k*f*d+e*m*d)*F;c[11]=
-(p*m*h-k*r*h-p*f*n+e*r*n+k*f*t-e*m*t)*F;c[12]=H*F;c[13]=(p*u*g-q*r*g+q*f*x-e*u*x-p*f*v+e*r*v)*F;c[14]=(q*m*g-k*u*g-q*f*l+e*u*l+k*f*v-e*m*v)*F;c[15]=(k*r*g-p*m*g+p*f*l-e*r*l-k*f*x+e*m*x)*F;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],
-a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=
-Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,k=e*f,m=e*g;this.set(k*f+c,k*g-d*h,k*h+d*g,0,k*g+d*h,m*g+c,m*h-d*f,0,k*h-d*g,m*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a,b;return function(c,d,e){void 0===a&&(a=new q,b=new J);var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],
-f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.elements.set(this.elements);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);
-g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){a=c*Math.tan(T.DEG2RAD*a*.5);var e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=
-this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}};Xa.prototype=Object.create(da.prototype);
-Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var ie=new da,je=new Xa,fe=[],he=[];ne.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var zd=/([\w\d_]+)(\])?(\[|\.)?/g;Ya.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};Ya.prototype.set=function(a,b,c){var d=this.map[c];
-void 0!==d&&d.setValue(a,b[c],this.renderer)};Ya.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Ya.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Ya.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var La={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b=
-{},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},X={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",
-aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",
-begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",
-bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",
-clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n",
-clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",
-color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\n",
-cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",
-defaultnormal_vertex:"#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",
-emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n  return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n  return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n  return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n  return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n  return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n  return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n  float maxComponent = max( max( value.r, value.g ), value.b );\n  float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n  return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n  return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n  float maxRGB = max( value.x, max( value.g, value.b ) );\n  float M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n  M            = ceil( M * 255.0 ) / 255.0;\n  return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n    return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n    float maxRGB = max( value.x, max( value.g, value.b ) );\n    float D      = max( maxRange / maxRGB, 1.0 );\n    D            = min( floor( D ) / 255.0, 1.0 );\n    return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n  vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n  Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n  vec4 vResult;\n  vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n  float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n  vResult.w = fract(Le);\n  vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n  return vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n  float Le = value.z * 255.0 + value.w;\n  vec3 Xp_Y_XYZp;\n  Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n  Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n  Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n  vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n  return vec4( max(vRGB, 0.0), 1.0 );\n}\n",
-envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",
-envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",
-envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n",
-fog_fragment:"#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",
-lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",
-lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\t#include <normal_flip>\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\t#include <normal_flip>\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",
-lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",
-lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",
-lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n",
-lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",
-logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n",
-map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n",
-metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",
-morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",
-normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
-normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",
-packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n  return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n  return 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n  return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n  return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n  return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n  return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",
-premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n",
-roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",
-shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",
-shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",
-shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",
-skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n",
-skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned  = bindMatrixInverse * skinned;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n",
-specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n  return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n  color *= toneMappingExposure;\n  return saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n  color *= toneMappingExposure;\n  return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n  color *= toneMappingExposure;\n  color = max( vec3( 0.0 ), color - 0.004 );\n  return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",
-uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n",
-uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
-uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
-cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",
-depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",
-distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n",
-equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",
-linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n}\n",
-meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nuniform float envMapIntensity;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-normal_frag:"uniform float opacity;\nvarying vec3 vNormal;\n#include <common>\n#include <packing>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include <logdepthbuf_fragment>\n}\n",normal_vert:"varying vec3 vNormal;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",
-points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-shadow_frag:"uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0  - getShadowMask() ) );\n}\n",shadow_vert:"#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"};O.prototype={constructor:O,
-isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,
-c,d){b=T.euclideanModulo(b,1);c=T.clamp(c,0,1);d=T.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=
-Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/
-360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=He[a],void 0!==
-c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);return this},convertGammaToLinear:function(){var a=
-this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):
-k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=
-a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=
-0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}};var He={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,
-cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,
-floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,
-lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,
-moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,
-silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},W={common:{diffuse:{value:new O(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new ga(0,0,1,1)},specularMap:{value:null},alphaMap:{value:null},envMap:{value:null},flipEnvMap:{value:-1},
-reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new B(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},
-fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new O(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},
-spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}}},points:{diffuse:{value:new O(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new ga(0,0,1,1)}}},Gb={basic:{uniforms:La.merge([W.common,W.aomap,W.fog]),vertexShader:X.meshbasic_vert,
-fragmentShader:X.meshbasic_frag},lambert:{uniforms:La.merge([W.common,W.aomap,W.lightmap,W.emissivemap,W.fog,W.lights,{emissive:{value:new O(0)}}]),vertexShader:X.meshlambert_vert,fragmentShader:X.meshlambert_frag},phong:{uniforms:La.merge([W.common,W.aomap,W.lightmap,W.emissivemap,W.bumpmap,W.normalmap,W.displacementmap,W.fog,W.lights,{emissive:{value:new O(0)},specular:{value:new O(1118481)},shininess:{value:30}}]),vertexShader:X.meshphong_vert,fragmentShader:X.meshphong_frag},standard:{uniforms:La.merge([W.common,
-W.aomap,W.lightmap,W.emissivemap,W.bumpmap,W.normalmap,W.displacementmap,W.roughnessmap,W.metalnessmap,W.fog,W.lights,{emissive:{value:new O(0)},roughness:{value:.5},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag},points:{uniforms:La.merge([W.points,W.fog]),vertexShader:X.points_vert,fragmentShader:X.points_frag},dashed:{uniforms:La.merge([W.common,W.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:X.linedashed_vert,
-fragmentShader:X.linedashed_frag},depth:{uniforms:La.merge([W.common,W.displacementmap]),vertexShader:X.depth_vert,fragmentShader:X.depth_frag},normal:{uniforms:{opacity:{value:1}},vertexShader:X.normal_vert,fragmentShader:X.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:X.cube_vert,fragmentShader:X.cube_frag},equirect:{uniforms:{tEquirect:{value:null},tFlip:{value:-1}},vertexShader:X.equirect_vert,fragmentShader:X.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new q}},
-vertexShader:X.distanceRGBA_vert,fragmentShader:X.distanceRGBA_frag}};Gb.physical={uniforms:La.merge([Gb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag};mc.prototype={constructor:mc,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new B;return function(b,
-c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){a=a||new B;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},
-getSize:function(a){a=a||new B;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&
-this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a,b){return(b||new B).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new B).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new B;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);
-this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}};U.prototype={constructor:U,isMaterial:!0,get needsUpdate(){return this._needsUpdate},set needsUpdate(a){!0===a&&this.update();this._needsUpdate=a},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+
-b+"' parameter is undefined.");else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.4,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;
-""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&
-(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,
-d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=
-this.reflectivity);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==this.shading&&(d.shading=this.shading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0<this.alphaTest&&
-(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);d.skinning=this.skinning;d.morphTargets=this.morphTargets;c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=
-c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;this.lights=a.lights;this.blending=a.blending;this.side=a.side;this.shading=a.shading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;
-this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=
-a.length,b=Array(c),d=0;d!==c;++d)b[d]=a[d].clone();this.clippingPlanes=b;return this},update:function(){this.dispatchEvent({type:"update"})},dispose:function(){this.dispatchEvent({type:"dispose"})}};Object.assign(U.prototype,sa.prototype);var oe=0;Fa.prototype=Object.create(U.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isShaderMaterial=!0;Fa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=La.clone(a.uniforms);
-this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=a.extensions;return this};Fa.prototype.toJSON=function(a){a=U.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Za.prototype=Object.create(U.prototype);Za.prototype.constructor=
-Za;Za.prototype.isMeshDepthMaterial=!0;Za.prototype.copy=function(a){U.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Ba.prototype={constructor:Ba,isBox3:!0,set:function(a,b){this.min.copy(a);
-this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var m=a[h],l=a[h+1],n=a[h+2];m<b&&(b=m);l<c&&(c=l);n<d&&(d=n);m>e&&(e=m);l>f&&(f=l);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g)},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new q;return function(b,c){var d=a.copy(c).multiplyScalar(.5);
-this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(){var a=new q;return function(b){var c=this;b.updateMatrixWorld(!0);this.makeEmpty();b.traverse(function(b){var e=b.geometry;if(void 0!==e)if(e&&e.isGeometry)for(var e=e.vertices,f=0,g=e.length;f<g;f++)a.copy(e[f]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a);else if(e&&e.isBufferGeometry&&(g=e.attributes.position,void 0!==g)){var h;g&&g.isInterleavedBufferAttribute?(e=g.data.array,f=g.offset,h=g.data.stride):
-(e=g.array,f=0,h=3);for(g=e.length;f<g;f+=h)a.fromArray(e,f),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)}});return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new q;
-return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new q;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||
-a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a,b){return(b||new q).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||
-a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a;return function(b){void 0===a&&(a=new q);this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0<a.normal.x?(b=a.normal.x*this.min.x,c=a.normal.x*this.max.x):(b=a.normal.x*this.max.x,c=a.normal.x*this.min.x);0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*
-this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,b){return(b||new q).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new q;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new q;return function(b){b=b||new Ca;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);
-this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new q,new q,new q,new q,new q,new q,new q,new q];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,
-this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}};Ca.prototype={constructor:Ca,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=
-new Ba;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f<g;f++)e=Math.max(e,d.distanceToSquared(b[f]));this.radius=Math.sqrt(e);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-
-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new q;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=
-a||new Ba;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}};Ia.prototype={constructor:Ia,isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,
-0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix3(this),a.toArray(b,
-c);return b}}(),applyToBuffer:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],
-a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");var c=a.elements,d=this.elements,e=c[0],f=c[1],g=c[2],h=c[3],k=c[4],m=c[5],l=c[6],n=c[7],c=c[8],p=c*k-m*n,r=m*l-c*h,q=n*h-k*l,t=e*p+f*r+g*q;if(0===t){if(!0===b)throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");return this.identity()}t=
-1/t;d[0]=p*t;d[1]=(g*n-c*f)*t;d[2]=(m*f-g*k)*t;d[3]=r*t;d[4]=(c*e-g*l)*t;d[5]=(g*h-m*e)*t;d[6]=q*t;d[7]=(f*l-n*e)*t;d[8]=(k*e-f*h)*t;return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated - just use .toArray instead.");return this.toArray(a,b)},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},
-transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}};va.prototype={constructor:va,set:function(a,b){this.normal.copy(a);
-this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new q,b=new q;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);
-this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,b){var c=this.distanceToPoint(a);return(b||
-new q).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new q;return function(b,c){var d=c||new q,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/f,0>f||1<f?void 0:d.copy(e).multiplyScalar(f).add(b.start)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},
-intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new q).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new q,b=new Ia;return function(c,d){var e=this.coplanarPoint(a).applyMatrix4(c),f=d||b.getNormalMatrix(c),f=this.normal.applyMatrix3(f).normalize();this.constant=-e.dot(f);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===
-this.constant}};nc.prototype={constructor:nc,set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],l=c[8],n=c[9],p=c[10],r=c[11],q=c[12],t=c[13],D=c[14],c=c[15];
-b[0].setComponents(f-a,m-g,r-l,c-q).normalize();b[1].setComponents(f+a,m+g,r+l,c+q).normalize();b[2].setComponents(f+d,m+h,r+n,c+t).normalize();b[3].setComponents(f-d,m-h,r-n,c-t).normalize();b[4].setComponents(f-e,m-k,r-p,c-D).normalize();b[5].setComponents(f+e,m+k,r+p,c+D).normalize();return this},intersectsObject:function(){var a=new Ca;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),
-intersectsSprite:function(){var a=new Ca;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new q,b=new q;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?
-c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}};ab.prototype={constructor:ab,set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);
-this.direction.copy(a.direction);return this},at:function(a,b){return(b||new q).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new q;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new q;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},
-distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new q;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new q,b=new q,c=new q;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);
-var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),l=-c.dot(b),n=c.lengthSq(),p=Math.abs(1-k*k),r;0<p?(d=k*l-m,e=k*m-l,r=h*p,0<=d?e>=-r?e<=r?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+n):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-l),h),k=-d*d+e*(e+2*l)+n):e<=r?(d=0,e=Math.min(Math.max(-h,-l),h),k=e*(e+2*l)+n):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,
--l),h),k=-d*d+e*(e+2*l)+n)):(e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n);f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new q;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,f=b.radius*b.radius;if(e>f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=
-a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;
-var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;0<=g?(e=(a.min.z-h.z)*g,g*=a.max.z-h.z):(e=(a.max.z-h.z)*g,g*=a.min.z-h.z);if(c>g||e>d)return null;if(e>c||c!==c)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new q;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=
-new q,b=new q,c=new q,d=new q;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a);
-this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}};bb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");bb.DefaultOrder="XYZ";bb.prototype={constructor:bb,isEuler:!0,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order},
-set order(a){this._order=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=T.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],l=e[2],n=e[6],e=e[10];b=b||
-this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-l,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-l,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>
-Math.abs(l)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-l,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();
-return this},setFromQuaternion:function(){var a;return function(b,c,d){void 0===a&&(a=new J);a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new ba;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];
-this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new q(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};Yc.prototype={constructor:Yc,set:function(a){this.mask=1<<a},enable:function(a){this.mask|=1<<a},toggle:function(a){this.mask^=
-1<<a},disable:function(a){this.mask&=~(1<<a)},test:function(a){return 0!==(this.mask&a.mask)}};z.DefaultUp=new q(0,1,0);z.DefaultMatrixAutoUpdate=!0;Object.assign(z.prototype,sa.prototype,{isObject3D:!0,applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},
-setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new ba;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new q(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=new q(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new q(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new q;
-return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new q(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new q(0,1,0);return function(b){return this.translateOnAxis(a,b)}}(),translateZ:function(){var a=new q(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=
-new J;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new J;return function(b){a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),
-this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length)for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1))},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===
-b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new q;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new q,b=new q;return function(c){c=c||new ba;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new ba;return function(b){b=b||new bb;this.getWorldQuaternion(a);
-return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new q,b=new ba;return function(c){c=c||new q;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new ba;return function(b){b=b||new q;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);
-for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){!0===this.matrixAutoUpdate&&this.updateMatrix();if(!0===this.matrixWorldNeedsUpdate||!0===a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,
-this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||""===a,d={};c&&(a={geometries:{},materials:{},textures:{},images:{}},d.metadata={version:4.4,type:"Object",generator:"Object3D.toJSON"});var e={};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);"{}"!==JSON.stringify(this.userData)&&(e.userData=
-this.userData);!0===this.castShadow&&(e.castShadow=!0);!0===this.receiveShadow&&(e.receiveShadow=!0);!1===this.visible&&(e.visible=!1);e.matrix=this.matrix.toArray();void 0!==this.geometry&&(void 0===a.geometries[this.geometry.uuid]&&(a.geometries[this.geometry.uuid]=this.geometry.toJSON(a)),e.geometry=this.geometry.uuid);void 0!==this.material&&(void 0===a.materials[this.material.uuid]&&(a.materials[this.material.uuid]=this.material.toJSON(a)),e.material=this.material.uuid);if(0<this.children.length){e.children=
-[];for(var f=0;f<this.children.length;f++)e.children.push(this.children[f].toJSON(a).object)}if(c){var c=b(a.geometries),f=b(a.materials),g=b(a.textures);a=b(a.images);0<c.length&&(d.geometries=c);0<f.length&&(d.materials=f);0<g.length&&(d.textures=g);0<a.length&&(d.images=a)}d.object=e;return d},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);
-this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}});var qe=0;gb.prototype={constructor:gb,set:function(a,
-b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){return(a||new q).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new q).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){var c=b||new q;
-return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new q,b=new q;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=T.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new q;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&
-a.end.equals(this.end)}};wa.normal=function(){var a=new q;return function(b,c,d,e){e=e||new q;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}();wa.barycoordFromPoint=function(){var a=new q,b=new q,c=new q;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var m=d*k-e*e;h=h||new q;if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-
-e*f)*m;return h.set(1-k-d,d,k)}}();wa.containsPoint=function(){var a=new q;return function(b,c,d,e){b=wa.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}();wa.prototype={constructor:wa,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);
-return this},area:function(){var a=new q,b=new q;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new q).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return wa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new va).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return wa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return wa.containsPoint(a,
-this.a,this.b,this.c)},closestPointToPoint:function(){var a,b,c,d;return function(e,f){void 0===a&&(a=new va,b=[new gb,new gb,new gb],c=new q,d=new q);var g=f||new q,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;k<b.length;k++){b[k].closestPointToPoint(c,!0,d);var m=c.distanceToSquared(d);m<h&&(h=m,g.copy(d))}}return g}}(),equals:function(a){return a.a.equals(this.a)&&
-a.b.equals(this.b)&&a.c.equals(this.c)}};ea.prototype={constructor:ea,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}};Ma.prototype=Object.create(U.prototype);Ma.prototype.constructor=
-Ma;Ma.prototype.isMeshBasicMaterial=!0;Ma.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=
-a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};C.prototype={constructor:C,isBufferAttribute:!0,set needsUpdate(a){!0===a&&this.version++},setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=
-a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new O);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=
-this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new B);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",
-d),f=new q);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new ga);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*
-this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=
-d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},clone:function(){return(new this.constructor).copy(this)}};Object.assign(Q.prototype,sa.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=(new Ia).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<
-f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a;return function(b){void 0===a&&(a=new J);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0===a&&(a=new J);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===
-a&&(a=new J);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new J);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new J);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=new z);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=
-void 0!==g?[l[a].clone(),l[b].clone(),l[d].clone()]:[],r=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new ea(a,b,d,f,r,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([n[a].clone(),n[b].clone(),n[d].clone()]);void 0!==m&&c.faceVertexUvs[1].push([p[a].clone(),p[b].clone(),p[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==
-e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(var l=[],n=[],p=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new q(f[e],f[e+1],f[e+2])),void 0!==g&&l.push(new q(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new O(h[e],h[e+1],h[e+2])),void 0!==k&&n.push(new B(k[r],k[r+1])),void 0!==m&&p.push(new B(m[r],m[r+1]));if(void 0!==d)if(f=a.groups,0<f.length)for(e=0;e<f.length;e++)for(var x=f[e],t=x.start,D=x.count,r=t,t=t+D;r<t;r+=3)b(d[r],d[r+1],d[r+
-2],x.materialIndex);else for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,
-b=0===b?1:1/b,c=new J;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new q,b=new q,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===a&&(a=!0);var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new q;if(a){var e,
-f,g,h=new q,k=new q;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],f=this.vertices[c.b],g=this.vertices[c.c],h.subVectors(g,f),k.subVectors(e,f),h.cross(k),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(this.computeFaceNormals(),a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[c.a].add(c.normal),d[c.b].add(c.normal),d[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=c.vertexNormals,3===e.length?
-(e[0].copy(d[c.a]),e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a,b,c;this.computeFaceNormals();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=
-!0)},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||(e.__originalVertexNormals=[]),a=0,b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone();var f=new Q;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<
-b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=[];e=this.morphNormals[a].faceNormals;var g=this.morphNormals[a].vertexNormals,h,k;c=0;for(d=this.faces.length;c<d;c++)h=new q,k={a:new q,b:new q,c:new q},e.push(h),g.push(k)}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],
-h.copy(e.normal),k.a.copy(e.vertexNormals[0]),k.b.copy(e.vertexNormals[1]),k.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeTangents:function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new Ba);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Ca);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(!1===(a&&a.isGeometry))console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a);else{var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],l=a.faceVertexUvs[0],n=this.colors,
-p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new Ia).getNormalMatrix(b));a=0;for(var r=g.length;a<r;a++){var q=g[a].clone();void 0!==b&&q.applyMatrix4(b);f.push(q)}a=0;for(r=p.length;a<r;a++)n.push(p[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],t=g.vertexNormals,p=g.vertexColors,n=new ea(g.a+e,g.b+e,g.c+e);n.normal.copy(g.normal);void 0!==d&&n.normal.applyMatrix3(d).normalize();b=0;for(f=t.length;b<f;b++)q=t[b].clone(),void 0!==d&&q.applyMatrix3(d).normalize(),n.vertexNormals.push(q);n.color.copy(g.color);
-b=0;for(f=p.length;b<f;b++)q=p[b],n.vertexColors.push(q.clone());n.materialIndex=g.materialIndex+c;h.push(n)}a=0;for(r=l.length;a<r;a++)if(c=l[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());m.push(d)}}},mergeMesh:function(a){!1===(a&&a.isMesh)?console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a):(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix))},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g;f=0;for(g=this.vertices.length;f<
-g;f++)d=this.vertices[f],d=Math.round(d.x*e)+"_"+Math.round(d.y*e)+"_"+Math.round(d.z*e),void 0===a[d]?(a[d]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[d]];a=[];f=0;for(g=this.faces.length;f<g;f++)for(e=this.faces[f],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c<g;c++)this.faceVertexUvs[c].splice(e,1);f=this.vertices.length-b.length;this.vertices=
-b;return f},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+
-a.z.toString();if(void 0!==m[b])return m[b];m[b]=k.length/3;k.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=l.length;l.push(a.getHex());return n[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.4,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==
-this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],k=[],m={},l=[],n={},p=[],r={};for(g=0;g<this.faces.length;g++){var q=this.faces[g],t=void 0!==this.faceVertexUvs[0][g],D=0<q.normal.length(),u=0<q.vertexNormals.length,v=1!==q.color.r||1!==q.color.g||1!==q.color.b,I=0<q.vertexColors.length,y=0,y=a(y,0,0),y=a(y,1,!0),y=a(y,2,!1),y=a(y,3,t),y=a(y,4,D),y=a(y,5,u),y=a(y,6,
-v),y=a(y,7,I);h.push(y);h.push(q.a,q.b,q.c);h.push(q.materialIndex);t&&(t=this.faceVertexUvs[0][g],h.push(d(t[0]),d(t[1]),d(t[2])));D&&h.push(b(q.normal));u&&(D=q.vertexNormals,h.push(b(D[0]),b(D[1]),b(D[2])));v&&h.push(c(q.color));I&&(q=q.vertexColors,h.push(c(q[0]),c(q[1]),c(q[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<l.length&&(e.data.colors=l);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new Q).copy(this)},copy:function(a){this.vertices=[];this.faces=
-[];this.faceVertexUvs=[[]];this.colors=[];for(var b=a.vertices,c=0,d=b.length;c<d;c++)this.vertices.push(b[c].clone());b=a.colors;c=0;for(d=b.length;c<d;c++)this.colors.push(b[c].clone());b=a.faces;c=0;for(d=b.length;c<d;c++)this.faces.push(b[c].clone());c=0;for(d=a.faceVertexUvs.length;c<d;c++){b=a.faceVertexUvs[c];void 0===this.faceVertexUvs[c]&&(this.faceVertexUvs[c]=[]);for(var e=0,f=b.length;e<f;e++){for(var g=b[e],h=[],k=0,m=g.length;k<m;k++)h.push(g[k].clone());this.faceVertexUvs[c].push(h)}}return this},
-dispose:function(){this.dispatchEvent({type:"dispose"})}});var ad=0;Object.assign(re.prototype,sa.prototype,{computeBoundingBox:Q.prototype.computeBoundingBox,computeBoundingSphere:Q.prototype.computeBoundingSphere,computeFaceNormals:function(){console.warn("THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.")},computeVertexNormals:function(){console.warn("THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.")},computeGroups:function(a){var b,
-c=[],d;a=a.faces;for(var e=0;e<a.length;e++){var f=a[e];f.materialIndex!==d&&(d=f.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length,k;if(0<h){k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position=k}var l=a.morphNormals,n=l.length,p;if(0<n){p=[];for(m=0;m<
-n;m++)p[m]=[];this.morphTargets.normal=p}for(var r=a.skinIndices,q=a.skinWeights,t=r.length===c.length,D=q.length===c.length,m=0;m<b.length;m++){var u=b[m];this.vertices.push(c[u.a],c[u.b],c[u.c]);var v=u.vertexNormals;3===v.length?this.normals.push(v[0],v[1],v[2]):(v=u.normal,this.normals.push(v,v,v));v=u.vertexColors;3===v.length?this.colors.push(v[0],v[1],v[2]):(v=u.color,this.colors.push(v,v,v));!0===e&&(v=d[0][m],void 0!==v?this.uvs.push(v[0],v[1],v[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",
-m),this.uvs.push(new B,new B,new B)));!0===f&&(v=d[1][m],void 0!==v?this.uvs2.push(v[0],v[1],v[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",m),this.uvs2.push(new B,new B,new B)));for(v=0;v<h;v++){var I=g[v].vertices;k[v].push(I[u.a],I[u.b],I[u.c])}for(v=0;v<n;v++)I=l[v].vertexNormals[m],p[v].push(I.a,I.b,I.c);t&&this.skinIndices.push(r[u.a],r[u.b],r[u.c]);D&&this.skinWeights.push(q[u.a],q[u.b],q[u.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;
-this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.assign(G.prototype,sa.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){this.index=a},addAttribute:function(a,b,c){if(!1===(b&&b.isBufferAttribute)&&!1===(b&&b.isInterleavedBufferAttribute))console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),
-this.addAttribute(a,new C(b,c));else if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b);else return this.attributes[a]=b,this},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=
-b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToVector3Array(b.array),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new Ia).getNormalMatrix(a).applyToVector3Array(b.array),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a;return function(b){void 0===a&&(a=new J);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0===
-a&&(a=new J);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===a&&(a=new J);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new J);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new J);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=
-new z);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a&&a.isPoints||a&&a.isLine){a=new ha(3*b.vertices.length,3);var c=new ha(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&
-(a=new ha(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a&&a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},updateFromObject:function(a){var b=a.geometry;if(a&&a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=
-b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),
-c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=
-b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new re).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new C(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new C(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),
-this.addAttribute("color",(new C(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new C(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new C(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<a.vertices.length?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new C(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=
-[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new ha(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new ha(4*a.skinIndices.length,4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new ha(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=
-a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Ba);var a=this.attributes.position.array;void 0!==a?this.boundingBox.setFromArray(a):this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=
-new Ba,b=new q;return function(){null===this.boundingSphere&&(this.boundingSphere=new Ca);var c=this.attributes.position;if(c){var c=c.array,d=this.boundingSphere.center;a.setFromArray(c);a.getCenter(d);for(var e=0,f=0,g=c.length;f<g;f+=3)b.fromArray(c,f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',
-this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",new C(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h,k,m,l=new q,n=new q,p=new q,r=new q,x=new q;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var t=0,D=c.length;t<D;++t)for(f=c[t],g=f.start,h=f.count,f=g,g+=h;f<
-g;f+=3)h=3*a[f+0],k=3*a[f+1],m=3*a[f+2],l.fromArray(d,h),n.fromArray(d,k),p.fromArray(d,m),r.subVectors(p,n),x.subVectors(l,n),r.cross(x),e[h]+=r.x,e[h+1]+=r.y,e[h+2]+=r.z,e[k]+=r.x,e[k+1]+=r.y,e[k+2]+=r.z,e[m]+=r.x,e[m+1]+=r.y,e[m+2]+=r.z}else for(f=0,g=d.length;f<g;f+=9)l.fromArray(d,f),n.fromArray(d,f+3),p.fromArray(d,f+6),r.subVectors(p,n),x.subVectors(l,n),r.cross(x),e[f]=r.x,e[f+1]=r.y,e[f+2]=r.z,e[f+3]=r.x,e[f+4]=r.y,e[f+5]=r.z,e[f+6]=r.x,e[f+7]=r.y,e[f+8]=r.z;this.normalizeNormals();b.normal.needsUpdate=
-!0}},merge:function(a,b){if(!1===(a&&a.isBufferGeometry))console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a);else{void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}},normalizeNormals:function(){for(var a=this.attributes.normal.array,b,c,d,e=0,f=a.length;e<f;e+=3)b=a[e],c=a[e+1],d=a[e+2],b=1/Math.sqrt(b*b+c*c+d*d),
-a[e]*=b,a[e+1]*=b,a[e+2]*=b},toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var a=new G,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,m=0,l=b.length;m<l;m++){h=b[m]*e;for(var n=0;n<e;n++)g[k++]=f[h++]}a.addAttribute(d,new C(g,e))}return a},toJSON:function(){var a={metadata:{version:4.4,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};
-a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;
-0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),radius:c.radius});return a},clone:function(){return(new G).copy(this)},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});
-G.MaxIndex=65535;ya.prototype=Object.assign(Object.create(z.prototype),{constructor:ya,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){z.prototype.copy.call(this,a);this.drawMode=a.drawMode;return this},updateMorphTargets:function(){var a=this.geometry.morphTargets;if(void 0!==a&&0<a.length){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var b=0,c=a.length;b<c;b++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[a[b].name]=b}},raycast:function(){function a(a,
-b,c,d,e,f,g){wa.barycoordFromPoint(a,b,c,d,t);e.multiplyScalar(t.x);f.multiplyScalar(t.y);g.multiplyScalar(t.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(1===h.side?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,2!==h.side,g)))return null;u.copy(g);u.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(u);return c<b.near||c>b.far?null:{distance:c,point:u.clone(),object:a}}function c(c,d,e,f,m,l,n,w){g.fromArray(f,3*l);h.fromArray(f,3*n);k.fromArray(f,
-3*w);if(c=b(c,d,e,g,h,k,D))m&&(p.fromArray(m,2*l),r.fromArray(m,2*n),x.fromArray(m,2*w),c.uv=a(D,g,h,k,p,r,x)),c.face=new ea(l,n,w,wa.normal(g,h,k)),c.faceIndex=l;return c}var d=new J,e=new ab,f=new Ca,g=new q,h=new q,k=new q,m=new q,l=new q,n=new q,p=new B,r=new B,x=new B,t=new q,D=new q,u=new q;return function(q,t){var u=this.geometry,E=this.material,H=this.matrixWorld;if(void 0!==E&&(null===u.boundingSphere&&u.computeBoundingSphere(),f.copy(u.boundingSphere),f.applyMatrix4(H),!1!==q.ray.intersectsSphere(f)&&
-(d.getInverse(H),e.copy(q.ray).applyMatrix4(d),null===u.boundingBox||!1!==e.intersectsBox(u.boundingBox)))){var F,M;if(u&&u.isBufferGeometry){var B,K,E=u.index,H=u.attributes,u=H.position.array;void 0!==H.uv&&(F=H.uv.array);if(null!==E)for(var H=E.array,z=0,C=H.length;z<C;z+=3){if(E=H[z],B=H[z+1],K=H[z+2],M=c(this,q,e,u,F,E,B,K))M.faceIndex=Math.floor(z/3),t.push(M)}else for(z=0,C=u.length;z<C;z+=9)if(E=z/3,B=E+1,K=E+2,M=c(this,q,e,u,F,E,B,K))M.index=E,t.push(M)}else if(u&&u.isGeometry){var G,J,H=
-E&&E.isMultiMaterial,z=!0===H?E.materials:null,C=u.vertices;B=u.faces;K=u.faceVertexUvs[0];0<K.length&&(F=K);for(var N=0,P=B.length;N<P;N++){var R=B[N];M=!0===H?z[R.materialIndex]:E;if(void 0!==M){K=C[R.a];G=C[R.b];J=C[R.c];if(!0===M.morphTargets){M=u.morphTargets;var S=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var Q=0,V=M.length;Q<V;Q++){var O=S[Q];if(0!==O){var L=M[Q].vertices;g.addScaledVector(m.subVectors(L[R.a],K),O);h.addScaledVector(l.subVectors(L[R.b],G),O);k.addScaledVector(n.subVectors(L[R.c],
-J),O)}}g.add(K);h.add(G);k.add(J);K=g;G=h;J=k}if(M=b(this,q,e,K,G,J,D))F&&(S=F[N],p.copy(S[0]),r.copy(S[1]),x.copy(S[2]),M.uv=a(D,K,G,J,p,r,x)),M.face=R,M.faceIndex=N,t.push(M)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});hb.prototype=Object.create(G.prototype);hb.prototype.constructor=hb;ib.prototype=Object.create(G.prototype);ib.prototype.constructor=ib;Z.prototype=Object.create(z.prototype);Z.prototype.constructor=Z;Z.prototype.isCamera=!0;Z.prototype.getWorldDirection=
-function(){var a=new ba;return function(b){b=b||new q;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}();Z.prototype.lookAt=function(){var a=new J;return function(b){a.lookAt(this.position,b,this.up);this.quaternion.setFromRotationMatrix(a)}}();Z.prototype.clone=function(){return(new this.constructor).copy(this)};Z.prototype.copy=function(a){z.prototype.copy.call(this,a);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);return this};
-Ea.prototype=Object.assign(Object.create(Z.prototype),{constructor:Ea,isPerspectiveCamera:!0,copy:function(a){Z.prototype.copy.call(this,a);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*T.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=
-Math.tan(.5*T.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*T.RAD2DEG*Math.atan(Math.tan(.5*T.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=
-null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*T.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==f)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makeFrustum(e,e+d,b-c,b,a,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=
-this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});Hb.prototype=Object.assign(Object.create(Z.prototype),{constructor:Hb,isOrthographicCamera:!0,copy:function(a){Z.prototype.copy.call(this,a);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=
-null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a,a=d+b,b=d-b;if(null!==this.view)var c=this.zoom/
-(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=
-this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});var sf=0;Ib.prototype.isFogExp2=!0;Ib.prototype.clone=function(){return new Ib(this.color.getHex(),this.density)};Ib.prototype.toJSON=function(a){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};Jb.prototype.isFog=!0;Jb.prototype.clone=function(){return new Jb(this.color.getHex(),this.near,this.far)};Jb.prototype.toJSON=function(a){return{type:"Fog",
-color:this.color.getHex(),near:this.near,far:this.far}};jb.prototype=Object.create(z.prototype);jb.prototype.constructor=jb;jb.prototype.copy=function(a,b){z.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this};jb.prototype.toJSON=function(a){var b=z.prototype.toJSON.call(this,
-a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b};Ed.prototype=Object.assign(Object.create(z.prototype),{constructor:Ed,isLensFlare:!0,copy:function(a){z.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===
-c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new O(16777215));void 0===d&&(d=1);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;a<b;a++)c=this.lensFlares[a],c.x=this.positionScreen.x+d*c.distance,c.y=this.positionScreen.y+e*c.distance,c.wantedRotation=c.x*Math.PI*.25,c.rotation+=.25*(c.wantedRotation-
-c.rotation)}});kb.prototype=Object.create(U.prototype);kb.prototype.constructor=kb;kb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};qc.prototype=Object.assign(Object.create(z.prototype),{constructor:qc,isSprite:!0,raycast:function(){var a=new q;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.distanceSqToPoint(a);d>this.scale.x*this.scale.y/4||c.push({distance:Math.sqrt(d),point:this.position,
-face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});rc.prototype=Object.assign(Object.create(z.prototype),{constructor:rc,copy:function(a){z.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=
-this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new q;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new q,b=new q;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-
-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});lb.prototype=Object.create(da.prototype);lb.prototype.constructor=lb;lb.prototype.isDataTexture=!0;Object.assign(bd.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<
-b;a++){var c=new J;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){for(var a,b=0,c=this.bones.length;b<c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<c;b++)if(a=this.bones[b])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new J;return function(){for(var b=
-0,c=this.bones.length;b<c;b++)a.multiplyMatrices(this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix,this.boneInverses[b]),a.toArray(this.boneMatrices,16*b);this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}(),clone:function(){return new bd(this.bones,this.boneInverses,this.useVertexTexture)}});cd.prototype=Object.assign(Object.create(z.prototype),{constructor:cd,isBone:!0,copy:function(a){z.prototype.copy.call(this,a);this.skin=a.skin;return this}});dd.prototype=Object.assign(Object.create(ya.prototype),
-{constructor:dd,isSkinnedMesh:!0,bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){if(this.geometry&&this.geometry.isGeometry)for(var a=0;a<this.geometry.skinWeights.length;a++){var b=this.geometry.skinWeights[a],c=1/b.lengthManhattan();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&
-this.geometry.isBufferGeometry)for(var b=new ga,d=this.geometry.attributes.skinWeight,a=0;a<d.count;a++)b.x=d.getX(a),b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.lengthManhattan(),Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)},updateMatrixWorld:function(a){ya.prototype.updateMatrixWorld.call(this,!0);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh unrecognized bindMode: "+
-this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material,this.skeleton.useVertexTexture)).copy(this)}});oa.prototype=Object.create(U.prototype);oa.prototype.constructor=oa;oa.prototype.isLineBasicMaterial=!0;oa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};Ta.prototype=Object.assign(Object.create(z.prototype),{constructor:Ta,isLine:!0,raycast:function(){var a=
-new J,b=new ab,c=new Ca;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new q,m=new q,h=new q,l=new q,n=this&&this.isLineSegments?2:1;if(g&&g.isBufferGeometry){var p=g.index,r=g.attributes.position.array;if(null!==p)for(var p=p.array,g=0,x=p.length-1;g<x;g+=n){var t=p[g+1];k.fromArray(r,
-3*p[g]);m.fromArray(r,3*t);t=b.distanceSqToSegment(k,m,l,h);t>f||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,x=r.length/3-1;g<x;g+=n)k.fromArray(r,3*g),m.fromArray(r,3*g+3),t=b.distanceSqToSegment(k,m,l,h),t>f||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),
-index:g,face:null,faceIndex:null,object:this}))}else if(g&&g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=n)t=b.distanceSqToSegment(k[g],k[g+1],l,h),t>f||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});la.prototype=Object.assign(Object.create(Ta.prototype),
-{constructor:la,isLineSegments:!0});xa.prototype=Object.create(U.prototype);xa.prototype.constructor=xa;xa.prototype.isPointsMaterial=!0;xa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(z.prototype),{constructor:Kb,isPoints:!0,raycast:function(){var a=new J,b=new ab,c=new Ca;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);
-if(f<l){var h=b.closestPointToPoint(a);h.applyMatrix4(k);var m=d.ray.origin.distanceTo(h);m<d.near||m>d.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),
-l=m*m,m=new q;if(h&&h.isBufferGeometry){var n=h.index,h=h.attributes.position.array;if(null!==n)for(var p=n.array,n=0,r=p.length;n<r;n++){var x=p[n];m.fromArray(h,3*x);f(m,x)}else for(n=0,p=h.length/3;n<p;n++)m.fromArray(h,3*n),f(m,n)}else for(m=h.vertices,n=0,p=m.length;n<p;n++)f(m[n],n)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});sc.prototype=Object.assign(Object.create(z.prototype),{constructor:sc});ed.prototype=Object.create(da.prototype);ed.prototype.constructor=
-ed;Lb.prototype=Object.create(da.prototype);Lb.prototype.constructor=Lb;Lb.prototype.isCompressedTexture=!0;fd.prototype=Object.create(da.prototype);fd.prototype.constructor=fd;tc.prototype=Object.create(da.prototype);tc.prototype.constructor=tc;tc.prototype.isDepthTexture=!0;Mb.prototype=Object.create(G.prototype);Mb.prototype.constructor=Mb;Nb.prototype=Object.create(G.prototype);Nb.prototype.constructor=Nb;uc.prototype=Object.create(Q.prototype);uc.prototype.constructor=uc;ua.prototype=Object.create(G.prototype);
-ua.prototype.constructor=ua;Ob.prototype=Object.create(ua.prototype);Ob.prototype.constructor=Ob;vc.prototype=Object.create(Q.prototype);vc.prototype.constructor=vc;Pb.prototype=Object.create(ua.prototype);Pb.prototype.constructor=Pb;wc.prototype=Object.create(Q.prototype);wc.prototype.constructor=wc;Qb.prototype=Object.create(ua.prototype);Qb.prototype.constructor=Qb;xc.prototype=Object.create(Q.prototype);xc.prototype.constructor=xc;Rb.prototype=Object.create(ua.prototype);Rb.prototype.constructor=
-Rb;yc.prototype=Object.create(Q.prototype);yc.prototype.constructor=yc;zc.prototype=Object.create(Q.prototype);zc.prototype.constructor=zc;Sb.prototype=Object.create(G.prototype);Sb.prototype.constructor=Sb;Ac.prototype=Object.create(Q.prototype);Ac.prototype.constructor=Ac;Tb.prototype=Object.create(G.prototype);Tb.prototype.constructor=Tb;Bc.prototype=Object.create(Q.prototype);Bc.prototype.constructor=Bc;Ub.prototype=Object.create(G.prototype);Ub.prototype.constructor=Ub;Cc.prototype=Object.create(Q.prototype);
-Cc.prototype.constructor=Cc;var ra={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g,h,k;if(0<ra.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var m=2*c;for(h=c-1;2<c;){if(0>=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var l;a:{var n,
-p,r,q,t,D,u,v;n=a[e[g]].x;p=a[e[g]].y;r=a[e[h]].x;q=a[e[h]].y;t=a[e[k]].x;D=a[e[k]].y;if(0>=(r-n)*(D-p)-(q-p)*(t-n))l=!1;else{var I,y,E,H,F,M,B,z,C,G;I=t-r;y=D-q;E=n-t;H=p-D;F=r-n;M=q-p;for(l=0;l<c;l++)if(u=a[e[l]].x,v=a[e[l]].y,!(u===n&&v===p||u===r&&v===q||u===t&&v===D)&&(B=u-n,z=v-p,C=u-r,G=v-q,u-=t,v-=D,C=I*G-y*C,B=F*z-M*B,z=E*v-H*u,C>=-Number.EPSILON&&z>=-Number.EPSILON&&B>=-Number.EPSILON)){l=!1;break a}l=!0}}if(l){d.push([a[e[g]],a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;k<c;g++,
-k++)e[g]=e[k];c--;m=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,m=e.y-c.y,l=a.x-c.x,n=a.y-c.y,p=h*k-g*m,q=h*l-g*n;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>q||q>p)return[];k=m*l-k*n;if(0>k||k>p)return[]}else{if(0<q||q<p)return[];k=m*l-k*n;if(0<
-k||k<p)return[]}if(0===k)return!f||0!==q&&q!==p?[a]:[];if(k===p)return!f||0!==q&&q!==p?[b]:[];if(0===q)return[c];if(q===p)return[e];f=k/p;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==q||m*l!==k*n)return[];h=0===g&&0===h;k=0===k&&0===m;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,p=c.x,m=e,c=e.x):(b=e,p=e.x,m=c,c=c.x)):(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=
-c,p=c.y,m=e,c=e.y):(b=e,p=e.y,m=c,c=c.y));return k<=p?a<p?[]:a===p?f?[]:[b]:a<=c?[b,h]:[b,m]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h,k,m,l,n={};k=a.concat();g=0;for(h=b.length;g<h;g++)Array.prototype.push.apply(k,b[g]);g=0;for(h=k.length;g<h;g++)l=k[g].x+":"+k[g].y,void 0!==n[l]&&console.warn("THREE.ShapeUtils: Duplicate point",
-l,g),n[l]=g;g=function(a,b){function c(a,b){var d=h.length-1,e=a-1;0>e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;c<h.length;c++)if(f=c+1,f%=h.length,f=e(a,b,h[c],h[f],!0),0<f.length)return!0;return!1}function g(a,c){var d,f,h,k;for(d=0;d<m.length;d++)for(f=b[m[d]],h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=e(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=
-a.concat(),k,m=[],l,n,p,q,w,B=[],z,C,G,J=0;for(l=b.length;J<l;J++)m.push(J);z=0;for(var N=2*m.length;0<m.length;){N--;if(0>N){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(n=z;n<h.length;n++){p=h[n];l=-1;for(J=0;J<m.length;J++)if(q=m[J],w=p.x+":"+p.y+":"+q,void 0===B[w]){k=b[q];for(C=0;C<k.length;C++)if(q=k[C],c(n,C)&&!d(p,q)&&!g(p,q)){l=C;m.splice(J,1);z=h.slice(0,n+1);q=h.slice(n);C=k.slice(l);G=k.slice(0,l+1);h=z.concat(C).concat(G).concat(q);z=n;
-break}if(0<=l)break;B[w]=!0}if(0<=l)break}}return h}(a,b);var p=ra.triangulate(g,!1);g=0;for(h=p.length;g<h;g++)for(m=p[g],k=0;3>k;k++)l=m[k].x+":"+m[k].y,l=n[l],void 0!==l&&(m[k]=l);return p.concat()},isClockWise:function(a){return 0>ra.area(a)},b2:function(){return function(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}}(),b3:function(){return function(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}}()};za.prototype=Object.create(Q.prototype);za.prototype.constructor=
-za;za.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};za.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d,e,f;e=a.x-b.x;f=a.y-b.y;d=c.x-a.x;var g=c.y-a.y,h=e*e+f*f;if(Math.abs(e*g-f*d)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=
-d*d+e*e;if(2>=f)return new B(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new B(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=r+2*l;for(e=0;e<f;e++){var g=T*e,h=T*(e+1),k=b+c+g,g=b+d+g,m=b+d+h,h=b+c+h,k=k+K,g=g+K,m=m+K,h=h+K;C.faces.push(new ea(k,g,h,null,null,1));C.faces.push(new ea(g,
-m,h,null,null,1));k=u.generateSideWallUV(C,k,g,m,h);C.faceVertexUvs[0].push([k[0],k[1],k[3]]);C.faceVertexUvs[0].push([k[1],k[2],k[3]])}}}function f(a,b,c){C.vertices.push(new q(a,b,c))}function g(a,b,c){a+=K;b+=K;c+=K;C.faces.push(new ea(a,b,c,null,null,0));a=u.generateTopUV(C,a,b,c);C.faceVertexUvs[0].push(a)}var h=void 0!==b.amount?b.amount:100,k=void 0!==b.bevelThickness?b.bevelThickness:6,m=void 0!==b.bevelSize?b.bevelSize:k-2,l=void 0!==b.bevelSegments?b.bevelSegments:3,n=void 0!==b.bevelEnabled?
-b.bevelEnabled:!0,p=void 0!==b.curveSegments?b.curveSegments:12,r=void 0!==b.steps?b.steps:1,x=b.extrudePath,t,D=!1,u=void 0!==b.UVGenerator?b.UVGenerator:za.WorldUVGenerator,v,I,y,E;x&&(t=x.getSpacedPoints(r),D=!0,n=!1,v=void 0!==b.frames?b.frames:x.computeFrenetFrames(r,!1),I=new q,y=new q,E=new q);n||(m=k=l=0);var H,F,z,C=this,K=this.vertices.length,x=a.extractPoints(p),p=x.shape,G=x.holes;if(x=!ra.isClockWise(p)){p=p.reverse();F=0;for(z=G.length;F<z;F++)H=G[F],ra.isClockWise(H)&&(G[F]=H.reverse());
-x=!1}var J=ra.triangulateShape(p,G),Q=p;F=0;for(z=G.length;F<z;F++)H=G[F],p=p.concat(H);var O,N,P,R,S,T=p.length,V,U=J.length,x=[],L=0;P=Q.length;O=P-1;for(N=L+1;L<P;L++,O++,N++)O===P&&(O=0),N===P&&(N=0),x[L]=d(Q[L],Q[O],Q[N]);var W=[],X,Z=x.concat();F=0;for(z=G.length;F<z;F++){H=G[F];X=[];L=0;P=H.length;O=P-1;for(N=L+1;L<P;L++,O++,N++)O===P&&(O=0),N===P&&(N=0),X[L]=d(H[L],H[O],H[N]);W.push(X);Z=Z.concat(X)}for(O=0;O<l;O++){P=O/l;R=k*Math.cos(P*Math.PI/2);N=m*Math.sin(P*Math.PI/2);L=0;for(P=Q.length;L<
-P;L++)S=c(Q[L],x[L],N),f(S.x,S.y,-R);F=0;for(z=G.length;F<z;F++)for(H=G[F],X=W[F],L=0,P=H.length;L<P;L++)S=c(H[L],X[L],N),f(S.x,S.y,-R)}N=m;for(L=0;L<T;L++)S=n?c(p[L],Z[L],N):p[L],D?(y.copy(v.normals[0]).multiplyScalar(S.x),I.copy(v.binormals[0]).multiplyScalar(S.y),E.copy(t[0]).add(y).add(I),f(E.x,E.y,E.z)):f(S.x,S.y,0);for(P=1;P<=r;P++)for(L=0;L<T;L++)S=n?c(p[L],Z[L],N):p[L],D?(y.copy(v.normals[P]).multiplyScalar(S.x),I.copy(v.binormals[P]).multiplyScalar(S.y),E.copy(t[P]).add(y).add(I),f(E.x,E.y,
-E.z)):f(S.x,S.y,h/r*P);for(O=l-1;0<=O;O--){P=O/l;R=k*Math.cos(P*Math.PI/2);N=m*Math.sin(P*Math.PI/2);L=0;for(P=Q.length;L<P;L++)S=c(Q[L],x[L],N),f(S.x,S.y,h+R);F=0;for(z=G.length;F<z;F++)for(H=G[F],X=W[F],L=0,P=H.length;L<P;L++)S=c(H[L],X[L],N),D?f(S.x,S.y+t[r-1].y,t[r-1].x+R):f(S.x,S.y,h+R)}(function(){if(n){var a=0*T;for(L=0;L<U;L++)V=J[L],g(V[2]+a,V[1]+a,V[0]+a);a=T*(r+2*l);for(L=0;L<U;L++)V=J[L],g(V[0]+a,V[1]+a,V[2]+a)}else{for(L=0;L<U;L++)V=J[L],g(V[2],V[1],V[0]);for(L=0;L<U;L++)V=J[L],g(V[0]+
-T*r,V[1]+T*r,V[2]+T*r)}})();(function(){var a=0;e(Q,a);a+=Q.length;F=0;for(z=G.length;F<z;F++)H=G[F],e(H,a),a+=H.length})()};za.WorldUVGenerator={generateTopUV:function(a,b,c,d){a=a.vertices;b=a[b];c=a[c];d=a[d];return[new B(b.x,b.y),new B(c.x,c.y),new B(d.x,d.y)]},generateSideWallUV:function(a,b,c,d,e){a=a.vertices;b=a[b];c=a[c];d=a[d];e=a[e];return.01>Math.abs(b.y-c.y)?[new B(b.x,1-b.z),new B(c.x,1-c.z),new B(d.x,1-d.z),new B(e.x,1-e.z)]:[new B(b.y,1-b.z),new B(c.y,1-c.z),new B(d.y,1-d.z),new B(e.y,
-1-e.z)]}};Dc.prototype=Object.create(za.prototype);Dc.prototype.constructor=Dc;mb.prototype=Object.create(G.prototype);mb.prototype.constructor=mb;Vb.prototype=Object.create(Q.prototype);Vb.prototype.constructor=Vb;Wb.prototype=Object.create(G.prototype);Wb.prototype.constructor=Wb;Ec.prototype=Object.create(Q.prototype);Ec.prototype.constructor=Ec;Fc.prototype=Object.create(Q.prototype);Fc.prototype.constructor=Fc;Xb.prototype=Object.create(G.prototype);Xb.prototype.constructor=Xb;Gc.prototype=Object.create(Q.prototype);
-Gc.prototype.constructor=Gc;cb.prototype=Object.create(Q.prototype);cb.prototype.constructor=cb;cb.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;c<d;c++)this.addShape(a[c],b);return this};cb.prototype.addShape=function(a,b){void 0===b&&(b={});var c=b.material,d=void 0===b.UVGenerator?za.WorldUVGenerator:b.UVGenerator,e,f,g,h=this.vertices.length;e=a.extractPoints(void 0!==b.curveSegments?b.curveSegments:12);var k=e.shape,m=e.holes;if(!ra.isClockWise(k))for(k=k.reverse(),e=0,f=m.length;e<
-f;e++)g=m[e],ra.isClockWise(g)&&(m[e]=g.reverse());var l=ra.triangulateShape(k,m);e=0;for(f=m.length;e<f;e++)g=m[e],k=k.concat(g);m=k.length;f=l.length;for(e=0;e<m;e++)g=k[e],this.vertices.push(new q(g.x,g.y,0));for(e=0;e<f;e++)m=l[e],k=m[0]+h,g=m[1]+h,m=m[2]+h,this.faces.push(new ea(k,g,m,null,null,c)),this.faceVertexUvs[0].push(d.generateTopUV(this,k,g,m))};Yb.prototype=Object.create(G.prototype);Yb.prototype.constructor=Yb;Ua.prototype=Object.create(G.prototype);Ua.prototype.constructor=Ua;nb.prototype=
-Object.create(Q.prototype);nb.prototype.constructor=nb;Hc.prototype=Object.create(nb.prototype);Hc.prototype.constructor=Hc;Ic.prototype=Object.create(Ua.prototype);Ic.prototype.constructor=Ic;Zb.prototype=Object.create(G.prototype);Zb.prototype.constructor=Zb;Jc.prototype=Object.create(Q.prototype);Jc.prototype.constructor=Jc;ob.prototype=Object.create(Q.prototype);ob.prototype.constructor=ob;var Na=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:uc,ParametricBufferGeometry:Nb,TetrahedronGeometry:vc,
-TetrahedronBufferGeometry:Ob,OctahedronGeometry:wc,OctahedronBufferGeometry:Pb,IcosahedronGeometry:xc,IcosahedronBufferGeometry:Qb,DodecahedronGeometry:yc,DodecahedronBufferGeometry:Rb,PolyhedronGeometry:zc,PolyhedronBufferGeometry:ua,TubeGeometry:Ac,TubeBufferGeometry:Sb,TorusKnotGeometry:Bc,TorusKnotBufferGeometry:Tb,TorusGeometry:Cc,TorusBufferGeometry:Ub,TextGeometry:Dc,SphereBufferGeometry:mb,SphereGeometry:Vb,RingGeometry:Ec,RingBufferGeometry:Wb,PlaneBufferGeometry:ib,PlaneGeometry:Fc,LatheGeometry:Gc,
-LatheBufferGeometry:Xb,ShapeGeometry:cb,ExtrudeGeometry:za,EdgesGeometry:Yb,ConeGeometry:Hc,ConeBufferGeometry:Ic,CylinderGeometry:nb,CylinderBufferGeometry:Ua,CircleBufferGeometry:Zb,CircleGeometry:Jc,BoxBufferGeometry:hb,BoxGeometry:ob});$b.prototype=Object.create(Fa.prototype);$b.prototype.constructor=$b;$b.prototype.isShadowMaterial=!0;ac.prototype=Object.create(Fa.prototype);ac.prototype.constructor=ac;ac.prototype.isRawShaderMaterial=!0;Kc.prototype={constructor:Kc,isMultiMaterial:!0,toJSON:function(a){for(var b=
-{metadata:{version:4.2,type:"material",generator:"MaterialExporter"},uuid:this.uuid,type:this.type,materials:[]},c=this.materials,d=0,e=c.length;d<e;d++){var f=c[d].toJSON(a);delete f.metadata;b.materials.push(f)}b.visible=this.visible;return b},clone:function(){for(var a=new this.constructor,b=0;b<this.materials.length;b++)a.materials.push(this.materials[b].clone());a.visible=this.visible;return a}};Oa.prototype=Object.create(U.prototype);Oa.prototype.constructor=Oa;Oa.prototype.isMeshStandardMaterial=
-!0;Oa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);
-this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=
-a.morphTargets;this.morphNormals=a.morphNormals;return this};pb.prototype=Object.create(Oa.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshPhysicalMaterial=!0;pb.prototype.copy=function(a){Oa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};db.prototype=Object.create(U.prototype);db.prototype.constructor=db;db.prototype.isMeshPhongMaterial=!0;db.prototype.copy=function(a){U.prototype.copy.call(this,
-a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=
-a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype=
-Object.create(U.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshNormalMaterial=!0;qb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};rb.prototype=Object.create(U.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshLambertMaterial=!0;rb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;
-this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=
-a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};sb.prototype=Object.create(U.prototype);sb.prototype.constructor=sb;sb.prototype.isLineDashedMaterial=!0;sb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Df=Object.freeze({ShadowMaterial:$b,SpriteMaterial:kb,RawShaderMaterial:ac,ShaderMaterial:Fa,PointsMaterial:xa,
-MultiMaterial:Kc,MeshPhysicalMaterial:pb,MeshStandardMaterial:Oa,MeshPhongMaterial:db,MeshNormalMaterial:qb,MeshLambertMaterial:rb,MeshDepthMaterial:Za,MeshBasicMaterial:Ma,LineDashedMaterial:sb,LineBasicMaterial:oa,Material:U}),ce={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},Ga=new Fd;Object.assign(Ja.prototype,{load:function(a,b,c,d){void 0===
-a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ce.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":m=new ArrayBuffer(g.length);for(var n=new Uint8Array(m),k=0;k<g.length;k++)n[k]=g.charCodeAt(k);"blob"===l&&(m=
-new Blob([m],{type:h}));break;case "document":m=(new DOMParser).parseFromString(g,h);break;case "json":m=JSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(q){window.setTimeout(function(){d&&d(q);e.manager.itemError(a)},0)}}else{var p=new XMLHttpRequest;p.open("GET",a,!0);p.addEventListener("load",function(c){var f=c.target.response;ce.add(a,f);200===this.status?(b&&b(f),e.manager.itemEnd(a)):0===this.status?(console.warn("THREE.XHRLoader: HTTP Status 0 received."),
-b&&b(f),e.manager.itemEnd(a)):(d&&d(c),e.manager.itemError(a))},!1);void 0!==c&&p.addEventListener("progress",function(a){c(a)},!1);p.addEventListener("error",function(b){d&&d(b);e.manager.itemError(a)},!1);void 0!==this.responseType&&(p.responseType=this.responseType);void 0!==this.withCredentials&&(p.withCredentials=this.withCredentials);p.overrideMimeType&&p.overrideMimeType("text/plain");p.send(null)}e.manager.itemStart(a);return p},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=
-a;return this},setWithCredentials:function(a){this.withCredentials=a;return this}});Object.assign(we.prototype,{load:function(a,b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Lb;h.image=g;var k=new Ja(this.manager);k.setPath(this.path);k.setResponseType("arraybuffer");if(Array.isArray(a))for(var m=
-0,l=0,n=a.length;l<n;++l)e(l);else k.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=a;
-return this}});Object.assign(Gd.prototype,{load:function(a,b,c,d){var e=this,f=new lb,g=new Ja(this.manager);g.setResponseType("arraybuffer");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?
-a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Lc.prototype,{load:function(a,b,c,d){var e=this,f=document.createElementNS("http://www.w3.org/1999/xhtml","img");f.onload=function(){f.onload=null;URL.revokeObjectURL(f.src);b&&b(f);e.manager.itemEnd(a)};f.onerror=d;if(0===a.indexOf("data:"))f.src=a;else{var g=new Ja;g.setPath(this.path);
-g.setResponseType("blob");g.setWithCredentials(this.withCredentials);g.load(a,function(a){f.src=URL.createObjectURL(a)},c,d)}e.manager.itemStart(a);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(Hd.prototype,{load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Xa,g=new Lc(this.manager);
-g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(gd.prototype,{load:function(a,b,c,d){var e=new da,f=new Lc(this.manager);f.setCrossOrigin(this.crossOrigin);f.setWithCredentials(this.withCredentials);f.setPath(this.path);f.load(a,function(c){var d=0<a.search(/\.(jpg|jpeg)$/)||0===a.search(/^data\:image\/jpeg/);e.format=d?1022:
-1023;e.image=c;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e},setCrossOrigin:function(a){this.crossOrigin=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setPath:function(a){this.path=a;return this}});pa.prototype=Object.assign(Object.create(z.prototype),{constructor:pa,isLight:!0,copy:function(a){z.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();
-a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});hd.prototype=Object.assign(Object.create(pa.prototype),{constructor:hd,isHemisphereLight:!0,copy:function(a){pa.prototype.copy.call(this,
-a);this.groundColor.copy(a.groundColor);return this}});Object.assign(tb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;
-return a}});id.prototype=Object.assign(Object.create(tb.prototype),{constructor:id,isSpotLightShadow:!0,update:function(a){var b=2*T.RAD2DEG*a.angle,c=this.mapSize.width/this.mapSize.height;a=a.distance||500;var d=this.camera;if(b!==d.fov||c!==d.aspect||a!==d.far)d.fov=b,d.aspect=c,d.far=a,d.updateProjectionMatrix()}});jd.prototype=Object.assign(Object.create(pa.prototype),{constructor:jd,isSpotLight:!0,copy:function(a){pa.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=
-a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});kd.prototype=Object.assign(Object.create(pa.prototype),{constructor:kd,isPointLight:!0,copy:function(a){pa.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});ld.prototype=Object.assign(Object.create(tb.prototype),{constructor:ld});md.prototype=Object.assign(Object.create(pa.prototype),{constructor:md,isDirectionalLight:!0,copy:function(a){pa.prototype.copy.call(this,
-a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});nd.prototype=Object.assign(Object.create(pa.prototype),{constructor:nd,isAmbientLight:!0});var ma={arraySlice:function(a,b,c){return ma.isTypedArray(a)?new a.constructor(a.subarray(b,c)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=
-a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],
-void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];while(void 0!==f)}}}};qa.prototype={constructor:qa,evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&
-(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||
-this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(a,b,c,d){throw Error("call to abstract method");},intervalChanged_:function(a,b,c){}};Object.assign(qa.prototype,{beforeStart_:qa.prototype.copySampleValue_,afterEnd_:qa.prototype.copySampleValue_});od.prototype=Object.assign(Object.create(qa.prototype),{constructor:od,DefaultSettings_:{endingStart:2400,endingEnd:2400},
-intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,
-b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,n=this._weightNext,p=(c-b)/(d-b);c=p*p;d=c*p;b=-l*d+2*l*c-l*p;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+p*f[a+c]+n*f[m+c];return e}});Mc.prototype=Object.assign(Object.create(qa.prototype),{constructor:Mc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;
-a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});pd.prototype=Object.assign(Object.create(qa.prototype),{constructor:pd,interpolate_:function(a,b,c,d){return this.copySampleValue_(a-1)}});var Wa;Wa={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new pd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Mc(this.times,this.values,
-this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new od(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){var b;switch(a){case 2300:b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);
-else throw Error(b);console.warn(b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=
-0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),d=this.getValueSize(),this.times=ma.arraySlice(c,e,f),this.values=ma.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("invalid value size in track",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("track is empty",
-this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("time is not a valid number",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("out of order keys",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ma.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("value is not a valid number",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,
-f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==k[0]))if(d)h=!0;else for(var m=g*c,l=m-c,n=m+c,k=0;k!==c;++k){var p=b[m+k];if(p!==b[l+k]||p!==b[n+k]){h=!0;break}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=ma.arraySlice(a,0,e),this.values=ma.arraySlice(b,0,e*c));return this}};bc.prototype=Object.assign(Object.create(Wa),{constructor:bc,ValueTypeName:"vector"});
-qd.prototype=Object.assign(Object.create(qa.prototype),{constructor:qd,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)ba.slerpFlat(e,0,f,a-g,f,a,b);return e}});Nc.prototype=Object.assign(Object.create(Wa),{constructor:Nc,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new qd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});
-cc.prototype=Object.assign(Object.create(Wa),{constructor:cc,ValueTypeName:"number"});rd.prototype=Object.assign(Object.create(Wa),{constructor:rd,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});sd.prototype=Object.assign(Object.create(Wa),{constructor:sd,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});
-td.prototype=Object.assign(Object.create(Wa),{constructor:td,ValueTypeName:"color"});vb.prototype=Wa;Wa.constructor=vb;Object.assign(vb,{parse:function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");var b=vb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];ma.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=
-b.toJSON(a);else{var b={name:a.name,times:ma.convertArray(a.times,Array),values:ma.convertArray(a.values,Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return cc;case "vector":case "vector2":case "vector3":case "vector4":return bc;case "color":return td;case "quaternion":return Nc;case "bool":case "boolean":return sd;
-case "string":return rd}throw Error("Unsupported typeName: "+a);}});Ha.prototype={constructor:Ha,resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}};Object.assign(Ha,{parse:function(a){for(var b=[],c=a.tracks,
-d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(vb.parse(c[e]).scale(d));return new Ha(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(vb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=ma.getKeyframeOrder(h),h=ma.sortedArray(h,1,m),k=ma.sortedArray(k,1,m);d||0!==h[0]||(h.push(e),
-k.push(k[0]));f.push((new cc(".morphTargetInfluences["+b[g].name+"]",h,k)).scale(1/c))}return new Ha(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(var d=0;d<c.length;d++)if(c[d].name===b)return c[d];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];for(m in d)a.push(Ha.CreateFromMorphTargetSequence(m,
-d[m],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("  no animation in JSONLoader data"),null;for(var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ma.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30,h=a.hierarchy||[],k=0;k<h.length;k++){var m=h[k].keys;if(m&&0!==m.length)if(m[0].morphTargets){for(var f={},l=0;l<m.length;l++)if(m[l].morphTargets)for(var n=0;n<m[l].morphTargets.length;n++)f[m[l].morphTargets[n]]=
--1;for(var p in f){for(var q=[],x=[],n=0;n!==m[l].morphTargets.length;++n){var t=m[l];q.push(t.time);x.push(t.morphTarget===p?1:0)}d.push(new cc(".morphTargetInfluence["+p+"]",q,x))}f=f.length*(g||1)}else l=".bones["+b[k].name+"]",c(bc,l+".position",m,"pos",d),c(Nc,l+".quaternion",m,"rot",d),c(bc,l+".scale",m,"scl",d)}return 0===d.length?null:new Ha(e,f,d)}});Object.assign(ud.prototype,{load:function(a,b,c,d){var e=this;(new Ja(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=
-a},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Df[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);
-void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.shading&&(d.shading=a.shading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=
-a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=
-a.morphTargets);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new B).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=
-b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));
-void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);if(void 0!==a.materials)for(var e=0,f=a.materials.length;e<f;e++)d.materials.push(this.parse(a.materials[e]));return d}});Object.assign(Id.prototype,{load:function(a,b,c,d){var e=this;(new Ja(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},
-c,d)},parse:function(a){var b=new G,c=a.data.index,d={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};void 0!==c&&(c=new d[c.type](c.array),b.setIndex(new C(c,1)));var e=a.data.attributes,f;for(f in e){var g=e[f],c=new d[g.type](g.array);b.addAttribute(f,new C(c,g.itemSize,g.normalized))}d=a.data.groups||a.data.drawcalls||a.data.offsets;
-if(void 0!==d)for(f=0,c=d.length;f!==c;++f)e=d[f],b.addGroup(e.start,e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(d=new q,void 0!==a.center&&d.fromArray(a.center),b.boundingSphere=new Ca(d,a.radius));return b}});wb.prototype={constructor:wb,crossOrigin:void 0,extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a,
-b,c;return function(d,e,f){function g(a,c,d,g,k){a=e+a;var l=wb.Handlers.get(a);null!==l?a=l.load(a):(b.setCrossOrigin(f),a=b.load(a));void 0!==c&&(a.repeat.fromArray(c),1!==c[0]&&(a.wrapS=1E3),1!==c[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==g&&("repeat"===g[0]&&(a.wrapS=1E3),"mirror"===g[0]&&(a.wrapS=1002),"repeat"===g[1]&&(a.wrapT=1E3),"mirror"===g[1]&&(a.wrapT=1002));void 0!==k&&(a.anisotropy=k);c=T.generateUUID();h[c]=a;return c}void 0===a&&(a=new O);void 0===b&&(b=new gd);
-void 0===c&&(c=new ud);var h={},k={uuid:T.generateUUID(),type:"MeshLambertMaterial"},m;for(m in d){var l=d[m];switch(m){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":k.name=l;break;case "blending":k.blending=Fe[l];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",m,"is no longer supported.");break;case "colorDiffuse":k.color=a.fromArray(l).getHex();break;case "colorSpecular":k.specular=a.fromArray(l).getHex();break;
-case "colorEmissive":k.emissive=a.fromArray(l).getHex();break;case "specularCoef":k.shininess=l;break;case "shading":"basic"===l.toLowerCase()&&(k.type="MeshBasicMaterial");"phong"===l.toLowerCase()&&(k.type="MeshPhongMaterial");"standard"===l.toLowerCase()&&(k.type="MeshStandardMaterial");break;case "mapDiffuse":k.map=g(l,d.mapDiffuseRepeat,d.mapDiffuseOffset,d.mapDiffuseWrap,d.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;
-case "mapEmissive":k.emissiveMap=g(l,d.mapEmissiveRepeat,d.mapEmissiveOffset,d.mapEmissiveWrap,d.mapEmissiveAnisotropy);break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break;case "mapLight":k.lightMap=g(l,d.mapLightRepeat,d.mapLightOffset,d.mapLightWrap,d.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":k.aoMap=g(l,d.mapAORepeat,d.mapAOOffset,d.mapAOWrap,
-d.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":k.bumpMap=g(l,d.mapBumpRepeat,d.mapBumpOffset,d.mapBumpWrap,d.mapBumpAnisotropy);break;case "mapBumpScale":k.bumpScale=l;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":k.normalMap=g(l,d.mapNormalRepeat,d.mapNormalOffset,d.mapNormalWrap,d.mapNormalAnisotropy);break;case "mapNormalFactor":k.normalScale=[l,l];break;
-case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":k.specularMap=g(l,d.mapSpecularRepeat,d.mapSpecularOffset,d.mapSpecularWrap,d.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapMetalness":k.metalnessMap=g(l,d.mapMetalnessRepeat,d.mapMetalnessOffset,d.mapMetalnessWrap,d.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;
-case "mapRoughness":k.roughnessMap=g(l,d.mapRoughnessRepeat,d.mapRoughnessOffset,d.mapRoughnessWrap,d.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":k.alphaMap=g(l,d.mapAlphaRepeat,d.mapAlphaOffset,d.mapAlphaWrap,d.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":k.side=1;break;case "doubleSided":k.side=
-2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");k.opacity=l;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":k[m]=l;break;case "vertexColors":!0===l&&(k.vertexColors=2);"face"===l&&(k.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",m,l)}}"MeshBasicMaterial"===k.type&&delete k.emissive;"MeshPhongMaterial"!==
-k.type&&delete k.specular;1>k.opacity&&(k.transparent=!0);c.setTextures(h);return c.parse(k)}}()};wb.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};Object.assign(Jd.prototype,{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:wb.prototype.extractUrlBase(a),g=new Ja(this.manager);g.setWithCredentials(this.withCredentials);
-g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(a,b){var c=new Q,d=void 0!==a.scale?1/a.scale:
-1;(function(b){var d,g,h,k,l,w,n,p,r,x,t,D,u,v=a.faces;w=a.vertices;var z=a.normals,y=a.colors,E=0;if(void 0!==a.uvs){for(d=0;d<a.uvs.length;d++)a.uvs[d].length&&E++;for(d=0;d<E;d++)c.faceVertexUvs[d]=[]}k=0;for(l=w.length;k<l;)d=new q,d.x=w[k++]*b,d.y=w[k++]*b,d.z=w[k++]*b,c.vertices.push(d);k=0;for(l=v.length;k<l;)if(b=v[k++],r=b&1,h=b&2,d=b&8,n=b&16,x=b&32,w=b&64,b&=128,r){r=new ea;r.a=v[k];r.b=v[k+1];r.c=v[k+3];t=new ea;t.a=v[k+1];t.b=v[k+2];t.c=v[k+3];k+=4;h&&(h=v[k++],r.materialIndex=h,t.materialIndex=
-h);h=c.faces.length;if(d)for(d=0;d<E;d++)for(D=a.uvs[d],c.faceVertexUvs[d][h]=[],c.faceVertexUvs[d][h+1]=[],g=0;4>g;g++)p=v[k++],u=D[2*p],p=D[2*p+1],u=new B(u,p),2!==g&&c.faceVertexUvs[d][h].push(u),0!==g&&c.faceVertexUvs[d][h+1].push(u);n&&(n=3*v[k++],r.normal.set(z[n++],z[n++],z[n]),t.normal.copy(r.normal));if(x)for(d=0;4>d;d++)n=3*v[k++],x=new q(z[n++],z[n++],z[n]),2!==d&&r.vertexNormals.push(x),0!==d&&t.vertexNormals.push(x);w&&(w=v[k++],w=y[w],r.color.setHex(w),t.color.setHex(w));if(b)for(d=
-0;4>d;d++)w=v[k++],w=y[w],2!==d&&r.vertexColors.push(new O(w)),0!==d&&t.vertexColors.push(new O(w));c.faces.push(r);c.faces.push(t)}else{r=new ea;r.a=v[k++];r.b=v[k++];r.c=v[k++];h&&(h=v[k++],r.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<E;d++)for(D=a.uvs[d],c.faceVertexUvs[d][h]=[],g=0;3>g;g++)p=v[k++],u=D[2*p],p=D[2*p+1],u=new B(u,p),c.faceVertexUvs[d][h].push(u);n&&(n=3*v[k++],r.normal.set(z[n++],z[n++],z[n]));if(x)for(d=0;3>d;d++)n=3*v[k++],x=new q(z[n++],z[n++],z[n]),r.vertexNormals.push(x);
-w&&(w=v[k++],r.color.setHex(y[w]));if(b)for(d=0;3>d;d++)w=v[k++],r.vertexColors.push(new O(y[w]));c.faces.push(r)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,g=a.skinWeights.length;d<g;d+=b)c.skinWeights.push(new ga(a.skinWeights[d],1<b?a.skinWeights[d+1]:0,2<b?a.skinWeights[d+2]:0,3<b?a.skinWeights[d+3]:0));if(a.skinIndices)for(d=0,g=a.skinIndices.length;d<g;d+=b)c.skinIndices.push(new ga(a.skinIndices[d],1<b?a.skinIndices[d+1]:0,2<
-b?a.skinIndices[d+2]:0,3<b?a.skinIndices[d+3]:0));c.bones=a.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+") should match.")})();(function(b){if(void 0!==a.morphTargets)for(var d=0,g=a.morphTargets.length;d<g;d++){c.morphTargets[d]={};c.morphTargets[d].name=a.morphTargets[d].name;
-c.morphTargets[d].vertices=[];for(var h=c.morphTargets[d].vertices,k=a.morphTargets[d].vertices,l=0,w=k.length;l<w;l+=3){var n=new q;n.x=k[l]*b;n.y=k[l+1]*b;n.z=k[l+2]*b;h.push(n)}}if(void 0!==a.morphColors&&0<a.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),b=c.faces,h=a.morphColors[0].colors,d=0,g=b.length;d<g;d++)b[d].color.fromArray(h,3*d)})(d);(function(){var b=[],d=[];void 0!==a.animation&&d.push(a.animation);void 0!==a.animations&&
-(a.animations.length?d=d.concat(a.animations):d.push(a.animations));for(var g=0;g<d.length;g++){var h=Ha.parseAnimation(d[g],c.bones);h&&b.push(h)}c.morphTargets&&(d=Ha.CreateClipsFromMorphTargetSequences(c.morphTargets,10),b=b.concat(d));0<b.length&&(c.animations=b)})();c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};d=wb.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}});Object.assign(xe.prototype,
-{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ja(e.manager)).load(a,function(a){e.parse(JSON.parse(a),b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);
-a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new Jd,d=new Id,e=0,f=a.length;e<f;e++){var g,h=a[e];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":g=new Na[h.type](h.width,h.height,h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":g=new Na[h.type](h.width,h.height,h.depth,h.widthSegments,
-h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":g=new Na[h.type](h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":g=new Na[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":g=new Na[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);
-break;case "SphereGeometry":case "SphereBufferGeometry":g=new Na[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "IcosahedronGeometry":case "OctahedronGeometry":case "TetrahedronGeometry":g=new Na[h.type](h.radius,h.detail);break;case "RingGeometry":case "RingBufferGeometry":g=new Na[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":g=
-new Na[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":g=new Na[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":g=new Na[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case "BufferGeometry":g=d.parse(h);break;case "Geometry":g=c.parse(h.data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+
-h.type+'"');continue}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new ud;d.setTextures(b);for(var e=0,f=a.length;e<f;e++){var g=d.parse(a[e]);c[g.uuid]=g}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=Ha.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return g.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a)})}
-var d=this,e={};if(void 0!==a&&0<a.length){var f=new Fd(b),g=new Lc(f);g.setCrossOrigin(this.crossOrigin);for(var f=0,h=a.length;f<h;f++){var k=a[f],l=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(k.url)?k.url:d.texturePath+k.url;e[k.uuid]=c(l)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&
-console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=new da(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Ge));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],ae),h.wrapT=c(g.wrap[1],ae));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,be));
-void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,be));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new J;return function(b,c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return c[a]}function f(a){if(void 0!==a)return void 0===d[a]&&console.warn("THREE.ObjectLoader: Undefined material",a),d[a]}var g;switch(b.type){case "Scene":g=new jb;void 0!==b.background&&Number.isInteger(b.background)&&
-(g.background=new O(b.background));void 0!==b.fog&&("Fog"===b.fog.type?g.fog=new Jb(b.fog.color,b.fog.near,b.fog.far):"FogExp2"===b.fog.type&&(g.fog=new Ib(b.fog.color,b.fog.density)));break;case "PerspectiveCamera":g=new Ea(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=Object.assign({},b.view));break;case "OrthographicCamera":g=
-new Hb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":g=new nd(b.color,b.intensity);break;case "DirectionalLight":g=new md(b.color,b.intensity);break;case "PointLight":g=new kd(b.color,b.intensity,b.distance,b.decay);break;case "SpotLight":g=new jd(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case "HemisphereLight":g=new hd(b.color,b.groundColor,b.intensity);break;case "Mesh":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new dd(g,h):new ya(g,
-h);break;case "LOD":g=new rc;break;case "Line":g=new Ta(e(b.geometry),f(b.material),b.mode);break;case "LineSegments":g=new la(e(b.geometry),f(b.material));break;case "PointCloud":case "Points":g=new Kb(e(b.geometry),f(b.material));break;case "Sprite":g=new qc(f(b.material));break;case "Group":g=new sc;break;default:g=new z}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),
-void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),void 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=
-this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=b.userData);if(void 0!==b.children)for(var k in b.children)g.add(this.parseObject(b.children[k],c,d));if("LOD"===b.type)for(b=b.levels,h=0;h<b.length;h++){var l=b[h];k=g.getObjectByProperty("uuid",l.object);void 0!==k&&g.addLevel(k,l.distance)}return g}}()});ia.prototype={constructor:ia,getPoint:function(a){console.warn("THREE.Curve: Warning, getPoint() not implemented!");return null},getPointAt:function(a){a=
-this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){a||(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){a||(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;
-this.needsUpdate=!1;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++)c=this.getPoint(e/a),f+=c.distanceTo(d),b.push(f),d=c;return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,k;g<=h;)if(d=Math.floor(g+(h-g)/2),k=c[d]-f,0>k)g=d+1;else if(0<k)h=d-1;else{h=d;break}d=h;if(c[d]===f)return d/(e-1);g=c[d];return(d+(f-g)/(c[d+1]-g))/(e-1)},getTangent:function(a){var b=
-a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new q,d=[],e=[],f=[],g=new q,h=new J,k,l;for(k=0;k<=a;k++)l=k/a,d[k]=this.getTangentAt(l),d[k].normalize();e[0]=new q;f[0]=new q;k=Number.MAX_VALUE;l=Math.abs(d[0].x);var w=Math.abs(d[0].y),n=Math.abs(d[0].z);l<=k&&(k=l,c.set(1,0,0));w<=k&&(k=w,c.set(0,1,0));n<=k&&c.set(0,0,1);
-g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(T.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(T.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),
-f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}}};ia.create=function(a,b){a.prototype=Object.create(ia.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Sa.prototype=Object.create(ia.prototype);Sa.prototype.constructor=Sa;Sa.prototype.isLineCurve=!0;Sa.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};Sa.prototype.getPointAt=function(a){return this.getPoint(a)};Sa.prototype.getTangent=
-function(a){return this.v2.clone().sub(this.v1).normalize()};Oc.prototype=Object.assign(Object.create(ia.prototype),{constructor:Oc,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new Sa(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},
-getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){a||(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&
-b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},createPointsGeometry:function(a){a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){a=this.getSpacedPoints(a);
-return this.createGeometry(a)},createGeometry:function(a){for(var b=new Q,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new q(e.x,e.y,e.z||0))}return b}});Va.prototype=Object.create(ia.prototype);Va.prototype.constructor=Va;Va.prototype.isEllipseCurve=!0;Va.prototype.getPoint=function(a){for(var b=2*Math.PI,c=this.aEndAngle-this.aStartAngle,d=Math.abs(c)<Number.EPSILON;0>c;)c+=b;for(;c>b;)c-=b;c<Number.EPSILON&&(c=d?0:b);!0!==this.aClockwise||d||(c=c===b?-b:c-b);b=this.aStartAngle+a*c;a=this.aX+
-this.xRadius*Math.cos(b);var e=this.aY+this.yRadius*Math.sin(b);0!==this.aRotation&&(b=Math.cos(this.aRotation),c=Math.sin(this.aRotation),d=a-this.aX,e-=this.aY,a=d*b-e*c+this.aX,e=d*c+e*b+this.aY);return new B(a,e)};var Xc={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a,b,c,d,e){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*
-a-2*a)},interpolate:function(a,b,c,d,e){a=.5*(c-a);d=.5*(d-b);var f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}};xb.prototype=Object.create(ia.prototype);xb.prototype.constructor=xb;xb.prototype.isSplineCurve=!0;xb.prototype.getPoint=function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0===c?c:c-1],e=b[c],f=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=Xc.interpolate;return new B(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a))};yb.prototype=Object.create(ia.prototype);
-yb.prototype.constructor=yb;yb.prototype.getPoint=function(a){var b=ra.b3;return new B(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))};yb.prototype.getTangent=function(a){var b=Xc.tangentCubicBezier;return(new B(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))).normalize()};zb.prototype=Object.create(ia.prototype);zb.prototype.constructor=zb;zb.prototype.getPoint=function(a){var b=ra.b2;return new B(b(a,this.v0.x,
-this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))};zb.prototype.getTangent=function(a){var b=Xc.tangentQuadraticBezier;return(new B(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))).normalize()};var de=Object.assign(Object.create(Oc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Sa(this.currentPoint.clone(),new B(a,b));
-this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,b,c,d){a=new zb(this.currentPoint.clone(),new B(a,b),new B(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new yb(this.currentPoint.clone(),new B(a,b),new B(c,d),new B(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new xb(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,
-e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Va(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)}});Ab.prototype=Object.assign(Object.create(de),
-{constructor:Ab,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractAllPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},extractPoints:function(a){return this.extractAllPoints(a)}});Pc.prototype=de;de.constructor=Pc;Kd.prototype={moveTo:function(a,b){this.currentPath=new Pc;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,
-b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Ab;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,l=h.y-g.y;if(Math.abs(l)>Number.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.y<g.y||a.y>h.y))if(a.y===
-g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=ra.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,l=[];if(1===f.length)return h=f[0],k=new Ab,k.curves=h.curves,l.push(k),l;var q=!e(f[0].getPoints()),q=a?!q:q;k=[];var n=[],p=[],r=0,x;n[r]=void 0;p[r]=[];for(var t=0,D=f.length;t<D;t++)h=f[t],x=h.getPoints(),g=e(x),(g=a?!g:g)?(!q&&n[r]&&r++,
-n[r]={s:new Ab,p:x},n[r].s.curves=h.curves,q&&r++,p[r]=[]):p[r].push({h:h,p:x[0]});if(!n[0])return c(f);if(1<n.length){t=!1;h=[];e=0;for(f=n.length;e<f;e++)k[e]=[];e=0;for(f=n.length;e<f;e++)for(g=p[e],q=0;q<g.length;q++){r=g[q];x=!0;for(D=0;D<n.length;D++)d(r.p,n[D].p)&&(e!==D&&h.push({froms:e,tos:D,hole:q}),x?(x=!1,k[D].push(r)):t=!0);x&&k[e].push(r)}0<h.length&&(t||(p=k))}t=0;for(e=n.length;t<e;t++)for(k=n[t].s,l.push(k),h=p[t],f=0,g=h.length;f<g;f++)k.holes.push(h[f].h);return l}};Object.assign(Ld.prototype,
-{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=100);void 0===c&&(c=4);var d=this.data;a=String(a).split("");var e=b/d.resolution,f=0;b=[];for(var g=0;g<a.length;g++){var h;h=e;var k=f,l=d.glyphs[a[g]]||d.glyphs["?"];if(l){var q=new Kd,n=[],p=ra.b2,r=ra.b3,x,t,D,u,v,z,y,E;if(l.o)for(var B=l._cachedOutline||(l._cachedOutline=l.o.split(" ")),C=0,G=B.length;C<G;)switch(B[C++]){case "m":x=B[C++]*h+k;t=B[C++]*h;q.moveTo(x,t);break;case "l":x=B[C++]*h+k;t=B[C++]*h;q.lineTo(x,t);break;case "q":x=
-B[C++]*h+k;t=B[C++]*h;v=B[C++]*h+k;z=B[C++]*h;q.quadraticCurveTo(v,z,x,t);if(u=n[n.length-1]){D=u.x;u=u.y;for(var J=1;J<=c;J++){var K=J/c;p(K,D,v,x);p(K,u,z,t)}}break;case "b":if(x=B[C++]*h+k,t=B[C++]*h,v=B[C++]*h+k,z=B[C++]*h,y=B[C++]*h+k,E=B[C++]*h,q.bezierCurveTo(v,z,y,E,x,t),u=n[n.length-1])for(D=u.x,u=u.y,J=1;J<=c;J++)K=J/c,r(K,D,v,y,x),r(K,u,z,E,t)}h={offset:l.ha*h,path:q}}else h=void 0;f+=h.offset;b.push(h.path)}c=[];d=0;for(a=b.length;d<a;d++)Array.prototype.push.apply(c,b[d].toShapes());
-return c}});Object.assign(ye.prototype,{load:function(a,b,c,d){var e=this;(new Ja(this.manager)).load(a,function(a){var c;try{c=JSON.parse(a)}catch(d){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new Ld(a)}});var Nd;Object.assign(Od.prototype,{load:function(a,b,c,d){var e=new Ja(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){Md().decodeAudioData(a,
-function(a){b(a)})},c,d)}});Object.assign(ze.prototype,{update:function(){var a,b,c,d,e,f,g,h=new J,k=new J;return function(l){if(a!==this||b!==l.focus||c!==l.fov||d!==l.aspect*this.aspect||e!==l.near||f!==l.far||g!==l.zoom){a=this;b=l.focus;c=l.fov;d=l.aspect*this.aspect;e=l.near;f=l.far;g=l.zoom;var q=l.projectionMatrix.clone(),n=this.eyeSep/2,p=n*e/b,r=e*Math.tan(T.DEG2RAD*c*.5)/g,x;k.elements[12]=-n;h.elements[12]=n;n=-r*d+p;x=r*d+p;q.elements[0]=2*e/(x-n);q.elements[8]=(x+n)/(x-n);this.cameraL.projectionMatrix.copy(q);
-n=-r*d-p;x=r*d-p;q.elements[0]=2*e/(x-n);q.elements[8]=(x+n)/(x-n);this.cameraR.projectionMatrix.copy(q)}this.cameraL.matrixWorld.copy(l.matrixWorld).multiply(k);this.cameraR.matrixWorld.copy(l.matrixWorld).multiply(h)}}()});vd.prototype=Object.create(z.prototype);vd.prototype.constructor=vd;Pd.prototype=Object.assign(Object.create(z.prototype),{constructor:Pd,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),
-this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=
-new q,b=new ba,c=new q,d=new q;return function(e){z.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.setPosition(a.x,a.y,a.z);e.setOrientation(d.x,d.y,d.z,f.x,f.y,f.z)}}()});dc.prototype=Object.assign(Object.create(z.prototype),{constructor:dc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},
-setBuffer:function(a){this.source.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else{var a=this.context.createBufferSource();a.buffer=this.source.buffer;a.loop=this.source.loop;a.onended=this.source.onended;a.start(0,this.startTime);a.playbackRate.value=this.playbackRate;this.isPlaying=
-!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.startTime=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);
-for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},
-getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&(this.source.playbackRate.value=this.playbackRate),
-this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.source.loop},setLoop:function(a){!1===this.hasPlaybackControl?console.warn("THREE.Audio: this Audio has no playback control."):this.source.loop=a},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});Qd.prototype=Object.assign(Object.create(dc.prototype),
-{constructor:Qd,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=
-a},updateMatrixWorld:function(){var a=new q;return function(b){z.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(Rd.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});wd.prototype={constructor:wd,accumulate:function(a,b){var c=this.buffer,d=
-this.valueSize,e=a*d+d,f=this.cumulativeWeight;if(0===f){for(f=0;f!==d;++f)c[e+f]=c[f];f=b}else f+=b,this._mixBufferRegion(c,e,0,b/f,d);this.cumulativeWeight=f},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=
-b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d,e){ba.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}};fa.prototype={constructor:fa,getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=
-this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=fa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("  can not bind to material as node does not have a material",this);return}if(!a.material.materials){console.error("  can not bind to material.materials as node.material does not have a materials array",
-this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error("  can not bind to bones as node does not have a skeleton",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("  can not bind to objectName of node, undefined",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("  trying to bind to objectIndex of objectName, but is undefined:",this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("  trying to update property for track: "+
-b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("  can not bind to morphTargetInfluences becasuse node does not have a geometry",this);return}if(!a.geometry.morphTargets){console.error("  can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets",
-this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):void 0!==f.length?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("  trying to update node for track: "+
-this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}};Object.assign(fa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},_getValue_unbound:fa.prototype.getValue,_setValue_unbound:fa.prototype.setValue,BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},
-function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.node[this.propertyName]=a[b]},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,
-d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];
-this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]]});fa.Composite=function(a,b,c){c=c||fa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)};fa.Composite.prototype={constructor:fa.Composite,getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];
-void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}};fa.create=function(a,b,c){return a&&a.isAnimationObjectGroup?new fa.Composite(a,b,c):new fa(a,b,c)};fa.parseTrackName=function(a){var b=
-/^((?:\w+[\/:])*)(\w+)?(?:\.(\w+)(?:\[(.+)\])?)?\.(\w+)(?:\[(.+)\])?$/.exec(a);if(!b)throw Error("cannot parse trackName at all: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};if(null===b.propertyName||0===b.propertyName.length)throw Error("can not parse propertyName from trackName: "+a);return b};fa.findNode=function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=
-a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var g=a[c];if(g.name===b||g.uuid===b||(g=d(g.children)))return g}return null};if(c=d(a.children))return c}return null};Sd.prototype={constructor:Sd,isAnimationObjectGroup:!0,add:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._paths,g=this._parsedPaths,h=this._bindings,k=h.length,l=0,q=arguments.length;l!==q;++l){var n=
-arguments[l],p=n.uuid,r=e[p];if(void 0===r){r=c++;e[p]=r;b.push(n);for(var p=0,x=k;p!==x;++p)h[p].push(new fa(n,f[p],g[p]))}else if(r<d){var t=b[r],D=--d,x=b[D];e[x.uuid]=r;b[r]=x;e[p]=D;b[D]=n;p=0;for(x=k;p!==x;++p){var u=h[p],v=u[r];u[r]=u[D];void 0===v&&(v=new fa(n,f[p],g[p]));u[D]=v}}else b[r]!==t&&console.error("Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes...")}this.nCachedObjects_=d},remove:function(a){for(var b=this._objects,
-c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g],l=k.uuid,q=d[l];if(void 0!==q&&q>=c){var n=c++,p=b[n];d[p.uuid]=q;b[q]=p;d[l]=n;b[n]=k;k=0;for(l=f;k!==l;++k){var p=e[k],r=p[q];p[q]=p[n];p[n]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,q=e[l];if(void 0!==
-q)if(delete e[l],q<d){var l=--d,n=b[l],p=--c,r=b[p];e[n.uuid]=q;b[q]=n;e[r.uuid]=l;b[l]=r;b.pop();n=0;for(r=g;n!==r;++n){var x=f[n],t=x[p];x[q]=x[l];x[l]=t;x.pop()}}else for(p=--c,r=b[p],e[r.uuid]=q,b[q]=r,b.pop(),n=0,r=g;n!==r;++n)x=f[n],x[q]=x[p],x.pop()}this.nCachedObjects_=d},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,l=Array(h.length),d=e.length;c[a]=
-d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new fa(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}};Td.prototype={constructor:Td,play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=
-!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?
-a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=
-null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,
-b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||
-this._mixer._root},_update:function(a,b,c,d){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;for(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&
-(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===d)a:{if(-1===e&&(this.loopCount=
-0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",
-action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,
-f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}};Object.assign(Ud.prototype,sa.prototype,{clipAction:function(a,b){var c=b||this._root,d=c.uuid,e="string"===typeof a?Ha.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===e&&(e=g._clip)}if(null===e)return null;e=new Td(this,
-e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?Ha.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=
-this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g){var h=b[g];h.enabled&&h._update(d,a,e,f)}a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,
-k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,b);
-null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Object.assign(Ud.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var q=d[k],n=q.name,p=l[n];if(void 0===p){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,n));continue}p=new wd(fa.create(c,n,b&&b._propertyBindings[k].binding.parsedPath),
-q.ValueTypeName,q.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,n)}f[k]=p;g[k].resultBuffer=p.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},
-_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},
-get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=
-f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var c=a._clip.uuid,d=this._actionsByClip,e=d[c],f=e.knownActions,g=f[f.length-1],h=a._byClipCacheIndex;g._byClipCacheIndex=h;f[h]=g;f.pop();a._byClipCacheIndex=null;delete e.actionByRoot[(b._localRoot||this._root).uuid];0===f.length&&delete d[c];this._removeInactiveBindingsForAction(a)},
-_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,
-e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=
-this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Mc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=
-d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1)});Bb.prototype=Object.create(G.prototype);Bb.prototype.constructor=Bb;Bb.prototype.isInstancedBufferGeometry=!0;Bb.prototype.addGroup=function(a,b,c){this.groups.push({start:a,count:b,materialIndex:c})};Bb.prototype.copy=function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,
-d.count,d.materialIndex)}return this};Vd.prototype={constructor:Vd,isInterleavedBufferAttribute:!0,get count(){return this.data.count},get array(){return this.data.array},setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},
-getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+
-1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}};ec.prototype={constructor:ec,isInterleavedBuffer:!0,set needsUpdate(a){!0===a&&this.version++},setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=
-a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)}};fc.prototype=Object.create(ec.prototype);fc.prototype.constructor=fc;fc.prototype.isInstancedInterleavedBuffer=
-!0;fc.prototype.copy=function(a){ec.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};gc.prototype=Object.create(C.prototype);gc.prototype.constructor=gc;gc.prototype.isInstancedBufferAttribute=!0;gc.prototype.copy=function(a){C.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};Wd.prototype={constructor:Wd,linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),
-this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];Xd(a,this,c,b);c.sort(Be);return c},intersectObjects:function(a,b){var c=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),
-c;for(var d=0,e=a.length;d<e;d++)Xd(a[d],this,c,b);c.sort(Be);return c}};Yd.prototype={constructor:Yd,start:function(){this.oldTime=this.startTime=(performance||Date).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=(performance||Date).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=
-a}return a}};Zd.prototype={constructor:Zd,set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(T.clamp(a.y/this.radius,
--1,1)));return this}};na.prototype=Object.create(ya.prototype);na.prototype.constructor=na;na.prototype.createAnimation=function(a,b,c,d){b={start:b,end:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};na.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\d+)/i,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);
-if(h&&1<h.length){var k=h[1];d[k]||(d[k]={start:Infinity,end:-Infinity});h=d[k];f<h.start&&(h.start=f);f>h.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};na.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};na.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};na.prototype.setAnimationFPS=function(a,b){var c=
-this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};na.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};na.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};na.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};na.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};na.prototype.getAnimationDuration=
-function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};na.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};na.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};na.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time+=d.direction*a;if(d.mirroredLoop){if(d.time>
-d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.start+T.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!==
-d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};Qc.prototype=Object.create(z.prototype);Qc.prototype.constructor=Qc;Qc.prototype.isImmediateRenderObject=!0;Rc.prototype=Object.create(la.prototype);Rc.prototype.constructor=Rc;Rc.prototype.update=function(){var a=new q,b=new q,c=new Ia;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);
-var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,q=k.length;l<q;l++)for(var n=k[l],p=0,r=n.vertexNormals.length;p<r;p++){var x=n.vertexNormals[p];a.copy(h[n[d[p]]]).applyMatrix4(e);b.copy(x).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,p=g=0,r=d.count;p<
-r;p++)a.set(d.getX(p),d.getY(p),d.getZ(p)).applyMatrix4(e),b.set(h.getX(p),h.getY(p),h.getZ(p)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0;return this}}();hc.prototype=Object.create(z.prototype);hc.prototype.constructor=hc;hc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};hc.prototype.update=function(){var a=new q,b=new q;return function(){var c=this.light.distance?
-this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}}();ic.prototype=Object.create(la.prototype);ic.prototype.constructor=ic;ic.prototype.getBoneList=function(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,this.getBoneList(a.children[c]));
-return b};ic.prototype.update=function(){for(var a=this.geometry,b=(new J).getInverse(this.root.matrixWorld),c=new J,d=0,e=0;e<this.bones.length;e++){var f=this.bones[e];f.parent&&f.parent.isBone&&(c.multiplyMatrices(b,f.matrixWorld),a.vertices[d].setFromMatrixPosition(c),c.multiplyMatrices(b,f.parent.matrixWorld),a.vertices[d+1].setFromMatrixPosition(c),d+=2)}a.verticesNeedUpdate=!0;a.computeBoundingSphere()};jc.prototype=Object.create(ya.prototype);jc.prototype.constructor=jc;jc.prototype.dispose=
-function(){this.geometry.dispose();this.material.dispose()};jc.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)};kc.prototype=Object.create(z.prototype);kc.prototype.constructor=kc;kc.prototype.dispose=function(){this.lightSphere.geometry.dispose();this.lightSphere.material.dispose()};kc.prototype.update=function(){var a=new q;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);
-this.lightSphere.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());this.lightSphere.geometry.colorsNeedUpdate=!0}}();Sc.prototype=Object.create(la.prototype);Sc.prototype.constructor=Sc;Sc.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};Tc.prototype=Object.create(la.prototype);Tc.prototype.constructor=Tc;Tc.prototype.update=function(){var a=new q,b=new q,c=new Ia;return function(){this.object.updateMatrixWorld(!0);
-c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,l=f.length;k<l;k++){var q=f[k],n=q.normal;a.copy(g[q.a]).add(g[q.b]).add(g[q.c]).divideScalar(3).applyMatrix4(d);b.copy(n).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0;return this}}();lc.prototype=Object.create(z.prototype);lc.prototype.constructor=
-lc;lc.prototype.dispose=function(){var a=this.children[0],b=this.children[1];a.geometry.dispose();a.material.dispose();b.geometry.dispose();b.material.dispose()};lc.prototype.update=function(){var a=new q,b=new q,c=new q;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);var d=this.children[0],e=this.children[1];d.lookAt(c);d.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);e.lookAt(c);
-e.scale.z=c.length()}}();Uc.prototype=Object.create(la.prototype);Uc.prototype.constructor=Uc;Uc.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=0,h=a.length;g<h;g++)b.vertices[a[g]].copy(d)}var b,c,d=new q,e=new Z;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",
--1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",0,1,-1);b.verticesNeedUpdate=!0}}();Vc.prototype=Object.create(ya.prototype);Vc.prototype.constructor=Vc;Vc.prototype.update=function(){this.box.setFromObject(this.object);this.box.getSize(this.scale);this.box.getCenter(this.position)};Wc.prototype=Object.create(la.prototype);Wc.prototype.constructor=Wc;Wc.prototype.update=
-function(){var a=new Ba;return function(b){b&&b.isBox3?a.copy(b):a.setFromObject(b);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();var Ce=new G;Ce.addAttribute("position",new ha([0,
-0,0,0,1,0],3));var De=new Ua(0,.5,1,5,1);De.translate(0,-.5,0);Cb.prototype=Object.create(z.prototype);Cb.prototype.constructor=Cb;Cb.prototype.setDirection=function(){var a=new q,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Cb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();
-this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Cb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};xd.prototype=Object.create(la.prototype);xd.prototype.constructor=xd;var $d=function(){function a(){}var b=new q,c=new a,d=new a,e=new a;a.prototype.init=function(a,b,c,d){this.c0=a;this.c1=c;this.c2=-3*a+3*b-2*c-d;this.c3=2*a-2*b+c+d};a.prototype.initNonuniformCatmullRom=function(a,b,c,d,e,l,n){this.init(b,c,((b-a)/e-(c-a)/
-(e+l)+(c-b)/l)*l,((c-b)/l-(d-b)/(l+n)+(d-c)/n)*l)};a.prototype.initCatmullRom=function(a,b,c,d,e){this.init(b,c,e*(c-a),e*(d-b))};a.prototype.calc=function(a){var b=a*a;return this.c0+this.c1*a+this.c2*b+this.c3*b*a};return ia.create(function(a){this.points=a||[];this.closed=!1},function(a){var g=this.points,h,k;k=g.length;2>k&&console.log("duh, you need at least 2 points");a*=k-(this.closed?0:1);h=Math.floor(a);a-=h;this.closed?h+=0<h?0:(Math.floor(Math.abs(h)/g.length)+1)*g.length:0===a&&h===k-
-1&&(h=k-2,a=1);var l,w,n;this.closed||0<h?l=g[(h-1)%k]:(b.subVectors(g[0],g[1]).add(g[0]),l=b);w=g[h%k];n=g[(h+1)%k];this.closed||h+2<k?g=g[(h+2)%k]:(b.subVectors(g[k-1],g[k-2]).add(g[k-1]),g=b);if(void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var p="chordal"===this.type?.5:.25;k=Math.pow(l.distanceToSquared(w),p);h=Math.pow(w.distanceToSquared(n),p);p=Math.pow(n.distanceToSquared(g),p);1E-4>h&&(h=1);1E-4>k&&(k=h);1E-4>p&&(p=h);c.initNonuniformCatmullRom(l.x,w.x,n.x,g.x,k,
-h,p);d.initNonuniformCatmullRom(l.y,w.y,n.y,g.y,k,h,p);e.initNonuniformCatmullRom(l.z,w.z,n.z,g.z,k,h,p)}else"catmullrom"===this.type&&(k=void 0!==this.tension?this.tension:.5,c.initCatmullRom(l.x,w.x,n.x,g.x,k),d.initCatmullRom(l.y,w.y,n.y,g.y,k),e.initCatmullRom(l.z,w.z,n.z,g.z,k));return new q(c.calc(a),d.calc(a),e.calc(a))})}();Ee.prototype=Object.create($d.prototype);var Ef=ia.create(function(a){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3");this.points=
-void 0===a?[]:a},function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0==c?c:c-1],e=b[c],f=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=Xc.interpolate;return new q(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a),c(d.z,e.z,f.z,b.z,a))}),Ff=ia.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b=ra.b3;return new q(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b(a,this.v0.z,this.v1.z,this.v2.z,
-this.v3.z))}),Gf=ia.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b=ra.b2;return new q(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y),b(a,this.v0.z,this.v1.z,this.v2.z))}),Hf=ia.create(function(a,b){this.v1=a;this.v2=b},function(a){if(1===a)return this.v2.clone();var b=new q;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b});yd.prototype=Object.create(Va.prototype);yd.prototype.constructor=yd;Object.assign(mc.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");
-return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Ba.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");
-return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");
-return this.getSize(a)}});Object.assign(gb.prototype,{center:function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)}});Object.assign(Ia.prototype,{multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");
-return this.applyToVector3Array(a)}});Object.assign(J.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");
-return a.applyProjection(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");
-a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(a){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(a){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(a){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(a){console.error("THREE.Matrix4: .rotateZ() has been removed.")},
-rotateByAxis:function(a,b){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")}});Object.assign(va.prototype,{isIntersectionLine:function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)}});Object.assign(ba.prototype,{multiplyVector3:function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)}});Object.assign(ab.prototype,
-{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}});Object.assign(Ab.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");
-return new za(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new cb(this,a)}});Object.assign(q.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},
-getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,
-a)}});Object.assign(z.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(a){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(z.prototype,
-{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(a){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});
-Object.defineProperties(rc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Ea.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(pa.prototype,{onlyShadow:{set:function(a){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");
-this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");
-this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(a){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");
-this.shadow.bias=a}},shadowDarkness:{set:function(a){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(C.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count.");
-return this.array.length}}});Object.assign(G.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");
-this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});Object.defineProperties(G.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});
-Object.defineProperties(U.prototype,{wrapAround:{get:function(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set:function(a){console.warn("THREE."+this.type+": .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE."+this.type+": .wrapRGB has been removed.");return new O}}});Object.defineProperties(db.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(a){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});
-Object.defineProperties(Fa.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});sa.prototype=Object.assign(Object.create({constructor:sa,apply:function(a){console.warn("THREE.EventDispatcher: .apply is deprecated, just inherit or Object.assign the prototype to mix-in.");
-Object.assign(a,this)}}),sa.prototype);Object.defineProperties(Ae.prototype,{dynamic:{set:function(a){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");return this}}});Object.assign(Dd.prototype,{supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");
-return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");
-return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return this.capabilities.vertexTextures},
-supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},
-addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});Object.defineProperties(Dd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");
-this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");this.shadowMap.cullFace=a}}});Object.defineProperties(pe.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Db.prototype,
-{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");
-return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");
-return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},
-set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");
-this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.assign(dc.prototype,{load:function(a){console.warn("THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.");var b=this;(new Od).load(a,function(a){b.setBuffer(a)});
-return this}});Object.assign(Rd.prototype,{getData:function(a){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()}});l.WebGLRenderTargetCube=Eb;l.WebGLRenderTarget=Db;l.WebGLRenderer=Dd;l.ShaderLib=Gb;l.UniformsLib=W;l.UniformsUtils=La;l.ShaderChunk=X;l.FogExp2=Ib;l.Fog=Jb;l.Scene=jb;l.LensFlare=Ed;l.Sprite=qc;l.LOD=rc;l.SkinnedMesh=dd;l.Skeleton=bd;l.Bone=cd;l.Mesh=ya;l.LineSegments=la;l.Line=Ta;l.Points=Kb;l.Group=sc;l.VideoTexture=ed;l.DataTexture=
-lb;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=fd;l.DepthTexture=tc;l.TextureIdCount=function(){return ee++};l.Texture=da;l.MaterialIdCount=function(){return oe++};l.CompressedTextureLoader=we;l.BinaryTextureLoader=Gd;l.DataTextureLoader=Gd;l.CubeTextureLoader=Hd;l.TextureLoader=gd;l.ObjectLoader=xe;l.MaterialLoader=ud;l.BufferGeometryLoader=Id;l.DefaultLoadingManager=Ga;l.LoadingManager=Fd;l.JSONLoader=Jd;l.ImageLoader=Lc;l.FontLoader=ye;l.XHRLoader=Ja;l.Loader=wb;l.Cache=ce;l.AudioLoader=
-Od;l.SpotLightShadow=id;l.SpotLight=jd;l.PointLight=kd;l.HemisphereLight=hd;l.DirectionalLightShadow=ld;l.DirectionalLight=md;l.AmbientLight=nd;l.LightShadow=tb;l.Light=pa;l.StereoCamera=ze;l.PerspectiveCamera=Ea;l.OrthographicCamera=Hb;l.CubeCamera=vd;l.Camera=Z;l.AudioListener=Pd;l.PositionalAudio=Qd;l.getAudioContext=Md;l.AudioAnalyser=Rd;l.Audio=dc;l.VectorKeyframeTrack=bc;l.StringKeyframeTrack=rd;l.QuaternionKeyframeTrack=Nc;l.NumberKeyframeTrack=cc;l.ColorKeyframeTrack=td;l.BooleanKeyframeTrack=
-sd;l.PropertyMixer=wd;l.PropertyBinding=fa;l.KeyframeTrack=vb;l.AnimationUtils=ma;l.AnimationObjectGroup=Sd;l.AnimationMixer=Ud;l.AnimationClip=Ha;l.Uniform=Ae;l.InstancedBufferGeometry=Bb;l.BufferGeometry=G;l.GeometryIdCount=function(){return ad++};l.Geometry=Q;l.InterleavedBufferAttribute=Vd;l.InstancedInterleavedBuffer=fc;l.InterleavedBuffer=ec;l.InstancedBufferAttribute=gc;l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");
-return(new C(a,b)).setDynamic(!0)};l.Float64Attribute=function(a,b){return new C(new Float64Array(a),b)};l.Float32Attribute=ha;l.Uint32Attribute=$c;l.Int32Attribute=function(a,b){return new C(new Int32Array(a),b)};l.Uint16Attribute=Zc;l.Int16Attribute=function(a,b){return new C(new Int16Array(a),b)};l.Uint8ClampedAttribute=function(a,b){return new C(new Uint8ClampedArray(a),b)};l.Uint8Attribute=function(a,b){return new C(new Uint8Array(a),b)};l.Int8Attribute=function(a,b){return new C(new Int8Array(a),
-b)};l.BufferAttribute=C;l.Face3=ea;l.Object3DIdCount=function(){return qe++};l.Object3D=z;l.Raycaster=Wd;l.Layers=Yc;l.EventDispatcher=sa;l.Clock=Yd;l.QuaternionLinearInterpolant=qd;l.LinearInterpolant=Mc;l.DiscreteInterpolant=pd;l.CubicInterpolant=od;l.Interpolant=qa;l.Triangle=wa;l.Spline=function(a){function b(a,b,c,d,e,f,g){a=.5*(c-a);d=.5*(d-b);return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,k,l,w,n,p;this.initFromArray=function(a){this.points=[];
-for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=0===f?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:f+2;l=this.points[c[0]];w=this.points[c[1]];n=this.points[c[2]];p=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,w.x,n.x,p.x,g,h,k);d.y=b(l.y,w.y,n.y,p.y,g,h,k);d.z=b(l.z,w.z,n.z,p.z,g,h,k);return d};this.getControlPointsArray=function(){var a,
-b,c=this.points.length,d=[];for(a=0;a<c;a++)b=this.points[a],d[a]=[b.x,b.y,b.z];return d};this.getLength=function(a){var b,c,d,e=0,f=new q,g=new q,h=[],k=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++)b=a/c,d=this.getPoint(b),g.copy(d),k+=g.distanceTo(f),f.copy(d),b*=this.points.length-1,b=Math.floor(b),b!==e&&(h[b]=k,e=b);h[h.length]=k;return{chunks:h,total:k}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],k=new q,l=this.getLength();h.push(k.copy(this.points[0]).clone());
-for(b=1;b<this.points.length;b++){c=l.chunks[b]-l.chunks[b-1];g=Math.ceil(a*c/l.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++)d=e+1/g*c*(f-e),d=this.getPoint(d),h.push(k.copy(d).clone());h.push(k.copy(this.points[b]).clone())}this.points=h}};l.Math=T;l.Spherical=Zd;l.Plane=va;l.Frustum=nc;l.Sphere=Ca;l.Ray=ab;l.Matrix4=J;l.Matrix3=Ia;l.Box3=Ba;l.Box2=mc;l.Line3=gb;l.Euler=bb;l.Vector4=ga;l.Vector3=q;l.Vector2=B;l.Quaternion=ba;l.ColorKeywords=He;l.Color=O;l.MorphBlendMesh=
-na;l.ImmediateRenderObject=Qc;l.VertexNormalsHelper=Rc;l.SpotLightHelper=hc;l.SkeletonHelper=ic;l.PointLightHelper=jc;l.HemisphereLightHelper=kc;l.GridHelper=Sc;l.FaceNormalsHelper=Tc;l.DirectionalLightHelper=lc;l.CameraHelper=Uc;l.BoundingBoxHelper=Vc;l.BoxHelper=Wc;l.ArrowHelper=Cb;l.AxisHelper=xd;l.ClosedSplineCurve3=Ee;l.CatmullRomCurve3=$d;l.SplineCurve3=Ef;l.CubicBezierCurve3=Ff;l.QuadraticBezierCurve3=Gf;l.LineCurve3=Hf;l.ArcCurve=yd;l.EllipseCurve=Va;l.SplineCurve=xb;l.CubicBezierCurve=yb;
-l.QuadraticBezierCurve=zb;l.LineCurve=Sa;l.Shape=Ab;l.ShapePath=Kd;l.Path=Pc;l.Font=Ld;l.CurvePath=Oc;l.Curve=ia;l.ShapeUtils=ra;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new sc,d=0,e=b.length;d<e;d++)c.add(new ya(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new J;d.getInverse(c.matrixWorld);a.applyMatrix(d);b.remove(a);c.add(a)}};l.CurveUtils=Xc;l.WireframeGeometry=Mb;l.ParametricGeometry=uc;l.ParametricBufferGeometry=
-Nb;l.TetrahedronGeometry=vc;l.TetrahedronBufferGeometry=Ob;l.OctahedronGeometry=wc;l.OctahedronBufferGeometry=Pb;l.IcosahedronGeometry=xc;l.IcosahedronBufferGeometry=Qb;l.DodecahedronGeometry=yc;l.DodecahedronBufferGeometry=Rb;l.PolyhedronGeometry=zc;l.PolyhedronBufferGeometry=ua;l.TubeGeometry=Ac;l.TubeBufferGeometry=Sb;l.TorusKnotGeometry=Bc;l.TorusKnotBufferGeometry=Tb;l.TorusGeometry=Cc;l.TorusBufferGeometry=Ub;l.TextGeometry=Dc;l.SphereBufferGeometry=mb;l.SphereGeometry=Vb;l.RingGeometry=Ec;
-l.RingBufferGeometry=Wb;l.PlaneBufferGeometry=ib;l.PlaneGeometry=Fc;l.LatheGeometry=Gc;l.LatheBufferGeometry=Xb;l.ShapeGeometry=cb;l.ExtrudeGeometry=za;l.EdgesGeometry=Yb;l.ConeGeometry=Hc;l.ConeBufferGeometry=Ic;l.CylinderGeometry=nb;l.CylinderBufferGeometry=Ua;l.CircleBufferGeometry=Zb;l.CircleGeometry=Jc;l.BoxBufferGeometry=hb;l.BoxGeometry=ob;l.ShadowMaterial=$b;l.SpriteMaterial=kb;l.RawShaderMaterial=ac;l.ShaderMaterial=Fa;l.PointsMaterial=xa;l.MultiMaterial=Kc;l.MeshPhysicalMaterial=pb;l.MeshStandardMaterial=
-Oa;l.MeshPhongMaterial=db;l.MeshNormalMaterial=qb;l.MeshLambertMaterial=rb;l.MeshDepthMaterial=Za;l.MeshBasicMaterial=Ma;l.LineDashedMaterial=sb;l.LineBasicMaterial=oa;l.Material=U;l.REVISION="82";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;l.SmoothShading=2;l.NoColors=0;
-l.FaceColors=1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.BlendingMode=Fe;l.AddEquation=100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=208;l.OneMinusDstColorFactor=
-209;l.SrcAlphaSaturateFactor=210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=304;l.SphericalReflectionMapping=
-305;l.CubeUVReflectionMapping=306;l.CubeUVRefractionMapping=307;l.TextureMapping=Ge;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.TextureWrapping=ae;l.NearestFilter=1003;l.NearestMipMapNearestFilter=1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.TextureFilter=be;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;l.UnsignedIntType=1014;l.FloatType=
-1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;l.UnsignedShort5551Type=1018;l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=2001;l.RGBA_S3TC_DXT1_Format=2002;l.RGBA_S3TC_DXT3_Format=2003;l.RGBA_S3TC_DXT5_Format=2004;l.RGB_PVRTC_4BPPV1_Format=2100;l.RGB_PVRTC_2BPPV1_Format=2101;l.RGBA_PVRTC_4BPPV1_Format=
-2102;l.RGBA_PVRTC_2BPPV1_Format=2103;l.RGB_ETC1_Format=2151;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;l.InterpolateLinear=2301;l.InterpolateSmooth=2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=3005;l.RGBDEncoding=3006;
-l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.CubeGeometry=ob;l.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new ea(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=Kc;l.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Kb(a,b)};l.Particle=qc;l.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Kb(a,
-b)};l.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new xa(a)};l.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new xa(a)};l.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new xa(a)};l.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");
-return new q(a,b,c)};l.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new la(new Yb(a.geometry),new oa({color:void 0!==b?b:16777215}))};l.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new la(new Mb(a.geometry),new oa({color:void 0!==b?b:16777215}))};l.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
-var d;b.isMesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,b=b.geometry);a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};l.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new gd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},
-loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new Hd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}};
-l.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(a,b){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};l.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");
-this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(l,"__esModule",{value:!0});Object.defineProperty(l,"AudioContext",{get:function(){return l.getAudioContext()}})});
-
-},{}],158:[function(require,module,exports){
-//     Underscore.js 1.8.3
-//     http://underscorejs.org
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-
-(function() {
-
-  // Baseline setup
-  // --------------
-
-  // Establish the root object, `window` in the browser, or `exports` on the server.
-  var root = this;
-
-  // Save the previous value of the `_` variable.
-  var previousUnderscore = root._;
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var
-    push             = ArrayProto.push,
-    slice            = ArrayProto.slice,
-    toString         = ObjProto.toString,
-    hasOwnProperty   = ObjProto.hasOwnProperty;
-
-  // All **ECMAScript 5** native function implementations that we hope to use
-  // are declared here.
-  var
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind,
-    nativeCreate       = Object.create;
-
-  // Naked function reference for surrogate-prototype-swapping.
-  var Ctor = function(){};
-
-  // Create a safe reference to the Underscore object for use below.
-  var _ = function(obj) {
-    if (obj instanceof _) return obj;
-    if (!(this instanceof _)) return new _(obj);
-    this._wrapped = obj;
-  };
-
-  // Export the Underscore object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, add `_` as a global object.
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      exports = module.exports = _;
-    }
-    exports._ = _;
-  } else {
-    root._ = _;
-  }
+    // === READING =================================================================
 
-  // Current version.
-  _.VERSION = '1.8.3';
+    readFields: function(readField, result, end) {
+        end = end || this.length;
 
-  // Internal function that returns an efficient (for current engines) version
-  // of the passed-in callback, to be repeatedly applied in other Underscore
-  // functions.
-  var optimizeCb = function(func, context, argCount) {
-    if (context === void 0) return func;
-    switch (argCount == null ? 3 : argCount) {
-      case 1: return function(value) {
-        return func.call(context, value);
-      };
-      case 2: return function(value, other) {
-        return func.call(context, value, other);
-      };
-      case 3: return function(value, index, collection) {
-        return func.call(context, value, index, collection);
-      };
-      case 4: return function(accumulator, value, index, collection) {
-        return func.call(context, accumulator, value, index, collection);
-      };
-    }
-    return function() {
-      return func.apply(context, arguments);
-    };
-  };
+        while (this.pos < end) {
+            var val = this.readVarint(),
+                tag = val >> 3,
+                startPos = this.pos;
 
-  // A mostly-internal function to generate callbacks that can be applied
-  // to each element in a collection, returning the desired result — either
-  // identity, an arbitrary callback, a property matcher, or a property accessor.
-  var cb = function(value, context, argCount) {
-    if (value == null) return _.identity;
-    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
-    if (_.isObject(value)) return _.matcher(value);
-    return _.property(value);
-  };
-  _.iteratee = function(value, context) {
-    return cb(value, context, Infinity);
-  };
+            this.type = val & 0x7;
+            readField(tag, result, this);
 
-  // An internal function for creating assigner functions.
-  var createAssigner = function(keysFunc, undefinedOnly) {
-    return function(obj) {
-      var length = arguments.length;
-      if (length < 2 || obj == null) return obj;
-      for (var index = 1; index < length; index++) {
-        var source = arguments[index],
-            keys = keysFunc(source),
-            l = keys.length;
-        for (var i = 0; i < l; i++) {
-          var key = keys[i];
-          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
+            if (this.pos === startPos) this.skip(val);
         }
-      }
-      return obj;
-    };
-  };
-
-  // An internal function for creating a new object that inherits from another.
-  var baseCreate = function(prototype) {
-    if (!_.isObject(prototype)) return {};
-    if (nativeCreate) return nativeCreate(prototype);
-    Ctor.prototype = prototype;
-    var result = new Ctor;
-    Ctor.prototype = null;
-    return result;
-  };
-
-  var property = function(key) {
-    return function(obj) {
-      return obj == null ? void 0 : obj[key];
-    };
-  };
-
-  // Helper for collection methods to determine whether a collection
-  // should be iterated as an array or as an object
-  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
-  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
-  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
-  var getLength = property('length');
-  var isArrayLike = function(collection) {
-    var length = getLength(collection);
-    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
-  };
-
-  // Collection Functions
-  // --------------------
-
-  // The cornerstone, an `each` implementation, aka `forEach`.
-  // Handles raw objects in addition to array-likes. Treats all
-  // sparse array-likes as if they were dense.
-  _.each = _.forEach = function(obj, iteratee, context) {
-    iteratee = optimizeCb(iteratee, context);
-    var i, length;
-    if (isArrayLike(obj)) {
-      for (i = 0, length = obj.length; i < length; i++) {
-        iteratee(obj[i], i, obj);
-      }
-    } else {
-      var keys = _.keys(obj);
-      for (i = 0, length = keys.length; i < length; i++) {
-        iteratee(obj[keys[i]], keys[i], obj);
-      }
-    }
-    return obj;
-  };
+        return result;
+    },
 
-  // Return the results of applying the iteratee to each element.
-  _.map = _.collect = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length,
-        results = Array(length);
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      results[index] = iteratee(obj[currentKey], currentKey, obj);
-    }
-    return results;
-  };
+    readMessage: function(readField, result) {
+        return this.readFields(readField, result, this.readVarint() + this.pos);
+    },
 
-  // Create a reducing function iterating left or right.
-  function createReduce(dir) {
-    // Optimized iterator function as using arguments.length
-    // in the main function will deoptimize the, see #1991.
-    function iterator(obj, iteratee, memo, keys, index, length) {
-      for (; index >= 0 && index < length; index += dir) {
-        var currentKey = keys ? keys[index] : index;
-        memo = iteratee(memo, obj[currentKey], currentKey, obj);
-      }
-      return memo;
-    }
-
-    return function(obj, iteratee, memo, context) {
-      iteratee = optimizeCb(iteratee, context, 4);
-      var keys = !isArrayLike(obj) && _.keys(obj),
-          length = (keys || obj).length,
-          index = dir > 0 ? 0 : length - 1;
-      // Determine the initial value if none is provided.
-      if (arguments.length < 3) {
-        memo = obj[keys ? keys[index] : index];
-        index += dir;
-      }
-      return iterator(obj, iteratee, memo, keys, index, length);
-    };
-  }
+    readFixed32: function() {
+        var val = readUInt32(this.buf, this.pos);
+        this.pos += 4;
+        return val;
+    },
 
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`.
-  _.reduce = _.foldl = _.inject = createReduce(1);
+    readSFixed32: function() {
+        var val = readInt32(this.buf, this.pos);
+        this.pos += 4;
+        return val;
+    },
 
-  // The right-associative version of reduce, also known as `foldr`.
-  _.reduceRight = _.foldr = createReduce(-1);
+    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
 
-  // Return the first value which passes a truth test. Aliased as `detect`.
-  _.find = _.detect = function(obj, predicate, context) {
-    var key;
-    if (isArrayLike(obj)) {
-      key = _.findIndex(obj, predicate, context);
-    } else {
-      key = _.findKey(obj, predicate, context);
-    }
-    if (key !== void 0 && key !== -1) return obj[key];
-  };
+    readFixed64: function() {
+        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+        this.pos += 8;
+        return val;
+    },
 
-  // Return all the elements that pass a truth test.
-  // Aliased as `select`.
-  _.filter = _.select = function(obj, predicate, context) {
-    var results = [];
-    predicate = cb(predicate, context);
-    _.each(obj, function(value, index, list) {
-      if (predicate(value, index, list)) results.push(value);
-    });
-    return results;
-  };
+    readSFixed64: function() {
+        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+        this.pos += 8;
+        return val;
+    },
 
-  // Return all the elements for which a truth test fails.
-  _.reject = function(obj, predicate, context) {
-    return _.filter(obj, _.negate(cb(predicate)), context);
-  };
+    readFloat: function() {
+        var val = ieee754.read(this.buf, this.pos, true, 23, 4);
+        this.pos += 4;
+        return val;
+    },
 
-  // Determine whether all of the elements match a truth test.
-  // Aliased as `all`.
-  _.every = _.all = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (!predicate(obj[currentKey], currentKey, obj)) return false;
-    }
-    return true;
-  };
+    readDouble: function() {
+        var val = ieee754.read(this.buf, this.pos, true, 52, 8);
+        this.pos += 8;
+        return val;
+    },
 
-  // Determine if at least one element in the object matches a truth test.
-  // Aliased as `any`.
-  _.some = _.any = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (predicate(obj[currentKey], currentKey, obj)) return true;
-    }
-    return false;
-  };
+    readVarint: function(isSigned) {
+        var buf = this.buf,
+            val, b;
 
-  // Determine if the array or object contains a given item (using `===`).
-  // Aliased as `includes` and `include`.
-  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
-    if (!isArrayLike(obj)) obj = _.values(obj);
-    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
-    return _.indexOf(obj, item, fromIndex) >= 0;
-  };
+        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
+        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
+        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
+        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
+        b = buf[this.pos];   val |= (b & 0x0f) << 28;
 
-  // Invoke a method (with arguments) on every item in a collection.
-  _.invoke = function(obj, method) {
-    var args = slice.call(arguments, 2);
-    var isFunc = _.isFunction(method);
-    return _.map(obj, function(value) {
-      var func = isFunc ? method : value[method];
-      return func == null ? func : func.apply(value, args);
-    });
-  };
+        return readVarintRemainder(val, isSigned, this);
+    },
 
-  // Convenience version of a common use case of `map`: fetching a property.
-  _.pluck = function(obj, key) {
-    return _.map(obj, _.property(key));
-  };
+    readVarint64: function() { // for compatibility with v2.0.1
+        return this.readVarint(true);
+    },
 
-  // Convenience version of a common use case of `filter`: selecting only objects
-  // containing specific `key:value` pairs.
-  _.where = function(obj, attrs) {
-    return _.filter(obj, _.matcher(attrs));
-  };
+    readSVarint: function() {
+        var num = this.readVarint();
+        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
+    },
 
-  // Convenience version of a common use case of `find`: getting the first object
-  // containing specific `key:value` pairs.
-  _.findWhere = function(obj, attrs) {
-    return _.find(obj, _.matcher(attrs));
-  };
+    readBoolean: function() {
+        return Boolean(this.readVarint());
+    },
 
-  // Return the maximum element (or element-based computation).
-  _.max = function(obj, iteratee, context) {
-    var result = -Infinity, lastComputed = -Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value > result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
-          result = value;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  };
+    readString: function() {
+        var end = this.readVarint() + this.pos;
+        var pos = this.pos;
+        this.pos = end;
 
-  // Return the minimum element (or element-based computation).
-  _.min = function(obj, iteratee, context) {
-    var result = Infinity, lastComputed = Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value < result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed < lastComputed || computed === Infinity && result === Infinity) {
-          result = value;
-          lastComputed = computed;
+        if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
+            // longer strings are fast with the built-in browser TextDecoder API
+            return readUtf8TextDecoder(this.buf, pos, end);
         }
-      });
-    }
-    return result;
-  };
-
-  // Shuffle a collection, using the modern version of the
-  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
-  _.shuffle = function(obj) {
-    var set = isArrayLike(obj) ? obj : _.values(obj);
-    var length = set.length;
-    var shuffled = Array(length);
-    for (var index = 0, rand; index < length; index++) {
-      rand = _.random(0, index);
-      if (rand !== index) shuffled[index] = shuffled[rand];
-      shuffled[rand] = set[index];
-    }
-    return shuffled;
-  };
-
-  // Sample **n** random values from a collection.
-  // If **n** is not specified, returns a single random element.
-  // The internal `guard` argument allows it to work with `map`.
-  _.sample = function(obj, n, guard) {
-    if (n == null || guard) {
-      if (!isArrayLike(obj)) obj = _.values(obj);
-      return obj[_.random(obj.length - 1)];
-    }
-    return _.shuffle(obj).slice(0, Math.max(0, n));
-  };
-
-  // Sort the object's values by a criterion produced by an iteratee.
-  _.sortBy = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    return _.pluck(_.map(obj, function(value, index, list) {
-      return {
-        value: value,
-        index: index,
-        criteria: iteratee(value, index, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria;
-      var b = right.criteria;
-      if (a !== b) {
-        if (a > b || a === void 0) return 1;
-        if (a < b || b === void 0) return -1;
-      }
-      return left.index - right.index;
-    }), 'value');
-  };
-
-  // An internal function used for aggregate "group by" operations.
-  var group = function(behavior) {
-    return function(obj, iteratee, context) {
-      var result = {};
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index) {
-        var key = iteratee(value, index, obj);
-        behavior(result, value, key);
-      });
-      return result;
-    };
-  };
-
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  _.groupBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
-  });
-
-  // Indexes the object's values by a criterion, similar to `groupBy`, but for
-  // when you know that your index values will be unique.
-  _.indexBy = group(function(result, value, key) {
-    result[key] = value;
-  });
-
-  // Counts instances of an object that group by a certain criterion. Pass
-  // either a string attribute to count by, or a function that returns the
-  // criterion.
-  _.countBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key]++; else result[key] = 1;
-  });
-
-  // Safely create a real, live array from anything iterable.
-  _.toArray = function(obj) {
-    if (!obj) return [];
-    if (_.isArray(obj)) return slice.call(obj);
-    if (isArrayLike(obj)) return _.map(obj, _.identity);
-    return _.values(obj);
-  };
-
-  // Return the number of elements in an object.
-  _.size = function(obj) {
-    if (obj == null) return 0;
-    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
-  };
-
-  // Split a collection into two arrays: one whose elements all satisfy the given
-  // predicate, and one whose elements all do not satisfy the predicate.
-  _.partition = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var pass = [], fail = [];
-    _.each(obj, function(value, key, obj) {
-      (predicate(value, key, obj) ? pass : fail).push(value);
-    });
-    return [pass, fail];
-  };
-
-  // Array Functions
-  // ---------------
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. Aliased as `head` and `take`. The **guard** check
-  // allows it to work with `_.map`.
-  _.first = _.head = _.take = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[0];
-    return _.initial(array, array.length - n);
-  };
+        // short strings are fast with our custom implementation
+        return readUtf8(this.buf, pos, end);
+    },
 
-  // Returns everything but the last entry of the array. Especially useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N.
-  _.initial = function(array, n, guard) {
-    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
-  };
+    readBytes: function() {
+        var end = this.readVarint() + this.pos,
+            buffer = this.buf.subarray(this.pos, end);
+        this.pos = end;
+        return buffer;
+    },
 
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array.
-  _.last = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[array.length - 1];
-    return _.rest(array, Math.max(0, array.length - n));
-  };
+    // verbose for performance reasons; doesn't affect gzipped size
 
-  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
-  // Especially useful on the arguments object. Passing an **n** will return
-  // the rest N values in the array.
-  _.rest = _.tail = _.drop = function(array, n, guard) {
-    return slice.call(array, n == null || guard ? 1 : n);
-  };
-
-  // Trim out all falsy values from an array.
-  _.compact = function(array) {
-    return _.filter(array, _.identity);
-  };
-
-  // Internal implementation of a recursive `flatten` function.
-  var flatten = function(input, shallow, strict, startIndex) {
-    var output = [], idx = 0;
-    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
-      var value = input[i];
-      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
-        //flatten current level of array or arguments object
-        if (!shallow) value = flatten(value, shallow, strict);
-        var j = 0, len = value.length;
-        output.length += len;
-        while (j < len) {
-          output[idx++] = value[j++];
-        }
-      } else if (!strict) {
-        output[idx++] = value;
-      }
-    }
-    return output;
-  };
-
-  // Flatten out an array, either recursively (by default), or just one level.
-  _.flatten = function(array, shallow) {
-    return flatten(array, shallow, false);
-  };
-
-  // Return a version of the array that does not contain the specified value(s).
-  _.without = function(array) {
-    return _.difference(array, slice.call(arguments, 1));
-  };
-
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // Aliased as `unique`.
-  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
-    if (!_.isBoolean(isSorted)) {
-      context = iteratee;
-      iteratee = isSorted;
-      isSorted = false;
-    }
-    if (iteratee != null) iteratee = cb(iteratee, context);
-    var result = [];
-    var seen = [];
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var value = array[i],
-          computed = iteratee ? iteratee(value, i, array) : value;
-      if (isSorted) {
-        if (!i || seen !== computed) result.push(value);
-        seen = computed;
-      } else if (iteratee) {
-        if (!_.contains(seen, computed)) {
-          seen.push(computed);
-          result.push(value);
-        }
-      } else if (!_.contains(result, value)) {
-        result.push(value);
-      }
-    }
-    return result;
-  };
-
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  _.union = function() {
-    return _.uniq(flatten(arguments, true, true));
-  };
-
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays.
-  _.intersection = function(array) {
-    var result = [];
-    var argsLength = arguments.length;
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var item = array[i];
-      if (_.contains(result, item)) continue;
-      for (var j = 1; j < argsLength; j++) {
-        if (!_.contains(arguments[j], item)) break;
-      }
-      if (j === argsLength) result.push(item);
-    }
-    return result;
-  };
-
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  _.difference = function(array) {
-    var rest = flatten(arguments, true, true, 1);
-    return _.filter(array, function(value){
-      return !_.contains(rest, value);
-    });
-  };
-
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  _.zip = function() {
-    return _.unzip(arguments);
-  };
-
-  // Complement of _.zip. Unzip accepts an array of arrays and groups
-  // each array's elements on shared indices
-  _.unzip = function(array) {
-    var length = array && _.max(array, getLength).length || 0;
-    var result = Array(length);
+    readPackedVarint: function(arr, isSigned) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readVarint(isSigned));
+        return arr;
+    },
+    readPackedSVarint: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readSVarint());
+        return arr;
+    },
+    readPackedBoolean: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readBoolean());
+        return arr;
+    },
+    readPackedFloat: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readFloat());
+        return arr;
+    },
+    readPackedDouble: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readDouble());
+        return arr;
+    },
+    readPackedFixed32: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readFixed32());
+        return arr;
+    },
+    readPackedSFixed32: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readSFixed32());
+        return arr;
+    },
+    readPackedFixed64: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readFixed64());
+        return arr;
+    },
+    readPackedSFixed64: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readSFixed64());
+        return arr;
+    },
 
-    for (var index = 0; index < length; index++) {
-      result[index] = _.pluck(array, index);
-    }
-    return result;
-  };
+    skip: function(val) {
+        var type = val & 0x7;
+        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
+        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
+        else if (type === Pbf.Fixed32) this.pos += 4;
+        else if (type === Pbf.Fixed64) this.pos += 8;
+        else throw new Error('Unimplemented type: ' + type);
+    },
 
-  // Converts lists into objects. Pass either a single array of `[key, value]`
-  // pairs, or two parallel arrays of the same length -- one of keys, and one of
-  // the corresponding values.
-  _.object = function(list, values) {
-    var result = {};
-    for (var i = 0, length = getLength(list); i < length; i++) {
-      if (values) {
-        result[list[i]] = values[i];
-      } else {
-        result[list[i][0]] = list[i][1];
-      }
-    }
-    return result;
-  };
+    // === WRITING =================================================================
 
-  // Generator function to create the findIndex and findLastIndex functions
-  function createPredicateIndexFinder(dir) {
-    return function(array, predicate, context) {
-      predicate = cb(predicate, context);
-      var length = getLength(array);
-      var index = dir > 0 ? 0 : length - 1;
-      for (; index >= 0 && index < length; index += dir) {
-        if (predicate(array[index], index, array)) return index;
-      }
-      return -1;
-    };
-  }
+    writeTag: function(tag, type) {
+        this.writeVarint((tag << 3) | type);
+    },
 
-  // Returns the first index on an array-like that passes a predicate test
-  _.findIndex = createPredicateIndexFinder(1);
-  _.findLastIndex = createPredicateIndexFinder(-1);
+    realloc: function(min) {
+        var length = this.length || 16;
 
-  // Use a comparator function to figure out the smallest index at which
-  // an object should be inserted so as to maintain order. Uses binary search.
-  _.sortedIndex = function(array, obj, iteratee, context) {
-    iteratee = cb(iteratee, context, 1);
-    var value = iteratee(obj);
-    var low = 0, high = getLength(array);
-    while (low < high) {
-      var mid = Math.floor((low + high) / 2);
-      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
-    }
-    return low;
-  };
+        while (length < this.pos + min) length *= 2;
 
-  // Generator function to create the indexOf and lastIndexOf functions
-  function createIndexFinder(dir, predicateFind, sortedIndex) {
-    return function(array, item, idx) {
-      var i = 0, length = getLength(array);
-      if (typeof idx == 'number') {
-        if (dir > 0) {
-            i = idx >= 0 ? idx : Math.max(idx + length, i);
-        } else {
-            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+        if (length !== this.length) {
+            var buf = new Uint8Array(length);
+            buf.set(this.buf);
+            this.buf = buf;
+            this.length = length;
         }
-      } else if (sortedIndex && idx && length) {
-        idx = sortedIndex(array, item);
-        return array[idx] === item ? idx : -1;
-      }
-      if (item !== item) {
-        idx = predicateFind(slice.call(array, i, length), _.isNaN);
-        return idx >= 0 ? idx + i : -1;
-      }
-      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
-        if (array[idx] === item) return idx;
-      }
-      return -1;
-    };
-  }
-
-  // Return the position of the first occurrence of an item in an array,
-  // or -1 if the item is not included in the array.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
-  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](http://docs.python.org/library/functions.html#range).
-  _.range = function(start, stop, step) {
-    if (stop == null) {
-      stop = start || 0;
-      start = 0;
-    }
-    step = step || 1;
-
-    var length = Math.max(Math.ceil((stop - start) / step), 0);
-    var range = Array(length);
-
-    for (var idx = 0; idx < length; idx++, start += step) {
-      range[idx] = start;
-    }
+    },
 
-    return range;
-  };
+    finish: function() {
+        this.length = this.pos;
+        this.pos = 0;
+        return this.buf.subarray(0, this.length);
+    },
 
-  // Function (ahem) Functions
-  // ------------------
-
-  // Determines whether to execute a function as a constructor
-  // or a normal function with the provided arguments
-  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
-    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
-    var self = baseCreate(sourceFunc.prototype);
-    var result = sourceFunc.apply(self, args);
-    if (_.isObject(result)) return result;
-    return self;
-  };
+    writeFixed32: function(val) {
+        this.realloc(4);
+        writeInt32(this.buf, val, this.pos);
+        this.pos += 4;
+    },
 
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
-  // available.
-  _.bind = function(func, context) {
-    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
-    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
-    var args = slice.call(arguments, 2);
-    var bound = function() {
-      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
-    };
-    return bound;
-  };
+    writeSFixed32: function(val) {
+        this.realloc(4);
+        writeInt32(this.buf, val, this.pos);
+        this.pos += 4;
+    },
 
-  // Partially apply a function by creating a version that has had some of its
-  // arguments pre-filled, without changing its dynamic `this` context. _ acts
-  // as a placeholder, allowing any combination of arguments to be pre-filled.
-  _.partial = function(func) {
-    var boundArgs = slice.call(arguments, 1);
-    var bound = function() {
-      var position = 0, length = boundArgs.length;
-      var args = Array(length);
-      for (var i = 0; i < length; i++) {
-        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
-      }
-      while (position < arguments.length) args.push(arguments[position++]);
-      return executeBound(func, bound, this, this, args);
-    };
-    return bound;
-  };
+    writeFixed64: function(val) {
+        this.realloc(8);
+        writeInt32(this.buf, val & -1, this.pos);
+        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+        this.pos += 8;
+    },
 
-  // Bind a number of an object's methods to that object. Remaining arguments
-  // are the method names to be bound. Useful for ensuring that all callbacks
-  // defined on an object belong to it.
-  _.bindAll = function(obj) {
-    var i, length = arguments.length, key;
-    if (length <= 1) throw new Error('bindAll must be passed function names');
-    for (i = 1; i < length; i++) {
-      key = arguments[i];
-      obj[key] = _.bind(obj[key], obj);
-    }
-    return obj;
-  };
+    writeSFixed64: function(val) {
+        this.realloc(8);
+        writeInt32(this.buf, val & -1, this.pos);
+        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+        this.pos += 8;
+    },
 
-  // Memoize an expensive function by storing its results.
-  _.memoize = function(func, hasher) {
-    var memoize = function(key) {
-      var cache = memoize.cache;
-      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
-      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
-      return cache[address];
-    };
-    memoize.cache = {};
-    return memoize;
-  };
+    writeVarint: function(val) {
+        val = +val || 0;
 
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  _.delay = function(func, wait) {
-    var args = slice.call(arguments, 2);
-    return setTimeout(function(){
-      return func.apply(null, args);
-    }, wait);
-  };
+        if (val > 0xfffffff || val < 0) {
+            writeBigVarint(val, this);
+            return;
+        }
 
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  _.defer = _.partial(_.delay, _, 1);
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time. Normally, the throttled function will run
-  // as much as it can, without ever going more than once per `wait` duration;
-  // but if you'd like to disable the execution on the leading edge, pass
-  // `{leading: false}`. To disable execution on the trailing edge, ditto.
-  _.throttle = function(func, wait, options) {
-    var context, args, result;
-    var timeout = null;
-    var previous = 0;
-    if (!options) options = {};
-    var later = function() {
-      previous = options.leading === false ? 0 : _.now();
-      timeout = null;
-      result = func.apply(context, args);
-      if (!timeout) context = args = null;
-    };
-    return function() {
-      var now = _.now();
-      if (!previous && options.leading === false) previous = now;
-      var remaining = wait - (now - previous);
-      context = this;
-      args = arguments;
-      if (remaining <= 0 || remaining > wait) {
-        if (timeout) {
-          clearTimeout(timeout);
-          timeout = null;
-        }
-        previous = now;
-        result = func.apply(context, args);
-        if (!timeout) context = args = null;
-      } else if (!timeout && options.trailing !== false) {
-        timeout = setTimeout(later, remaining);
-      }
-      return result;
-    };
-  };
+        this.realloc(4);
 
-  // Returns a function, that, as long as it continues to be invoked, will not
-  // be triggered. The function will be called after it stops being called for
-  // N milliseconds. If `immediate` is passed, trigger the function on the
-  // leading edge, instead of the trailing.
-  _.debounce = function(func, wait, immediate) {
-    var timeout, args, context, timestamp, result;
+        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+        this.buf[this.pos++] =   (val >>> 7) & 0x7f;
+    },
 
-    var later = function() {
-      var last = _.now() - timestamp;
+    writeSVarint: function(val) {
+        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
+    },
 
-      if (last < wait && last >= 0) {
-        timeout = setTimeout(later, wait - last);
-      } else {
-        timeout = null;
-        if (!immediate) {
-          result = func.apply(context, args);
-          if (!timeout) context = args = null;
-        }
-      }
-    };
+    writeBoolean: function(val) {
+        this.writeVarint(Boolean(val));
+    },
 
-    return function() {
-      context = this;
-      args = arguments;
-      timestamp = _.now();
-      var callNow = immediate && !timeout;
-      if (!timeout) timeout = setTimeout(later, wait);
-      if (callNow) {
-        result = func.apply(context, args);
-        context = args = null;
-      }
+    writeString: function(str) {
+        str = String(str);
+        this.realloc(str.length * 4);
 
-      return result;
-    };
-  };
+        this.pos++; // reserve 1 byte for short string length
 
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  _.wrap = function(func, wrapper) {
-    return _.partial(wrapper, func);
-  };
+        var startPos = this.pos;
+        // write the string directly to the buffer and see how much was written
+        this.pos = writeUtf8(this.buf, str, this.pos);
+        var len = this.pos - startPos;
 
-  // Returns a negated version of the passed-in predicate.
-  _.negate = function(predicate) {
-    return function() {
-      return !predicate.apply(this, arguments);
-    };
-  };
+        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
 
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  _.compose = function() {
-    var args = arguments;
-    var start = args.length - 1;
-    return function() {
-      var i = start;
-      var result = args[start].apply(this, arguments);
-      while (i--) result = args[i].call(this, result);
-      return result;
-    };
-  };
+        // finally, write the message length in the reserved place and restore the position
+        this.pos = startPos - 1;
+        this.writeVarint(len);
+        this.pos += len;
+    },
 
-  // Returns a function that will only be executed on and after the Nth call.
-  _.after = function(times, func) {
-    return function() {
-      if (--times < 1) {
-        return func.apply(this, arguments);
-      }
-    };
-  };
+    writeFloat: function(val) {
+        this.realloc(4);
+        ieee754.write(this.buf, val, this.pos, true, 23, 4);
+        this.pos += 4;
+    },
 
-  // Returns a function that will only be executed up to (but not including) the Nth call.
-  _.before = function(times, func) {
-    var memo;
-    return function() {
-      if (--times > 0) {
-        memo = func.apply(this, arguments);
-      }
-      if (times <= 1) func = null;
-      return memo;
-    };
-  };
+    writeDouble: function(val) {
+        this.realloc(8);
+        ieee754.write(this.buf, val, this.pos, true, 52, 8);
+        this.pos += 8;
+    },
 
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  _.once = _.partial(_.before, 2);
+    writeBytes: function(buffer) {
+        var len = buffer.length;
+        this.writeVarint(len);
+        this.realloc(len);
+        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
+    },
 
-  // Object Functions
-  // ----------------
+    writeRawMessage: function(fn, obj) {
+        this.pos++; // reserve 1 byte for short message length
 
-  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
-  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
-  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
-                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+        // write the message directly to the buffer and see how much was written
+        var startPos = this.pos;
+        fn(obj, this);
+        var len = this.pos - startPos;
 
-  function collectNonEnumProps(obj, keys) {
-    var nonEnumIdx = nonEnumerableProps.length;
-    var constructor = obj.constructor;
-    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
+        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
 
-    // Constructor is a special case.
-    var prop = 'constructor';
-    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
+        // finally, write the message length in the reserved place and restore the position
+        this.pos = startPos - 1;
+        this.writeVarint(len);
+        this.pos += len;
+    },
 
-    while (nonEnumIdx--) {
-      prop = nonEnumerableProps[nonEnumIdx];
-      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
-        keys.push(prop);
-      }
-    }
-  }
+    writeMessage: function(tag, fn, obj) {
+        this.writeTag(tag, Pbf.Bytes);
+        this.writeRawMessage(fn, obj);
+    },
 
-  // Retrieve the names of an object's own properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`
-  _.keys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    if (nativeKeys) return nativeKeys(obj);
-    var keys = [];
-    for (var key in obj) if (_.has(obj, key)) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
+    writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
+    writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
+    writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
+    writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
+    writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
+    writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
+    writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
+    writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
+    writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
 
-  // Retrieve all the property names of an object.
-  _.allKeys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    var keys = [];
-    for (var key in obj) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve the values of an object's properties.
-  _.values = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var values = Array(length);
-    for (var i = 0; i < length; i++) {
-      values[i] = obj[keys[i]];
+    writeBytesField: function(tag, buffer) {
+        this.writeTag(tag, Pbf.Bytes);
+        this.writeBytes(buffer);
+    },
+    writeFixed32Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed32);
+        this.writeFixed32(val);
+    },
+    writeSFixed32Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed32);
+        this.writeSFixed32(val);
+    },
+    writeFixed64Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed64);
+        this.writeFixed64(val);
+    },
+    writeSFixed64Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed64);
+        this.writeSFixed64(val);
+    },
+    writeVarintField: function(tag, val) {
+        this.writeTag(tag, Pbf.Varint);
+        this.writeVarint(val);
+    },
+    writeSVarintField: function(tag, val) {
+        this.writeTag(tag, Pbf.Varint);
+        this.writeSVarint(val);
+    },
+    writeStringField: function(tag, str) {
+        this.writeTag(tag, Pbf.Bytes);
+        this.writeString(str);
+    },
+    writeFloatField: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed32);
+        this.writeFloat(val);
+    },
+    writeDoubleField: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed64);
+        this.writeDouble(val);
+    },
+    writeBooleanField: function(tag, val) {
+        this.writeVarintField(tag, Boolean(val));
     }
-    return values;
-  };
+};
 
-  // Returns the results of applying the iteratee to each element of the object
-  // In contrast to _.map it returns an object
-  _.mapObject = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys =  _.keys(obj),
-          length = keys.length,
-          results = {},
-          currentKey;
-      for (var index = 0; index < length; index++) {
-        currentKey = keys[index];
-        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
-      }
-      return results;
-  };
+function readVarintRemainder(l, s, p) {
+    var buf = p.buf,
+        h, b;
 
-  // Convert an object into a list of `[key, value]` pairs.
-  _.pairs = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var pairs = Array(length);
-    for (var i = 0; i < length; i++) {
-      pairs[i] = [keys[i], obj[keys[i]]];
-    }
-    return pairs;
-  };
+    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
 
-  // Invert the keys and values of an object. The values must be serializable.
-  _.invert = function(obj) {
-    var result = {};
-    var keys = _.keys(obj);
-    for (var i = 0, length = keys.length; i < length; i++) {
-      result[obj[keys[i]]] = keys[i];
-    }
-    return result;
-  };
+    throw new Error('Expected varint not more than 10 bytes');
+}
 
-  // Return a sorted list of the function names available on the object.
-  // Aliased as `methods`
-  _.functions = _.methods = function(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (_.isFunction(obj[key])) names.push(key);
-    }
-    return names.sort();
-  };
+function readPackedEnd(pbf) {
+    return pbf.type === Pbf.Bytes ?
+        pbf.readVarint() + pbf.pos : pbf.pos + 1;
+}
 
-  // Extend a given object with all the properties in passed-in object(s).
-  _.extend = createAssigner(_.allKeys);
+function toNum(low, high, isSigned) {
+    if (isSigned) {
+        return high * 0x100000000 + (low >>> 0);
+    }
 
-  // Assigns a given object with all the own properties in the passed-in object(s)
-  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
-  _.extendOwn = _.assign = createAssigner(_.keys);
+    return ((high >>> 0) * 0x100000000) + (low >>> 0);
+}
 
-  // Returns the first key on an object that passes a predicate test
-  _.findKey = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = _.keys(obj), key;
-    for (var i = 0, length = keys.length; i < length; i++) {
-      key = keys[i];
-      if (predicate(obj[key], key, obj)) return key;
-    }
-  };
+function writeBigVarint(val, pbf) {
+    var low, high;
 
-  // Return a copy of the object only containing the whitelisted properties.
-  _.pick = function(object, oiteratee, context) {
-    var result = {}, obj = object, iteratee, keys;
-    if (obj == null) return result;
-    if (_.isFunction(oiteratee)) {
-      keys = _.allKeys(obj);
-      iteratee = optimizeCb(oiteratee, context);
+    if (val >= 0) {
+        low  = (val % 0x100000000) | 0;
+        high = (val / 0x100000000) | 0;
     } else {
-      keys = flatten(arguments, false, false, 1);
-      iteratee = function(value, key, obj) { return key in obj; };
-      obj = Object(obj);
-    }
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = keys[i];
-      var value = obj[key];
-      if (iteratee(value, key, obj)) result[key] = value;
+        low  = ~(-val % 0x100000000);
+        high = ~(-val / 0x100000000);
+
+        if (low ^ 0xffffffff) {
+            low = (low + 1) | 0;
+        } else {
+            low = 0;
+            high = (high + 1) | 0;
+        }
     }
-    return result;
-  };
 
-   // Return a copy of the object without the blacklisted properties.
-  _.omit = function(obj, iteratee, context) {
-    if (_.isFunction(iteratee)) {
-      iteratee = _.negate(iteratee);
-    } else {
-      var keys = _.map(flatten(arguments, false, false, 1), String);
-      iteratee = function(value, key) {
-        return !_.contains(keys, key);
-      };
+    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
+        throw new Error('Given varint doesn\'t fit into 10 bytes');
     }
-    return _.pick(obj, iteratee, context);
-  };
 
-  // Fill in a given object with default properties.
-  _.defaults = createAssigner(_.allKeys, true);
+    pbf.realloc(10);
 
-  // Creates an object that inherits from the given prototype object.
-  // If additional properties are provided then they will be added to the
-  // created object.
-  _.create = function(prototype, props) {
-    var result = baseCreate(prototype);
-    if (props) _.extendOwn(result, props);
-    return result;
-  };
+    writeBigVarintLow(low, high, pbf);
+    writeBigVarintHigh(high, pbf);
+}
 
-  // Create a (shallow-cloned) duplicate of an object.
-  _.clone = function(obj) {
-    if (!_.isObject(obj)) return obj;
-    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };
+function writeBigVarintLow(low, high, pbf) {
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos]   = low & 0x7f;
+}
 
-  // Invokes interceptor with the obj, and then returns obj.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  _.tap = function(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  };
+function writeBigVarintHigh(high, pbf) {
+    var lsb = (high & 0x07) << 4;
 
-  // Returns whether an object has a given set of `key:value` pairs.
-  _.isMatch = function(object, attrs) {
-    var keys = _.keys(attrs), length = keys.length;
-    if (object == null) return !length;
-    var obj = Object(object);
-    for (var i = 0; i < length; i++) {
-      var key = keys[i];
-      if (attrs[key] !== obj[key] || !(key in obj)) return false;
-    }
-    return true;
-  };
+    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f;
+}
 
+function makeRoomForExtraLength(startPos, len, pbf) {
+    var extraLen =
+        len <= 0x3fff ? 1 :
+        len <= 0x1fffff ? 2 :
+        len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
 
-  // Internal recursive comparison function for `isEqual`.
-  var eq = function(a, b, aStack, bStack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-    if (a === b) return a !== 0 || 1 / a === 1 / b;
-    // A strict comparison is necessary because `null == undefined`.
-    if (a == null || b == null) return a === b;
-    // Unwrap any wrapped objects.
-    if (a instanceof _) a = a._wrapped;
-    if (b instanceof _) b = b._wrapped;
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className !== toString.call(b)) return false;
-    switch (className) {
-      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-      case '[object RegExp]':
-      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return '' + a === '' + b;
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive.
-        // Object(NaN) is equivalent to NaN
-        if (+a !== +a) return +b !== +b;
-        // An `egal` comparison is performed for other numeric values.
-        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a === +b;
-    }
-
-    var areArrays = className === '[object Array]';
-    if (!areArrays) {
-      if (typeof a != 'object' || typeof b != 'object') return false;
-
-      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-      // from different frames are.
-      var aCtor = a.constructor, bCtor = b.constructor;
-      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
-                               _.isFunction(bCtor) && bCtor instanceof bCtor)
-                          && ('constructor' in a && 'constructor' in b)) {
-        return false;
-      }
-    }
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-    // Initializing stack of traversed objects.
-    // It's done here since we only need them for objects and arrays comparison.
-    aStack = aStack || [];
-    bStack = bStack || [];
-    var length = aStack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (aStack[length] === a) return bStack[length] === b;
-    }
-
-    // Add the first object to the stack of traversed objects.
-    aStack.push(a);
-    bStack.push(b);
-
-    // Recursively compare objects and arrays.
-    if (areArrays) {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      length = a.length;
-      if (length !== b.length) return false;
-      // Deep compare the contents, ignoring non-numeric properties.
-      while (length--) {
-        if (!eq(a[length], b[length], aStack, bStack)) return false;
-      }
-    } else {
-      // Deep compare objects.
-      var keys = _.keys(a), key;
-      length = keys.length;
-      // Ensure that both objects contain the same number of properties before comparing deep equality.
-      if (_.keys(b).length !== length) return false;
-      while (length--) {
-        // Deep compare each member
-        key = keys[length];
-        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
-      }
-    }
-    // Remove the first object from the stack of traversed objects.
-    aStack.pop();
-    bStack.pop();
-    return true;
-  };
+    // if 1 byte isn't enough for encoding message length, shift the data to the right
+    pbf.realloc(extraLen);
+    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
+}
 
-  // Perform a deep comparison to check if two objects are equal.
-  _.isEqual = function(a, b) {
-    return eq(a, b);
-  };
+function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
+function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
+function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
+function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
+function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
+function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
+function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
+function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
+function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
 
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  _.isEmpty = function(obj) {
-    if (obj == null) return true;
-    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
-    return _.keys(obj).length === 0;
-  };
+// Buffer code below from https://github.com/feross/buffer, MIT-licensed
 
-  // Is a given value a DOM element?
-  _.isElement = function(obj) {
-    return !!(obj && obj.nodeType === 1);
-  };
+function readUInt32(buf, pos) {
+    return ((buf[pos]) |
+        (buf[pos + 1] << 8) |
+        (buf[pos + 2] << 16)) +
+        (buf[pos + 3] * 0x1000000);
+}
 
-  // Is a given value an array?
-  // Delegates to ECMA5's native Array.isArray
-  _.isArray = nativeIsArray || function(obj) {
-    return toString.call(obj) === '[object Array]';
-  };
+function writeInt32(buf, val, pos) {
+    buf[pos] = val;
+    buf[pos + 1] = (val >>> 8);
+    buf[pos + 2] = (val >>> 16);
+    buf[pos + 3] = (val >>> 24);
+}
 
-  // Is a given variable an object?
-  _.isObject = function(obj) {
-    var type = typeof obj;
-    return type === 'function' || type === 'object' && !!obj;
-  };
+function readInt32(buf, pos) {
+    return ((buf[pos]) |
+        (buf[pos + 1] << 8) |
+        (buf[pos + 2] << 16)) +
+        (buf[pos + 3] << 24);
+}
 
-  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
-  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
-    _['is' + name] = function(obj) {
-      return toString.call(obj) === '[object ' + name + ']';
-    };
-  });
+function readUtf8(buf, pos, end) {
+    var str = '';
+    var i = pos;
 
-  // Define a fallback version of the method in browsers (ahem, IE < 9), where
-  // there isn't any inspectable "Arguments" type.
-  if (!_.isArguments(arguments)) {
-    _.isArguments = function(obj) {
-      return _.has(obj, 'callee');
-    };
-  }
+    while (i < end) {
+        var b0 = buf[i];
+        var c = null; // codepoint
+        var bytesPerSequence =
+            b0 > 0xEF ? 4 :
+            b0 > 0xDF ? 3 :
+            b0 > 0xBF ? 2 : 1;
 
-  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
-  // IE 11 (#1621), and in Safari 8 (#1929).
-  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
-    _.isFunction = function(obj) {
-      return typeof obj == 'function' || false;
-    };
-  }
+        if (i + bytesPerSequence > end) break;
 
-  // Is a given object a finite number?
-  _.isFinite = function(obj) {
-    return isFinite(obj) && !isNaN(parseFloat(obj));
-  };
+        var b1, b2, b3;
 
-  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
-  _.isNaN = function(obj) {
-    return _.isNumber(obj) && obj !== +obj;
-  };
+        if (bytesPerSequence === 1) {
+            if (b0 < 0x80) {
+                c = b0;
+            }
+        } else if (bytesPerSequence === 2) {
+            b1 = buf[i + 1];
+            if ((b1 & 0xC0) === 0x80) {
+                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
+                if (c <= 0x7F) {
+                    c = null;
+                }
+            }
+        } else if (bytesPerSequence === 3) {
+            b1 = buf[i + 1];
+            b2 = buf[i + 2];
+            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
+                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
+                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
+                    c = null;
+                }
+            }
+        } else if (bytesPerSequence === 4) {
+            b1 = buf[i + 1];
+            b2 = buf[i + 2];
+            b3 = buf[i + 3];
+            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
+                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
+                if (c <= 0xFFFF || c >= 0x110000) {
+                    c = null;
+                }
+            }
+        }
 
-  // Is a given value a boolean?
-  _.isBoolean = function(obj) {
-    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
-  };
+        if (c === null) {
+            c = 0xFFFD;
+            bytesPerSequence = 1;
 
-  // Is a given value equal to null?
-  _.isNull = function(obj) {
-    return obj === null;
-  };
+        } else if (c > 0xFFFF) {
+            c -= 0x10000;
+            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
+            c = 0xDC00 | c & 0x3FF;
+        }
 
-  // Is a given variable undefined?
-  _.isUndefined = function(obj) {
-    return obj === void 0;
-  };
+        str += String.fromCharCode(c);
+        i += bytesPerSequence;
+    }
 
-  // Shortcut function for checking if an object has a given property directly
-  // on itself (in other words, not on a prototype).
-  _.has = function(obj, key) {
-    return obj != null && hasOwnProperty.call(obj, key);
-  };
+    return str;
+}
 
-  // Utility Functions
-  // -----------------
+function readUtf8TextDecoder(buf, pos, end) {
+    return utf8TextDecoder.decode(buf.subarray(pos, end));
+}
 
-  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
-  // previous owner. Returns a reference to the Underscore object.
-  _.noConflict = function() {
-    root._ = previousUnderscore;
-    return this;
-  };
+function writeUtf8(buf, str, pos) {
+    for (var i = 0, c, lead; i < str.length; i++) {
+        c = str.charCodeAt(i); // code point
 
-  // Keep the identity function around for default iteratees.
-  _.identity = function(value) {
-    return value;
-  };
-
-  // Predicate-generating functions. Often useful outside of Underscore.
-  _.constant = function(value) {
-    return function() {
-      return value;
-    };
-  };
-
-  _.noop = function(){};
+        if (c > 0xD7FF && c < 0xE000) {
+            if (lead) {
+                if (c < 0xDC00) {
+                    buf[pos++] = 0xEF;
+                    buf[pos++] = 0xBF;
+                    buf[pos++] = 0xBD;
+                    lead = c;
+                    continue;
+                } else {
+                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
+                    lead = null;
+                }
+            } else {
+                if (c > 0xDBFF || (i + 1 === str.length)) {
+                    buf[pos++] = 0xEF;
+                    buf[pos++] = 0xBF;
+                    buf[pos++] = 0xBD;
+                } else {
+                    lead = c;
+                }
+                continue;
+            }
+        } else if (lead) {
+            buf[pos++] = 0xEF;
+            buf[pos++] = 0xBF;
+            buf[pos++] = 0xBD;
+            lead = null;
+        }
 
-  _.property = property;
+        if (c < 0x80) {
+            buf[pos++] = c;
+        } else {
+            if (c < 0x800) {
+                buf[pos++] = c >> 0x6 | 0xC0;
+            } else {
+                if (c < 0x10000) {
+                    buf[pos++] = c >> 0xC | 0xE0;
+                } else {
+                    buf[pos++] = c >> 0x12 | 0xF0;
+                    buf[pos++] = c >> 0xC & 0x3F | 0x80;
+                }
+                buf[pos++] = c >> 0x6 & 0x3F | 0x80;
+            }
+            buf[pos++] = c & 0x3F | 0x80;
+        }
+    }
+    return pos;
+}
 
-  // Generates a function for a given object that returns a given property.
-  _.propertyOf = function(obj) {
-    return obj == null ? function(){} : function(key) {
-      return obj[key];
-    };
-  };
+},{"ieee754":41}],41:[function(require,module,exports){
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+  var e, m
+  var eLen = (nBytes * 8) - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var nBits = -7
+  var i = isLE ? (nBytes - 1) : 0
+  var d = isLE ? -1 : 1
+  var s = buffer[offset + i]
 
-  // Returns a predicate for checking whether an object has a given set of
-  // `key:value` pairs.
-  _.matcher = _.matches = function(attrs) {
-    attrs = _.extendOwn({}, attrs);
-    return function(obj) {
-      return _.isMatch(obj, attrs);
-    };
-  };
+  i += d
 
-  // Run a function **n** times.
-  _.times = function(n, iteratee, context) {
-    var accum = Array(Math.max(0, n));
-    iteratee = optimizeCb(iteratee, context, 1);
-    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
-    return accum;
-  };
+  e = s & ((1 << (-nBits)) - 1)
+  s >>= (-nBits)
+  nBits += eLen
+  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
 
-  // Return a random integer between min and max (inclusive).
-  _.random = function(min, max) {
-    if (max == null) {
-      max = min;
-      min = 0;
-    }
-    return min + Math.floor(Math.random() * (max - min + 1));
-  };
+  m = e & ((1 << (-nBits)) - 1)
+  e >>= (-nBits)
+  nBits += mLen
+  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
 
-  // A (possibly faster) way to get the current timestamp as an integer.
-  _.now = Date.now || function() {
-    return new Date().getTime();
-  };
+  if (e === 0) {
+    e = 1 - eBias
+  } else if (e === eMax) {
+    return m ? NaN : ((s ? -1 : 1) * Infinity)
+  } else {
+    m = m + Math.pow(2, mLen)
+    e = e - eBias
+  }
+  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
 
-   // List of HTML entities for escaping.
-  var escapeMap = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-  };
-  var unescapeMap = _.invert(escapeMap);
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+  var e, m, c
+  var eLen = (nBytes * 8) - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+  var i = isLE ? 0 : (nBytes - 1)
+  var d = isLE ? 1 : -1
+  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
 
-  // Functions for escaping and unescaping strings to/from HTML interpolation.
-  var createEscaper = function(map) {
-    var escaper = function(match) {
-      return map[match];
-    };
-    // Regexes for identifying a key that needs to be escaped
-    var source = '(?:' + _.keys(map).join('|') + ')';
-    var testRegexp = RegExp(source);
-    var replaceRegexp = RegExp(source, 'g');
-    return function(string) {
-      string = string == null ? '' : '' + string;
-      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
-    };
-  };
-  _.escape = createEscaper(escapeMap);
-  _.unescape = createEscaper(unescapeMap);
+  value = Math.abs(value)
 
-  // If the value of the named `property` is a function then invoke it with the
-  // `object` as context; otherwise, return it.
-  _.result = function(object, property, fallback) {
-    var value = object == null ? void 0 : object[property];
-    if (value === void 0) {
-      value = fallback;
+  if (isNaN(value) || value === Infinity) {
+    m = isNaN(value) ? 1 : 0
+    e = eMax
+  } else {
+    e = Math.floor(Math.log(value) / Math.LN2)
+    if (value * (c = Math.pow(2, -e)) < 1) {
+      e--
+      c *= 2
+    }
+    if (e + eBias >= 1) {
+      value += rt / c
+    } else {
+      value += rt * Math.pow(2, 1 - eBias)
+    }
+    if (value * c >= 2) {
+      e++
+      c /= 2
     }
-    return _.isFunction(value) ? value.call(object) : value;
-  };
 
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  _.uniqueId = function(prefix) {
-    var id = ++idCounter + '';
-    return prefix ? prefix + id : id;
-  };
+    if (e + eBias >= eMax) {
+      m = 0
+      e = eMax
+    } else if (e + eBias >= 1) {
+      m = ((value * c) - 1) * Math.pow(2, mLen)
+      e = e + eBias
+    } else {
+      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+      e = 0
+    }
+  }
 
-  // By default, Underscore uses ERB-style template delimiters, change the
-  // following template settings to use alternative delimiters.
-  _.templateSettings = {
-    evaluate    : /<%([\s\S]+?)%>/g,
-    interpolate : /<%=([\s\S]+?)%>/g,
-    escape      : /<%-([\s\S]+?)%>/g
-  };
+  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
 
-  // When customizing `templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /(.)^/;
-
-  // Certain characters need to be escaped so that they can be put into a
-  // string literal.
-  var escapes = {
-    "'":      "'",
-    '\\':     '\\',
-    '\r':     'r',
-    '\n':     'n',
-    '\u2028': 'u2028',
-    '\u2029': 'u2029'
-  };
+  e = (e << mLen) | m
+  eLen += mLen
+  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
 
-  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
+  buffer[offset + i - d] |= s * 128
+}
 
-  var escapeChar = function(match) {
-    return '\\' + escapes[match];
-  };
+},{}],42:[function(require,module,exports){
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(t=t||self).RBush=i()}(this,function(){"use strict";function t(t,r,e,a,h){!function t(n,r,e,a,h){for(;a>e;){if(a-e>600){var o=a-e+1,s=r-e+1,l=Math.log(o),f=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*f*(o-f)/o)*(s-o/2<0?-1:1),m=Math.max(e,Math.floor(r-s*f/o+u)),c=Math.min(a,Math.floor(r+(o-s)*f/o+u));t(n,r,m,c,h)}var p=n[r],d=e,x=a;for(i(n,e,r),h(n[a],p)>0&&i(n,e,a);d<x;){for(i(n,d,x),d++,x--;h(n[d],p)<0;)d++;for(;h(n[x],p)>0;)x--}0===h(n[e],p)?i(n,e,x):i(n,++x,a),x<=r&&(e=x+1),r<=x&&(a=x-1)}}(t,r,e||0,a||t.length-1,h||n)}function i(t,i,n){var r=t[i];t[i]=t[n],t[n]=r}function n(t,i){return t<i?-1:t>i?1:0}var r=function(t){void 0===t&&(t=9),this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function e(t,i,n){if(!n)return i.indexOf(t);for(var r=0;r<i.length;r++)if(n(t,i[r]))return r;return-1}function a(t,i){h(t,0,t.children.length,i,t)}function h(t,i,n,r,e){e||(e=p(null)),e.minX=1/0,e.minY=1/0,e.maxX=-1/0,e.maxY=-1/0;for(var a=i;a<n;a++){var h=t.children[a];o(e,t.leaf?r(h):h)}return e}function o(t,i){return t.minX=Math.min(t.minX,i.minX),t.minY=Math.min(t.minY,i.minY),t.maxX=Math.max(t.maxX,i.maxX),t.maxY=Math.max(t.maxY,i.maxY),t}function s(t,i){return t.minX-i.minX}function l(t,i){return t.minY-i.minY}function f(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function u(t){return t.maxX-t.minX+(t.maxY-t.minY)}function m(t,i){return t.minX<=i.minX&&t.minY<=i.minY&&i.maxX<=t.maxX&&i.maxY<=t.maxY}function c(t,i){return i.minX<=t.maxX&&i.minY<=t.maxY&&i.maxX>=t.minX&&i.maxY>=t.minY}function p(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function d(i,n,r,e,a){for(var h=[n,r];h.length;)if(!((r=h.pop())-(n=h.pop())<=e)){var o=n+Math.ceil((r-n)/e/2)*e;t(i,o,n,r,a),h.push(n,o,o,r)}}return r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(t){var i=this.data,n=[];if(!c(t,i))return n;for(var r=this.toBBox,e=[];i;){for(var a=0;a<i.children.length;a++){var h=i.children[a],o=i.leaf?r(h):h;c(t,o)&&(i.leaf?n.push(h):m(t,o)?this._all(h,n):e.push(h))}i=e.pop()}return n},r.prototype.collides=function(t){var i=this.data;if(!c(t,i))return!1;for(var n=[];i;){for(var r=0;r<i.children.length;r++){var e=i.children[r],a=i.leaf?this.toBBox(e):e;if(c(t,a)){if(i.leaf||m(t,a))return!0;n.push(e)}}i=n.pop()}return!1},r.prototype.load=function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var i=0;i<t.length;i++)this.insert(t[i]);return this}var n=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var r=this.data;this.data=n,n=r}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},r.prototype.insert=function(t){return t&&this._insert(t,this.data.height-1),this},r.prototype.clear=function(){return this.data=p([]),this},r.prototype.remove=function(t,i){if(!t)return this;for(var n,r,a,h=this.data,o=this.toBBox(t),s=[],l=[];h||s.length;){if(h||(h=s.pop(),r=s[s.length-1],n=l.pop(),a=!0),h.leaf){var f=e(t,h.children,i);if(-1!==f)return h.children.splice(f,1),s.push(h),this._condense(s),this}a||h.leaf||!m(h,o)?r?(n++,h=r.children[n],a=!1):h=null:(s.push(h),l.push(n),n=0,r=h,h=h.children[0])}return this},r.prototype.toBBox=function(t){return t},r.prototype.compareMinX=function(t,i){return t.minX-i.minX},r.prototype.compareMinY=function(t,i){return t.minY-i.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(t){return this.data=t,this},r.prototype._all=function(t,i){for(var n=[];t;)t.leaf?i.push.apply(i,t.children):n.push.apply(n,t.children),t=n.pop();return i},r.prototype._build=function(t,i,n,r){var e,h=n-i+1,o=this._maxEntries;if(h<=o)return a(e=p(t.slice(i,n+1)),this.toBBox),e;r||(r=Math.ceil(Math.log(h)/Math.log(o)),o=Math.ceil(h/Math.pow(o,r-1))),(e=p([])).leaf=!1,e.height=r;var s=Math.ceil(h/o),l=s*Math.ceil(Math.sqrt(o));d(t,i,n,l,this.compareMinX);for(var f=i;f<=n;f+=l){var u=Math.min(f+l-1,n);d(t,f,u,s,this.compareMinY);for(var m=f;m<=u;m+=s){var c=Math.min(m+s-1,u);e.children.push(this._build(t,m,c,r-1))}}return a(e,this.toBBox),e},r.prototype._chooseSubtree=function(t,i,n,r){for(;r.push(i),!i.leaf&&r.length-1!==n;){for(var e=1/0,a=1/0,h=void 0,o=0;o<i.children.length;o++){var s=i.children[o],l=f(s),u=(m=t,c=s,(Math.max(c.maxX,m.maxX)-Math.min(c.minX,m.minX))*(Math.max(c.maxY,m.maxY)-Math.min(c.minY,m.minY))-l);u<a?(a=u,e=l<e?l:e,h=s):u===a&&l<e&&(e=l,h=s)}i=h||i.children[0]}var m,c;return i},r.prototype._insert=function(t,i,n){var r=n?t:this.toBBox(t),e=[],a=this._chooseSubtree(r,this.data,i,e);for(a.children.push(t),o(a,r);i>=0&&e[i].children.length>this._maxEntries;)this._split(e,i),i--;this._adjustParentBBoxes(r,e,i)},r.prototype._split=function(t,i){var n=t[i],r=n.children.length,e=this._minEntries;this._chooseSplitAxis(n,e,r);var h=this._chooseSplitIndex(n,e,r),o=p(n.children.splice(h,n.children.length-h));o.height=n.height,o.leaf=n.leaf,a(n,this.toBBox),a(o,this.toBBox),i?t[i-1].children.push(o):this._splitRoot(n,o)},r.prototype._splitRoot=function(t,i){this.data=p([t,i]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(t,i,n){for(var r,e,a,o,s,l,u,m=1/0,c=1/0,p=i;p<=n-i;p++){var d=h(t,0,p,this.toBBox),x=h(t,p,n,this.toBBox),v=(e=d,a=x,o=void 0,s=void 0,l=void 0,u=void 0,o=Math.max(e.minX,a.minX),s=Math.max(e.minY,a.minY),l=Math.min(e.maxX,a.maxX),u=Math.min(e.maxY,a.maxY),Math.max(0,l-o)*Math.max(0,u-s)),M=f(d)+f(x);v<m?(m=v,r=p,c=M<c?M:c):v===m&&M<c&&(c=M,r=p)}return r||n-i},r.prototype._chooseSplitAxis=function(t,i,n){var r=t.leaf?this.compareMinX:s,e=t.leaf?this.compareMinY:l;this._allDistMargin(t,i,n,r)<this._allDistMargin(t,i,n,e)&&t.children.sort(r)},r.prototype._allDistMargin=function(t,i,n,r){t.children.sort(r);for(var e=this.toBBox,a=h(t,0,i,e),s=h(t,n-i,n,e),l=u(a)+u(s),f=i;f<n-i;f++){var m=t.children[f];o(a,t.leaf?e(m):m),l+=u(a)}for(var c=n-i-1;c>=i;c--){var p=t.children[c];o(s,t.leaf?e(p):p),l+=u(s)}return l},r.prototype._adjustParentBBoxes=function(t,i,n){for(var r=n;r>=0;r--)o(i[r],t)},r.prototype._condense=function(t){for(var i=t.length-1,n=void 0;i>=0;i--)0===t[i].children.length?i>0?(n=t[i-1].children).splice(n.indexOf(t[i]),1):this.clear():a(t[i],this.toBBox)},r});
 
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  // NB: `oldSettings` only exists for backwards compatibility.
-  _.template = function(text, settings, oldSettings) {
-    if (!settings && oldSettings) settings = oldSettings;
-    settings = _.defaults({}, settings, _.templateSettings);
-
-    // Combine delimiters into one regular expression via alternation.
-    var matcher = RegExp([
-      (settings.escape || noMatch).source,
-      (settings.interpolate || noMatch).source,
-      (settings.evaluate || noMatch).source
-    ].join('|') + '|$', 'g');
-
-    // Compile the template source, escaping string literals appropriately.
-    var index = 0;
-    var source = "__p+='";
-    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
-      source += text.slice(index, offset).replace(escaper, escapeChar);
-      index = offset + match.length;
-
-      if (escape) {
-        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
-      } else if (interpolate) {
-        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
-      } else if (evaluate) {
-        source += "';\n" + evaluate + "\n__p+='";
-      }
+},{}],43:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("./internal/Observable");
+exports.Observable = Observable_1.Observable;
+var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
+exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
+var groupBy_1 = require("./internal/operators/groupBy");
+exports.GroupedObservable = groupBy_1.GroupedObservable;
+var observable_1 = require("./internal/symbol/observable");
+exports.observable = observable_1.observable;
+var Subject_1 = require("./internal/Subject");
+exports.Subject = Subject_1.Subject;
+var BehaviorSubject_1 = require("./internal/BehaviorSubject");
+exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
+var ReplaySubject_1 = require("./internal/ReplaySubject");
+exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
+var AsyncSubject_1 = require("./internal/AsyncSubject");
+exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
+var asap_1 = require("./internal/scheduler/asap");
+exports.asapScheduler = asap_1.asap;
+var async_1 = require("./internal/scheduler/async");
+exports.asyncScheduler = async_1.async;
+var queue_1 = require("./internal/scheduler/queue");
+exports.queueScheduler = queue_1.queue;
+var animationFrame_1 = require("./internal/scheduler/animationFrame");
+exports.animationFrameScheduler = animationFrame_1.animationFrame;
+var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
+exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
+exports.VirtualAction = VirtualTimeScheduler_1.VirtualAction;
+var Scheduler_1 = require("./internal/Scheduler");
+exports.Scheduler = Scheduler_1.Scheduler;
+var Subscription_1 = require("./internal/Subscription");
+exports.Subscription = Subscription_1.Subscription;
+var Subscriber_1 = require("./internal/Subscriber");
+exports.Subscriber = Subscriber_1.Subscriber;
+var Notification_1 = require("./internal/Notification");
+exports.Notification = Notification_1.Notification;
+exports.NotificationKind = Notification_1.NotificationKind;
+var pipe_1 = require("./internal/util/pipe");
+exports.pipe = pipe_1.pipe;
+var noop_1 = require("./internal/util/noop");
+exports.noop = noop_1.noop;
+var identity_1 = require("./internal/util/identity");
+exports.identity = identity_1.identity;
+var isObservable_1 = require("./internal/util/isObservable");
+exports.isObservable = isObservable_1.isObservable;
+var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
+exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+var EmptyError_1 = require("./internal/util/EmptyError");
+exports.EmptyError = EmptyError_1.EmptyError;
+var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
+exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
+var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
+exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
+var TimeoutError_1 = require("./internal/util/TimeoutError");
+exports.TimeoutError = TimeoutError_1.TimeoutError;
+var bindCallback_1 = require("./internal/observable/bindCallback");
+exports.bindCallback = bindCallback_1.bindCallback;
+var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
+exports.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;
+var combineLatest_1 = require("./internal/observable/combineLatest");
+exports.combineLatest = combineLatest_1.combineLatest;
+var concat_1 = require("./internal/observable/concat");
+exports.concat = concat_1.concat;
+var defer_1 = require("./internal/observable/defer");
+exports.defer = defer_1.defer;
+var empty_1 = require("./internal/observable/empty");
+exports.empty = empty_1.empty;
+var forkJoin_1 = require("./internal/observable/forkJoin");
+exports.forkJoin = forkJoin_1.forkJoin;
+var from_1 = require("./internal/observable/from");
+exports.from = from_1.from;
+var fromEvent_1 = require("./internal/observable/fromEvent");
+exports.fromEvent = fromEvent_1.fromEvent;
+var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
+exports.fromEventPattern = fromEventPattern_1.fromEventPattern;
+var generate_1 = require("./internal/observable/generate");
+exports.generate = generate_1.generate;
+var iif_1 = require("./internal/observable/iif");
+exports.iif = iif_1.iif;
+var interval_1 = require("./internal/observable/interval");
+exports.interval = interval_1.interval;
+var merge_1 = require("./internal/observable/merge");
+exports.merge = merge_1.merge;
+var never_1 = require("./internal/observable/never");
+exports.never = never_1.never;
+var of_1 = require("./internal/observable/of");
+exports.of = of_1.of;
+var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
+exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
+var pairs_1 = require("./internal/observable/pairs");
+exports.pairs = pairs_1.pairs;
+var partition_1 = require("./internal/observable/partition");
+exports.partition = partition_1.partition;
+var race_1 = require("./internal/observable/race");
+exports.race = race_1.race;
+var range_1 = require("./internal/observable/range");
+exports.range = range_1.range;
+var throwError_1 = require("./internal/observable/throwError");
+exports.throwError = throwError_1.throwError;
+var timer_1 = require("./internal/observable/timer");
+exports.timer = timer_1.timer;
+var using_1 = require("./internal/observable/using");
+exports.using = using_1.using;
+var zip_1 = require("./internal/observable/zip");
+exports.zip = zip_1.zip;
+var scheduled_1 = require("./internal/scheduled/scheduled");
+exports.scheduled = scheduled_1.scheduled;
+var empty_2 = require("./internal/observable/empty");
+exports.EMPTY = empty_2.EMPTY;
+var never_2 = require("./internal/observable/never");
+exports.NEVER = never_2.NEVER;
+var config_1 = require("./internal/config");
+exports.config = config_1.config;
+
+},{"./internal/AsyncSubject":44,"./internal/BehaviorSubject":45,"./internal/Notification":47,"./internal/Observable":48,"./internal/ReplaySubject":51,"./internal/Scheduler":52,"./internal/Subject":53,"./internal/Subscriber":55,"./internal/Subscription":56,"./internal/config":57,"./internal/observable/ConnectableObservable":58,"./internal/observable/bindCallback":60,"./internal/observable/bindNodeCallback":61,"./internal/observable/combineLatest":62,"./internal/observable/concat":63,"./internal/observable/defer":64,"./internal/observable/empty":65,"./internal/observable/forkJoin":66,"./internal/observable/from":67,"./internal/observable/fromEvent":69,"./internal/observable/fromEventPattern":70,"./internal/observable/generate":71,"./internal/observable/iif":72,"./internal/observable/interval":73,"./internal/observable/merge":74,"./internal/observable/never":75,"./internal/observable/of":76,"./internal/observable/onErrorResumeNext":77,"./internal/observable/pairs":78,"./internal/observable/partition":79,"./internal/observable/race":80,"./internal/observable/range":81,"./internal/observable/throwError":82,"./internal/observable/timer":83,"./internal/observable/using":84,"./internal/observable/zip":85,"./internal/operators/groupBy":121,"./internal/scheduled/scheduled":193,"./internal/scheduler/VirtualTimeScheduler":203,"./internal/scheduler/animationFrame":204,"./internal/scheduler/asap":205,"./internal/scheduler/async":206,"./internal/scheduler/queue":207,"./internal/symbol/observable":209,"./internal/util/ArgumentOutOfRangeError":211,"./internal/util/EmptyError":212,"./internal/util/ObjectUnsubscribedError":214,"./internal/util/TimeoutError":215,"./internal/util/UnsubscriptionError":216,"./internal/util/identity":219,"./internal/util/isObservable":228,"./internal/util/noop":231,"./internal/util/pipe":233}],44:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("./Subject");
+var Subscription_1 = require("./Subscription");
+var AsyncSubject = (function (_super) {
+    __extends(AsyncSubject, _super);
+    function AsyncSubject() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this.value = null;
+        _this.hasNext = false;
+        _this.hasCompleted = false;
+        return _this;
+    }
+    AsyncSubject.prototype._subscribe = function (subscriber) {
+        if (this.hasError) {
+            subscriber.error(this.thrownError);
+            return Subscription_1.Subscription.EMPTY;
+        }
+        else if (this.hasCompleted && this.hasNext) {
+            subscriber.next(this.value);
+            subscriber.complete();
+            return Subscription_1.Subscription.EMPTY;
+        }
+        return _super.prototype._subscribe.call(this, subscriber);
+    };
+    AsyncSubject.prototype.next = function (value) {
+        if (!this.hasCompleted) {
+            this.value = value;
+            this.hasNext = true;
+        }
+    };
+    AsyncSubject.prototype.error = function (error) {
+        if (!this.hasCompleted) {
+            _super.prototype.error.call(this, error);
+        }
+    };
+    AsyncSubject.prototype.complete = function () {
+        this.hasCompleted = true;
+        if (this.hasNext) {
+            _super.prototype.next.call(this, this.value);
+        }
+        _super.prototype.complete.call(this);
+    };
+    return AsyncSubject;
+}(Subject_1.Subject));
+exports.AsyncSubject = AsyncSubject;
 
-      // Adobe VMs need the match returned to produce the correct offest.
-      return match;
+},{"./Subject":53,"./Subscription":56}],45:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("./Subject");
+var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
+var BehaviorSubject = (function (_super) {
+    __extends(BehaviorSubject, _super);
+    function BehaviorSubject(_value) {
+        var _this = _super.call(this) || this;
+        _this._value = _value;
+        return _this;
+    }
+    Object.defineProperty(BehaviorSubject.prototype, "value", {
+        get: function () {
+            return this.getValue();
+        },
+        enumerable: true,
+        configurable: true
     });
-    source += "';\n";
-
-    // If a variable is not specified, place data values in local scope.
-    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
-
-    source = "var __t,__p='',__j=Array.prototype.join," +
-      "print=function(){__p+=__j.call(arguments,'');};\n" +
-      source + 'return __p;\n';
+    BehaviorSubject.prototype._subscribe = function (subscriber) {
+        var subscription = _super.prototype._subscribe.call(this, subscriber);
+        if (subscription && !subscription.closed) {
+            subscriber.next(this._value);
+        }
+        return subscription;
+    };
+    BehaviorSubject.prototype.getValue = function () {
+        if (this.hasError) {
+            throw this.thrownError;
+        }
+        else if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else {
+            return this._value;
+        }
+    };
+    BehaviorSubject.prototype.next = function (value) {
+        _super.prototype.next.call(this, this._value = value);
+    };
+    return BehaviorSubject;
+}(Subject_1.Subject));
+exports.BehaviorSubject = BehaviorSubject;
 
-    try {
-      var render = new Function(settings.variable || 'obj', '_', source);
-    } catch (e) {
-      e.source = source;
-      throw e;
+},{"./Subject":53,"./util/ObjectUnsubscribedError":214}],46:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("./Subscriber");
+var InnerSubscriber = (function (_super) {
+    __extends(InnerSubscriber, _super);
+    function InnerSubscriber(parent, outerValue, outerIndex) {
+        var _this = _super.call(this) || this;
+        _this.parent = parent;
+        _this.outerValue = outerValue;
+        _this.outerIndex = outerIndex;
+        _this.index = 0;
+        return _this;
     }
-
-    var template = function(data) {
-      return render.call(this, data, _);
+    InnerSubscriber.prototype._next = function (value) {
+        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
     };
-
-    // Provide the compiled source as a convenience for precompilation.
-    var argument = settings.variable || 'obj';
-    template.source = 'function(' + argument + '){\n' + source + '}';
-
-    return template;
-  };
-
-  // Add a "chain" function. Start chaining a wrapped Underscore object.
-  _.chain = function(obj) {
-    var instance = _(obj);
-    instance._chain = true;
-    return instance;
-  };
-
-  // OOP
-  // ---------------
-  // If Underscore is called as a function, it returns a wrapped object that
-  // can be used OO-style. This wrapper holds altered versions of all the
-  // underscore functions. Wrapped objects may be chained.
-
-  // Helper function to continue chaining intermediate results.
-  var result = function(instance, obj) {
-    return instance._chain ? _(obj).chain() : obj;
-  };
-
-  // Add your own custom functions to the Underscore object.
-  _.mixin = function(obj) {
-    _.each(_.functions(obj), function(name) {
-      var func = _[name] = obj[name];
-      _.prototype[name] = function() {
-        var args = [this._wrapped];
-        push.apply(args, arguments);
-        return result(this, func.apply(_, args));
-      };
-    });
-  };
-
-  // Add all of the Underscore functions to the wrapper object.
-  _.mixin(_);
-
-  // Add all mutator Array functions to the wrapper.
-  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      var obj = this._wrapped;
-      method.apply(obj, arguments);
-      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
-      return result(this, obj);
+    InnerSubscriber.prototype._error = function (error) {
+        this.parent.notifyError(error, this);
+        this.unsubscribe();
     };
-  });
-
-  // Add all accessor Array functions to the wrapper.
-  _.each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      return result(this, method.apply(this._wrapped, arguments));
+    InnerSubscriber.prototype._complete = function () {
+        this.parent.notifyComplete(this);
+        this.unsubscribe();
     };
-  });
-
-  // Extracts the result from a wrapped and chained object.
-  _.prototype.value = function() {
-    return this._wrapped;
-  };
-
-  // Provide unwrapping proxy for some methods used in engine operations
-  // such as arithmetic and JSON stringification.
-  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
-
-  _.prototype.toString = function() {
-    return '' + this._wrapped;
-  };
-
-  // AMD registration happens at the end for compatibility with AMD loaders
-  // that may not enforce next-turn semantics on modules. Even though general
-  // practice for AMD registration is to be anonymous, underscore registers
-  // as a named module because, like jQuery, it is a base library that is
-  // popular enough to be bundled in a third party lib, but not be part of
-  // an AMD load request. Those cases could generate an error when an
-  // anonymous define() is called outside of a loader request.
-  if (typeof define === 'function' && define.amd) {
-    define('underscore', [], function() {
-      return _;
-    });
-  }
-}.call(this));
+    return InnerSubscriber;
+}(Subscriber_1.Subscriber));
+exports.InnerSubscriber = InnerSubscriber;
 
-},{}],159:[function(require,module,exports){
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Ported from Webkit
- * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h
- */
-
-module.exports = UnitBezier;
-
-function UnitBezier(p1x, p1y, p2x, p2y) {
-    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
-    this.cx = 3.0 * p1x;
-    this.bx = 3.0 * (p2x - p1x) - this.cx;
-    this.ax = 1.0 - this.cx - this.bx;
-
-    this.cy = 3.0 * p1y;
-    this.by = 3.0 * (p2y - p1y) - this.cy;
-    this.ay = 1.0 - this.cy - this.by;
-
-    this.p1x = p1x;
-    this.p1y = p2y;
-    this.p2x = p2x;
-    this.p2y = p2y;
-}
-
-UnitBezier.prototype.sampleCurveX = function(t) {
-    // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
-    return ((this.ax * t + this.bx) * t + this.cx) * t;
-};
-
-UnitBezier.prototype.sampleCurveY = function(t) {
-    return ((this.ay * t + this.by) * t + this.cy) * t;
-};
-
-UnitBezier.prototype.sampleCurveDerivativeX = function(t) {
-    return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;
-};
-
-UnitBezier.prototype.solveCurveX = function(x, epsilon) {
-    if (typeof epsilon === 'undefined') epsilon = 1e-6;
-
-    var t0, t1, t2, x2, i;
-
-    // First try a few iterations of Newton's method -- normally very fast.
-    for (t2 = x, i = 0; i < 8; i++) {
-
-        x2 = this.sampleCurveX(t2) - x;
-        if (Math.abs(x2) < epsilon) return t2;
-
-        var d2 = this.sampleCurveDerivativeX(t2);
-        if (Math.abs(d2) < 1e-6) break;
-
-        t2 = t2 - x2 / d2;
+},{"./Subscriber":55}],47:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var empty_1 = require("./observable/empty");
+var of_1 = require("./observable/of");
+var throwError_1 = require("./observable/throwError");
+var NotificationKind;
+(function (NotificationKind) {
+    NotificationKind["NEXT"] = "N";
+    NotificationKind["ERROR"] = "E";
+    NotificationKind["COMPLETE"] = "C";
+})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
+var Notification = (function () {
+    function Notification(kind, value, error) {
+        this.kind = kind;
+        this.value = value;
+        this.error = error;
+        this.hasValue = kind === 'N';
     }
-
-    // Fall back to the bisection method for reliability.
-    t0 = 0.0;
-    t1 = 1.0;
-    t2 = x;
-
-    if (t2 < t0) return t0;
-    if (t2 > t1) return t1;
-
-    while (t0 < t1) {
-
-        x2 = this.sampleCurveX(t2);
-        if (Math.abs(x2 - x) < epsilon) return t2;
-
-        if (x > x2) {
-            t0 = t2;
-        } else {
-            t1 = t2;
+    Notification.prototype.observe = function (observer) {
+        switch (this.kind) {
+            case 'N':
+                return observer.next && observer.next(this.value);
+            case 'E':
+                return observer.error && observer.error(this.error);
+            case 'C':
+                return observer.complete && observer.complete();
+        }
+    };
+    Notification.prototype.do = function (next, error, complete) {
+        var kind = this.kind;
+        switch (kind) {
+            case 'N':
+                return next && next(this.value);
+            case 'E':
+                return error && error(this.error);
+            case 'C':
+                return complete && complete();
+        }
+    };
+    Notification.prototype.accept = function (nextOrObserver, error, complete) {
+        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
+            return this.observe(nextOrObserver);
+        }
+        else {
+            return this.do(nextOrObserver, error, complete);
+        }
+    };
+    Notification.prototype.toObservable = function () {
+        var kind = this.kind;
+        switch (kind) {
+            case 'N':
+                return of_1.of(this.value);
+            case 'E':
+                return throwError_1.throwError(this.error);
+            case 'C':
+                return empty_1.empty();
+        }
+        throw new Error('unexpected notification kind value');
+    };
+    Notification.createNext = function (value) {
+        if (typeof value !== 'undefined') {
+            return new Notification('N', value);
         }
+        return Notification.undefinedValueNotification;
+    };
+    Notification.createError = function (err) {
+        return new Notification('E', undefined, err);
+    };
+    Notification.createComplete = function () {
+        return Notification.completeNotification;
+    };
+    Notification.completeNotification = new Notification('C');
+    Notification.undefinedValueNotification = new Notification('N', undefined);
+    return Notification;
+}());
+exports.Notification = Notification;
 
-        t2 = (t1 - t0) * 0.5 + t0;
+},{"./observable/empty":65,"./observable/of":76,"./observable/throwError":82}],48:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var canReportError_1 = require("./util/canReportError");
+var toSubscriber_1 = require("./util/toSubscriber");
+var observable_1 = require("./symbol/observable");
+var pipe_1 = require("./util/pipe");
+var config_1 = require("./config");
+var Observable = (function () {
+    function Observable(subscribe) {
+        this._isScalar = false;
+        if (subscribe) {
+            this._subscribe = subscribe;
+        }
     }
-
-    // Failure.
-    return t2;
-};
-
-UnitBezier.prototype.solve = function(x, epsilon) {
-    return this.sampleCurveY(this.solveCurveX(x, epsilon));
-};
-
-},{}],160:[function(require,module,exports){
-var createElement = require("./vdom/create-element.js")
-
-module.exports = createElement
-
-},{"./vdom/create-element.js":166}],161:[function(require,module,exports){
-var diff = require("./vtree/diff.js")
-
-module.exports = diff
-
-},{"./vtree/diff.js":186}],162:[function(require,module,exports){
-var h = require("./virtual-hyperscript/index.js")
-
-module.exports = h
-
-},{"./virtual-hyperscript/index.js":173}],163:[function(require,module,exports){
-var diff = require("./diff.js")
-var patch = require("./patch.js")
-var h = require("./h.js")
-var create = require("./create-element.js")
-var VNode = require('./vnode/vnode.js')
-var VText = require('./vnode/vtext.js')
-
-module.exports = {
-    diff: diff,
-    patch: patch,
-    h: h,
-    create: create,
-    VNode: VNode,
-    VText: VText
-}
-
-},{"./create-element.js":160,"./diff.js":161,"./h.js":162,"./patch.js":164,"./vnode/vnode.js":182,"./vnode/vtext.js":184}],164:[function(require,module,exports){
-var patch = require("./vdom/patch.js")
-
-module.exports = patch
-
-},{"./vdom/patch.js":169}],165:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook.js")
-
-module.exports = applyProperties
-
-function applyProperties(node, props, previous) {
-    for (var propName in props) {
-        var propValue = props[propName]
-
-        if (propValue === undefined) {
-            removeProperty(node, propName, propValue, previous);
-        } else if (isHook(propValue)) {
-            removeProperty(node, propName, propValue, previous)
-            if (propValue.hook) {
-                propValue.hook(node,
-                    propName,
-                    previous ? previous[propName] : undefined)
+    Observable.prototype.lift = function (operator) {
+        var observable = new Observable();
+        observable.source = this;
+        observable.operator = operator;
+        return observable;
+    };
+    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
+        var operator = this.operator;
+        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
+        if (operator) {
+            sink.add(operator.call(sink, this.source));
+        }
+        else {
+            sink.add(this.source || (config_1.config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
+                this._subscribe(sink) :
+                this._trySubscribe(sink));
+        }
+        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+            if (sink.syncErrorThrowable) {
+                sink.syncErrorThrowable = false;
+                if (sink.syncErrorThrown) {
+                    throw sink.syncErrorValue;
+                }
             }
-        } else {
-            if (isObject(propValue)) {
-                patchObject(node, props, previous, propName, propValue);
-            } else {
-                node[propName] = propValue
+        }
+        return sink;
+    };
+    Observable.prototype._trySubscribe = function (sink) {
+        try {
+            return this._subscribe(sink);
+        }
+        catch (err) {
+            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+                sink.syncErrorThrown = true;
+                sink.syncErrorValue = err;
+            }
+            if (canReportError_1.canReportError(sink)) {
+                sink.error(err);
+            }
+            else {
+                console.warn(err);
             }
         }
-    }
-}
-
-function removeProperty(node, propName, propValue, previous) {
-    if (previous) {
-        var previousValue = previous[propName]
-
-        if (!isHook(previousValue)) {
-            if (propName === "attributes") {
-                for (var attrName in previousValue) {
-                    node.removeAttribute(attrName)
+    };
+    Observable.prototype.forEach = function (next, promiseCtor) {
+        var _this = this;
+        promiseCtor = getPromiseCtor(promiseCtor);
+        return new promiseCtor(function (resolve, reject) {
+            var subscription;
+            subscription = _this.subscribe(function (value) {
+                try {
+                    next(value);
                 }
-            } else if (propName === "style") {
-                for (var i in previousValue) {
-                    node.style[i] = ""
+                catch (err) {
+                    reject(err);
+                    if (subscription) {
+                        subscription.unsubscribe();
+                    }
                 }
-            } else if (typeof previousValue === "string") {
-                node[propName] = ""
-            } else {
-                node[propName] = null
-            }
-        } else if (previousValue.unhook) {
-            previousValue.unhook(node, propName, propValue)
+            }, reject, resolve);
+        });
+    };
+    Observable.prototype._subscribe = function (subscriber) {
+        var source = this.source;
+        return source && source.subscribe(subscriber);
+    };
+    Observable.prototype[observable_1.observable] = function () {
+        return this;
+    };
+    Observable.prototype.pipe = function () {
+        var operations = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            operations[_i] = arguments[_i];
+        }
+        if (operations.length === 0) {
+            return this;
         }
+        return pipe_1.pipeFromArray(operations)(this);
+    };
+    Observable.prototype.toPromise = function (promiseCtor) {
+        var _this = this;
+        promiseCtor = getPromiseCtor(promiseCtor);
+        return new promiseCtor(function (resolve, reject) {
+            var value;
+            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
+        });
+    };
+    Observable.create = function (subscribe) {
+        return new Observable(subscribe);
+    };
+    return Observable;
+}());
+exports.Observable = Observable;
+function getPromiseCtor(promiseCtor) {
+    if (!promiseCtor) {
+        promiseCtor = config_1.config.Promise || Promise;
+    }
+    if (!promiseCtor) {
+        throw new Error('no Promise impl found');
     }
+    return promiseCtor;
 }
 
-function patchObject(node, props, previous, propName, propValue) {
-    var previousValue = previous ? previous[propName] : undefined
-
-    // Set attributes
-    if (propName === "attributes") {
-        for (var attrName in propValue) {
-            var attrValue = propValue[attrName]
-
-            if (attrValue === undefined) {
-                node.removeAttribute(attrName)
-            } else {
-                node.setAttribute(attrName, attrValue)
-            }
+},{"./config":57,"./symbol/observable":209,"./util/canReportError":217,"./util/pipe":233,"./util/toSubscriber":240}],49:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var config_1 = require("./config");
+var hostReportError_1 = require("./util/hostReportError");
+exports.empty = {
+    closed: true,
+    next: function (value) { },
+    error: function (err) {
+        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+            throw err;
+        }
+        else {
+            hostReportError_1.hostReportError(err);
         }
+    },
+    complete: function () { }
+};
 
-        return
+},{"./config":57,"./util/hostReportError":218}],50:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("./Subscriber");
+var OuterSubscriber = (function (_super) {
+    __extends(OuterSubscriber, _super);
+    function OuterSubscriber() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
+    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
+        this.destination.error(error);
+    };
+    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.destination.complete();
+    };
+    return OuterSubscriber;
+}(Subscriber_1.Subscriber));
+exports.OuterSubscriber = OuterSubscriber;
 
-    if(previousValue && isObject(previousValue) &&
-        getPrototype(previousValue) !== getPrototype(propValue)) {
-        node[propName] = propValue
-        return
+},{"./Subscriber":55}],51:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("./Subject");
+var queue_1 = require("./scheduler/queue");
+var Subscription_1 = require("./Subscription");
+var observeOn_1 = require("./operators/observeOn");
+var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
+var SubjectSubscription_1 = require("./SubjectSubscription");
+var ReplaySubject = (function (_super) {
+    __extends(ReplaySubject, _super);
+    function ReplaySubject(bufferSize, windowTime, scheduler) {
+        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
+        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
+        var _this = _super.call(this) || this;
+        _this.scheduler = scheduler;
+        _this._events = [];
+        _this._infiniteTimeWindow = false;
+        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
+        _this._windowTime = windowTime < 1 ? 1 : windowTime;
+        if (windowTime === Number.POSITIVE_INFINITY) {
+            _this._infiniteTimeWindow = true;
+            _this.next = _this.nextInfiniteTimeWindow;
+        }
+        else {
+            _this.next = _this.nextTimeWindow;
+        }
+        return _this;
     }
-
-    if (!isObject(node[propName])) {
-        node[propName] = {}
+    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
+        var _events = this._events;
+        _events.push(value);
+        if (_events.length > this._bufferSize) {
+            _events.shift();
+        }
+        _super.prototype.next.call(this, value);
+    };
+    ReplaySubject.prototype.nextTimeWindow = function (value) {
+        this._events.push(new ReplayEvent(this._getNow(), value));
+        this._trimBufferThenGetEvents();
+        _super.prototype.next.call(this, value);
+    };
+    ReplaySubject.prototype._subscribe = function (subscriber) {
+        var _infiniteTimeWindow = this._infiniteTimeWindow;
+        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
+        var scheduler = this.scheduler;
+        var len = _events.length;
+        var subscription;
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else if (this.isStopped || this.hasError) {
+            subscription = Subscription_1.Subscription.EMPTY;
+        }
+        else {
+            this.observers.push(subscriber);
+            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
+        }
+        if (scheduler) {
+            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
+        }
+        if (_infiniteTimeWindow) {
+            for (var i = 0; i < len && !subscriber.closed; i++) {
+                subscriber.next(_events[i]);
+            }
+        }
+        else {
+            for (var i = 0; i < len && !subscriber.closed; i++) {
+                subscriber.next(_events[i].value);
+            }
+        }
+        if (this.hasError) {
+            subscriber.error(this.thrownError);
+        }
+        else if (this.isStopped) {
+            subscriber.complete();
+        }
+        return subscription;
+    };
+    ReplaySubject.prototype._getNow = function () {
+        return (this.scheduler || queue_1.queue).now();
+    };
+    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
+        var now = this._getNow();
+        var _bufferSize = this._bufferSize;
+        var _windowTime = this._windowTime;
+        var _events = this._events;
+        var eventsCount = _events.length;
+        var spliceCount = 0;
+        while (spliceCount < eventsCount) {
+            if ((now - _events[spliceCount].time) < _windowTime) {
+                break;
+            }
+            spliceCount++;
+        }
+        if (eventsCount > _bufferSize) {
+            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
+        }
+        if (spliceCount > 0) {
+            _events.splice(0, spliceCount);
+        }
+        return _events;
+    };
+    return ReplaySubject;
+}(Subject_1.Subject));
+exports.ReplaySubject = ReplaySubject;
+var ReplayEvent = (function () {
+    function ReplayEvent(time, value) {
+        this.time = time;
+        this.value = value;
     }
+    return ReplayEvent;
+}());
 
-    var replacer = propName === "style" ? "" : undefined
-
-    for (var k in propValue) {
-        var value = propValue[k]
-        node[propName][k] = (value === undefined) ? replacer : value
+},{"./Subject":53,"./SubjectSubscription":54,"./Subscription":56,"./operators/observeOn":136,"./scheduler/queue":207,"./util/ObjectUnsubscribedError":214}],52:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Scheduler = (function () {
+    function Scheduler(SchedulerAction, now) {
+        if (now === void 0) { now = Scheduler.now; }
+        this.SchedulerAction = SchedulerAction;
+        this.now = now;
     }
-}
+    Scheduler.prototype.schedule = function (work, delay, state) {
+        if (delay === void 0) { delay = 0; }
+        return new this.SchedulerAction(this, work).schedule(state, delay);
+    };
+    Scheduler.now = function () { return Date.now(); };
+    return Scheduler;
+}());
+exports.Scheduler = Scheduler;
 
-function getPrototype(value) {
-    if (Object.getPrototypeOf) {
-        return Object.getPrototypeOf(value)
-    } else if (value.__proto__) {
-        return value.__proto__
-    } else if (value.constructor) {
-        return value.constructor.prototype
+},{}],53:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("./Observable");
+var Subscriber_1 = require("./Subscriber");
+var Subscription_1 = require("./Subscription");
+var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
+var SubjectSubscription_1 = require("./SubjectSubscription");
+var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
+var SubjectSubscriber = (function (_super) {
+    __extends(SubjectSubscriber, _super);
+    function SubjectSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        return _this;
     }
-}
-
-},{"../vnode/is-vhook.js":177,"is-object":18}],166:[function(require,module,exports){
-var document = require("global/document")
-
-var applyProperties = require("./apply-properties")
-
-var isVNode = require("../vnode/is-vnode.js")
-var isVText = require("../vnode/is-vtext.js")
-var isWidget = require("../vnode/is-widget.js")
-var handleThunk = require("../vnode/handle-thunk.js")
-
-module.exports = createElement
-
-function createElement(vnode, opts) {
-    var doc = opts ? opts.document || document : document
-    var warn = opts ? opts.warn : null
-
-    vnode = handleThunk(vnode).a
-
-    if (isWidget(vnode)) {
-        return vnode.init()
-    } else if (isVText(vnode)) {
-        return doc.createTextNode(vnode.text)
-    } else if (!isVNode(vnode)) {
-        if (warn) {
-            warn("Item is not a valid virtual dom node", vnode)
+    return SubjectSubscriber;
+}(Subscriber_1.Subscriber));
+exports.SubjectSubscriber = SubjectSubscriber;
+var Subject = (function (_super) {
+    __extends(Subject, _super);
+    function Subject() {
+        var _this = _super.call(this) || this;
+        _this.observers = [];
+        _this.closed = false;
+        _this.isStopped = false;
+        _this.hasError = false;
+        _this.thrownError = null;
+        return _this;
+    }
+    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
+        return new SubjectSubscriber(this);
+    };
+    Subject.prototype.lift = function (operator) {
+        var subject = new AnonymousSubject(this, this);
+        subject.operator = operator;
+        return subject;
+    };
+    Subject.prototype.next = function (value) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
         }
-        return null
-    }
-
-    var node = (vnode.namespace === null) ?
-        doc.createElement(vnode.tagName) :
-        doc.createElementNS(vnode.namespace, vnode.tagName)
-
-    var props = vnode.properties
-    applyProperties(node, props)
-
-    var children = vnode.children
-
-    for (var i = 0; i < children.length; i++) {
-        var childNode = createElement(children[i], opts)
-        if (childNode) {
-            node.appendChild(childNode)
+        if (!this.isStopped) {
+            var observers = this.observers;
+            var len = observers.length;
+            var copy = observers.slice();
+            for (var i = 0; i < len; i++) {
+                copy[i].next(value);
+            }
         }
-    }
-
-    return node
-}
-
-},{"../vnode/handle-thunk.js":175,"../vnode/is-vnode.js":178,"../vnode/is-vtext.js":179,"../vnode/is-widget.js":180,"./apply-properties":165,"global/document":14}],167:[function(require,module,exports){
-// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
-// We don't want to read all of the DOM nodes in the tree so we use
-// the in-order tree indexing to eliminate recursion down certain branches.
-// We only recurse into a DOM node if we know that it contains a child of
-// interest.
-
-var noChild = {}
-
-module.exports = domIndex
-
-function domIndex(rootNode, tree, indices, nodes) {
-    if (!indices || indices.length === 0) {
-        return {}
-    } else {
-        indices.sort(ascending)
-        return recurse(rootNode, tree, indices, nodes, 0)
-    }
-}
-
-function recurse(rootNode, tree, indices, nodes, rootIndex) {
-    nodes = nodes || {}
-
-
-    if (rootNode) {
-        if (indexInRange(indices, rootIndex, rootIndex)) {
-            nodes[rootIndex] = rootNode
+    };
+    Subject.prototype.error = function (err) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
         }
-
-        var vChildren = tree.children
-
-        if (vChildren) {
-
-            var childNodes = rootNode.childNodes
-
-            for (var i = 0; i < tree.children.length; i++) {
-                rootIndex += 1
-
-                var vChild = vChildren[i] || noChild
-                var nextIndex = rootIndex + (vChild.count || 0)
-
-                // skip recursion down the tree if there are no nodes down here
-                if (indexInRange(indices, rootIndex, nextIndex)) {
-                    recurse(childNodes[i], vChild, indices, nodes, rootIndex)
-                }
-
-                rootIndex = nextIndex
-            }
+        this.hasError = true;
+        this.thrownError = err;
+        this.isStopped = true;
+        var observers = this.observers;
+        var len = observers.length;
+        var copy = observers.slice();
+        for (var i = 0; i < len; i++) {
+            copy[i].error(err);
+        }
+        this.observers.length = 0;
+    };
+    Subject.prototype.complete = function () {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        this.isStopped = true;
+        var observers = this.observers;
+        var len = observers.length;
+        var copy = observers.slice();
+        for (var i = 0; i < len; i++) {
+            copy[i].complete();
+        }
+        this.observers.length = 0;
+    };
+    Subject.prototype.unsubscribe = function () {
+        this.isStopped = true;
+        this.closed = true;
+        this.observers = null;
+    };
+    Subject.prototype._trySubscribe = function (subscriber) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else {
+            return _super.prototype._trySubscribe.call(this, subscriber);
+        }
+    };
+    Subject.prototype._subscribe = function (subscriber) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else if (this.hasError) {
+            subscriber.error(this.thrownError);
+            return Subscription_1.Subscription.EMPTY;
+        }
+        else if (this.isStopped) {
+            subscriber.complete();
+            return Subscription_1.Subscription.EMPTY;
+        }
+        else {
+            this.observers.push(subscriber);
+            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
         }
+    };
+    Subject.prototype.asObservable = function () {
+        var observable = new Observable_1.Observable();
+        observable.source = this;
+        return observable;
+    };
+    Subject.create = function (destination, source) {
+        return new AnonymousSubject(destination, source);
+    };
+    return Subject;
+}(Observable_1.Observable));
+exports.Subject = Subject;
+var AnonymousSubject = (function (_super) {
+    __extends(AnonymousSubject, _super);
+    function AnonymousSubject(destination, source) {
+        var _this = _super.call(this) || this;
+        _this.destination = destination;
+        _this.source = source;
+        return _this;
     }
+    AnonymousSubject.prototype.next = function (value) {
+        var destination = this.destination;
+        if (destination && destination.next) {
+            destination.next(value);
+        }
+    };
+    AnonymousSubject.prototype.error = function (err) {
+        var destination = this.destination;
+        if (destination && destination.error) {
+            this.destination.error(err);
+        }
+    };
+    AnonymousSubject.prototype.complete = function () {
+        var destination = this.destination;
+        if (destination && destination.complete) {
+            this.destination.complete();
+        }
+    };
+    AnonymousSubject.prototype._subscribe = function (subscriber) {
+        var source = this.source;
+        if (source) {
+            return this.source.subscribe(subscriber);
+        }
+        else {
+            return Subscription_1.Subscription.EMPTY;
+        }
+    };
+    return AnonymousSubject;
+}(Subject));
+exports.AnonymousSubject = AnonymousSubject;
 
-    return nodes
-}
-
-// Binary search for an index in the interval [left, right]
-function indexInRange(indices, left, right) {
-    if (indices.length === 0) {
-        return false
+},{"../internal/symbol/rxSubscriber":210,"./Observable":48,"./SubjectSubscription":54,"./Subscriber":55,"./Subscription":56,"./util/ObjectUnsubscribedError":214}],54:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("./Subscription");
+var SubjectSubscription = (function (_super) {
+    __extends(SubjectSubscription, _super);
+    function SubjectSubscription(subject, subscriber) {
+        var _this = _super.call(this) || this;
+        _this.subject = subject;
+        _this.subscriber = subscriber;
+        _this.closed = false;
+        return _this;
     }
+    SubjectSubscription.prototype.unsubscribe = function () {
+        if (this.closed) {
+            return;
+        }
+        this.closed = true;
+        var subject = this.subject;
+        var observers = subject.observers;
+        this.subject = null;
+        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
+            return;
+        }
+        var subscriberIndex = observers.indexOf(this.subscriber);
+        if (subscriberIndex !== -1) {
+            observers.splice(subscriberIndex, 1);
+        }
+    };
+    return SubjectSubscription;
+}(Subscription_1.Subscription));
+exports.SubjectSubscription = SubjectSubscription;
 
-    var minIndex = 0
-    var maxIndex = indices.length - 1
-    var currentIndex
-    var currentItem
-
-    while (minIndex <= maxIndex) {
-        currentIndex = ((maxIndex + minIndex) / 2) >> 0
-        currentItem = indices[currentIndex]
-
-        if (minIndex === maxIndex) {
-            return currentItem >= left && currentItem <= right
-        } else if (currentItem < left) {
-            minIndex = currentIndex + 1
-        } else  if (currentItem > right) {
-            maxIndex = currentIndex - 1
-        } else {
-            return true
+},{"./Subscription":56}],55:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var isFunction_1 = require("./util/isFunction");
+var Observer_1 = require("./Observer");
+var Subscription_1 = require("./Subscription");
+var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
+var config_1 = require("./config");
+var hostReportError_1 = require("./util/hostReportError");
+var Subscriber = (function (_super) {
+    __extends(Subscriber, _super);
+    function Subscriber(destinationOrNext, error, complete) {
+        var _this = _super.call(this) || this;
+        _this.syncErrorValue = null;
+        _this.syncErrorThrown = false;
+        _this.syncErrorThrowable = false;
+        _this.isStopped = false;
+        switch (arguments.length) {
+            case 0:
+                _this.destination = Observer_1.empty;
+                break;
+            case 1:
+                if (!destinationOrNext) {
+                    _this.destination = Observer_1.empty;
+                    break;
+                }
+                if (typeof destinationOrNext === 'object') {
+                    if (destinationOrNext instanceof Subscriber) {
+                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
+                        _this.destination = destinationOrNext;
+                        destinationOrNext.add(_this);
+                    }
+                    else {
+                        _this.syncErrorThrowable = true;
+                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
+                    }
+                    break;
+                }
+            default:
+                _this.syncErrorThrowable = true;
+                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
+                break;
         }
+        return _this;
     }
-
-    return false;
-}
-
-function ascending(a, b) {
-    return a > b ? 1 : -1
-}
-
-},{}],168:[function(require,module,exports){
-var applyProperties = require("./apply-properties")
-
-var isWidget = require("../vnode/is-widget.js")
-var VPatch = require("../vnode/vpatch.js")
-
-var updateWidget = require("./update-widget")
-
-module.exports = applyPatch
-
-function applyPatch(vpatch, domNode, renderOptions) {
-    var type = vpatch.type
-    var vNode = vpatch.vNode
-    var patch = vpatch.patch
-
-    switch (type) {
-        case VPatch.REMOVE:
-            return removeNode(domNode, vNode)
-        case VPatch.INSERT:
-            return insertNode(domNode, patch, renderOptions)
-        case VPatch.VTEXT:
-            return stringPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.WIDGET:
-            return widgetPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.VNODE:
-            return vNodePatch(domNode, vNode, patch, renderOptions)
-        case VPatch.ORDER:
-            reorderChildren(domNode, patch)
-            return domNode
-        case VPatch.PROPS:
-            applyProperties(domNode, patch, vNode.properties)
-            return domNode
-        case VPatch.THUNK:
-            return replaceRoot(domNode,
-                renderOptions.patch(domNode, patch, renderOptions))
-        default:
-            return domNode
+    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
+    Subscriber.create = function (next, error, complete) {
+        var subscriber = new Subscriber(next, error, complete);
+        subscriber.syncErrorThrowable = false;
+        return subscriber;
+    };
+    Subscriber.prototype.next = function (value) {
+        if (!this.isStopped) {
+            this._next(value);
+        }
+    };
+    Subscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            this.isStopped = true;
+            this._error(err);
+        }
+    };
+    Subscriber.prototype.complete = function () {
+        if (!this.isStopped) {
+            this.isStopped = true;
+            this._complete();
+        }
+    };
+    Subscriber.prototype.unsubscribe = function () {
+        if (this.closed) {
+            return;
+        }
+        this.isStopped = true;
+        _super.prototype.unsubscribe.call(this);
+    };
+    Subscriber.prototype._next = function (value) {
+        this.destination.next(value);
+    };
+    Subscriber.prototype._error = function (err) {
+        this.destination.error(err);
+        this.unsubscribe();
+    };
+    Subscriber.prototype._complete = function () {
+        this.destination.complete();
+        this.unsubscribe();
+    };
+    Subscriber.prototype._unsubscribeAndRecycle = function () {
+        var _parentOrParents = this._parentOrParents;
+        this._parentOrParents = null;
+        this.unsubscribe();
+        this.closed = false;
+        this.isStopped = false;
+        this._parentOrParents = _parentOrParents;
+        return this;
+    };
+    return Subscriber;
+}(Subscription_1.Subscription));
+exports.Subscriber = Subscriber;
+var SafeSubscriber = (function (_super) {
+    __extends(SafeSubscriber, _super);
+    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
+        var _this = _super.call(this) || this;
+        _this._parentSubscriber = _parentSubscriber;
+        var next;
+        var context = _this;
+        if (isFunction_1.isFunction(observerOrNext)) {
+            next = observerOrNext;
+        }
+        else if (observerOrNext) {
+            next = observerOrNext.next;
+            error = observerOrNext.error;
+            complete = observerOrNext.complete;
+            if (observerOrNext !== Observer_1.empty) {
+                context = Object.create(observerOrNext);
+                if (isFunction_1.isFunction(context.unsubscribe)) {
+                    _this.add(context.unsubscribe.bind(context));
+                }
+                context.unsubscribe = _this.unsubscribe.bind(_this);
+            }
+        }
+        _this._context = context;
+        _this._next = next;
+        _this._error = error;
+        _this._complete = complete;
+        return _this;
     }
-}
-
-function removeNode(domNode, vNode) {
-    var parentNode = domNode.parentNode
+    SafeSubscriber.prototype.next = function (value) {
+        if (!this.isStopped && this._next) {
+            var _parentSubscriber = this._parentSubscriber;
+            if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+                this.__tryOrUnsub(this._next, value);
+            }
+            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
+                this.unsubscribe();
+            }
+        }
+    };
+    SafeSubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var _parentSubscriber = this._parentSubscriber;
+            var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling;
+            if (this._error) {
+                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+                    this.__tryOrUnsub(this._error, err);
+                    this.unsubscribe();
+                }
+                else {
+                    this.__tryOrSetError(_parentSubscriber, this._error, err);
+                    this.unsubscribe();
+                }
+            }
+            else if (!_parentSubscriber.syncErrorThrowable) {
+                this.unsubscribe();
+                if (useDeprecatedSynchronousErrorHandling) {
+                    throw err;
+                }
+                hostReportError_1.hostReportError(err);
+            }
+            else {
+                if (useDeprecatedSynchronousErrorHandling) {
+                    _parentSubscriber.syncErrorValue = err;
+                    _parentSubscriber.syncErrorThrown = true;
+                }
+                else {
+                    hostReportError_1.hostReportError(err);
+                }
+                this.unsubscribe();
+            }
+        }
+    };
+    SafeSubscriber.prototype.complete = function () {
+        var _this = this;
+        if (!this.isStopped) {
+            var _parentSubscriber = this._parentSubscriber;
+            if (this._complete) {
+                var wrappedComplete = function () { return _this._complete.call(_this._context); };
+                if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+                    this.__tryOrUnsub(wrappedComplete);
+                    this.unsubscribe();
+                }
+                else {
+                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
+                    this.unsubscribe();
+                }
+            }
+            else {
+                this.unsubscribe();
+            }
+        }
+    };
+    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
+        try {
+            fn.call(this._context, value);
+        }
+        catch (err) {
+            this.unsubscribe();
+            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+                throw err;
+            }
+            else {
+                hostReportError_1.hostReportError(err);
+            }
+        }
+    };
+    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
+        if (!config_1.config.useDeprecatedSynchronousErrorHandling) {
+            throw new Error('bad call');
+        }
+        try {
+            fn.call(this._context, value);
+        }
+        catch (err) {
+            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+                parent.syncErrorValue = err;
+                parent.syncErrorThrown = true;
+                return true;
+            }
+            else {
+                hostReportError_1.hostReportError(err);
+                return true;
+            }
+        }
+        return false;
+    };
+    SafeSubscriber.prototype._unsubscribe = function () {
+        var _parentSubscriber = this._parentSubscriber;
+        this._context = null;
+        this._parentSubscriber = null;
+        _parentSubscriber.unsubscribe();
+    };
+    return SafeSubscriber;
+}(Subscriber));
+exports.SafeSubscriber = SafeSubscriber;
 
-    if (parentNode) {
-        parentNode.removeChild(domNode)
+},{"../internal/symbol/rxSubscriber":210,"./Observer":49,"./Subscription":56,"./config":57,"./util/hostReportError":218,"./util/isFunction":223}],56:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("./util/isArray");
+var isObject_1 = require("./util/isObject");
+var isFunction_1 = require("./util/isFunction");
+var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
+var Subscription = (function () {
+    function Subscription(unsubscribe) {
+        this.closed = false;
+        this._parentOrParents = null;
+        this._subscriptions = null;
+        if (unsubscribe) {
+            this._unsubscribe = unsubscribe;
+        }
     }
-
-    destroyWidget(domNode, vNode);
-
-    return null
+    Subscription.prototype.unsubscribe = function () {
+        var errors;
+        if (this.closed) {
+            return;
+        }
+        var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
+        this.closed = true;
+        this._parentOrParents = null;
+        this._subscriptions = null;
+        if (_parentOrParents instanceof Subscription) {
+            _parentOrParents.remove(this);
+        }
+        else if (_parentOrParents !== null) {
+            for (var index = 0; index < _parentOrParents.length; ++index) {
+                var parent_1 = _parentOrParents[index];
+                parent_1.remove(this);
+            }
+        }
+        if (isFunction_1.isFunction(_unsubscribe)) {
+            try {
+                _unsubscribe.call(this);
+            }
+            catch (e) {
+                errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
+            }
+        }
+        if (isArray_1.isArray(_subscriptions)) {
+            var index = -1;
+            var len = _subscriptions.length;
+            while (++index < len) {
+                var sub = _subscriptions[index];
+                if (isObject_1.isObject(sub)) {
+                    try {
+                        sub.unsubscribe();
+                    }
+                    catch (e) {
+                        errors = errors || [];
+                        if (e instanceof UnsubscriptionError_1.UnsubscriptionError) {
+                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
+                        }
+                        else {
+                            errors.push(e);
+                        }
+                    }
+                }
+            }
+        }
+        if (errors) {
+            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
+        }
+    };
+    Subscription.prototype.add = function (teardown) {
+        var subscription = teardown;
+        if (!teardown) {
+            return Subscription.EMPTY;
+        }
+        switch (typeof teardown) {
+            case 'function':
+                subscription = new Subscription(teardown);
+            case 'object':
+                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
+                    return subscription;
+                }
+                else if (this.closed) {
+                    subscription.unsubscribe();
+                    return subscription;
+                }
+                else if (!(subscription instanceof Subscription)) {
+                    var tmp = subscription;
+                    subscription = new Subscription();
+                    subscription._subscriptions = [tmp];
+                }
+                break;
+            default: {
+                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
+            }
+        }
+        var _parentOrParents = subscription._parentOrParents;
+        if (_parentOrParents === null) {
+            subscription._parentOrParents = this;
+        }
+        else if (_parentOrParents instanceof Subscription) {
+            if (_parentOrParents === this) {
+                return subscription;
+            }
+            subscription._parentOrParents = [_parentOrParents, this];
+        }
+        else if (_parentOrParents.indexOf(this) === -1) {
+            _parentOrParents.push(this);
+        }
+        else {
+            return subscription;
+        }
+        var subscriptions = this._subscriptions;
+        if (subscriptions === null) {
+            this._subscriptions = [subscription];
+        }
+        else {
+            subscriptions.push(subscription);
+        }
+        return subscription;
+    };
+    Subscription.prototype.remove = function (subscription) {
+        var subscriptions = this._subscriptions;
+        if (subscriptions) {
+            var subscriptionIndex = subscriptions.indexOf(subscription);
+            if (subscriptionIndex !== -1) {
+                subscriptions.splice(subscriptionIndex, 1);
+            }
+        }
+    };
+    Subscription.EMPTY = (function (empty) {
+        empty.closed = true;
+        return empty;
+    }(new Subscription()));
+    return Subscription;
+}());
+exports.Subscription = Subscription;
+function flattenUnsubscriptionErrors(errors) {
+    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
 }
 
-function insertNode(parentNode, vNode, renderOptions) {
-    var newNode = renderOptions.render(vNode, renderOptions)
+},{"./util/UnsubscriptionError":216,"./util/isArray":220,"./util/isFunction":223,"./util/isObject":227}],57:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var _enable_super_gross_mode_that_will_cause_bad_things = false;
+exports.config = {
+    Promise: undefined,
+    set useDeprecatedSynchronousErrorHandling(value) {
+        if (value) {
+            var error = new Error();
+            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
+        }
+        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
+            console.log('RxJS: Back to a better error behavior. Thank you. <3');
+        }
+        _enable_super_gross_mode_that_will_cause_bad_things = value;
+    },
+    get useDeprecatedSynchronousErrorHandling() {
+        return _enable_super_gross_mode_that_will_cause_bad_things;
+    },
+};
 
-    if (parentNode) {
-        parentNode.appendChild(newNode)
+},{}],58:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var Observable_1 = require("../Observable");
+var Subscriber_1 = require("../Subscriber");
+var Subscription_1 = require("../Subscription");
+var refCount_1 = require("../operators/refCount");
+var ConnectableObservable = (function (_super) {
+    __extends(ConnectableObservable, _super);
+    function ConnectableObservable(source, subjectFactory) {
+        var _this = _super.call(this) || this;
+        _this.source = source;
+        _this.subjectFactory = subjectFactory;
+        _this._refCount = 0;
+        _this._isComplete = false;
+        return _this;
     }
-
-    return parentNode
-}
-
-function stringPatch(domNode, leftVNode, vText, renderOptions) {
-    var newNode
-
-    if (domNode.nodeType === 3) {
-        domNode.replaceData(0, domNode.length, vText.text)
-        newNode = domNode
-    } else {
-        var parentNode = domNode.parentNode
-        newNode = renderOptions.render(vText, renderOptions)
-
-        if (parentNode && newNode !== domNode) {
-            parentNode.replaceChild(newNode, domNode)
+    ConnectableObservable.prototype._subscribe = function (subscriber) {
+        return this.getSubject().subscribe(subscriber);
+    };
+    ConnectableObservable.prototype.getSubject = function () {
+        var subject = this._subject;
+        if (!subject || subject.isStopped) {
+            this._subject = this.subjectFactory();
         }
+        return this._subject;
+    };
+    ConnectableObservable.prototype.connect = function () {
+        var connection = this._connection;
+        if (!connection) {
+            this._isComplete = false;
+            connection = this._connection = new Subscription_1.Subscription();
+            connection.add(this.source
+                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
+            if (connection.closed) {
+                this._connection = null;
+                connection = Subscription_1.Subscription.EMPTY;
+            }
+        }
+        return connection;
+    };
+    ConnectableObservable.prototype.refCount = function () {
+        return refCount_1.refCount()(this);
+    };
+    return ConnectableObservable;
+}(Observable_1.Observable));
+exports.ConnectableObservable = ConnectableObservable;
+exports.connectableObservableDescriptor = (function () {
+    var connectableProto = ConnectableObservable.prototype;
+    return {
+        operator: { value: null },
+        _refCount: { value: 0, writable: true },
+        _subject: { value: null, writable: true },
+        _connection: { value: null, writable: true },
+        _subscribe: { value: connectableProto._subscribe },
+        _isComplete: { value: connectableProto._isComplete, writable: true },
+        getSubject: { value: connectableProto.getSubject },
+        connect: { value: connectableProto.connect },
+        refCount: { value: connectableProto.refCount }
+    };
+})();
+var ConnectableSubscriber = (function (_super) {
+    __extends(ConnectableSubscriber, _super);
+    function ConnectableSubscriber(destination, connectable) {
+        var _this = _super.call(this, destination) || this;
+        _this.connectable = connectable;
+        return _this;
     }
-
-    return newNode
-}
-
-function widgetPatch(domNode, leftVNode, widget, renderOptions) {
-    var updating = updateWidget(leftVNode, widget)
-    var newNode
-
-    if (updating) {
-        newNode = widget.update(leftVNode, domNode) || domNode
-    } else {
-        newNode = renderOptions.render(widget, renderOptions)
-    }
-
-    var parentNode = domNode.parentNode
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    if (!updating) {
-        destroyWidget(domNode, leftVNode)
+    ConnectableSubscriber.prototype._error = function (err) {
+        this._unsubscribe();
+        _super.prototype._error.call(this, err);
+    };
+    ConnectableSubscriber.prototype._complete = function () {
+        this.connectable._isComplete = true;
+        this._unsubscribe();
+        _super.prototype._complete.call(this);
+    };
+    ConnectableSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (connectable) {
+            this.connectable = null;
+            var connection = connectable._connection;
+            connectable._refCount = 0;
+            connectable._subject = null;
+            connectable._connection = null;
+            if (connection) {
+                connection.unsubscribe();
+            }
+        }
+    };
+    return ConnectableSubscriber;
+}(Subject_1.SubjectSubscriber));
+var RefCountOperator = (function () {
+    function RefCountOperator(connectable) {
+        this.connectable = connectable;
     }
-
-    return newNode
-}
-
-function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
-    var parentNode = domNode.parentNode
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
+    RefCountOperator.prototype.call = function (subscriber, source) {
+        var connectable = this.connectable;
+        connectable._refCount++;
+        var refCounter = new RefCountSubscriber(subscriber, connectable);
+        var subscription = source.subscribe(refCounter);
+        if (!refCounter.closed) {
+            refCounter.connection = connectable.connect();
+        }
+        return subscription;
+    };
+    return RefCountOperator;
+}());
+var RefCountSubscriber = (function (_super) {
+    __extends(RefCountSubscriber, _super);
+    function RefCountSubscriber(destination, connectable) {
+        var _this = _super.call(this, destination) || this;
+        _this.connectable = connectable;
+        return _this;
     }
+    RefCountSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (!connectable) {
+            this.connection = null;
+            return;
+        }
+        this.connectable = null;
+        var refCount = connectable._refCount;
+        if (refCount <= 0) {
+            this.connection = null;
+            return;
+        }
+        connectable._refCount = refCount - 1;
+        if (refCount > 1) {
+            this.connection = null;
+            return;
+        }
+        var connection = this.connection;
+        var sharedConnection = connectable._connection;
+        this.connection = null;
+        if (sharedConnection && (!connection || sharedConnection === connection)) {
+            sharedConnection.unsubscribe();
+        }
+    };
+    return RefCountSubscriber;
+}(Subscriber_1.Subscriber));
 
-    return newNode
-}
+},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56,"../operators/refCount":147}],59:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var asap_1 = require("../scheduler/asap");
+var isNumeric_1 = require("../util/isNumeric");
+var SubscribeOnObservable = (function (_super) {
+    __extends(SubscribeOnObservable, _super);
+    function SubscribeOnObservable(source, delayTime, scheduler) {
+        if (delayTime === void 0) { delayTime = 0; }
+        if (scheduler === void 0) { scheduler = asap_1.asap; }
+        var _this = _super.call(this) || this;
+        _this.source = source;
+        _this.delayTime = delayTime;
+        _this.scheduler = scheduler;
+        if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {
+            _this.delayTime = 0;
+        }
+        if (!scheduler || typeof scheduler.schedule !== 'function') {
+            _this.scheduler = asap_1.asap;
+        }
+        return _this;
+    }
+    SubscribeOnObservable.create = function (source, delay, scheduler) {
+        if (delay === void 0) { delay = 0; }
+        if (scheduler === void 0) { scheduler = asap_1.asap; }
+        return new SubscribeOnObservable(source, delay, scheduler);
+    };
+    SubscribeOnObservable.dispatch = function (arg) {
+        var source = arg.source, subscriber = arg.subscriber;
+        return this.add(source.subscribe(subscriber));
+    };
+    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
+        var delay = this.delayTime;
+        var source = this.source;
+        var scheduler = this.scheduler;
+        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
+            source: source, subscriber: subscriber
+        });
+    };
+    return SubscribeOnObservable;
+}(Observable_1.Observable));
+exports.SubscribeOnObservable = SubscribeOnObservable;
 
-function destroyWidget(domNode, w) {
-    if (typeof w.destroy === "function" && isWidget(w)) {
-        w.destroy(domNode)
+},{"../Observable":48,"../scheduler/asap":205,"../util/isNumeric":226}],60:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var AsyncSubject_1 = require("../AsyncSubject");
+var map_1 = require("../operators/map");
+var canReportError_1 = require("../util/canReportError");
+var isArray_1 = require("../util/isArray");
+var isScheduler_1 = require("../util/isScheduler");
+function bindCallback(callbackFunc, resultSelector, scheduler) {
+    if (resultSelector) {
+        if (isScheduler_1.isScheduler(resultSelector)) {
+            scheduler = resultSelector;
+        }
+        else {
+            return function () {
+                var args = [];
+                for (var _i = 0; _i < arguments.length; _i++) {
+                    args[_i] = arguments[_i];
+                }
+                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+            };
+        }
     }
+    return function () {
+        var args = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            args[_i] = arguments[_i];
+        }
+        var context = this;
+        var subject;
+        var params = {
+            context: context,
+            subject: subject,
+            callbackFunc: callbackFunc,
+            scheduler: scheduler,
+        };
+        return new Observable_1.Observable(function (subscriber) {
+            if (!scheduler) {
+                if (!subject) {
+                    subject = new AsyncSubject_1.AsyncSubject();
+                    var handler = function () {
+                        var innerArgs = [];
+                        for (var _i = 0; _i < arguments.length; _i++) {
+                            innerArgs[_i] = arguments[_i];
+                        }
+                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
+                        subject.complete();
+                    };
+                    try {
+                        callbackFunc.apply(context, args.concat([handler]));
+                    }
+                    catch (err) {
+                        if (canReportError_1.canReportError(subject)) {
+                            subject.error(err);
+                        }
+                        else {
+                            console.warn(err);
+                        }
+                    }
+                }
+                return subject.subscribe(subscriber);
+            }
+            else {
+                var state = {
+                    args: args, subscriber: subscriber, params: params,
+                };
+                return scheduler.schedule(dispatch, 0, state);
+            }
+        });
+    };
 }
-
-function reorderChildren(domNode, moves) {
-    var childNodes = domNode.childNodes
-    var keyMap = {}
-    var node
-    var remove
-    var insert
-
-    for (var i = 0; i < moves.removes.length; i++) {
-        remove = moves.removes[i]
-        node = childNodes[remove.from]
-        if (remove.key) {
-            keyMap[remove.key] = node
+exports.bindCallback = bindCallback;
+function dispatch(state) {
+    var _this = this;
+    var self = this;
+    var args = state.args, subscriber = state.subscriber, params = state.params;
+    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
+    var subject = params.subject;
+    if (!subject) {
+        subject = params.subject = new AsyncSubject_1.AsyncSubject();
+        var handler = function () {
+            var innerArgs = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                innerArgs[_i] = arguments[_i];
+            }
+            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
+            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
+        };
+        try {
+            callbackFunc.apply(context, args.concat([handler]));
+        }
+        catch (err) {
+            subject.error(err);
         }
-        domNode.removeChild(node)
-    }
-
-    var length = childNodes.length
-    for (var j = 0; j < moves.inserts.length; j++) {
-        insert = moves.inserts[j]
-        node = keyMap[insert.key]
-        // this is the weirdest bug i've ever seen in webkit
-        domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to])
     }
+    this.add(subject.subscribe(subscriber));
 }
-
-function replaceRoot(oldRoot, newRoot) {
-    if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) {
-        oldRoot.parentNode.replaceChild(newRoot, oldRoot)
-    }
-
-    return newRoot;
+function dispatchNext(state) {
+    var value = state.value, subject = state.subject;
+    subject.next(value);
+    subject.complete();
 }
-
-},{"../vnode/is-widget.js":180,"../vnode/vpatch.js":183,"./apply-properties":165,"./update-widget":170}],169:[function(require,module,exports){
-var document = require("global/document")
-var isArray = require("x-is-array")
-
-var render = require("./create-element")
-var domIndex = require("./dom-index")
-var patchOp = require("./patch-op")
-module.exports = patch
-
-function patch(rootNode, patches, renderOptions) {
-    renderOptions = renderOptions || {}
-    renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
-        ? renderOptions.patch
-        : patchRecursive
-    renderOptions.render = renderOptions.render || render
-
-    return renderOptions.patch(rootNode, patches, renderOptions)
+function dispatchError(state) {
+    var err = state.err, subject = state.subject;
+    subject.error(err);
 }
 
-function patchRecursive(rootNode, patches, renderOptions) {
-    var indices = patchIndices(patches)
-
-    if (indices.length === 0) {
-        return rootNode
+},{"../AsyncSubject":44,"../Observable":48,"../operators/map":125,"../util/canReportError":217,"../util/isArray":220,"../util/isScheduler":230}],61:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var AsyncSubject_1 = require("../AsyncSubject");
+var map_1 = require("../operators/map");
+var canReportError_1 = require("../util/canReportError");
+var isScheduler_1 = require("../util/isScheduler");
+var isArray_1 = require("../util/isArray");
+function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
+    if (resultSelector) {
+        if (isScheduler_1.isScheduler(resultSelector)) {
+            scheduler = resultSelector;
+        }
+        else {
+            return function () {
+                var args = [];
+                for (var _i = 0; _i < arguments.length; _i++) {
+                    args[_i] = arguments[_i];
+                }
+                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+            };
+        }
     }
-
-    var index = domIndex(rootNode, patches.a, indices)
-    var ownerDocument = rootNode.ownerDocument
-
-    if (!renderOptions.document && ownerDocument !== document) {
-        renderOptions.document = ownerDocument
+    return function () {
+        var args = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            args[_i] = arguments[_i];
+        }
+        var params = {
+            subject: undefined,
+            args: args,
+            callbackFunc: callbackFunc,
+            scheduler: scheduler,
+            context: this,
+        };
+        return new Observable_1.Observable(function (subscriber) {
+            var context = params.context;
+            var subject = params.subject;
+            if (!scheduler) {
+                if (!subject) {
+                    subject = params.subject = new AsyncSubject_1.AsyncSubject();
+                    var handler = function () {
+                        var innerArgs = [];
+                        for (var _i = 0; _i < arguments.length; _i++) {
+                            innerArgs[_i] = arguments[_i];
+                        }
+                        var err = innerArgs.shift();
+                        if (err) {
+                            subject.error(err);
+                            return;
+                        }
+                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
+                        subject.complete();
+                    };
+                    try {
+                        callbackFunc.apply(context, args.concat([handler]));
+                    }
+                    catch (err) {
+                        if (canReportError_1.canReportError(subject)) {
+                            subject.error(err);
+                        }
+                        else {
+                            console.warn(err);
+                        }
+                    }
+                }
+                return subject.subscribe(subscriber);
+            }
+            else {
+                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
+            }
+        });
+    };
+}
+exports.bindNodeCallback = bindNodeCallback;
+function dispatch(state) {
+    var _this = this;
+    var params = state.params, subscriber = state.subscriber, context = state.context;
+    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
+    var subject = params.subject;
+    if (!subject) {
+        subject = params.subject = new AsyncSubject_1.AsyncSubject();
+        var handler = function () {
+            var innerArgs = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                innerArgs[_i] = arguments[_i];
+            }
+            var err = innerArgs.shift();
+            if (err) {
+                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
+            }
+            else {
+                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
+                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
+            }
+        };
+        try {
+            callbackFunc.apply(context, args.concat([handler]));
+        }
+        catch (err) {
+            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
+        }
     }
+    this.add(subject.subscribe(subscriber));
+}
+function dispatchNext(arg) {
+    var value = arg.value, subject = arg.subject;
+    subject.next(value);
+    subject.complete();
+}
+function dispatchError(arg) {
+    var err = arg.err, subject = arg.subject;
+    subject.error(err);
+}
 
-    for (var i = 0; i < indices.length; i++) {
-        var nodeIndex = indices[i]
-        rootNode = applyPatch(rootNode,
-            index[nodeIndex],
-            patches[nodeIndex],
-            renderOptions)
+},{"../AsyncSubject":44,"../Observable":48,"../operators/map":125,"../util/canReportError":217,"../util/isArray":220,"../util/isScheduler":230}],62:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var isScheduler_1 = require("../util/isScheduler");
+var isArray_1 = require("../util/isArray");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var fromArray_1 = require("./fromArray");
+var NONE = {};
+function combineLatest() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
     }
-
-    return rootNode
+    var resultSelector = null;
+    var scheduler = null;
+    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
+        scheduler = observables.pop();
+    }
+    if (typeof observables[observables.length - 1] === 'function') {
+        resultSelector = observables.pop();
+    }
+    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
+        observables = observables[0];
+    }
+    return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
 }
-
-function applyPatch(rootNode, domNode, patchList, renderOptions) {
-    if (!domNode) {
-        return rootNode
+exports.combineLatest = combineLatest;
+var CombineLatestOperator = (function () {
+    function CombineLatestOperator(resultSelector) {
+        this.resultSelector = resultSelector;
     }
-
-    var newNode
-
-    if (isArray(patchList)) {
-        for (var i = 0; i < patchList.length; i++) {
-            newNode = patchOp(patchList[i], domNode, renderOptions)
-
-            if (domNode === rootNode) {
-                rootNode = newNode
+    CombineLatestOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
+    };
+    return CombineLatestOperator;
+}());
+exports.CombineLatestOperator = CombineLatestOperator;
+var CombineLatestSubscriber = (function (_super) {
+    __extends(CombineLatestSubscriber, _super);
+    function CombineLatestSubscriber(destination, resultSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.resultSelector = resultSelector;
+        _this.active = 0;
+        _this.values = [];
+        _this.observables = [];
+        return _this;
+    }
+    CombineLatestSubscriber.prototype._next = function (observable) {
+        this.values.push(NONE);
+        this.observables.push(observable);
+    };
+    CombineLatestSubscriber.prototype._complete = function () {
+        var observables = this.observables;
+        var len = observables.length;
+        if (len === 0) {
+            this.destination.complete();
+        }
+        else {
+            this.active = len;
+            this.toRespond = len;
+            for (var i = 0; i < len; i++) {
+                var observable = observables[i];
+                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
             }
         }
-    } else {
-        newNode = patchOp(patchList, domNode, renderOptions)
-
-        if (domNode === rootNode) {
-            rootNode = newNode
+    };
+    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
+        if ((this.active -= 1) === 0) {
+            this.destination.complete();
         }
-    }
+    };
+    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var values = this.values;
+        var oldVal = values[outerIndex];
+        var toRespond = !this.toRespond
+            ? 0
+            : oldVal === NONE ? --this.toRespond : this.toRespond;
+        values[outerIndex] = innerValue;
+        if (toRespond === 0) {
+            if (this.resultSelector) {
+                this._tryResultSelector(values);
+            }
+            else {
+                this.destination.next(values.slice());
+            }
+        }
+    };
+    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
+        var result;
+        try {
+            result = this.resultSelector.apply(this, values);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return CombineLatestSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.CombineLatestSubscriber = CombineLatestSubscriber;
 
-    return rootNode
+},{"../OuterSubscriber":50,"../util/isArray":220,"../util/isScheduler":230,"../util/subscribeToResult":239,"./fromArray":68}],63:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var of_1 = require("./of");
+var concatAll_1 = require("../operators/concatAll");
+function concat() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
 }
+exports.concat = concat;
 
-function patchIndices(patches) {
-    var indices = []
-
-    for (var key in patches) {
-        if (key !== "a") {
-            indices.push(Number(key))
+},{"../operators/concatAll":97,"./of":76}],64:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var from_1 = require("./from");
+var empty_1 = require("./empty");
+function defer(observableFactory) {
+    return new Observable_1.Observable(function (subscriber) {
+        var input;
+        try {
+            input = observableFactory();
         }
-    }
-
-    return indices
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        var source = input ? from_1.from(input) : empty_1.empty();
+        return source.subscribe(subscriber);
+    });
 }
+exports.defer = defer;
 
-},{"./create-element":166,"./dom-index":167,"./patch-op":168,"global/document":14,"x-is-array":205}],170:[function(require,module,exports){
-var isWidget = require("../vnode/is-widget.js")
-
-module.exports = updateWidget
+},{"../Observable":48,"./empty":65,"./from":67}],65:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
+function empty(scheduler) {
+    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
+}
+exports.empty = empty;
+function emptyScheduled(scheduler) {
+    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
+}
 
-function updateWidget(a, b) {
-    if (isWidget(a) && isWidget(b)) {
-        if ("name" in a && "name" in b) {
-            return a.id === b.id
-        } else {
-            return a.init === b.init
+},{"../Observable":48}],66:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isArray_1 = require("../util/isArray");
+var map_1 = require("../operators/map");
+var isObject_1 = require("../util/isObject");
+var from_1 = require("./from");
+function forkJoin() {
+    var sources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        sources[_i] = arguments[_i];
+    }
+    if (sources.length === 1) {
+        var first_1 = sources[0];
+        if (isArray_1.isArray(first_1)) {
+            return forkJoinInternal(first_1, null);
+        }
+        if (isObject_1.isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
+            var keys = Object.keys(first_1);
+            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
         }
     }
-
-    return false
+    if (typeof sources[sources.length - 1] === 'function') {
+        var resultSelector_1 = sources.pop();
+        sources = (sources.length === 1 && isArray_1.isArray(sources[0])) ? sources[0] : sources;
+        return forkJoinInternal(sources, null).pipe(map_1.map(function (args) { return resultSelector_1.apply(void 0, args); }));
+    }
+    return forkJoinInternal(sources, null);
+}
+exports.forkJoin = forkJoin;
+function forkJoinInternal(sources, keys) {
+    return new Observable_1.Observable(function (subscriber) {
+        var len = sources.length;
+        if (len === 0) {
+            subscriber.complete();
+            return;
+        }
+        var values = new Array(len);
+        var completed = 0;
+        var emitted = 0;
+        var _loop_1 = function (i) {
+            var source = from_1.from(sources[i]);
+            var hasValue = false;
+            subscriber.add(source.subscribe({
+                next: function (value) {
+                    if (!hasValue) {
+                        hasValue = true;
+                        emitted++;
+                    }
+                    values[i] = value;
+                },
+                error: function (err) { return subscriber.error(err); },
+                complete: function () {
+                    completed++;
+                    if (completed === len || !hasValue) {
+                        if (emitted === len) {
+                            subscriber.next(keys ?
+                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
+                                values);
+                        }
+                        subscriber.complete();
+                    }
+                }
+            }));
+        };
+        for (var i = 0; i < len; i++) {
+            _loop_1(i);
+        }
+    });
 }
 
-},{"../vnode/is-widget.js":180}],171:[function(require,module,exports){
-'use strict';
-
-var EvStore = require('ev-store');
-
-module.exports = EvHook;
-
-function EvHook(value) {
-    if (!(this instanceof EvHook)) {
-        return new EvHook(value);
+},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isObject":227,"./from":67}],67:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var subscribeTo_1 = require("../util/subscribeTo");
+var scheduled_1 = require("../scheduled/scheduled");
+function from(input, scheduler) {
+    if (!scheduler) {
+        if (input instanceof Observable_1.Observable) {
+            return input;
+        }
+        return new Observable_1.Observable(subscribeTo_1.subscribeTo(input));
+    }
+    else {
+        return scheduled_1.scheduled(input, scheduler);
     }
-
-    this.value = value;
 }
+exports.from = from;
 
-EvHook.prototype.hook = function (node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = this.value;
-};
-
-EvHook.prototype.unhook = function(node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = undefined;
-};
-
-},{"ev-store":7}],172:[function(require,module,exports){
-'use strict';
-
-module.exports = SoftSetHook;
-
-function SoftSetHook(value) {
-    if (!(this instanceof SoftSetHook)) {
-        return new SoftSetHook(value);
+},{"../Observable":48,"../scheduled/scheduled":193,"../util/subscribeTo":234}],68:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var subscribeToArray_1 = require("../util/subscribeToArray");
+var scheduleArray_1 = require("../scheduled/scheduleArray");
+function fromArray(input, scheduler) {
+    if (!scheduler) {
+        return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input));
+    }
+    else {
+        return scheduleArray_1.scheduleArray(input, scheduler);
     }
-
-    this.value = value;
 }
+exports.fromArray = fromArray;
 
-SoftSetHook.prototype.hook = function (node, propertyName) {
-    if (node[propertyName] !== this.value) {
-        node[propertyName] = this.value;
+},{"../Observable":48,"../scheduled/scheduleArray":189,"../util/subscribeToArray":235}],69:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isArray_1 = require("../util/isArray");
+var isFunction_1 = require("../util/isFunction");
+var map_1 = require("../operators/map");
+var toString = (function () { return Object.prototype.toString; })();
+function fromEvent(target, eventName, options, resultSelector) {
+    if (isFunction_1.isFunction(options)) {
+        resultSelector = options;
+        options = undefined;
+    }
+    if (resultSelector) {
+        return fromEvent(target, eventName, options).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        function handler(e) {
+            if (arguments.length > 1) {
+                subscriber.next(Array.prototype.slice.call(arguments));
+            }
+            else {
+                subscriber.next(e);
+            }
+        }
+        setupSubscription(target, eventName, handler, subscriber, options);
+    });
+}
+exports.fromEvent = fromEvent;
+function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
+    var unsubscribe;
+    if (isEventTarget(sourceObj)) {
+        var source_1 = sourceObj;
+        sourceObj.addEventListener(eventName, handler, options);
+        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
     }
-};
-
-},{}],173:[function(require,module,exports){
-'use strict';
-
-var isArray = require('x-is-array');
-
-var VNode = require('../vnode/vnode.js');
-var VText = require('../vnode/vtext.js');
-var isVNode = require('../vnode/is-vnode');
-var isVText = require('../vnode/is-vtext');
-var isWidget = require('../vnode/is-widget');
-var isHook = require('../vnode/is-vhook');
-var isVThunk = require('../vnode/is-thunk');
-
-var parseTag = require('./parse-tag.js');
-var softSetHook = require('./hooks/soft-set-hook.js');
-var evHook = require('./hooks/ev-hook.js');
-
-module.exports = h;
-
-function h(tagName, properties, children) {
-    var childNodes = [];
-    var tag, props, key, namespace;
-
-    if (!children && isChildren(properties)) {
-        children = properties;
-        props = {};
-    }
-
-    props = props || properties || {};
-    tag = parseTag(tagName, props);
-
-    // support keys
-    if (props.hasOwnProperty('key')) {
-        key = props.key;
-        props.key = undefined;
+    else if (isJQueryStyleEventEmitter(sourceObj)) {
+        var source_2 = sourceObj;
+        sourceObj.on(eventName, handler);
+        unsubscribe = function () { return source_2.off(eventName, handler); };
     }
-
-    // support namespace
-    if (props.hasOwnProperty('namespace')) {
-        namespace = props.namespace;
-        props.namespace = undefined;
+    else if (isNodeStyleEventEmitter(sourceObj)) {
+        var source_3 = sourceObj;
+        sourceObj.addListener(eventName, handler);
+        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
     }
-
-    // fix cursor bug
-    if (tag === 'INPUT' &&
-        !namespace &&
-        props.hasOwnProperty('value') &&
-        props.value !== undefined &&
-        !isHook(props.value)
-    ) {
-        props.value = softSetHook(props.value);
+    else if (sourceObj && sourceObj.length) {
+        for (var i = 0, len = sourceObj.length; i < len; i++) {
+            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
+        }
     }
-
-    transformProperties(props);
-
-    if (children !== undefined && children !== null) {
-        addChild(children, childNodes, tag, props);
+    else {
+        throw new TypeError('Invalid event target');
     }
-
-
-    return new VNode(tag, props, childNodes, key, namespace);
+    subscriber.add(unsubscribe);
+}
+function isNodeStyleEventEmitter(sourceObj) {
+    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
+}
+function isJQueryStyleEventEmitter(sourceObj) {
+    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
+}
+function isEventTarget(sourceObj) {
+    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
 }
 
-function addChild(c, childNodes, tag, props) {
-    if (typeof c === 'string') {
-        childNodes.push(new VText(c));
-    } else if (typeof c === 'number') {
-        childNodes.push(new VText(String(c)));
-    } else if (isChild(c)) {
-        childNodes.push(c);
-    } else if (isArray(c)) {
-        for (var i = 0; i < c.length; i++) {
-            addChild(c[i], childNodes, tag, props);
-        }
-    } else if (c === null || c === undefined) {
-        return;
-    } else {
-        throw UnexpectedVirtualElement({
-            foreignObject: c,
-            parentVnode: {
-                tagName: tag,
-                properties: props
+},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isFunction":223}],70:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isArray_1 = require("../util/isArray");
+var isFunction_1 = require("../util/isFunction");
+var map_1 = require("../operators/map");
+function fromEventPattern(addHandler, removeHandler, resultSelector) {
+    if (resultSelector) {
+        return fromEventPattern(addHandler, removeHandler).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var handler = function () {
+            var e = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                e[_i] = arguments[_i];
             }
-        });
-    }
+            return subscriber.next(e.length === 1 ? e[0] : e);
+        };
+        var retValue;
+        try {
+            retValue = addHandler(handler);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        if (!isFunction_1.isFunction(removeHandler)) {
+            return undefined;
+        }
+        return function () { return removeHandler(handler, retValue); };
+    });
 }
+exports.fromEventPattern = fromEventPattern;
 
-function transformProperties(props) {
-    for (var propName in props) {
-        if (props.hasOwnProperty(propName)) {
-            var value = props[propName];
-
-            if (isHook(value)) {
-                continue;
+},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isFunction":223}],71:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var identity_1 = require("../util/identity");
+var isScheduler_1 = require("../util/isScheduler");
+function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
+    var resultSelector;
+    var initialState;
+    if (arguments.length == 1) {
+        var options = initialStateOrOptions;
+        initialState = options.initialState;
+        condition = options.condition;
+        iterate = options.iterate;
+        resultSelector = options.resultSelector || identity_1.identity;
+        scheduler = options.scheduler;
+    }
+    else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
+        initialState = initialStateOrOptions;
+        resultSelector = identity_1.identity;
+        scheduler = resultSelectorOrObservable;
+    }
+    else {
+        initialState = initialStateOrOptions;
+        resultSelector = resultSelectorOrObservable;
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var state = initialState;
+        if (scheduler) {
+            return scheduler.schedule(dispatch, 0, {
+                subscriber: subscriber,
+                iterate: iterate,
+                condition: condition,
+                resultSelector: resultSelector,
+                state: state
+            });
+        }
+        do {
+            if (condition) {
+                var conditionResult = void 0;
+                try {
+                    conditionResult = condition(state);
+                }
+                catch (err) {
+                    subscriber.error(err);
+                    return undefined;
+                }
+                if (!conditionResult) {
+                    subscriber.complete();
+                    break;
+                }
             }
-
-            if (propName.substr(0, 3) === 'ev-') {
-                // add ev-foo support
-                props[propName] = evHook(value);
+            var value = void 0;
+            try {
+                value = resultSelector(state);
+            }
+            catch (err) {
+                subscriber.error(err);
+                return undefined;
+            }
+            subscriber.next(value);
+            if (subscriber.closed) {
+                break;
+            }
+            try {
+                state = iterate(state);
             }
+            catch (err) {
+                subscriber.error(err);
+                return undefined;
+            }
+        } while (true);
+        return undefined;
+    });
+}
+exports.generate = generate;
+function dispatch(state) {
+    var subscriber = state.subscriber, condition = state.condition;
+    if (subscriber.closed) {
+        return undefined;
+    }
+    if (state.needIterate) {
+        try {
+            state.state = state.iterate(state.state);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+    }
+    else {
+        state.needIterate = true;
+    }
+    if (condition) {
+        var conditionResult = void 0;
+        try {
+            conditionResult = condition(state.state);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        if (!conditionResult) {
+            subscriber.complete();
+            return undefined;
+        }
+        if (subscriber.closed) {
+            return undefined;
         }
     }
+    var value;
+    try {
+        value = state.resultSelector(state.state);
+    }
+    catch (err) {
+        subscriber.error(err);
+        return undefined;
+    }
+    if (subscriber.closed) {
+        return undefined;
+    }
+    subscriber.next(value);
+    if (subscriber.closed) {
+        return undefined;
+    }
+    return this.schedule(state);
 }
 
-function isChild(x) {
-    return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x);
+},{"../Observable":48,"../util/identity":219,"../util/isScheduler":230}],72:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var defer_1 = require("./defer");
+var empty_1 = require("./empty");
+function iif(condition, trueResult, falseResult) {
+    if (trueResult === void 0) { trueResult = empty_1.EMPTY; }
+    if (falseResult === void 0) { falseResult = empty_1.EMPTY; }
+    return defer_1.defer(function () { return condition() ? trueResult : falseResult; });
 }
+exports.iif = iif;
 
-function isChildren(x) {
-    return typeof x === 'string' || isArray(x) || isChild(x);
+},{"./defer":64,"./empty":65}],73:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var async_1 = require("../scheduler/async");
+var isNumeric_1 = require("../util/isNumeric");
+function interval(period, scheduler) {
+    if (period === void 0) { period = 0; }
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    if (!isNumeric_1.isNumeric(period) || period < 0) {
+        period = 0;
+    }
+    if (!scheduler || typeof scheduler.schedule !== 'function') {
+        scheduler = async_1.async;
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
+        return subscriber;
+    });
 }
-
-function UnexpectedVirtualElement(data) {
-    var err = new Error();
-
-    err.type = 'virtual-hyperscript.unexpected.virtual-element';
-    err.message = 'Unexpected virtual child passed to h().\n' +
-        'Expected a VNode / Vthunk / VWidget / string but:\n' +
-        'got:\n' +
-        errorString(data.foreignObject) +
-        '.\n' +
-        'The parent vnode is:\n' +
-        errorString(data.parentVnode)
-        '\n' +
-        'Suggested fix: change your `h(..., [ ... ])` callsite.';
-    err.foreignObject = data.foreignObject;
-    err.parentVnode = data.parentVnode;
-
-    return err;
+exports.interval = interval;
+function dispatch(state) {
+    var subscriber = state.subscriber, counter = state.counter, period = state.period;
+    subscriber.next(counter);
+    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
 }
 
-function errorString(obj) {
-    try {
-        return JSON.stringify(obj, null, '    ');
-    } catch (e) {
-        return String(obj);
+},{"../Observable":48,"../scheduler/async":206,"../util/isNumeric":226}],74:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isScheduler_1 = require("../util/isScheduler");
+var mergeAll_1 = require("../operators/mergeAll");
+var fromArray_1 = require("./fromArray");
+function merge() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    var concurrent = Number.POSITIVE_INFINITY;
+    var scheduler = null;
+    var last = observables[observables.length - 1];
+    if (isScheduler_1.isScheduler(last)) {
+        scheduler = observables.pop();
+        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
+            concurrent = observables.pop();
+        }
+    }
+    else if (typeof last === 'number') {
+        concurrent = observables.pop();
     }
+    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
+        return observables[0];
+    }
+    return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler));
 }
+exports.merge = merge;
 
-},{"../vnode/is-thunk":176,"../vnode/is-vhook":177,"../vnode/is-vnode":178,"../vnode/is-vtext":179,"../vnode/is-widget":180,"../vnode/vnode.js":182,"../vnode/vtext.js":184,"./hooks/ev-hook.js":171,"./hooks/soft-set-hook.js":172,"./parse-tag.js":174,"x-is-array":205}],174:[function(require,module,exports){
-'use strict';
-
-var split = require('browser-split');
-
-var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
-var notClassId = /^\.|#/;
-
-module.exports = parseTag;
+},{"../Observable":48,"../operators/mergeAll":130,"../util/isScheduler":230,"./fromArray":68}],75:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var noop_1 = require("../util/noop");
+exports.NEVER = new Observable_1.Observable(noop_1.noop);
+function never() {
+    return exports.NEVER;
+}
+exports.never = never;
 
-function parseTag(tag, props) {
-    if (!tag) {
-        return 'DIV';
+},{"../Observable":48,"../util/noop":231}],76:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isScheduler_1 = require("../util/isScheduler");
+var fromArray_1 = require("./fromArray");
+var scheduleArray_1 = require("../scheduled/scheduleArray");
+function of() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        args[_i] = arguments[_i];
     }
-
-    var noId = !(props.hasOwnProperty('id'));
-
-    var tagParts = split(tag, classIdSplit);
-    var tagName = null;
-
-    if (notClassId.test(tagParts[1])) {
-        tagName = 'DIV';
+    var scheduler = args[args.length - 1];
+    if (isScheduler_1.isScheduler(scheduler)) {
+        args.pop();
+        return scheduleArray_1.scheduleArray(args, scheduler);
     }
+    else {
+        return fromArray_1.fromArray(args);
+    }
+}
+exports.of = of;
 
-    var classes, part, type, i;
-
-    for (i = 0; i < tagParts.length; i++) {
-        part = tagParts[i];
+},{"../scheduled/scheduleArray":189,"../util/isScheduler":230,"./fromArray":68}],77:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var from_1 = require("./from");
+var isArray_1 = require("../util/isArray");
+var empty_1 = require("./empty");
+function onErrorResumeNext() {
+    var sources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        sources[_i] = arguments[_i];
+    }
+    if (sources.length === 0) {
+        return empty_1.EMPTY;
+    }
+    var first = sources[0], remainder = sources.slice(1);
+    if (sources.length === 1 && isArray_1.isArray(first)) {
+        return onErrorResumeNext.apply(void 0, first);
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
+        return from_1.from(first).subscribe({
+            next: function (value) { subscriber.next(value); },
+            error: subNext,
+            complete: subNext,
+        });
+    });
+}
+exports.onErrorResumeNext = onErrorResumeNext;
 
-        if (!part) {
-            continue;
+},{"../Observable":48,"../util/isArray":220,"./empty":65,"./from":67}],78:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+function pairs(obj, scheduler) {
+    if (!scheduler) {
+        return new Observable_1.Observable(function (subscriber) {
+            var keys = Object.keys(obj);
+            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
+                var key = keys[i];
+                if (obj.hasOwnProperty(key)) {
+                    subscriber.next([key, obj[key]]);
+                }
+            }
+            subscriber.complete();
+        });
+    }
+    else {
+        return new Observable_1.Observable(function (subscriber) {
+            var keys = Object.keys(obj);
+            var subscription = new Subscription_1.Subscription();
+            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
+            return subscription;
+        });
+    }
+}
+exports.pairs = pairs;
+function dispatch(state) {
+    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
+    if (!subscriber.closed) {
+        if (index < keys.length) {
+            var key = keys[index];
+            subscriber.next([key, obj[key]]);
+            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
         }
-
-        type = part.charAt(0);
-
-        if (!tagName) {
-            tagName = part;
-        } else if (type === '.') {
-            classes = classes || [];
-            classes.push(part.substring(1, part.length));
-        } else if (type === '#' && noId) {
-            props.id = part.substring(1, part.length);
+        else {
+            subscriber.complete();
         }
     }
+}
+exports.dispatch = dispatch;
 
-    if (classes) {
-        if (props.className) {
-            classes.push(props.className);
+},{"../Observable":48,"../Subscription":56}],79:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var not_1 = require("../util/not");
+var subscribeTo_1 = require("../util/subscribeTo");
+var filter_1 = require("../operators/filter");
+var Observable_1 = require("../Observable");
+function partition(source, predicate, thisArg) {
+    return [
+        filter_1.filter(predicate, thisArg)(new Observable_1.Observable(subscribeTo_1.subscribeTo(source))),
+        filter_1.filter(not_1.not(predicate, thisArg))(new Observable_1.Observable(subscribeTo_1.subscribeTo(source)))
+    ];
+}
+exports.partition = partition;
+
+},{"../Observable":48,"../operators/filter":116,"../util/not":232,"../util/subscribeTo":234}],80:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("../util/isArray");
+var fromArray_1 = require("./fromArray");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function race() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    if (observables.length === 1) {
+        if (isArray_1.isArray(observables[0])) {
+            observables = observables[0];
+        }
+        else {
+            return observables[0];
         }
-
-        props.className = classes.join(' ');
     }
-
-    return props.namespace ? tagName : tagName.toUpperCase();
+    return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator());
 }
-
-},{"browser-split":3}],175:[function(require,module,exports){
-var isVNode = require("./is-vnode")
-var isVText = require("./is-vtext")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-
-module.exports = handleThunk
-
-function handleThunk(a, b) {
-    var renderedA = a
-    var renderedB = b
-
-    if (isThunk(b)) {
-        renderedB = renderThunk(b, a)
+exports.race = race;
+var RaceOperator = (function () {
+    function RaceOperator() {
     }
+    RaceOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RaceSubscriber(subscriber));
+    };
+    return RaceOperator;
+}());
+exports.RaceOperator = RaceOperator;
+var RaceSubscriber = (function (_super) {
+    __extends(RaceSubscriber, _super);
+    function RaceSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasFirst = false;
+        _this.observables = [];
+        _this.subscriptions = [];
+        return _this;
+    }
+    RaceSubscriber.prototype._next = function (observable) {
+        this.observables.push(observable);
+    };
+    RaceSubscriber.prototype._complete = function () {
+        var observables = this.observables;
+        var len = observables.length;
+        if (len === 0) {
+            this.destination.complete();
+        }
+        else {
+            for (var i = 0; i < len && !this.hasFirst; i++) {
+                var observable = observables[i];
+                var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);
+                if (this.subscriptions) {
+                    this.subscriptions.push(subscription);
+                }
+                this.add(subscription);
+            }
+            this.observables = null;
+        }
+    };
+    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        if (!this.hasFirst) {
+            this.hasFirst = true;
+            for (var i = 0; i < this.subscriptions.length; i++) {
+                if (i !== outerIndex) {
+                    var subscription = this.subscriptions[i];
+                    subscription.unsubscribe();
+                    this.remove(subscription);
+                }
+            }
+            this.subscriptions = null;
+        }
+        this.destination.next(innerValue);
+    };
+    return RaceSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.RaceSubscriber = RaceSubscriber;
 
-    if (isThunk(a)) {
-        renderedA = renderThunk(a, null)
+},{"../OuterSubscriber":50,"../util/isArray":220,"../util/subscribeToResult":239,"./fromArray":68}],81:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+function range(start, count, scheduler) {
+    if (start === void 0) { start = 0; }
+    return new Observable_1.Observable(function (subscriber) {
+        if (count === undefined) {
+            count = start;
+            start = 0;
+        }
+        var index = 0;
+        var current = start;
+        if (scheduler) {
+            return scheduler.schedule(dispatch, 0, {
+                index: index, count: count, start: start, subscriber: subscriber
+            });
+        }
+        else {
+            do {
+                if (index++ >= count) {
+                    subscriber.complete();
+                    break;
+                }
+                subscriber.next(current++);
+                if (subscriber.closed) {
+                    break;
+                }
+            } while (true);
+        }
+        return undefined;
+    });
+}
+exports.range = range;
+function dispatch(state) {
+    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
+    if (index >= count) {
+        subscriber.complete();
+        return;
     }
-
-    return {
-        a: renderedA,
-        b: renderedB
+    subscriber.next(start);
+    if (subscriber.closed) {
+        return;
     }
+    state.index = index + 1;
+    state.start = start + 1;
+    this.schedule(state);
 }
+exports.dispatch = dispatch;
 
-function renderThunk(thunk, previous) {
-    var renderedThunk = thunk.vnode
-
-    if (!renderedThunk) {
-        renderedThunk = thunk.vnode = thunk.render(previous)
+},{"../Observable":48}],82:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+function throwError(error, scheduler) {
+    if (!scheduler) {
+        return new Observable_1.Observable(function (subscriber) { return subscriber.error(error); });
     }
-
-    if (!(isVNode(renderedThunk) ||
-            isVText(renderedThunk) ||
-            isWidget(renderedThunk))) {
-        throw new Error("thunk did not return a valid node");
+    else {
+        return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
     }
-
-    return renderedThunk
-}
-
-},{"./is-thunk":176,"./is-vnode":178,"./is-vtext":179,"./is-widget":180}],176:[function(require,module,exports){
-module.exports = isThunk
-
-function isThunk(t) {
-    return t && t.type === "Thunk"
 }
-
-},{}],177:[function(require,module,exports){
-module.exports = isHook
-
-function isHook(hook) {
-    return hook &&
-      (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") ||
-       typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
-}
-
-},{}],178:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualNode
-
-function isVirtualNode(x) {
-    return x && x.type === "VirtualNode" && x.version === version
+exports.throwError = throwError;
+function dispatch(_a) {
+    var error = _a.error, subscriber = _a.subscriber;
+    subscriber.error(error);
 }
 
-},{"./version":181}],179:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualText
-
-function isVirtualText(x) {
-    return x && x.type === "VirtualText" && x.version === version
+},{"../Observable":48}],83:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var async_1 = require("../scheduler/async");
+var isNumeric_1 = require("../util/isNumeric");
+var isScheduler_1 = require("../util/isScheduler");
+function timer(dueTime, periodOrScheduler, scheduler) {
+    if (dueTime === void 0) { dueTime = 0; }
+    var period = -1;
+    if (isNumeric_1.isNumeric(periodOrScheduler)) {
+        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
+    }
+    else if (isScheduler_1.isScheduler(periodOrScheduler)) {
+        scheduler = periodOrScheduler;
+    }
+    if (!isScheduler_1.isScheduler(scheduler)) {
+        scheduler = async_1.async;
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var due = isNumeric_1.isNumeric(dueTime)
+            ? dueTime
+            : (+dueTime - scheduler.now());
+        return scheduler.schedule(dispatch, due, {
+            index: 0, period: period, subscriber: subscriber
+        });
+    });
 }
-
-},{"./version":181}],180:[function(require,module,exports){
-module.exports = isWidget
-
-function isWidget(w) {
-    return w && w.type === "Widget"
+exports.timer = timer;
+function dispatch(state) {
+    var index = state.index, period = state.period, subscriber = state.subscriber;
+    subscriber.next(index);
+    if (subscriber.closed) {
+        return;
+    }
+    else if (period === -1) {
+        return subscriber.complete();
+    }
+    state.index = index + 1;
+    this.schedule(state, period);
 }
 
-},{}],181:[function(require,module,exports){
-module.exports = "2"
-
-},{}],182:[function(require,module,exports){
-var version = require("./version")
-var isVNode = require("./is-vnode")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-var isVHook = require("./is-vhook")
-
-module.exports = VirtualNode
-
-var noProperties = {}
-var noChildren = []
-
-function VirtualNode(tagName, properties, children, key, namespace) {
-    this.tagName = tagName
-    this.properties = properties || noProperties
-    this.children = children || noChildren
-    this.key = key != null ? String(key) : undefined
-    this.namespace = (typeof namespace === "string") ? namespace : null
-
-    var count = (children && children.length) || 0
-    var descendants = 0
-    var hasWidgets = false
-    var hasThunks = false
-    var descendantHooks = false
-    var hooks
-
-    for (var propName in properties) {
-        if (properties.hasOwnProperty(propName)) {
-            var property = properties[propName]
-            if (isVHook(property) && property.unhook) {
-                if (!hooks) {
-                    hooks = {}
-                }
-
-                hooks[propName] = property
-            }
+},{"../Observable":48,"../scheduler/async":206,"../util/isNumeric":226,"../util/isScheduler":230}],84:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var from_1 = require("./from");
+var empty_1 = require("./empty");
+function using(resourceFactory, observableFactory) {
+    return new Observable_1.Observable(function (subscriber) {
+        var resource;
+        try {
+            resource = resourceFactory();
         }
-    }
-
-    for (var i = 0; i < count; i++) {
-        var child = children[i]
-        if (isVNode(child)) {
-            descendants += child.count || 0
-
-            if (!hasWidgets && child.hasWidgets) {
-                hasWidgets = true
-            }
-
-            if (!hasThunks && child.hasThunks) {
-                hasThunks = true
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        var result;
+        try {
+            result = observableFactory(resource);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        var source = result ? from_1.from(result) : empty_1.EMPTY;
+        var subscription = source.subscribe(subscriber);
+        return function () {
+            subscription.unsubscribe();
+            if (resource) {
+                resource.unsubscribe();
             }
+        };
+    });
+}
+exports.using = using;
 
-            if (!descendantHooks && (child.hooks || child.descendantHooks)) {
-                descendantHooks = true
-            }
-        } else if (!hasWidgets && isWidget(child)) {
-            if (typeof child.destroy === "function") {
-                hasWidgets = true
-            }
-        } else if (!hasThunks && isThunk(child)) {
-            hasThunks = true;
-        }
+},{"../Observable":48,"./empty":65,"./from":67}],85:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var fromArray_1 = require("./fromArray");
+var isArray_1 = require("../util/isArray");
+var Subscriber_1 = require("../Subscriber");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var iterator_1 = require("../../internal/symbol/iterator");
+function zip() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
     }
-
-    this.count = count + descendants
-    this.hasWidgets = hasWidgets
-    this.hasThunks = hasThunks
-    this.hooks = hooks
-    this.descendantHooks = descendantHooks
+    var resultSelector = observables[observables.length - 1];
+    if (typeof resultSelector === 'function') {
+        observables.pop();
+    }
+    return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
 }
-
-VirtualNode.prototype.version = version
-VirtualNode.prototype.type = "VirtualNode"
-
-},{"./is-thunk":176,"./is-vhook":177,"./is-vnode":178,"./is-widget":180,"./version":181}],183:[function(require,module,exports){
-var version = require("./version")
-
-VirtualPatch.NONE = 0
-VirtualPatch.VTEXT = 1
-VirtualPatch.VNODE = 2
-VirtualPatch.WIDGET = 3
-VirtualPatch.PROPS = 4
-VirtualPatch.ORDER = 5
-VirtualPatch.INSERT = 6
-VirtualPatch.REMOVE = 7
-VirtualPatch.THUNK = 8
-
-module.exports = VirtualPatch
-
-function VirtualPatch(type, vNode, patch) {
-    this.type = Number(type)
-    this.vNode = vNode
-    this.patch = patch
-}
-
-VirtualPatch.prototype.version = version
-VirtualPatch.prototype.type = "VirtualPatch"
-
-},{"./version":181}],184:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = VirtualText
-
-function VirtualText(text) {
-    this.text = String(text)
-}
-
-VirtualText.prototype.version = version
-VirtualText.prototype.type = "VirtualText"
-
-},{"./version":181}],185:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook")
-
-module.exports = diffProps
-
-function diffProps(a, b) {
-    var diff
-
-    for (var aKey in a) {
-        if (!(aKey in b)) {
-            diff = diff || {}
-            diff[aKey] = undefined
+exports.zip = zip;
+var ZipOperator = (function () {
+    function ZipOperator(resultSelector) {
+        this.resultSelector = resultSelector;
+    }
+    ZipOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
+    };
+    return ZipOperator;
+}());
+exports.ZipOperator = ZipOperator;
+var ZipSubscriber = (function (_super) {
+    __extends(ZipSubscriber, _super);
+    function ZipSubscriber(destination, resultSelector, values) {
+        if (values === void 0) { values = Object.create(null); }
+        var _this = _super.call(this, destination) || this;
+        _this.iterators = [];
+        _this.active = 0;
+        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
+        _this.values = values;
+        return _this;
+    }
+    ZipSubscriber.prototype._next = function (value) {
+        var iterators = this.iterators;
+        if (isArray_1.isArray(value)) {
+            iterators.push(new StaticArrayIterator(value));
         }
-
-        var aValue = a[aKey]
-        var bValue = b[aKey]
-
-        if (aValue === bValue) {
-            continue
-        } else if (isObject(aValue) && isObject(bValue)) {
-            if (getPrototype(bValue) !== getPrototype(aValue)) {
-                diff = diff || {}
-                diff[aKey] = bValue
-            } else if (isHook(bValue)) {
-                 diff = diff || {}
-                 diff[aKey] = bValue
-            } else {
-                var objectDiff = diffProps(aValue, bValue)
-                if (objectDiff) {
-                    diff = diff || {}
-                    diff[aKey] = objectDiff
-                }
-            }
-        } else {
-            diff = diff || {}
-            diff[aKey] = bValue
+        else if (typeof value[iterator_1.iterator] === 'function') {
+            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
         }
-    }
-
-    for (var bKey in b) {
-        if (!(bKey in a)) {
-            diff = diff || {}
-            diff[bKey] = b[bKey]
+        else {
+            iterators.push(new ZipBufferIterator(this.destination, this, value));
         }
-    }
-
-    return diff
-}
-
-function getPrototype(value) {
-  if (Object.getPrototypeOf) {
-    return Object.getPrototypeOf(value)
-  } else if (value.__proto__) {
-    return value.__proto__
-  } else if (value.constructor) {
-    return value.constructor.prototype
-  }
-}
-
-},{"../vnode/is-vhook":177,"is-object":18}],186:[function(require,module,exports){
-var isArray = require("x-is-array")
-
-var VPatch = require("../vnode/vpatch")
-var isVNode = require("../vnode/is-vnode")
-var isVText = require("../vnode/is-vtext")
-var isWidget = require("../vnode/is-widget")
-var isThunk = require("../vnode/is-thunk")
-var handleThunk = require("../vnode/handle-thunk")
-
-var diffProps = require("./diff-props")
-
-module.exports = diff
-
-function diff(a, b) {
-    var patch = { a: a }
-    walk(a, b, patch, 0)
-    return patch
-}
-
-function walk(a, b, patch, index) {
-    if (a === b) {
-        return
-    }
-
-    var apply = patch[index]
-    var applyClear = false
-
-    if (isThunk(a) || isThunk(b)) {
-        thunks(a, b, patch, index)
-    } else if (b == null) {
-
-        // If a is a widget we will add a remove patch for it
-        // Otherwise any child widgets/hooks must be destroyed.
-        // This prevents adding two remove patches for a widget.
-        if (!isWidget(a)) {
-            clearState(a, patch, index)
-            apply = patch[index]
+    };
+    ZipSubscriber.prototype._complete = function () {
+        var iterators = this.iterators;
+        var len = iterators.length;
+        this.unsubscribe();
+        if (len === 0) {
+            this.destination.complete();
+            return;
         }
-
-        apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b))
-    } else if (isVNode(b)) {
-        if (isVNode(a)) {
-            if (a.tagName === b.tagName &&
-                a.namespace === b.namespace &&
-                a.key === b.key) {
-                var propsPatch = diffProps(a.properties, b.properties)
-                if (propsPatch) {
-                    apply = appendPatch(apply,
-                        new VPatch(VPatch.PROPS, a, propsPatch))
-                }
-                apply = diffChildren(a, b, patch, apply, index)
-            } else {
-                apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-                applyClear = true
+        this.active = len;
+        for (var i = 0; i < len; i++) {
+            var iterator = iterators[i];
+            if (iterator.stillUnsubscribed) {
+                var destination = this.destination;
+                destination.add(iterator.subscribe(iterator, i));
+            }
+            else {
+                this.active--;
             }
-        } else {
-            apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-            applyClear = true
         }
-    } else if (isVText(b)) {
-        if (!isVText(a)) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-            applyClear = true
-        } else if (a.text !== b.text) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
+    };
+    ZipSubscriber.prototype.notifyInactive = function () {
+        this.active--;
+        if (this.active === 0) {
+            this.destination.complete();
         }
-    } else if (isWidget(b)) {
-        if (!isWidget(a)) {
-            applyClear = true
+    };
+    ZipSubscriber.prototype.checkIterators = function () {
+        var iterators = this.iterators;
+        var len = iterators.length;
+        var destination = this.destination;
+        for (var i = 0; i < len; i++) {
+            var iterator = iterators[i];
+            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
+                return;
+            }
         }
-
-        apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b))
-    }
-
-    if (apply) {
-        patch[index] = apply
-    }
-
-    if (applyClear) {
-        clearState(a, patch, index)
-    }
-}
-
-function diffChildren(a, b, patch, apply, index) {
-    var aChildren = a.children
-    var orderedSet = reorder(aChildren, b.children)
-    var bChildren = orderedSet.children
-
-    var aLen = aChildren.length
-    var bLen = bChildren.length
-    var len = aLen > bLen ? aLen : bLen
-
-    for (var i = 0; i < len; i++) {
-        var leftNode = aChildren[i]
-        var rightNode = bChildren[i]
-        index += 1
-
-        if (!leftNode) {
-            if (rightNode) {
-                // Excess nodes in b need to be added
-                apply = appendPatch(apply,
-                    new VPatch(VPatch.INSERT, null, rightNode))
+        var shouldComplete = false;
+        var args = [];
+        for (var i = 0; i < len; i++) {
+            var iterator = iterators[i];
+            var result = iterator.next();
+            if (iterator.hasCompleted()) {
+                shouldComplete = true;
             }
-        } else {
-            walk(leftNode, rightNode, patch, index)
+            if (result.done) {
+                destination.complete();
+                return;
+            }
+            args.push(result.value);
         }
-
-        if (isVNode(leftNode) && leftNode.count) {
-            index += leftNode.count
+        if (this.resultSelector) {
+            this._tryresultSelector(args);
         }
-    }
-
-    if (orderedSet.moves) {
-        // Reorder nodes last
-        apply = appendPatch(apply, new VPatch(
-            VPatch.ORDER,
-            a,
-            orderedSet.moves
-        ))
-    }
-
-    return apply
-}
-
-function clearState(vNode, patch, index) {
-    // TODO: Make this a single walk, not two
-    unhook(vNode, patch, index)
-    destroyWidgets(vNode, patch, index)
-}
-
-// Patch records for all destroyed widgets must be added because we need
-// a DOM node reference for the destroy function
-function destroyWidgets(vNode, patch, index) {
-    if (isWidget(vNode)) {
-        if (typeof vNode.destroy === "function") {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(VPatch.REMOVE, vNode, null)
-            )
+        else {
+            destination.next(args);
         }
-    } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) {
-        var children = vNode.children
-        var len = children.length
-        for (var i = 0; i < len; i++) {
-            var child = children[i]
-            index += 1
-
-            destroyWidgets(child, patch, index)
-
-            if (isVNode(child) && child.count) {
-                index += child.count
-            }
+        if (shouldComplete) {
+            destination.complete();
         }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
+    };
+    ZipSubscriber.prototype._tryresultSelector = function (args) {
+        var result;
+        try {
+            result = this.resultSelector.apply(this, args);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return ZipSubscriber;
+}(Subscriber_1.Subscriber));
+exports.ZipSubscriber = ZipSubscriber;
+var StaticIterator = (function () {
+    function StaticIterator(iterator) {
+        this.iterator = iterator;
+        this.nextResult = iterator.next();
     }
-}
-
-// Create a sub-patch for thunks
-function thunks(a, b, patch, index) {
-    var nodes = handleThunk(a, b)
-    var thunkPatch = diff(nodes.a, nodes.b)
-    if (hasPatches(thunkPatch)) {
-        patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch)
+    StaticIterator.prototype.hasValue = function () {
+        return true;
+    };
+    StaticIterator.prototype.next = function () {
+        var result = this.nextResult;
+        this.nextResult = this.iterator.next();
+        return result;
+    };
+    StaticIterator.prototype.hasCompleted = function () {
+        var nextResult = this.nextResult;
+        return nextResult && nextResult.done;
+    };
+    return StaticIterator;
+}());
+var StaticArrayIterator = (function () {
+    function StaticArrayIterator(array) {
+        this.array = array;
+        this.index = 0;
+        this.length = 0;
+        this.length = array.length;
     }
-}
-
-function hasPatches(patch) {
-    for (var index in patch) {
-        if (index !== "a") {
-            return true
+    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
+        return this;
+    };
+    StaticArrayIterator.prototype.next = function (value) {
+        var i = this.index++;
+        var array = this.array;
+        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
+    };
+    StaticArrayIterator.prototype.hasValue = function () {
+        return this.array.length > this.index;
+    };
+    StaticArrayIterator.prototype.hasCompleted = function () {
+        return this.array.length === this.index;
+    };
+    return StaticArrayIterator;
+}());
+var ZipBufferIterator = (function (_super) {
+    __extends(ZipBufferIterator, _super);
+    function ZipBufferIterator(destination, parent, observable) {
+        var _this = _super.call(this, destination) || this;
+        _this.parent = parent;
+        _this.observable = observable;
+        _this.stillUnsubscribed = true;
+        _this.buffer = [];
+        _this.isComplete = false;
+        return _this;
+    }
+    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
+        return this;
+    };
+    ZipBufferIterator.prototype.next = function () {
+        var buffer = this.buffer;
+        if (buffer.length === 0 && this.isComplete) {
+            return { value: null, done: true };
         }
-    }
-
-    return false
-}
-
-// Execute hooks when two nodes are identical
-function unhook(vNode, patch, index) {
-    if (isVNode(vNode)) {
-        if (vNode.hooks) {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(
-                    VPatch.PROPS,
-                    vNode,
-                    undefinedKeys(vNode.hooks)
-                )
-            )
+        else {
+            return { value: buffer.shift(), done: false };
         }
+    };
+    ZipBufferIterator.prototype.hasValue = function () {
+        return this.buffer.length > 0;
+    };
+    ZipBufferIterator.prototype.hasCompleted = function () {
+        return this.buffer.length === 0 && this.isComplete;
+    };
+    ZipBufferIterator.prototype.notifyComplete = function () {
+        if (this.buffer.length > 0) {
+            this.isComplete = true;
+            this.parent.notifyInactive();
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.buffer.push(innerValue);
+        this.parent.checkIterators();
+    };
+    ZipBufferIterator.prototype.subscribe = function (value, index) {
+        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
+    };
+    return ZipBufferIterator;
+}(OuterSubscriber_1.OuterSubscriber));
 
-        if (vNode.descendantHooks || vNode.hasThunks) {
-            var children = vNode.children
-            var len = children.length
-            for (var i = 0; i < len; i++) {
-                var child = children[i]
-                index += 1
-
-                unhook(child, patch, index)
-
-                if (isVNode(child) && child.count) {
-                    index += child.count
-                }
+},{"../../internal/symbol/iterator":208,"../OuterSubscriber":50,"../Subscriber":55,"../util/isArray":220,"../util/subscribeToResult":239,"./fromArray":68}],86:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function audit(durationSelector) {
+    return function auditOperatorFunction(source) {
+        return source.lift(new AuditOperator(durationSelector));
+    };
+}
+exports.audit = audit;
+var AuditOperator = (function () {
+    function AuditOperator(durationSelector) {
+        this.durationSelector = durationSelector;
+    }
+    AuditOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
+    };
+    return AuditOperator;
+}());
+var AuditSubscriber = (function (_super) {
+    __extends(AuditSubscriber, _super);
+    function AuditSubscriber(destination, durationSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.durationSelector = durationSelector;
+        _this.hasValue = false;
+        return _this;
+    }
+    AuditSubscriber.prototype._next = function (value) {
+        this.value = value;
+        this.hasValue = true;
+        if (!this.throttled) {
+            var duration = void 0;
+            try {
+                var durationSelector = this.durationSelector;
+                duration = durationSelector(value);
+            }
+            catch (err) {
+                return this.destination.error(err);
+            }
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration);
+            if (!innerSubscription || innerSubscription.closed) {
+                this.clearThrottle();
+            }
+            else {
+                this.add(this.throttled = innerSubscription);
             }
         }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
-    }
-}
+    };
+    AuditSubscriber.prototype.clearThrottle = function () {
+        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
+        if (throttled) {
+            this.remove(throttled);
+            this.throttled = null;
+            throttled.unsubscribe();
+        }
+        if (hasValue) {
+            this.value = null;
+            this.hasValue = false;
+            this.destination.next(value);
+        }
+    };
+    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
+        this.clearThrottle();
+    };
+    AuditSubscriber.prototype.notifyComplete = function () {
+        this.clearThrottle();
+    };
+    return AuditSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-function undefinedKeys(obj) {
-    var result = {}
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],87:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var audit_1 = require("./audit");
+var timer_1 = require("../observable/timer");
+function auditTime(duration, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
+}
+exports.auditTime = auditTime;
 
-    for (var key in obj) {
-        result[key] = undefined
+},{"../observable/timer":83,"../scheduler/async":206,"./audit":86}],88:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function buffer(closingNotifier) {
+    return function bufferOperatorFunction(source) {
+        return source.lift(new BufferOperator(closingNotifier));
+    };
+}
+exports.buffer = buffer;
+var BufferOperator = (function () {
+    function BufferOperator(closingNotifier) {
+        this.closingNotifier = closingNotifier;
+    }
+    BufferOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
+    };
+    return BufferOperator;
+}());
+var BufferSubscriber = (function (_super) {
+    __extends(BufferSubscriber, _super);
+    function BufferSubscriber(destination, closingNotifier) {
+        var _this = _super.call(this, destination) || this;
+        _this.buffer = [];
+        _this.add(subscribeToResult_1.subscribeToResult(_this, closingNotifier));
+        return _this;
     }
+    BufferSubscriber.prototype._next = function (value) {
+        this.buffer.push(value);
+    };
+    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var buffer = this.buffer;
+        this.buffer = [];
+        this.destination.next(buffer);
+    };
+    return BufferSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-    return result
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],89:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function bufferCount(bufferSize, startBufferEvery) {
+    if (startBufferEvery === void 0) { startBufferEvery = null; }
+    return function bufferCountOperatorFunction(source) {
+        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
+    };
 }
-
-// List diff, naive left to right reordering
-function reorder(aChildren, bChildren) {
-    // O(M) time, O(M) memory
-    var bChildIndex = keyIndex(bChildren)
-    var bKeys = bChildIndex.keys
-    var bFree = bChildIndex.free
-
-    if (bFree.length === bChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
+exports.bufferCount = bufferCount;
+var BufferCountOperator = (function () {
+    function BufferCountOperator(bufferSize, startBufferEvery) {
+        this.bufferSize = bufferSize;
+        this.startBufferEvery = startBufferEvery;
+        if (!startBufferEvery || bufferSize === startBufferEvery) {
+            this.subscriberClass = BufferCountSubscriber;
+        }
+        else {
+            this.subscriberClass = BufferSkipCountSubscriber;
         }
     }
-
-    // O(N) time, O(N) memory
-    var aChildIndex = keyIndex(aChildren)
-    var aKeys = aChildIndex.keys
-    var aFree = aChildIndex.free
-
-    if (aFree.length === aChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
+    BufferCountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
+    };
+    return BufferCountOperator;
+}());
+var BufferCountSubscriber = (function (_super) {
+    __extends(BufferCountSubscriber, _super);
+    function BufferCountSubscriber(destination, bufferSize) {
+        var _this = _super.call(this, destination) || this;
+        _this.bufferSize = bufferSize;
+        _this.buffer = [];
+        return _this;
+    }
+    BufferCountSubscriber.prototype._next = function (value) {
+        var buffer = this.buffer;
+        buffer.push(value);
+        if (buffer.length == this.bufferSize) {
+            this.destination.next(buffer);
+            this.buffer = [];
         }
-    }
-
-    // O(MAX(N, M)) memory
-    var newChildren = []
-
-    var freeIndex = 0
-    var freeCount = bFree.length
-    var deletedItems = 0
-
-    // Iterate through a and match a node in b
-    // O(N) time,
-    for (var i = 0 ; i < aChildren.length; i++) {
-        var aItem = aChildren[i]
-        var itemIndex
-
-        if (aItem.key) {
-            if (bKeys.hasOwnProperty(aItem.key)) {
-                // Match up the old keys
-                itemIndex = bKeys[aItem.key]
-                newChildren.push(bChildren[itemIndex])
-
-            } else {
-                // Remove old keyed items
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
-        } else {
-            // Match the item in a with the next free item in b
-            if (freeIndex < freeCount) {
-                itemIndex = bFree[freeIndex++]
-                newChildren.push(bChildren[itemIndex])
-            } else {
-                // There are no free items in b to match with
-                // the free items in a, so the extra free nodes
-                // are deleted.
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
+    };
+    BufferCountSubscriber.prototype._complete = function () {
+        var buffer = this.buffer;
+        if (buffer.length > 0) {
+            this.destination.next(buffer);
         }
-    }
-
-    var lastFreeIndex = freeIndex >= bFree.length ?
-        bChildren.length :
-        bFree[freeIndex]
-
-    // Iterate through b and append any new keys
-    // O(M) time
-    for (var j = 0; j < bChildren.length; j++) {
-        var newItem = bChildren[j]
-
-        if (newItem.key) {
-            if (!aKeys.hasOwnProperty(newItem.key)) {
-                // Add any new keyed items
-                // We are adding new items to the end and then sorting them
-                // in place. In future we should insert new items in place.
-                newChildren.push(newItem)
+        _super.prototype._complete.call(this);
+    };
+    return BufferCountSubscriber;
+}(Subscriber_1.Subscriber));
+var BufferSkipCountSubscriber = (function (_super) {
+    __extends(BufferSkipCountSubscriber, _super);
+    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
+        var _this = _super.call(this, destination) || this;
+        _this.bufferSize = bufferSize;
+        _this.startBufferEvery = startBufferEvery;
+        _this.buffers = [];
+        _this.count = 0;
+        return _this;
+    }
+    BufferSkipCountSubscriber.prototype._next = function (value) {
+        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
+        this.count++;
+        if (count % startBufferEvery === 0) {
+            buffers.push([]);
+        }
+        for (var i = buffers.length; i--;) {
+            var buffer = buffers[i];
+            buffer.push(value);
+            if (buffer.length === bufferSize) {
+                buffers.splice(i, 1);
+                this.destination.next(buffer);
+            }
+        }
+    };
+    BufferSkipCountSubscriber.prototype._complete = function () {
+        var _a = this, buffers = _a.buffers, destination = _a.destination;
+        while (buffers.length > 0) {
+            var buffer = buffers.shift();
+            if (buffer.length > 0) {
+                destination.next(buffer);
             }
-        } else if (j >= lastFreeIndex) {
-            // Add any leftover non-keyed items
-            newChildren.push(newItem)
-        }
-    }
-
-    var simulate = newChildren.slice()
-    var simulateIndex = 0
-    var removes = []
-    var inserts = []
-    var simulateItem
-
-    for (var k = 0; k < bChildren.length;) {
-        var wantedItem = bChildren[k]
-        simulateItem = simulate[simulateIndex]
-
-        // remove items
-        while (simulateItem === null && simulate.length) {
-            removes.push(remove(simulate, simulateIndex, null))
-            simulateItem = simulate[simulateIndex]
         }
+        _super.prototype._complete.call(this);
+    };
+    return BufferSkipCountSubscriber;
+}(Subscriber_1.Subscriber));
 
-        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-            // if we need a key in this position...
-            if (wantedItem.key) {
-                if (simulateItem && simulateItem.key) {
-                    // if an insert doesn't put this key in place, it needs to move
-                    if (bKeys[simulateItem.key] !== k + 1) {
-                        removes.push(remove(simulate, simulateIndex, simulateItem.key))
-                        simulateItem = simulate[simulateIndex]
-                        // if the remove didn't put the wanted item in place, we need to insert it
-                        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-                            inserts.push({key: wantedItem.key, to: k})
-                        }
-                        // items are matching, so skip ahead
-                        else {
-                            simulateIndex++
-                        }
-                    }
-                    else {
-                        inserts.push({key: wantedItem.key, to: k})
-                    }
-                }
-                else {
-                    inserts.push({key: wantedItem.key, to: k})
-                }
-                k++
-            }
-            // a key in simulate has no matching wanted key, remove it
-            else if (simulateItem && simulateItem.key) {
-                removes.push(remove(simulate, simulateIndex, simulateItem.key))
-            }
+},{"../Subscriber":55}],90:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var Subscriber_1 = require("../Subscriber");
+var isScheduler_1 = require("../util/isScheduler");
+function bufferTime(bufferTimeSpan) {
+    var length = arguments.length;
+    var scheduler = async_1.async;
+    if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {
+        scheduler = arguments[arguments.length - 1];
+        length--;
+    }
+    var bufferCreationInterval = null;
+    if (length >= 2) {
+        bufferCreationInterval = arguments[1];
+    }
+    var maxBufferSize = Number.POSITIVE_INFINITY;
+    if (length >= 3) {
+        maxBufferSize = arguments[2];
+    }
+    return function bufferTimeOperatorFunction(source) {
+        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
+    };
+}
+exports.bufferTime = bufferTime;
+var BufferTimeOperator = (function () {
+    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
+        this.bufferTimeSpan = bufferTimeSpan;
+        this.bufferCreationInterval = bufferCreationInterval;
+        this.maxBufferSize = maxBufferSize;
+        this.scheduler = scheduler;
+    }
+    BufferTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
+    };
+    return BufferTimeOperator;
+}());
+var Context = (function () {
+    function Context() {
+        this.buffer = [];
+    }
+    return Context;
+}());
+var BufferTimeSubscriber = (function (_super) {
+    __extends(BufferTimeSubscriber, _super);
+    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.bufferTimeSpan = bufferTimeSpan;
+        _this.bufferCreationInterval = bufferCreationInterval;
+        _this.maxBufferSize = maxBufferSize;
+        _this.scheduler = scheduler;
+        _this.contexts = [];
+        var context = _this.openContext();
+        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
+        if (_this.timespanOnly) {
+            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
+            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
         }
         else {
-            simulateIndex++
-            k++
+            var closeState = { subscriber: _this, context: context };
+            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
+            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
+            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
         }
+        return _this;
     }
-
-    // remove all the remaining nodes from simulate
-    while(simulateIndex < simulate.length) {
-        simulateItem = simulate[simulateIndex]
-        removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key))
-    }
-
-    // If the only moves we have are deletes then we can just
-    // let the delete patch remove these items.
-    if (removes.length === deletedItems && !inserts.length) {
-        return {
-            children: newChildren,
-            moves: null
+    BufferTimeSubscriber.prototype._next = function (value) {
+        var contexts = this.contexts;
+        var len = contexts.length;
+        var filledBufferContext;
+        for (var i = 0; i < len; i++) {
+            var context_1 = contexts[i];
+            var buffer = context_1.buffer;
+            buffer.push(value);
+            if (buffer.length == this.maxBufferSize) {
+                filledBufferContext = context_1;
+            }
         }
-    }
-
-    return {
-        children: newChildren,
-        moves: {
-            removes: removes,
-            inserts: inserts
+        if (filledBufferContext) {
+            this.onBufferFull(filledBufferContext);
+        }
+    };
+    BufferTimeSubscriber.prototype._error = function (err) {
+        this.contexts.length = 0;
+        _super.prototype._error.call(this, err);
+    };
+    BufferTimeSubscriber.prototype._complete = function () {
+        var _a = this, contexts = _a.contexts, destination = _a.destination;
+        while (contexts.length > 0) {
+            var context_2 = contexts.shift();
+            destination.next(context_2.buffer);
+        }
+        _super.prototype._complete.call(this);
+    };
+    BufferTimeSubscriber.prototype._unsubscribe = function () {
+        this.contexts = null;
+    };
+    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
+        this.closeContext(context);
+        var closeAction = context.closeAction;
+        closeAction.unsubscribe();
+        this.remove(closeAction);
+        if (!this.closed && this.timespanOnly) {
+            context = this.openContext();
+            var bufferTimeSpan = this.bufferTimeSpan;
+            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
+            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
+        }
+    };
+    BufferTimeSubscriber.prototype.openContext = function () {
+        var context = new Context();
+        this.contexts.push(context);
+        return context;
+    };
+    BufferTimeSubscriber.prototype.closeContext = function (context) {
+        this.destination.next(context.buffer);
+        var contexts = this.contexts;
+        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
+        if (spliceIndex >= 0) {
+            contexts.splice(contexts.indexOf(context), 1);
         }
+    };
+    return BufferTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchBufferTimeSpanOnly(state) {
+    var subscriber = state.subscriber;
+    var prevContext = state.context;
+    if (prevContext) {
+        subscriber.closeContext(prevContext);
     }
-}
-
-function remove(arr, index, key) {
-    arr.splice(index, 1)
-
-    return {
-        from: index,
-        key: key
+    if (!subscriber.closed) {
+        state.context = subscriber.openContext();
+        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
     }
 }
-
-function keyIndex(children) {
-    var keys = {}
-    var free = []
-    var length = children.length
-
-    for (var i = 0; i < length; i++) {
-        var child = children[i]
-
-        if (child.key) {
-            keys[child.key] = i
-        } else {
-            free.push(i)
-        }
-    }
-
-    return {
-        keys: keys,     // A hash of key name to index
-        free: free      // An array of unkeyed item indices
+function dispatchBufferCreation(state) {
+    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
+    var context = subscriber.openContext();
+    var action = this;
+    if (!subscriber.closed) {
+        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
+        action.schedule(state, bufferCreationInterval);
     }
 }
+function dispatchBufferClose(arg) {
+    var subscriber = arg.subscriber, context = arg.context;
+    subscriber.closeContext(context);
+}
 
-function appendPatch(apply, patch) {
-    if (apply) {
-        if (isArray(apply)) {
-            apply.push(patch)
-        } else {
-            apply = [apply, patch]
+},{"../Subscriber":55,"../scheduler/async":206,"../util/isScheduler":230}],91:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("../Subscription");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+function bufferToggle(openings, closingSelector) {
+    return function bufferToggleOperatorFunction(source) {
+        return source.lift(new BufferToggleOperator(openings, closingSelector));
+    };
+}
+exports.bufferToggle = bufferToggle;
+var BufferToggleOperator = (function () {
+    function BufferToggleOperator(openings, closingSelector) {
+        this.openings = openings;
+        this.closingSelector = closingSelector;
+    }
+    BufferToggleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
+    };
+    return BufferToggleOperator;
+}());
+var BufferToggleSubscriber = (function (_super) {
+    __extends(BufferToggleSubscriber, _super);
+    function BufferToggleSubscriber(destination, openings, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.openings = openings;
+        _this.closingSelector = closingSelector;
+        _this.contexts = [];
+        _this.add(subscribeToResult_1.subscribeToResult(_this, openings));
+        return _this;
+    }
+    BufferToggleSubscriber.prototype._next = function (value) {
+        var contexts = this.contexts;
+        var len = contexts.length;
+        for (var i = 0; i < len; i++) {
+            contexts[i].buffer.push(value);
+        }
+    };
+    BufferToggleSubscriber.prototype._error = function (err) {
+        var contexts = this.contexts;
+        while (contexts.length > 0) {
+            var context_1 = contexts.shift();
+            context_1.subscription.unsubscribe();
+            context_1.buffer = null;
+            context_1.subscription = null;
+        }
+        this.contexts = null;
+        _super.prototype._error.call(this, err);
+    };
+    BufferToggleSubscriber.prototype._complete = function () {
+        var contexts = this.contexts;
+        while (contexts.length > 0) {
+            var context_2 = contexts.shift();
+            this.destination.next(context_2.buffer);
+            context_2.subscription.unsubscribe();
+            context_2.buffer = null;
+            context_2.subscription = null;
+        }
+        this.contexts = null;
+        _super.prototype._complete.call(this);
+    };
+    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
+    };
+    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.closeBuffer(innerSub.context);
+    };
+    BufferToggleSubscriber.prototype.openBuffer = function (value) {
+        try {
+            var closingSelector = this.closingSelector;
+            var closingNotifier = closingSelector.call(this, value);
+            if (closingNotifier) {
+                this.trySubscribe(closingNotifier);
+            }
+        }
+        catch (err) {
+            this._error(err);
+        }
+    };
+    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
+        var contexts = this.contexts;
+        if (contexts && context) {
+            var buffer = context.buffer, subscription = context.subscription;
+            this.destination.next(buffer);
+            contexts.splice(contexts.indexOf(context), 1);
+            this.remove(subscription);
+            subscription.unsubscribe();
+        }
+    };
+    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
+        var contexts = this.contexts;
+        var buffer = [];
+        var subscription = new Subscription_1.Subscription();
+        var context = { buffer: buffer, subscription: subscription };
+        contexts.push(context);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);
+        if (!innerSubscription || innerSubscription.closed) {
+            this.closeBuffer(context);
+        }
+        else {
+            innerSubscription.context = context;
+            this.add(innerSubscription);
+            subscription.add(innerSubscription);
         }
+    };
+    return BufferToggleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-        return apply
-    } else {
-        return patch
-    }
+},{"../OuterSubscriber":50,"../Subscription":56,"../util/subscribeToResult":239}],92:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("../Subscription");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function bufferWhen(closingSelector) {
+    return function (source) {
+        return source.lift(new BufferWhenOperator(closingSelector));
+    };
 }
+exports.bufferWhen = bufferWhen;
+var BufferWhenOperator = (function () {
+    function BufferWhenOperator(closingSelector) {
+        this.closingSelector = closingSelector;
+    }
+    BufferWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
+    };
+    return BufferWhenOperator;
+}());
+var BufferWhenSubscriber = (function (_super) {
+    __extends(BufferWhenSubscriber, _super);
+    function BufferWhenSubscriber(destination, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.closingSelector = closingSelector;
+        _this.subscribing = false;
+        _this.openBuffer();
+        return _this;
+    }
+    BufferWhenSubscriber.prototype._next = function (value) {
+        this.buffer.push(value);
+    };
+    BufferWhenSubscriber.prototype._complete = function () {
+        var buffer = this.buffer;
+        if (buffer) {
+            this.destination.next(buffer);
+        }
+        _super.prototype._complete.call(this);
+    };
+    BufferWhenSubscriber.prototype._unsubscribe = function () {
+        this.buffer = null;
+        this.subscribing = false;
+    };
+    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.openBuffer();
+    };
+    BufferWhenSubscriber.prototype.notifyComplete = function () {
+        if (this.subscribing) {
+            this.complete();
+        }
+        else {
+            this.openBuffer();
+        }
+    };
+    BufferWhenSubscriber.prototype.openBuffer = function () {
+        var closingSubscription = this.closingSubscription;
+        if (closingSubscription) {
+            this.remove(closingSubscription);
+            closingSubscription.unsubscribe();
+        }
+        var buffer = this.buffer;
+        if (this.buffer) {
+            this.destination.next(buffer);
+        }
+        this.buffer = [];
+        var closingNotifier;
+        try {
+            var closingSelector = this.closingSelector;
+            closingNotifier = closingSelector();
+        }
+        catch (err) {
+            return this.error(err);
+        }
+        closingSubscription = new Subscription_1.Subscription();
+        this.closingSubscription = closingSubscription;
+        this.add(closingSubscription);
+        this.subscribing = true;
+        closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
+        this.subscribing = false;
+    };
+    return BufferWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../vnode/handle-thunk":175,"../vnode/is-thunk":176,"../vnode/is-vnode":178,"../vnode/is-vtext":179,"../vnode/is-widget":180,"../vnode/vpatch":183,"./diff-props":185,"x-is-array":205}],187:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function (require) {
-
-       var makePromise = require('./makePromise');
-       var Scheduler = require('./Scheduler');
-       var async = require('./env').asap;
+},{"../OuterSubscriber":50,"../Subscription":56,"../util/subscribeToResult":239}],93:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function catchError(selector) {
+    return function catchErrorOperatorFunction(source) {
+        var operator = new CatchOperator(selector);
+        var caught = source.lift(operator);
+        return (operator.caught = caught);
+    };
+}
+exports.catchError = catchError;
+var CatchOperator = (function () {
+    function CatchOperator(selector) {
+        this.selector = selector;
+    }
+    CatchOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
+    };
+    return CatchOperator;
+}());
+var CatchSubscriber = (function (_super) {
+    __extends(CatchSubscriber, _super);
+    function CatchSubscriber(destination, selector, caught) {
+        var _this = _super.call(this, destination) || this;
+        _this.selector = selector;
+        _this.caught = caught;
+        return _this;
+    }
+    CatchSubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var result = void 0;
+            try {
+                result = this.selector(err, this.caught);
+            }
+            catch (err2) {
+                _super.prototype.error.call(this, err2);
+                return;
+            }
+            this._unsubscribeAndRecycle();
+            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
+            this.add(innerSubscriber);
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
+            if (innerSubscription !== innerSubscriber) {
+                this.add(innerSubscription);
+            }
+        }
+    };
+    return CatchSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-       return makePromise({
-               scheduler: new Scheduler(async)
-       });
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],94:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var combineLatest_1 = require("../observable/combineLatest");
+function combineAll(project) {
+    return function (source) { return source.lift(new combineLatest_1.CombineLatestOperator(project)); };
+}
+exports.combineAll = combineAll;
 
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
+},{"../observable/combineLatest":62}],95:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("../util/isArray");
+var combineLatest_1 = require("../observable/combineLatest");
+var from_1 = require("../observable/from");
+var none = {};
+function combineLatest() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    var project = null;
+    if (typeof observables[observables.length - 1] === 'function') {
+        project = observables.pop();
+    }
+    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
+        observables = observables[0].slice();
+    }
+    return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };
+}
+exports.combineLatest = combineLatest;
 
-},{"./Scheduler":188,"./env":200,"./makePromise":202}],188:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../observable/combineLatest":62,"../observable/from":67,"../util/isArray":220}],96:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concat_1 = require("../observable/concat");
+function concat() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
+}
+exports.concat = concat;
 
-(function(define) { 'use strict';
-define(function() {
+},{"../observable/concat":63}],97:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeAll_1 = require("./mergeAll");
+function concatAll() {
+    return mergeAll_1.mergeAll(1);
+}
+exports.concatAll = concatAll;
 
-       // Credit to Twisol (https://github.com/Twisol) for suggesting
-       // this type of extensible queue + trampoline approach for next-tick conflation.
+},{"./mergeAll":130}],98:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeMap_1 = require("./mergeMap");
+function concatMap(project, resultSelector) {
+    return mergeMap_1.mergeMap(project, resultSelector, 1);
+}
+exports.concatMap = concatMap;
 
-       /**
-        * Async task scheduler
-        * @param {function} async function to schedule a single async function
-        * @constructor
-        */
-       function Scheduler(async) {
-               this._async = async;
-               this._running = false;
+},{"./mergeMap":131}],99:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concatMap_1 = require("./concatMap");
+function concatMapTo(innerObservable, resultSelector) {
+    return concatMap_1.concatMap(function () { return innerObservable; }, resultSelector);
+}
+exports.concatMapTo = concatMapTo;
 
-               this._queue = this;
-               this._queueLen = 0;
-               this._afterQueue = {};
-               this._afterQueueLen = 0;
+},{"./concatMap":98}],100:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function count(predicate) {
+    return function (source) { return source.lift(new CountOperator(predicate, source)); };
+}
+exports.count = count;
+var CountOperator = (function () {
+    function CountOperator(predicate, source) {
+        this.predicate = predicate;
+        this.source = source;
+    }
+    CountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
+    };
+    return CountOperator;
+}());
+var CountSubscriber = (function (_super) {
+    __extends(CountSubscriber, _super);
+    function CountSubscriber(destination, predicate, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.source = source;
+        _this.count = 0;
+        _this.index = 0;
+        return _this;
+    }
+    CountSubscriber.prototype._next = function (value) {
+        if (this.predicate) {
+            this._tryPredicate(value);
+        }
+        else {
+            this.count++;
+        }
+    };
+    CountSubscriber.prototype._tryPredicate = function (value) {
+        var result;
+        try {
+            result = this.predicate(value, this.index++, this.source);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        if (result) {
+            this.count++;
+        }
+    };
+    CountSubscriber.prototype._complete = function () {
+        this.destination.next(this.count);
+        this.destination.complete();
+    };
+    return CountSubscriber;
+}(Subscriber_1.Subscriber));
 
-               var self = this;
-               this.drain = function() {
-                       self._drain();
-               };
-       }
+},{"../Subscriber":55}],101:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function debounce(durationSelector) {
+    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
+}
+exports.debounce = debounce;
+var DebounceOperator = (function () {
+    function DebounceOperator(durationSelector) {
+        this.durationSelector = durationSelector;
+    }
+    DebounceOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
+    };
+    return DebounceOperator;
+}());
+var DebounceSubscriber = (function (_super) {
+    __extends(DebounceSubscriber, _super);
+    function DebounceSubscriber(destination, durationSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.durationSelector = durationSelector;
+        _this.hasValue = false;
+        _this.durationSubscription = null;
+        return _this;
+    }
+    DebounceSubscriber.prototype._next = function (value) {
+        try {
+            var result = this.durationSelector.call(this, value);
+            if (result) {
+                this._tryNext(value, result);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    DebounceSubscriber.prototype._complete = function () {
+        this.emitValue();
+        this.destination.complete();
+    };
+    DebounceSubscriber.prototype._tryNext = function (value, duration) {
+        var subscription = this.durationSubscription;
+        this.value = value;
+        this.hasValue = true;
+        if (subscription) {
+            subscription.unsubscribe();
+            this.remove(subscription);
+        }
+        subscription = subscribeToResult_1.subscribeToResult(this, duration);
+        if (subscription && !subscription.closed) {
+            this.add(this.durationSubscription = subscription);
+        }
+    };
+    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.emitValue();
+    };
+    DebounceSubscriber.prototype.notifyComplete = function () {
+        this.emitValue();
+    };
+    DebounceSubscriber.prototype.emitValue = function () {
+        if (this.hasValue) {
+            var value = this.value;
+            var subscription = this.durationSubscription;
+            if (subscription) {
+                this.durationSubscription = null;
+                subscription.unsubscribe();
+                this.remove(subscription);
+            }
+            this.value = null;
+            this.hasValue = false;
+            _super.prototype._next.call(this, value);
+        }
+    };
+    return DebounceSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-       /**
-        * Enqueue a task
-        * @param {{ run:function }} task
-        */
-       Scheduler.prototype.enqueue = function(task) {
-               this._queue[this._queueLen++] = task;
-               this.run();
-       };
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],102:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var async_1 = require("../scheduler/async");
+function debounceTime(dueTime, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
+}
+exports.debounceTime = debounceTime;
+var DebounceTimeOperator = (function () {
+    function DebounceTimeOperator(dueTime, scheduler) {
+        this.dueTime = dueTime;
+        this.scheduler = scheduler;
+    }
+    DebounceTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
+    };
+    return DebounceTimeOperator;
+}());
+var DebounceTimeSubscriber = (function (_super) {
+    __extends(DebounceTimeSubscriber, _super);
+    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.dueTime = dueTime;
+        _this.scheduler = scheduler;
+        _this.debouncedSubscription = null;
+        _this.lastValue = null;
+        _this.hasValue = false;
+        return _this;
+    }
+    DebounceTimeSubscriber.prototype._next = function (value) {
+        this.clearDebounce();
+        this.lastValue = value;
+        this.hasValue = true;
+        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
+    };
+    DebounceTimeSubscriber.prototype._complete = function () {
+        this.debouncedNext();
+        this.destination.complete();
+    };
+    DebounceTimeSubscriber.prototype.debouncedNext = function () {
+        this.clearDebounce();
+        if (this.hasValue) {
+            var lastValue = this.lastValue;
+            this.lastValue = null;
+            this.hasValue = false;
+            this.destination.next(lastValue);
+        }
+    };
+    DebounceTimeSubscriber.prototype.clearDebounce = function () {
+        var debouncedSubscription = this.debouncedSubscription;
+        if (debouncedSubscription !== null) {
+            this.remove(debouncedSubscription);
+            debouncedSubscription.unsubscribe();
+            this.debouncedSubscription = null;
+        }
+    };
+    return DebounceTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchNext(subscriber) {
+    subscriber.debouncedNext();
+}
 
-       /**
-        * Enqueue a task to run after the main task queue
-        * @param {{ run:function }} task
-        */
-       Scheduler.prototype.afterQueue = function(task) {
-               this._afterQueue[this._afterQueueLen++] = task;
-               this.run();
-       };
-
-       Scheduler.prototype.run = function() {
-               if (!this._running) {
-                       this._running = true;
-                       this._async(this.drain);
-               }
-       };
-
-       /**
-        * Drain the handler queue entirely, and then the after queue
-        */
-       Scheduler.prototype._drain = function() {
-               var i = 0;
-               for (; i < this._queueLen; ++i) {
-                       this._queue[i].run();
-                       this._queue[i] = void 0;
-               }
-
-               this._queueLen = 0;
-               this._running = false;
-
-               for (i = 0; i < this._afterQueueLen; ++i) {
-                       this._afterQueue[i].run();
-                       this._afterQueue[i] = void 0;
-               }
+},{"../Subscriber":55,"../scheduler/async":206}],103:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function defaultIfEmpty(defaultValue) {
+    if (defaultValue === void 0) { defaultValue = null; }
+    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
+}
+exports.defaultIfEmpty = defaultIfEmpty;
+var DefaultIfEmptyOperator = (function () {
+    function DefaultIfEmptyOperator(defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
+    };
+    return DefaultIfEmptyOperator;
+}());
+var DefaultIfEmptySubscriber = (function (_super) {
+    __extends(DefaultIfEmptySubscriber, _super);
+    function DefaultIfEmptySubscriber(destination, defaultValue) {
+        var _this = _super.call(this, destination) || this;
+        _this.defaultValue = defaultValue;
+        _this.isEmpty = true;
+        return _this;
+    }
+    DefaultIfEmptySubscriber.prototype._next = function (value) {
+        this.isEmpty = false;
+        this.destination.next(value);
+    };
+    DefaultIfEmptySubscriber.prototype._complete = function () {
+        if (this.isEmpty) {
+            this.destination.next(this.defaultValue);
+        }
+        this.destination.complete();
+    };
+    return DefaultIfEmptySubscriber;
+}(Subscriber_1.Subscriber));
 
-               this._afterQueueLen = 0;
-       };
+},{"../Subscriber":55}],104:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var isDate_1 = require("../util/isDate");
+var Subscriber_1 = require("../Subscriber");
+var Notification_1 = require("../Notification");
+function delay(delay, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    var absoluteDelay = isDate_1.isDate(delay);
+    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
+    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
+}
+exports.delay = delay;
+var DelayOperator = (function () {
+    function DelayOperator(delay, scheduler) {
+        this.delay = delay;
+        this.scheduler = scheduler;
+    }
+    DelayOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
+    };
+    return DelayOperator;
+}());
+var DelaySubscriber = (function (_super) {
+    __extends(DelaySubscriber, _super);
+    function DelaySubscriber(destination, delay, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.delay = delay;
+        _this.scheduler = scheduler;
+        _this.queue = [];
+        _this.active = false;
+        _this.errored = false;
+        return _this;
+    }
+    DelaySubscriber.dispatch = function (state) {
+        var source = state.source;
+        var queue = source.queue;
+        var scheduler = state.scheduler;
+        var destination = state.destination;
+        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
+            queue.shift().notification.observe(destination);
+        }
+        if (queue.length > 0) {
+            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
+            this.schedule(state, delay_1);
+        }
+        else {
+            this.unsubscribe();
+            source.active = false;
+        }
+    };
+    DelaySubscriber.prototype._schedule = function (scheduler) {
+        this.active = true;
+        var destination = this.destination;
+        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
+            source: this, destination: this.destination, scheduler: scheduler
+        }));
+    };
+    DelaySubscriber.prototype.scheduleNotification = function (notification) {
+        if (this.errored === true) {
+            return;
+        }
+        var scheduler = this.scheduler;
+        var message = new DelayMessage(scheduler.now() + this.delay, notification);
+        this.queue.push(message);
+        if (this.active === false) {
+            this._schedule(scheduler);
+        }
+    };
+    DelaySubscriber.prototype._next = function (value) {
+        this.scheduleNotification(Notification_1.Notification.createNext(value));
+    };
+    DelaySubscriber.prototype._error = function (err) {
+        this.errored = true;
+        this.queue = [];
+        this.destination.error(err);
+        this.unsubscribe();
+    };
+    DelaySubscriber.prototype._complete = function () {
+        this.scheduleNotification(Notification_1.Notification.createComplete());
+        this.unsubscribe();
+    };
+    return DelaySubscriber;
+}(Subscriber_1.Subscriber));
+var DelayMessage = (function () {
+    function DelayMessage(time, notification) {
+        this.time = time;
+        this.notification = notification;
+    }
+    return DelayMessage;
+}());
 
-       return Scheduler;
+},{"../Notification":47,"../Subscriber":55,"../scheduler/async":206,"../util/isDate":222}],105:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Observable_1 = require("../Observable");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function delayWhen(delayDurationSelector, subscriptionDelay) {
+    if (subscriptionDelay) {
+        return function (source) {
+            return new SubscriptionDelayObservable(source, subscriptionDelay)
+                .lift(new DelayWhenOperator(delayDurationSelector));
+        };
+    }
+    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
+}
+exports.delayWhen = delayWhen;
+var DelayWhenOperator = (function () {
+    function DelayWhenOperator(delayDurationSelector) {
+        this.delayDurationSelector = delayDurationSelector;
+    }
+    DelayWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
+    };
+    return DelayWhenOperator;
+}());
+var DelayWhenSubscriber = (function (_super) {
+    __extends(DelayWhenSubscriber, _super);
+    function DelayWhenSubscriber(destination, delayDurationSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.delayDurationSelector = delayDurationSelector;
+        _this.completed = false;
+        _this.delayNotifierSubscriptions = [];
+        _this.index = 0;
+        return _this;
+    }
+    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(outerValue);
+        this.removeSubscription(innerSub);
+        this.tryComplete();
+    };
+    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
+        var value = this.removeSubscription(innerSub);
+        if (value) {
+            this.destination.next(value);
+        }
+        this.tryComplete();
+    };
+    DelayWhenSubscriber.prototype._next = function (value) {
+        var index = this.index++;
+        try {
+            var delayNotifier = this.delayDurationSelector(value, index);
+            if (delayNotifier) {
+                this.tryDelay(delayNotifier, value);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    DelayWhenSubscriber.prototype._complete = function () {
+        this.completed = true;
+        this.tryComplete();
+        this.unsubscribe();
+    };
+    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
+        subscription.unsubscribe();
+        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
+        if (subscriptionIdx !== -1) {
+            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
+        }
+        return subscription.outerValue;
+    };
+    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
+        var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);
+        if (notifierSubscription && !notifierSubscription.closed) {
+            var destination = this.destination;
+            destination.add(notifierSubscription);
+            this.delayNotifierSubscriptions.push(notifierSubscription);
+        }
+    };
+    DelayWhenSubscriber.prototype.tryComplete = function () {
+        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
+            this.destination.complete();
+        }
+    };
+    return DelayWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+var SubscriptionDelayObservable = (function (_super) {
+    __extends(SubscriptionDelayObservable, _super);
+    function SubscriptionDelayObservable(source, subscriptionDelay) {
+        var _this = _super.call(this) || this;
+        _this.source = source;
+        _this.subscriptionDelay = subscriptionDelay;
+        return _this;
+    }
+    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
+        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
+    };
+    return SubscriptionDelayObservable;
+}(Observable_1.Observable));
+var SubscriptionDelaySubscriber = (function (_super) {
+    __extends(SubscriptionDelaySubscriber, _super);
+    function SubscriptionDelaySubscriber(parent, source) {
+        var _this = _super.call(this) || this;
+        _this.parent = parent;
+        _this.source = source;
+        _this.sourceSubscribed = false;
+        return _this;
+    }
+    SubscriptionDelaySubscriber.prototype._next = function (unused) {
+        this.subscribeToSource();
+    };
+    SubscriptionDelaySubscriber.prototype._error = function (err) {
+        this.unsubscribe();
+        this.parent.error(err);
+    };
+    SubscriptionDelaySubscriber.prototype._complete = function () {
+        this.unsubscribe();
+        this.subscribeToSource();
+    };
+    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
+        if (!this.sourceSubscribed) {
+            this.sourceSubscribed = true;
+            this.unsubscribe();
+            this.source.subscribe(this.parent);
+        }
+    };
+    return SubscriptionDelaySubscriber;
+}(Subscriber_1.Subscriber));
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+},{"../Observable":48,"../OuterSubscriber":50,"../Subscriber":55,"../util/subscribeToResult":239}],106:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function dematerialize() {
+    return function dematerializeOperatorFunction(source) {
+        return source.lift(new DeMaterializeOperator());
+    };
+}
+exports.dematerialize = dematerialize;
+var DeMaterializeOperator = (function () {
+    function DeMaterializeOperator() {
+    }
+    DeMaterializeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DeMaterializeSubscriber(subscriber));
+    };
+    return DeMaterializeOperator;
+}());
+var DeMaterializeSubscriber = (function (_super) {
+    __extends(DeMaterializeSubscriber, _super);
+    function DeMaterializeSubscriber(destination) {
+        return _super.call(this, destination) || this;
+    }
+    DeMaterializeSubscriber.prototype._next = function (value) {
+        value.observe(this.destination);
+    };
+    return DeMaterializeSubscriber;
+}(Subscriber_1.Subscriber));
 
-},{}],189:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../Subscriber":55}],107:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function distinct(keySelector, flushes) {
+    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
+}
+exports.distinct = distinct;
+var DistinctOperator = (function () {
+    function DistinctOperator(keySelector, flushes) {
+        this.keySelector = keySelector;
+        this.flushes = flushes;
+    }
+    DistinctOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
+    };
+    return DistinctOperator;
+}());
+var DistinctSubscriber = (function (_super) {
+    __extends(DistinctSubscriber, _super);
+    function DistinctSubscriber(destination, keySelector, flushes) {
+        var _this = _super.call(this, destination) || this;
+        _this.keySelector = keySelector;
+        _this.values = new Set();
+        if (flushes) {
+            _this.add(subscribeToResult_1.subscribeToResult(_this, flushes));
+        }
+        return _this;
+    }
+    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.values.clear();
+    };
+    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    DistinctSubscriber.prototype._next = function (value) {
+        if (this.keySelector) {
+            this._useKeySelector(value);
+        }
+        else {
+            this._finalizeNext(value, value);
+        }
+    };
+    DistinctSubscriber.prototype._useKeySelector = function (value) {
+        var key;
+        var destination = this.destination;
+        try {
+            key = this.keySelector(value);
+        }
+        catch (err) {
+            destination.error(err);
+            return;
+        }
+        this._finalizeNext(key, value);
+    };
+    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
+        var values = this.values;
+        if (!values.has(key)) {
+            values.add(key);
+            this.destination.next(value);
+        }
+    };
+    return DistinctSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.DistinctSubscriber = DistinctSubscriber;
 
-(function(define) { 'use strict';
-define(function() {
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],108:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function distinctUntilChanged(compare, keySelector) {
+    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
+}
+exports.distinctUntilChanged = distinctUntilChanged;
+var DistinctUntilChangedOperator = (function () {
+    function DistinctUntilChangedOperator(compare, keySelector) {
+        this.compare = compare;
+        this.keySelector = keySelector;
+    }
+    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
+    };
+    return DistinctUntilChangedOperator;
+}());
+var DistinctUntilChangedSubscriber = (function (_super) {
+    __extends(DistinctUntilChangedSubscriber, _super);
+    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.keySelector = keySelector;
+        _this.hasKey = false;
+        if (typeof compare === 'function') {
+            _this.compare = compare;
+        }
+        return _this;
+    }
+    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
+        return x === y;
+    };
+    DistinctUntilChangedSubscriber.prototype._next = function (value) {
+        var key;
+        try {
+            var keySelector = this.keySelector;
+            key = keySelector ? keySelector(value) : value;
+        }
+        catch (err) {
+            return this.destination.error(err);
+        }
+        var result = false;
+        if (this.hasKey) {
+            try {
+                var compare = this.compare;
+                result = compare(this.key, key);
+            }
+            catch (err) {
+                return this.destination.error(err);
+            }
+        }
+        else {
+            this.hasKey = true;
+        }
+        if (!result) {
+            this.key = key;
+            this.destination.next(value);
+        }
+    };
+    return DistinctUntilChangedSubscriber;
+}(Subscriber_1.Subscriber));
 
-       /**
-        * Custom error type for promises rejected by promise.timeout
-        * @param {string} message
-        * @constructor
-        */
-       function TimeoutError (message) {
-               Error.call(this);
-               this.message = message;
-               this.name = TimeoutError.name;
-               if (typeof Error.captureStackTrace === 'function') {
-                       Error.captureStackTrace(this, TimeoutError);
-               }
-       }
+},{"../Subscriber":55}],109:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var distinctUntilChanged_1 = require("./distinctUntilChanged");
+function distinctUntilKeyChanged(key, compare) {
+    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
+}
+exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
 
-       TimeoutError.prototype = Object.create(Error.prototype);
-       TimeoutError.prototype.constructor = TimeoutError;
+},{"./distinctUntilChanged":108}],110:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+var filter_1 = require("./filter");
+var throwIfEmpty_1 = require("./throwIfEmpty");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var take_1 = require("./take");
+function elementAt(index, defaultValue) {
+    if (index < 0) {
+        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
+    }
+    var hasDefaultValue = arguments.length >= 2;
+    return function (source) { return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue
+        ? defaultIfEmpty_1.defaultIfEmpty(defaultValue)
+        : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); })); };
+}
+exports.elementAt = elementAt;
+
+},{"../util/ArgumentOutOfRangeError":211,"./defaultIfEmpty":103,"./filter":116,"./take":168,"./throwIfEmpty":175}],111:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concat_1 = require("../observable/concat");
+var of_1 = require("../observable/of");
+function endWith() {
+    var array = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        array[_i] = arguments[_i];
+    }
+    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, array)); };
+}
+exports.endWith = endWith;
 
-       return TimeoutError;
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-},{}],190:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       makeApply.tryCatchResolve = tryCatchResolve;
-
-       return makeApply;
-
-       function makeApply(Promise, call) {
-               if(arguments.length < 2) {
-                       call = tryCatchResolve;
-               }
-
-               return apply;
+},{"../observable/concat":63,"../observable/of":76}],112:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function every(predicate, thisArg) {
+    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
+}
+exports.every = every;
+var EveryOperator = (function () {
+    function EveryOperator(predicate, thisArg, source) {
+        this.predicate = predicate;
+        this.thisArg = thisArg;
+        this.source = source;
+    }
+    EveryOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
+    };
+    return EveryOperator;
+}());
+var EverySubscriber = (function (_super) {
+    __extends(EverySubscriber, _super);
+    function EverySubscriber(destination, predicate, thisArg, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.thisArg = thisArg;
+        _this.source = source;
+        _this.index = 0;
+        _this.thisArg = thisArg || _this;
+        return _this;
+    }
+    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
+        this.destination.next(everyValueMatch);
+        this.destination.complete();
+    };
+    EverySubscriber.prototype._next = function (value) {
+        var result = false;
+        try {
+            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        if (!result) {
+            this.notifyComplete(false);
+        }
+    };
+    EverySubscriber.prototype._complete = function () {
+        this.notifyComplete(true);
+    };
+    return EverySubscriber;
+}(Subscriber_1.Subscriber));
 
-               function apply(f, thisArg, args) {
-                       var p = Promise._defer();
-                       var l = args.length;
-                       var params = new Array(l);
-                       callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
+},{"../Subscriber":55}],113:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function exhaust() {
+    return function (source) { return source.lift(new SwitchFirstOperator()); };
+}
+exports.exhaust = exhaust;
+var SwitchFirstOperator = (function () {
+    function SwitchFirstOperator() {
+    }
+    SwitchFirstOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SwitchFirstSubscriber(subscriber));
+    };
+    return SwitchFirstOperator;
+}());
+var SwitchFirstSubscriber = (function (_super) {
+    __extends(SwitchFirstSubscriber, _super);
+    function SwitchFirstSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasCompleted = false;
+        _this.hasSubscription = false;
+        return _this;
+    }
+    SwitchFirstSubscriber.prototype._next = function (value) {
+        if (!this.hasSubscription) {
+            this.hasSubscription = true;
+            this.add(subscribeToResult_1.subscribeToResult(this, value));
+        }
+    };
+    SwitchFirstSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (!this.hasSubscription) {
+            this.destination.complete();
+        }
+    };
+    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.remove(innerSub);
+        this.hasSubscription = false;
+        if (this.hasCompleted) {
+            this.destination.complete();
+        }
+    };
+    return SwitchFirstSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-                       return p;
-               }
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],114:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var map_1 = require("./map");
+var from_1 = require("../observable/from");
+function exhaustMap(project, resultSelector) {
+    if (resultSelector) {
+        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
+    }
+    return function (source) {
+        return source.lift(new ExhaustMapOperator(project));
+    };
+}
+exports.exhaustMap = exhaustMap;
+var ExhaustMapOperator = (function () {
+    function ExhaustMapOperator(project) {
+        this.project = project;
+    }
+    ExhaustMapOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
+    };
+    return ExhaustMapOperator;
+}());
+var ExhaustMapSubscriber = (function (_super) {
+    __extends(ExhaustMapSubscriber, _super);
+    function ExhaustMapSubscriber(destination, project) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.hasSubscription = false;
+        _this.hasCompleted = false;
+        _this.index = 0;
+        return _this;
+    }
+    ExhaustMapSubscriber.prototype._next = function (value) {
+        if (!this.hasSubscription) {
+            this.tryNext(value);
+        }
+    };
+    ExhaustMapSubscriber.prototype.tryNext = function (value) {
+        var result;
+        var index = this.index++;
+        try {
+            result = this.project(value, index);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.hasSubscription = true;
+        this._innerSub(result, value, index);
+    };
+    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            destination.add(innerSubscription);
+        }
+    };
+    ExhaustMapSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (!this.hasSubscription) {
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    ExhaustMapSubscriber.prototype.notifyError = function (err) {
+        this.destination.error(err);
+    };
+    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.hasSubscription = false;
+        if (this.hasCompleted) {
+            this.destination.complete();
+        }
+    };
+    return ExhaustMapSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               function callAndResolve(c, h) {
-                       if(c.i < 0) {
-                               return call(c.f, c.thisArg, c.params, h);
-                       }
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],115:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function expand(project, concurrent, scheduler) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (scheduler === void 0) { scheduler = undefined; }
+    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
+    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
+}
+exports.expand = expand;
+var ExpandOperator = (function () {
+    function ExpandOperator(project, concurrent, scheduler) {
+        this.project = project;
+        this.concurrent = concurrent;
+        this.scheduler = scheduler;
+    }
+    ExpandOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
+    };
+    return ExpandOperator;
+}());
+exports.ExpandOperator = ExpandOperator;
+var ExpandSubscriber = (function (_super) {
+    __extends(ExpandSubscriber, _super);
+    function ExpandSubscriber(destination, project, concurrent, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.concurrent = concurrent;
+        _this.scheduler = scheduler;
+        _this.index = 0;
+        _this.active = 0;
+        _this.hasCompleted = false;
+        if (concurrent < Number.POSITIVE_INFINITY) {
+            _this.buffer = [];
+        }
+        return _this;
+    }
+    ExpandSubscriber.dispatch = function (arg) {
+        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
+        subscriber.subscribeToProjection(result, value, index);
+    };
+    ExpandSubscriber.prototype._next = function (value) {
+        var destination = this.destination;
+        if (destination.closed) {
+            this._complete();
+            return;
+        }
+        var index = this.index++;
+        if (this.active < this.concurrent) {
+            destination.next(value);
+            try {
+                var project = this.project;
+                var result = project(value, index);
+                if (!this.scheduler) {
+                    this.subscribeToProjection(result, value, index);
+                }
+                else {
+                    var state = { subscriber: this, result: result, value: value, index: index };
+                    var destination_1 = this.destination;
+                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
+                }
+            }
+            catch (e) {
+                destination.error(e);
+            }
+        }
+        else {
+            this.buffer.push(value);
+        }
+    };
+    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
+        this.active++;
+        var destination = this.destination;
+        destination.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
+    };
+    ExpandSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (this.hasCompleted && this.active === 0) {
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this._next(innerValue);
+    };
+    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
+        var buffer = this.buffer;
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.active--;
+        if (buffer && buffer.length > 0) {
+            this._next(buffer.shift());
+        }
+        if (this.hasCompleted && this.active === 0) {
+            this.destination.complete();
+        }
+    };
+    return ExpandSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.ExpandSubscriber = ExpandSubscriber;
 
-                       var handler = Promise._handler(c.args[c.i]);
-                       handler.fold(callAndResolveNext, c, void 0, h);
-               }
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],116:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function filter(predicate, thisArg) {
+    return function filterOperatorFunction(source) {
+        return source.lift(new FilterOperator(predicate, thisArg));
+    };
+}
+exports.filter = filter;
+var FilterOperator = (function () {
+    function FilterOperator(predicate, thisArg) {
+        this.predicate = predicate;
+        this.thisArg = thisArg;
+    }
+    FilterOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
+    };
+    return FilterOperator;
+}());
+var FilterSubscriber = (function (_super) {
+    __extends(FilterSubscriber, _super);
+    function FilterSubscriber(destination, predicate, thisArg) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.thisArg = thisArg;
+        _this.count = 0;
+        return _this;
+    }
+    FilterSubscriber.prototype._next = function (value) {
+        var result;
+        try {
+            result = this.predicate.call(this.thisArg, value, this.count++);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        if (result) {
+            this.destination.next(value);
+        }
+    };
+    return FilterSubscriber;
+}(Subscriber_1.Subscriber));
 
-               function callAndResolveNext(c, x, h) {
-                       c.params[c.i] = x;
-                       c.i -= 1;
-                       callAndResolve(c, h);
-               }
-       }
+},{"../Subscriber":55}],117:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Subscription_1 = require("../Subscription");
+function finalize(callback) {
+    return function (source) { return source.lift(new FinallyOperator(callback)); };
+}
+exports.finalize = finalize;
+var FinallyOperator = (function () {
+    function FinallyOperator(callback) {
+        this.callback = callback;
+    }
+    FinallyOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
+    };
+    return FinallyOperator;
+}());
+var FinallySubscriber = (function (_super) {
+    __extends(FinallySubscriber, _super);
+    function FinallySubscriber(destination, callback) {
+        var _this = _super.call(this, destination) || this;
+        _this.add(new Subscription_1.Subscription(callback));
+        return _this;
+    }
+    return FinallySubscriber;
+}(Subscriber_1.Subscriber));
 
-       function tryCatchResolve(f, thisArg, args, resolver) {
-               try {
-                       resolver.resolve(f.apply(thisArg, args));
-               } catch(e) {
-                       resolver.reject(e);
-               }
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-
-
-},{}],191:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../Subscriber":55,"../Subscription":56}],118:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function find(predicate, thisArg) {
+    if (typeof predicate !== 'function') {
+        throw new TypeError('predicate is not a function');
+    }
+    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
+}
+exports.find = find;
+var FindValueOperator = (function () {
+    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
+        this.predicate = predicate;
+        this.source = source;
+        this.yieldIndex = yieldIndex;
+        this.thisArg = thisArg;
+    }
+    FindValueOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
+    };
+    return FindValueOperator;
+}());
+exports.FindValueOperator = FindValueOperator;
+var FindValueSubscriber = (function (_super) {
+    __extends(FindValueSubscriber, _super);
+    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.source = source;
+        _this.yieldIndex = yieldIndex;
+        _this.thisArg = thisArg;
+        _this.index = 0;
+        return _this;
+    }
+    FindValueSubscriber.prototype.notifyComplete = function (value) {
+        var destination = this.destination;
+        destination.next(value);
+        destination.complete();
+        this.unsubscribe();
+    };
+    FindValueSubscriber.prototype._next = function (value) {
+        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
+        var index = this.index++;
+        try {
+            var result = predicate.call(thisArg || this, value, index, this.source);
+            if (result) {
+                this.notifyComplete(this.yieldIndex ? index : value);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    FindValueSubscriber.prototype._complete = function () {
+        this.notifyComplete(this.yieldIndex ? -1 : undefined);
+    };
+    return FindValueSubscriber;
+}(Subscriber_1.Subscriber));
+exports.FindValueSubscriber = FindValueSubscriber;
 
-(function(define) { 'use strict';
-define(function(require) {
+},{"../Subscriber":55}],119:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var find_1 = require("../operators/find");
+function findIndex(predicate, thisArg) {
+    return function (source) { return source.lift(new find_1.FindValueOperator(predicate, source, true, thisArg)); };
+}
+exports.findIndex = findIndex;
 
-       var state = require('../state');
-       var applier = require('../apply');
+},{"../operators/find":118}],120:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyError_1 = require("../util/EmptyError");
+var filter_1 = require("./filter");
+var take_1 = require("./take");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var throwIfEmpty_1 = require("./throwIfEmpty");
+var identity_1 = require("../util/identity");
+function first(predicate, defaultValue) {
+    var hasDefaultValue = arguments.length >= 2;
+    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
+}
+exports.first = first;
 
-       return function array(Promise) {
+},{"../util/EmptyError":212,"../util/identity":219,"./defaultIfEmpty":103,"./filter":116,"./take":168,"./throwIfEmpty":175}],121:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Subscription_1 = require("../Subscription");
+var Observable_1 = require("../Observable");
+var Subject_1 = require("../Subject");
+function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
+    return function (source) {
+        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
+    };
+}
+exports.groupBy = groupBy;
+var GroupByOperator = (function () {
+    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
+        this.keySelector = keySelector;
+        this.elementSelector = elementSelector;
+        this.durationSelector = durationSelector;
+        this.subjectSelector = subjectSelector;
+    }
+    GroupByOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
+    };
+    return GroupByOperator;
+}());
+var GroupBySubscriber = (function (_super) {
+    __extends(GroupBySubscriber, _super);
+    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.keySelector = keySelector;
+        _this.elementSelector = elementSelector;
+        _this.durationSelector = durationSelector;
+        _this.subjectSelector = subjectSelector;
+        _this.groups = null;
+        _this.attemptedToUnsubscribe = false;
+        _this.count = 0;
+        return _this;
+    }
+    GroupBySubscriber.prototype._next = function (value) {
+        var key;
+        try {
+            key = this.keySelector(value);
+        }
+        catch (err) {
+            this.error(err);
+            return;
+        }
+        this._group(value, key);
+    };
+    GroupBySubscriber.prototype._group = function (value, key) {
+        var groups = this.groups;
+        if (!groups) {
+            groups = this.groups = new Map();
+        }
+        var group = groups.get(key);
+        var element;
+        if (this.elementSelector) {
+            try {
+                element = this.elementSelector(value);
+            }
+            catch (err) {
+                this.error(err);
+            }
+        }
+        else {
+            element = value;
+        }
+        if (!group) {
+            group = (this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject());
+            groups.set(key, group);
+            var groupedObservable = new GroupedObservable(key, group, this);
+            this.destination.next(groupedObservable);
+            if (this.durationSelector) {
+                var duration = void 0;
+                try {
+                    duration = this.durationSelector(new GroupedObservable(key, group));
+                }
+                catch (err) {
+                    this.error(err);
+                    return;
+                }
+                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
+            }
+        }
+        if (!group.closed) {
+            group.next(element);
+        }
+    };
+    GroupBySubscriber.prototype._error = function (err) {
+        var groups = this.groups;
+        if (groups) {
+            groups.forEach(function (group, key) {
+                group.error(err);
+            });
+            groups.clear();
+        }
+        this.destination.error(err);
+    };
+    GroupBySubscriber.prototype._complete = function () {
+        var groups = this.groups;
+        if (groups) {
+            groups.forEach(function (group, key) {
+                group.complete();
+            });
+            groups.clear();
+        }
+        this.destination.complete();
+    };
+    GroupBySubscriber.prototype.removeGroup = function (key) {
+        this.groups.delete(key);
+    };
+    GroupBySubscriber.prototype.unsubscribe = function () {
+        if (!this.closed) {
+            this.attemptedToUnsubscribe = true;
+            if (this.count === 0) {
+                _super.prototype.unsubscribe.call(this);
+            }
+        }
+    };
+    return GroupBySubscriber;
+}(Subscriber_1.Subscriber));
+var GroupDurationSubscriber = (function (_super) {
+    __extends(GroupDurationSubscriber, _super);
+    function GroupDurationSubscriber(key, group, parent) {
+        var _this = _super.call(this, group) || this;
+        _this.key = key;
+        _this.group = group;
+        _this.parent = parent;
+        return _this;
+    }
+    GroupDurationSubscriber.prototype._next = function (value) {
+        this.complete();
+    };
+    GroupDurationSubscriber.prototype._unsubscribe = function () {
+        var _a = this, parent = _a.parent, key = _a.key;
+        this.key = this.parent = null;
+        if (parent) {
+            parent.removeGroup(key);
+        }
+    };
+    return GroupDurationSubscriber;
+}(Subscriber_1.Subscriber));
+var GroupedObservable = (function (_super) {
+    __extends(GroupedObservable, _super);
+    function GroupedObservable(key, groupSubject, refCountSubscription) {
+        var _this = _super.call(this) || this;
+        _this.key = key;
+        _this.groupSubject = groupSubject;
+        _this.refCountSubscription = refCountSubscription;
+        return _this;
+    }
+    GroupedObservable.prototype._subscribe = function (subscriber) {
+        var subscription = new Subscription_1.Subscription();
+        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
+        if (refCountSubscription && !refCountSubscription.closed) {
+            subscription.add(new InnerRefCountSubscription(refCountSubscription));
+        }
+        subscription.add(groupSubject.subscribe(subscriber));
+        return subscription;
+    };
+    return GroupedObservable;
+}(Observable_1.Observable));
+exports.GroupedObservable = GroupedObservable;
+var InnerRefCountSubscription = (function (_super) {
+    __extends(InnerRefCountSubscription, _super);
+    function InnerRefCountSubscription(parent) {
+        var _this = _super.call(this) || this;
+        _this.parent = parent;
+        parent.count++;
+        return _this;
+    }
+    InnerRefCountSubscription.prototype.unsubscribe = function () {
+        var parent = this.parent;
+        if (!parent.closed && !this.closed) {
+            _super.prototype.unsubscribe.call(this);
+            parent.count -= 1;
+            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
+                parent.unsubscribe();
+            }
+        }
+    };
+    return InnerRefCountSubscription;
+}(Subscription_1.Subscription));
 
-               var applyFold = applier(Promise);
-               var toPromise = Promise.resolve;
-               var all = Promise.all;
+},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56}],122:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function ignoreElements() {
+    return function ignoreElementsOperatorFunction(source) {
+        return source.lift(new IgnoreElementsOperator());
+    };
+}
+exports.ignoreElements = ignoreElements;
+var IgnoreElementsOperator = (function () {
+    function IgnoreElementsOperator() {
+    }
+    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
+    };
+    return IgnoreElementsOperator;
+}());
+var IgnoreElementsSubscriber = (function (_super) {
+    __extends(IgnoreElementsSubscriber, _super);
+    function IgnoreElementsSubscriber() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    IgnoreElementsSubscriber.prototype._next = function (unused) {
+    };
+    return IgnoreElementsSubscriber;
+}(Subscriber_1.Subscriber));
 
-               var ar = Array.prototype.reduce;
-               var arr = Array.prototype.reduceRight;
-               var slice = Array.prototype.slice;
+},{"../Subscriber":55}],123:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function isEmpty() {
+    return function (source) { return source.lift(new IsEmptyOperator()); };
+}
+exports.isEmpty = isEmpty;
+var IsEmptyOperator = (function () {
+    function IsEmptyOperator() {
+    }
+    IsEmptyOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new IsEmptySubscriber(observer));
+    };
+    return IsEmptyOperator;
+}());
+var IsEmptySubscriber = (function (_super) {
+    __extends(IsEmptySubscriber, _super);
+    function IsEmptySubscriber(destination) {
+        return _super.call(this, destination) || this;
+    }
+    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
+        var destination = this.destination;
+        destination.next(isEmpty);
+        destination.complete();
+    };
+    IsEmptySubscriber.prototype._next = function (value) {
+        this.notifyComplete(false);
+    };
+    IsEmptySubscriber.prototype._complete = function () {
+        this.notifyComplete(true);
+    };
+    return IsEmptySubscriber;
+}(Subscriber_1.Subscriber));
 
-               // Additional array combinators
+},{"../Subscriber":55}],124:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyError_1 = require("../util/EmptyError");
+var filter_1 = require("./filter");
+var takeLast_1 = require("./takeLast");
+var throwIfEmpty_1 = require("./throwIfEmpty");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var identity_1 = require("../util/identity");
+function last(predicate, defaultValue) {
+    var hasDefaultValue = arguments.length >= 2;
+    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
+}
+exports.last = last;
 
-               Promise.any = any;
-               Promise.some = some;
-               Promise.settle = settle;
+},{"../util/EmptyError":212,"../util/identity":219,"./defaultIfEmpty":103,"./filter":116,"./takeLast":169,"./throwIfEmpty":175}],125:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function map(project, thisArg) {
+    return function mapOperation(source) {
+        if (typeof project !== 'function') {
+            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
+        }
+        return source.lift(new MapOperator(project, thisArg));
+    };
+}
+exports.map = map;
+var MapOperator = (function () {
+    function MapOperator(project, thisArg) {
+        this.project = project;
+        this.thisArg = thisArg;
+    }
+    MapOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
+    };
+    return MapOperator;
+}());
+exports.MapOperator = MapOperator;
+var MapSubscriber = (function (_super) {
+    __extends(MapSubscriber, _super);
+    function MapSubscriber(destination, project, thisArg) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.count = 0;
+        _this.thisArg = thisArg || _this;
+        return _this;
+    }
+    MapSubscriber.prototype._next = function (value) {
+        var result;
+        try {
+            result = this.project.call(this.thisArg, value, this.count++);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return MapSubscriber;
+}(Subscriber_1.Subscriber));
 
-               Promise.map = map;
-               Promise.filter = filter;
-               Promise.reduce = reduce;
-               Promise.reduceRight = reduceRight;
+},{"../Subscriber":55}],126:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function mapTo(value) {
+    return function (source) { return source.lift(new MapToOperator(value)); };
+}
+exports.mapTo = mapTo;
+var MapToOperator = (function () {
+    function MapToOperator(value) {
+        this.value = value;
+    }
+    MapToOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MapToSubscriber(subscriber, this.value));
+    };
+    return MapToOperator;
+}());
+var MapToSubscriber = (function (_super) {
+    __extends(MapToSubscriber, _super);
+    function MapToSubscriber(destination, value) {
+        var _this = _super.call(this, destination) || this;
+        _this.value = value;
+        return _this;
+    }
+    MapToSubscriber.prototype._next = function (x) {
+        this.destination.next(this.value);
+    };
+    return MapToSubscriber;
+}(Subscriber_1.Subscriber));
 
-               /**
-                * When this promise fulfills with an array, do
-                * onFulfilled.apply(void 0, array)
-                * @param {function} onFulfilled function to apply
-                * @returns {Promise} promise for the result of applying onFulfilled
-                */
-               Promise.prototype.spread = function(onFulfilled) {
-                       return this.then(all).then(function(array) {
-                               return onFulfilled.apply(this, array);
-                       });
-               };
+},{"../Subscriber":55}],127:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Notification_1 = require("../Notification");
+function materialize() {
+    return function materializeOperatorFunction(source) {
+        return source.lift(new MaterializeOperator());
+    };
+}
+exports.materialize = materialize;
+var MaterializeOperator = (function () {
+    function MaterializeOperator() {
+    }
+    MaterializeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MaterializeSubscriber(subscriber));
+    };
+    return MaterializeOperator;
+}());
+var MaterializeSubscriber = (function (_super) {
+    __extends(MaterializeSubscriber, _super);
+    function MaterializeSubscriber(destination) {
+        return _super.call(this, destination) || this;
+    }
+    MaterializeSubscriber.prototype._next = function (value) {
+        this.destination.next(Notification_1.Notification.createNext(value));
+    };
+    MaterializeSubscriber.prototype._error = function (err) {
+        var destination = this.destination;
+        destination.next(Notification_1.Notification.createError(err));
+        destination.complete();
+    };
+    MaterializeSubscriber.prototype._complete = function () {
+        var destination = this.destination;
+        destination.next(Notification_1.Notification.createComplete());
+        destination.complete();
+    };
+    return MaterializeSubscriber;
+}(Subscriber_1.Subscriber));
 
-               return Promise;
+},{"../Notification":47,"../Subscriber":55}],128:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var reduce_1 = require("./reduce");
+function max(comparer) {
+    var max = (typeof comparer === 'function')
+        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
+        : function (x, y) { return x > y ? x : y; };
+    return reduce_1.reduce(max);
+}
+exports.max = max;
 
-               /**
-                * One-winner competitive race.
-                * Return a promise that will fulfill when one of the promises
-                * in the input array fulfills, or will reject when all promises
-                * have rejected.
-                * @param {array} promises
-                * @returns {Promise} promise for the first fulfilled value
-                */
-               function any(promises) {
-                       var p = Promise._defer();
-                       var resolver = p._handler;
-                       var l = promises.length>>>0;
+},{"./reduce":146}],129:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var merge_1 = require("../observable/merge");
+function merge() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); };
+}
+exports.merge = merge;
 
-                       var pending = l;
-                       var errors = [];
+},{"../observable/merge":74}],130:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeMap_1 = require("./mergeMap");
+var identity_1 = require("../util/identity");
+function mergeAll(concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
+}
+exports.mergeAll = mergeAll;
 
-                       for (var h, x, i = 0; i < l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       --pending;
-                                       continue;
-                               }
-
-                               h = Promise._handler(x);
-                               if(h.state() > 0) {
-                                       resolver.become(h);
-                                       Promise._visitRemaining(promises, i, h);
-                                       break;
-                               } else {
-                                       h.visit(resolver, handleFulfill, handleReject);
-                               }
-                       }
+},{"../util/identity":219,"./mergeMap":131}],131:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var map_1 = require("./map");
+var from_1 = require("../observable/from");
+function mergeMap(project, resultSelector, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (typeof resultSelector === 'function') {
+        return function (source) { return source.pipe(mergeMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
+    }
+    else if (typeof resultSelector === 'number') {
+        concurrent = resultSelector;
+    }
+    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
+}
+exports.mergeMap = mergeMap;
+var MergeMapOperator = (function () {
+    function MergeMapOperator(project, concurrent) {
+        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+        this.project = project;
+        this.concurrent = concurrent;
+    }
+    MergeMapOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
+    };
+    return MergeMapOperator;
+}());
+exports.MergeMapOperator = MergeMapOperator;
+var MergeMapSubscriber = (function (_super) {
+    __extends(MergeMapSubscriber, _super);
+    function MergeMapSubscriber(destination, project, concurrent) {
+        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.concurrent = concurrent;
+        _this.hasCompleted = false;
+        _this.buffer = [];
+        _this.active = 0;
+        _this.index = 0;
+        return _this;
+    }
+    MergeMapSubscriber.prototype._next = function (value) {
+        if (this.active < this.concurrent) {
+            this._tryNext(value);
+        }
+        else {
+            this.buffer.push(value);
+        }
+    };
+    MergeMapSubscriber.prototype._tryNext = function (value) {
+        var result;
+        var index = this.index++;
+        try {
+            result = this.project(value, index);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.active++;
+        this._innerSub(result, value, index);
+    };
+    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            destination.add(innerSubscription);
+        }
+    };
+    MergeMapSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (this.active === 0 && this.buffer.length === 0) {
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
+        var buffer = this.buffer;
+        this.remove(innerSub);
+        this.active--;
+        if (buffer.length > 0) {
+            this._next(buffer.shift());
+        }
+        else if (this.active === 0 && this.hasCompleted) {
+            this.destination.complete();
+        }
+    };
+    return MergeMapSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.MergeMapSubscriber = MergeMapSubscriber;
 
-                       if(pending === 0) {
-                               resolver.reject(new RangeError('any(): array must not be empty'));
-                       }
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],132:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeMap_1 = require("./mergeMap");
+function mergeMapTo(innerObservable, resultSelector, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (typeof resultSelector === 'function') {
+        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
+    }
+    if (typeof resultSelector === 'number') {
+        concurrent = resultSelector;
+    }
+    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
+}
+exports.mergeMapTo = mergeMapTo;
 
-                       return p;
+},{"./mergeMap":131}],133:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+function mergeScan(accumulator, seed, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
+}
+exports.mergeScan = mergeScan;
+var MergeScanOperator = (function () {
+    function MergeScanOperator(accumulator, seed, concurrent) {
+        this.accumulator = accumulator;
+        this.seed = seed;
+        this.concurrent = concurrent;
+    }
+    MergeScanOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
+    };
+    return MergeScanOperator;
+}());
+exports.MergeScanOperator = MergeScanOperator;
+var MergeScanSubscriber = (function (_super) {
+    __extends(MergeScanSubscriber, _super);
+    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
+        var _this = _super.call(this, destination) || this;
+        _this.accumulator = accumulator;
+        _this.acc = acc;
+        _this.concurrent = concurrent;
+        _this.hasValue = false;
+        _this.hasCompleted = false;
+        _this.buffer = [];
+        _this.active = 0;
+        _this.index = 0;
+        return _this;
+    }
+    MergeScanSubscriber.prototype._next = function (value) {
+        if (this.active < this.concurrent) {
+            var index = this.index++;
+            var destination = this.destination;
+            var ish = void 0;
+            try {
+                var accumulator = this.accumulator;
+                ish = accumulator(this.acc, value, index);
+            }
+            catch (e) {
+                return destination.error(e);
+            }
+            this.active++;
+            this._innerSub(ish, value, index);
+        }
+        else {
+            this.buffer.push(value);
+        }
+    };
+    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            destination.add(innerSubscription);
+        }
+    };
+    MergeScanSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (this.active === 0 && this.buffer.length === 0) {
+            if (this.hasValue === false) {
+                this.destination.next(this.acc);
+            }
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var destination = this.destination;
+        this.acc = innerValue;
+        this.hasValue = true;
+        destination.next(innerValue);
+    };
+    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
+        var buffer = this.buffer;
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.active--;
+        if (buffer.length > 0) {
+            this._next(buffer.shift());
+        }
+        else if (this.active === 0 && this.hasCompleted) {
+            if (this.hasValue === false) {
+                this.destination.next(this.acc);
+            }
+            this.destination.complete();
+        }
+    };
+    return MergeScanSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.MergeScanSubscriber = MergeScanSubscriber;
 
-                       function handleFulfill(x) {
-                               /*jshint validthis:true*/
-                               errors = null;
-                               this.resolve(x); // this === resolver
-                       }
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],134:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var reduce_1 = require("./reduce");
+function min(comparer) {
+    var min = (typeof comparer === 'function')
+        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
+        : function (x, y) { return x < y ? x : y; };
+    return reduce_1.reduce(min);
+}
+exports.min = min;
 
-                       function handleReject(e) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
+},{"./reduce":146}],135:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ConnectableObservable_1 = require("../observable/ConnectableObservable");
+function multicast(subjectOrSubjectFactory, selector) {
+    return function multicastOperatorFunction(source) {
+        var subjectFactory;
+        if (typeof subjectOrSubjectFactory === 'function') {
+            subjectFactory = subjectOrSubjectFactory;
+        }
+        else {
+            subjectFactory = function subjectFactory() {
+                return subjectOrSubjectFactory;
+            };
+        }
+        if (typeof selector === 'function') {
+            return source.lift(new MulticastOperator(subjectFactory, selector));
+        }
+        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
+        connectable.source = source;
+        connectable.subjectFactory = subjectFactory;
+        return connectable;
+    };
+}
+exports.multicast = multicast;
+var MulticastOperator = (function () {
+    function MulticastOperator(subjectFactory, selector) {
+        this.subjectFactory = subjectFactory;
+        this.selector = selector;
+    }
+    MulticastOperator.prototype.call = function (subscriber, source) {
+        var selector = this.selector;
+        var subject = this.subjectFactory();
+        var subscription = selector(subject).subscribe(subscriber);
+        subscription.add(source.subscribe(subject));
+        return subscription;
+    };
+    return MulticastOperator;
+}());
+exports.MulticastOperator = MulticastOperator;
 
-                               errors.push(e);
-                               if(--pending === 0) {
-                                       this.reject(errors);
-                               }
-                       }
-               }
+},{"../observable/ConnectableObservable":58}],136:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Notification_1 = require("../Notification");
+function observeOn(scheduler, delay) {
+    if (delay === void 0) { delay = 0; }
+    return function observeOnOperatorFunction(source) {
+        return source.lift(new ObserveOnOperator(scheduler, delay));
+    };
+}
+exports.observeOn = observeOn;
+var ObserveOnOperator = (function () {
+    function ObserveOnOperator(scheduler, delay) {
+        if (delay === void 0) { delay = 0; }
+        this.scheduler = scheduler;
+        this.delay = delay;
+    }
+    ObserveOnOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
+    };
+    return ObserveOnOperator;
+}());
+exports.ObserveOnOperator = ObserveOnOperator;
+var ObserveOnSubscriber = (function (_super) {
+    __extends(ObserveOnSubscriber, _super);
+    function ObserveOnSubscriber(destination, scheduler, delay) {
+        if (delay === void 0) { delay = 0; }
+        var _this = _super.call(this, destination) || this;
+        _this.scheduler = scheduler;
+        _this.delay = delay;
+        return _this;
+    }
+    ObserveOnSubscriber.dispatch = function (arg) {
+        var notification = arg.notification, destination = arg.destination;
+        notification.observe(destination);
+        this.unsubscribe();
+    };
+    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
+        var destination = this.destination;
+        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
+    };
+    ObserveOnSubscriber.prototype._next = function (value) {
+        this.scheduleMessage(Notification_1.Notification.createNext(value));
+    };
+    ObserveOnSubscriber.prototype._error = function (err) {
+        this.scheduleMessage(Notification_1.Notification.createError(err));
+        this.unsubscribe();
+    };
+    ObserveOnSubscriber.prototype._complete = function () {
+        this.scheduleMessage(Notification_1.Notification.createComplete());
+        this.unsubscribe();
+    };
+    return ObserveOnSubscriber;
+}(Subscriber_1.Subscriber));
+exports.ObserveOnSubscriber = ObserveOnSubscriber;
+var ObserveOnMessage = (function () {
+    function ObserveOnMessage(notification, destination) {
+        this.notification = notification;
+        this.destination = destination;
+    }
+    return ObserveOnMessage;
+}());
+exports.ObserveOnMessage = ObserveOnMessage;
 
-               /**
-                * N-winner competitive race
-                * Return a promise that will fulfill when n input promises have
-                * fulfilled, or will reject when it becomes impossible for n
-                * input promises to fulfill (ie when promises.length - n + 1
-                * have rejected)
-                * @param {array} promises
-                * @param {number} n
-                * @returns {Promise} promise for the earliest n fulfillment values
-                *
-                * @deprecated
-                */
-               function some(promises, n) {
-                       /*jshint maxcomplexity:7*/
-                       var p = Promise._defer();
-                       var resolver = p._handler;
-
-                       var results = [];
-                       var errors = [];
-
-                       var l = promises.length>>>0;
-                       var nFulfill = 0;
-                       var nReject;
-                       var x, i; // reused in both for() loops
+},{"../Notification":47,"../Subscriber":55}],137:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var from_1 = require("../observable/from");
+var isArray_1 = require("../util/isArray");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function onErrorResumeNext() {
+    var nextSources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        nextSources[_i] = arguments[_i];
+    }
+    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
+        nextSources = nextSources[0];
+    }
+    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
+}
+exports.onErrorResumeNext = onErrorResumeNext;
+function onErrorResumeNextStatic() {
+    var nextSources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        nextSources[_i] = arguments[_i];
+    }
+    var source = null;
+    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
+        nextSources = nextSources[0];
+    }
+    source = nextSources.shift();
+    return from_1.from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
+}
+exports.onErrorResumeNextStatic = onErrorResumeNextStatic;
+var OnErrorResumeNextOperator = (function () {
+    function OnErrorResumeNextOperator(nextSources) {
+        this.nextSources = nextSources;
+    }
+    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
+    };
+    return OnErrorResumeNextOperator;
+}());
+var OnErrorResumeNextSubscriber = (function (_super) {
+    __extends(OnErrorResumeNextSubscriber, _super);
+    function OnErrorResumeNextSubscriber(destination, nextSources) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.nextSources = nextSources;
+        return _this;
+    }
+    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
+        this.subscribeToNextSource();
+    };
+    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.subscribeToNextSource();
+    };
+    OnErrorResumeNextSubscriber.prototype._error = function (err) {
+        this.subscribeToNextSource();
+        this.unsubscribe();
+    };
+    OnErrorResumeNextSubscriber.prototype._complete = function () {
+        this.subscribeToNextSource();
+        this.unsubscribe();
+    };
+    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
+        var next = this.nextSources.shift();
+        if (!!next) {
+            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
+            var destination = this.destination;
+            destination.add(innerSubscriber);
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber);
+            if (innerSubscription !== innerSubscriber) {
+                destination.add(innerSubscription);
+            }
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    return OnErrorResumeNextSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-                       // First pass: count actual array items
-                       for(i=0; i<l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-                               ++nFulfill;
-                       }
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/isArray":220,"../util/subscribeToResult":239}],138:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function pairwise() {
+    return function (source) { return source.lift(new PairwiseOperator()); };
+}
+exports.pairwise = pairwise;
+var PairwiseOperator = (function () {
+    function PairwiseOperator() {
+    }
+    PairwiseOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new PairwiseSubscriber(subscriber));
+    };
+    return PairwiseOperator;
+}());
+var PairwiseSubscriber = (function (_super) {
+    __extends(PairwiseSubscriber, _super);
+    function PairwiseSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasPrev = false;
+        return _this;
+    }
+    PairwiseSubscriber.prototype._next = function (value) {
+        var pair;
+        if (this.hasPrev) {
+            pair = [this.prev, value];
+        }
+        else {
+            this.hasPrev = true;
+        }
+        this.prev = value;
+        if (pair) {
+            this.destination.next(pair);
+        }
+    };
+    return PairwiseSubscriber;
+}(Subscriber_1.Subscriber));
 
-                       // Compute actual goals
-                       n = Math.max(n, 0);
-                       nReject = (nFulfill - n + 1);
-                       nFulfill = Math.min(n, nFulfill);
+},{"../Subscriber":55}],139:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var not_1 = require("../util/not");
+var filter_1 = require("./filter");
+function partition(predicate, thisArg) {
+    return function (source) { return [
+        filter_1.filter(predicate, thisArg)(source),
+        filter_1.filter(not_1.not(predicate, thisArg))(source)
+    ]; };
+}
+exports.partition = partition;
 
-                       if(n > nFulfill) {
-                               resolver.reject(new RangeError('some(): array must contain at least '
-                               + n + ' item(s), but had ' + nFulfill));
-                       } else if(nFulfill === 0) {
-                               resolver.resolve(results);
-                       }
+},{"../util/not":232,"./filter":116}],140:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var map_1 = require("./map");
+function pluck() {
+    var properties = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        properties[_i] = arguments[_i];
+    }
+    var length = properties.length;
+    if (length === 0) {
+        throw new Error('list of properties cannot be empty.');
+    }
+    return function (source) { return map_1.map(plucker(properties, length))(source); };
+}
+exports.pluck = pluck;
+function plucker(props, length) {
+    var mapper = function (x) {
+        var currentProp = x;
+        for (var i = 0; i < length; i++) {
+            var p = currentProp[props[i]];
+            if (typeof p !== 'undefined') {
+                currentProp = p;
+            }
+            else {
+                return undefined;
+            }
+        }
+        return currentProp;
+    };
+    return mapper;
+}
 
-                       // Second pass: observe each array item, make progress toward goals
-                       for(i=0; i<l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
+},{"./map":125}],141:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var multicast_1 = require("./multicast");
+function publish(selector) {
+    return selector ?
+        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
+        multicast_1.multicast(new Subject_1.Subject());
+}
+exports.publish = publish;
 
-                               Promise._handler(x).visit(resolver, fulfill, reject, resolver.notify);
-                       }
+},{"../Subject":53,"./multicast":135}],142:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var BehaviorSubject_1 = require("../BehaviorSubject");
+var multicast_1 = require("./multicast");
+function publishBehavior(value) {
+    return function (source) { return multicast_1.multicast(new BehaviorSubject_1.BehaviorSubject(value))(source); };
+}
+exports.publishBehavior = publishBehavior;
 
-                       return p;
+},{"../BehaviorSubject":45,"./multicast":135}],143:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncSubject_1 = require("../AsyncSubject");
+var multicast_1 = require("./multicast");
+function publishLast() {
+    return function (source) { return multicast_1.multicast(new AsyncSubject_1.AsyncSubject())(source); };
+}
+exports.publishLast = publishLast;
 
-                       function fulfill(x) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
+},{"../AsyncSubject":44,"./multicast":135}],144:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ReplaySubject_1 = require("../ReplaySubject");
+var multicast_1 = require("./multicast");
+function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
+    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
+        scheduler = selectorOrScheduler;
+    }
+    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
+    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
+    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
+}
+exports.publishReplay = publishReplay;
 
-                               results.push(x);
-                               if(--nFulfill === 0) {
-                                       errors = null;
-                                       this.resolve(results);
-                               }
-                       }
+},{"../ReplaySubject":51,"./multicast":135}],145:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("../util/isArray");
+var race_1 = require("../observable/race");
+function race() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function raceOperatorFunction(source) {
+        if (observables.length === 1 && isArray_1.isArray(observables[0])) {
+            observables = observables[0];
+        }
+        return source.lift.call(race_1.race.apply(void 0, [source].concat(observables)));
+    };
+}
+exports.race = race;
 
-                       function reject(e) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
+},{"../observable/race":80,"../util/isArray":220}],146:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var scan_1 = require("./scan");
+var takeLast_1 = require("./takeLast");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var pipe_1 = require("../util/pipe");
+function reduce(accumulator, seed) {
+    if (arguments.length >= 2) {
+        return function reduceOperatorFunctionWithSeed(source) {
+            return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source);
+        };
+    }
+    return function reduceOperatorFunction(source) {
+        return pipe_1.pipe(scan_1.scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast_1.takeLast(1))(source);
+    };
+}
+exports.reduce = reduce;
 
-                               errors.push(e);
-                               if(--nReject === 0) {
-                                       results = null;
-                                       this.reject(errors);
-                               }
-                       }
-               }
+},{"../util/pipe":233,"./defaultIfEmpty":103,"./scan":154,"./takeLast":169}],147:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function refCount() {
+    return function refCountOperatorFunction(source) {
+        return source.lift(new RefCountOperator(source));
+    };
+}
+exports.refCount = refCount;
+var RefCountOperator = (function () {
+    function RefCountOperator(connectable) {
+        this.connectable = connectable;
+    }
+    RefCountOperator.prototype.call = function (subscriber, source) {
+        var connectable = this.connectable;
+        connectable._refCount++;
+        var refCounter = new RefCountSubscriber(subscriber, connectable);
+        var subscription = source.subscribe(refCounter);
+        if (!refCounter.closed) {
+            refCounter.connection = connectable.connect();
+        }
+        return subscription;
+    };
+    return RefCountOperator;
+}());
+var RefCountSubscriber = (function (_super) {
+    __extends(RefCountSubscriber, _super);
+    function RefCountSubscriber(destination, connectable) {
+        var _this = _super.call(this, destination) || this;
+        _this.connectable = connectable;
+        return _this;
+    }
+    RefCountSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (!connectable) {
+            this.connection = null;
+            return;
+        }
+        this.connectable = null;
+        var refCount = connectable._refCount;
+        if (refCount <= 0) {
+            this.connection = null;
+            return;
+        }
+        connectable._refCount = refCount - 1;
+        if (refCount > 1) {
+            this.connection = null;
+            return;
+        }
+        var connection = this.connection;
+        var sharedConnection = connectable._connection;
+        this.connection = null;
+        if (sharedConnection && (!connection || sharedConnection === connection)) {
+            sharedConnection.unsubscribe();
+        }
+    };
+    return RefCountSubscriber;
+}(Subscriber_1.Subscriber));
 
-               /**
-                * Apply f to the value of each promise in a list of promises
-                * and return a new list containing the results.
-                * @param {array} promises
-                * @param {function(x:*, index:Number):*} f mapping function
-                * @returns {Promise}
-                */
-               function map(promises, f) {
-                       return Promise._traverse(f, promises);
-               }
+},{"../Subscriber":55}],148:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var empty_1 = require("../observable/empty");
+function repeat(count) {
+    if (count === void 0) { count = -1; }
+    return function (source) {
+        if (count === 0) {
+            return empty_1.empty();
+        }
+        else if (count < 0) {
+            return source.lift(new RepeatOperator(-1, source));
+        }
+        else {
+            return source.lift(new RepeatOperator(count - 1, source));
+        }
+    };
+}
+exports.repeat = repeat;
+var RepeatOperator = (function () {
+    function RepeatOperator(count, source) {
+        this.count = count;
+        this.source = source;
+    }
+    RepeatOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
+    };
+    return RepeatOperator;
+}());
+var RepeatSubscriber = (function (_super) {
+    __extends(RepeatSubscriber, _super);
+    function RepeatSubscriber(destination, count, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.count = count;
+        _this.source = source;
+        return _this;
+    }
+    RepeatSubscriber.prototype.complete = function () {
+        if (!this.isStopped) {
+            var _a = this, source = _a.source, count = _a.count;
+            if (count === 0) {
+                return _super.prototype.complete.call(this);
+            }
+            else if (count > -1) {
+                this.count = count - 1;
+            }
+            source.subscribe(this._unsubscribeAndRecycle());
+        }
+    };
+    return RepeatSubscriber;
+}(Subscriber_1.Subscriber));
 
-               /**
-                * Filter the provided array of promises using the provided predicate.  Input may
-                * contain promises and values
-                * @param {Array} promises array of promises and values
-                * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-                *  Must return truthy (or promise for truthy) for items to retain.
-                * @returns {Promise} promise that will fulfill with an array containing all items
-                *  for which predicate returned truthy.
-                */
-               function filter(promises, predicate) {
-                       var a = slice.call(promises);
-                       return Promise._traverse(predicate, a).then(function(keep) {
-                               return filterSync(a, keep);
-                       });
-               }
+},{"../Subscriber":55,"../observable/empty":65}],149:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function repeatWhen(notifier) {
+    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
+}
+exports.repeatWhen = repeatWhen;
+var RepeatWhenOperator = (function () {
+    function RepeatWhenOperator(notifier) {
+        this.notifier = notifier;
+    }
+    RepeatWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
+    };
+    return RepeatWhenOperator;
+}());
+var RepeatWhenSubscriber = (function (_super) {
+    __extends(RepeatWhenSubscriber, _super);
+    function RepeatWhenSubscriber(destination, notifier, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.notifier = notifier;
+        _this.source = source;
+        _this.sourceIsBeingSubscribedTo = true;
+        return _this;
+    }
+    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.sourceIsBeingSubscribedTo = true;
+        this.source.subscribe(this);
+    };
+    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
+        if (this.sourceIsBeingSubscribedTo === false) {
+            return _super.prototype.complete.call(this);
+        }
+    };
+    RepeatWhenSubscriber.prototype.complete = function () {
+        this.sourceIsBeingSubscribedTo = false;
+        if (!this.isStopped) {
+            if (!this.retries) {
+                this.subscribeToRetries();
+            }
+            if (!this.retriesSubscription || this.retriesSubscription.closed) {
+                return _super.prototype.complete.call(this);
+            }
+            this._unsubscribeAndRecycle();
+            this.notifications.next();
+        }
+    };
+    RepeatWhenSubscriber.prototype._unsubscribe = function () {
+        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
+        if (notifications) {
+            notifications.unsubscribe();
+            this.notifications = null;
+        }
+        if (retriesSubscription) {
+            retriesSubscription.unsubscribe();
+            this.retriesSubscription = null;
+        }
+        this.retries = null;
+    };
+    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
+        var _unsubscribe = this._unsubscribe;
+        this._unsubscribe = null;
+        _super.prototype._unsubscribeAndRecycle.call(this);
+        this._unsubscribe = _unsubscribe;
+        return this;
+    };
+    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
+        this.notifications = new Subject_1.Subject();
+        var retries;
+        try {
+            var notifier = this.notifier;
+            retries = notifier(this.notifications);
+        }
+        catch (e) {
+            return _super.prototype.complete.call(this);
+        }
+        this.retries = retries;
+        this.retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
+    };
+    return RepeatWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               function filterSync(promises, keep) {
-                       // Safe because we know all promises have fulfilled if we've made it this far
-                       var l = keep.length;
-                       var filtered = new Array(l);
-                       for(var i=0, j=0; i<l; ++i) {
-                               if(keep[i]) {
-                                       filtered[j++] = Promise._handler(promises[i]).value;
-                               }
-                       }
-                       filtered.length = j;
-                       return filtered;
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],150:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function retry(count) {
+    if (count === void 0) { count = -1; }
+    return function (source) { return source.lift(new RetryOperator(count, source)); };
+}
+exports.retry = retry;
+var RetryOperator = (function () {
+    function RetryOperator(count, source) {
+        this.count = count;
+        this.source = source;
+    }
+    RetryOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
+    };
+    return RetryOperator;
+}());
+var RetrySubscriber = (function (_super) {
+    __extends(RetrySubscriber, _super);
+    function RetrySubscriber(destination, count, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.count = count;
+        _this.source = source;
+        return _this;
+    }
+    RetrySubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var _a = this, source = _a.source, count = _a.count;
+            if (count === 0) {
+                return _super.prototype.error.call(this, err);
+            }
+            else if (count > -1) {
+                this.count = count - 1;
+            }
+            source.subscribe(this._unsubscribeAndRecycle());
+        }
+    };
+    return RetrySubscriber;
+}(Subscriber_1.Subscriber));
 
-               }
+},{"../Subscriber":55}],151:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function retryWhen(notifier) {
+    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
+}
+exports.retryWhen = retryWhen;
+var RetryWhenOperator = (function () {
+    function RetryWhenOperator(notifier, source) {
+        this.notifier = notifier;
+        this.source = source;
+    }
+    RetryWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
+    };
+    return RetryWhenOperator;
+}());
+var RetryWhenSubscriber = (function (_super) {
+    __extends(RetryWhenSubscriber, _super);
+    function RetryWhenSubscriber(destination, notifier, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.notifier = notifier;
+        _this.source = source;
+        return _this;
+    }
+    RetryWhenSubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var errors = this.errors;
+            var retries = this.retries;
+            var retriesSubscription = this.retriesSubscription;
+            if (!retries) {
+                errors = new Subject_1.Subject();
+                try {
+                    var notifier = this.notifier;
+                    retries = notifier(errors);
+                }
+                catch (e) {
+                    return _super.prototype.error.call(this, e);
+                }
+                retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
+            }
+            else {
+                this.errors = null;
+                this.retriesSubscription = null;
+            }
+            this._unsubscribeAndRecycle();
+            this.errors = errors;
+            this.retries = retries;
+            this.retriesSubscription = retriesSubscription;
+            errors.next(err);
+        }
+    };
+    RetryWhenSubscriber.prototype._unsubscribe = function () {
+        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
+        if (errors) {
+            errors.unsubscribe();
+            this.errors = null;
+        }
+        if (retriesSubscription) {
+            retriesSubscription.unsubscribe();
+            this.retriesSubscription = null;
+        }
+        this.retries = null;
+    };
+    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var _unsubscribe = this._unsubscribe;
+        this._unsubscribe = null;
+        this._unsubscribeAndRecycle();
+        this._unsubscribe = _unsubscribe;
+        this.source.subscribe(this);
+    };
+    return RetryWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               /**
-                * Return a promise that will always fulfill with an array containing
-                * the outcome states of all input promises.  The returned promise
-                * will never reject.
-                * @param {Array} promises
-                * @returns {Promise} promise for array of settled state descriptors
-                */
-               function settle(promises) {
-                       return all(promises.map(settleOne));
-               }
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],152:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function sample(notifier) {
+    return function (source) { return source.lift(new SampleOperator(notifier)); };
+}
+exports.sample = sample;
+var SampleOperator = (function () {
+    function SampleOperator(notifier) {
+        this.notifier = notifier;
+    }
+    SampleOperator.prototype.call = function (subscriber, source) {
+        var sampleSubscriber = new SampleSubscriber(subscriber);
+        var subscription = source.subscribe(sampleSubscriber);
+        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));
+        return subscription;
+    };
+    return SampleOperator;
+}());
+var SampleSubscriber = (function (_super) {
+    __extends(SampleSubscriber, _super);
+    function SampleSubscriber() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this.hasValue = false;
+        return _this;
+    }
+    SampleSubscriber.prototype._next = function (value) {
+        this.value = value;
+        this.hasValue = true;
+    };
+    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.emitValue();
+    };
+    SampleSubscriber.prototype.notifyComplete = function () {
+        this.emitValue();
+    };
+    SampleSubscriber.prototype.emitValue = function () {
+        if (this.hasValue) {
+            this.hasValue = false;
+            this.destination.next(this.value);
+        }
+    };
+    return SampleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               function settleOne(p) {
-                       var h = Promise._handler(p);
-                       if(h.state() === 0) {
-                               return toPromise(p).then(state.fulfilled, state.rejected);
-                       }
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],153:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var async_1 = require("../scheduler/async");
+function sampleTime(period, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
+}
+exports.sampleTime = sampleTime;
+var SampleTimeOperator = (function () {
+    function SampleTimeOperator(period, scheduler) {
+        this.period = period;
+        this.scheduler = scheduler;
+    }
+    SampleTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
+    };
+    return SampleTimeOperator;
+}());
+var SampleTimeSubscriber = (function (_super) {
+    __extends(SampleTimeSubscriber, _super);
+    function SampleTimeSubscriber(destination, period, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.period = period;
+        _this.scheduler = scheduler;
+        _this.hasValue = false;
+        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
+        return _this;
+    }
+    SampleTimeSubscriber.prototype._next = function (value) {
+        this.lastValue = value;
+        this.hasValue = true;
+    };
+    SampleTimeSubscriber.prototype.notifyNext = function () {
+        if (this.hasValue) {
+            this.hasValue = false;
+            this.destination.next(this.lastValue);
+        }
+    };
+    return SampleTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchNotification(state) {
+    var subscriber = state.subscriber, period = state.period;
+    subscriber.notifyNext();
+    this.schedule(state, period);
+}
 
-                       h._unreport();
-                       return state.inspect(h);
-               }
+},{"../Subscriber":55,"../scheduler/async":206}],154:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function scan(accumulator, seed) {
+    var hasSeed = false;
+    if (arguments.length >= 2) {
+        hasSeed = true;
+    }
+    return function scanOperatorFunction(source) {
+        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
+    };
+}
+exports.scan = scan;
+var ScanOperator = (function () {
+    function ScanOperator(accumulator, seed, hasSeed) {
+        if (hasSeed === void 0) { hasSeed = false; }
+        this.accumulator = accumulator;
+        this.seed = seed;
+        this.hasSeed = hasSeed;
+    }
+    ScanOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
+    };
+    return ScanOperator;
+}());
+var ScanSubscriber = (function (_super) {
+    __extends(ScanSubscriber, _super);
+    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
+        var _this = _super.call(this, destination) || this;
+        _this.accumulator = accumulator;
+        _this._seed = _seed;
+        _this.hasSeed = hasSeed;
+        _this.index = 0;
+        return _this;
+    }
+    Object.defineProperty(ScanSubscriber.prototype, "seed", {
+        get: function () {
+            return this._seed;
+        },
+        set: function (value) {
+            this.hasSeed = true;
+            this._seed = value;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    ScanSubscriber.prototype._next = function (value) {
+        if (!this.hasSeed) {
+            this.seed = value;
+            this.destination.next(value);
+        }
+        else {
+            return this._tryNext(value);
+        }
+    };
+    ScanSubscriber.prototype._tryNext = function (value) {
+        var index = this.index++;
+        var result;
+        try {
+            result = this.accumulator(this.seed, value, index);
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+        this.seed = result;
+        this.destination.next(result);
+    };
+    return ScanSubscriber;
+}(Subscriber_1.Subscriber));
 
-               /**
-                * Traditional reduce function, similar to `Array.prototype.reduce()`, but
-                * input may contain promises and/or values, and reduceFunc
-                * may return either a value or a promise, *and* initialValue may
-                * be a promise for the starting value.
-                * @param {Array|Promise} promises array or promise for an array of anything,
-                *      may contain a mix of promises and values.
-                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
-                * @returns {Promise} that will resolve to the final reduced value
-                */
-               function reduce(promises, f /*, initialValue */) {
-                       return arguments.length > 2 ? ar.call(promises, liftCombine(f), arguments[2])
-                                       : ar.call(promises, liftCombine(f));
-               }
+},{"../Subscriber":55}],155:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function sequenceEqual(compareTo, comparator) {
+    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
+}
+exports.sequenceEqual = sequenceEqual;
+var SequenceEqualOperator = (function () {
+    function SequenceEqualOperator(compareTo, comparator) {
+        this.compareTo = compareTo;
+        this.comparator = comparator;
+    }
+    SequenceEqualOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
+    };
+    return SequenceEqualOperator;
+}());
+exports.SequenceEqualOperator = SequenceEqualOperator;
+var SequenceEqualSubscriber = (function (_super) {
+    __extends(SequenceEqualSubscriber, _super);
+    function SequenceEqualSubscriber(destination, compareTo, comparator) {
+        var _this = _super.call(this, destination) || this;
+        _this.compareTo = compareTo;
+        _this.comparator = comparator;
+        _this._a = [];
+        _this._b = [];
+        _this._oneComplete = false;
+        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
+        return _this;
+    }
+    SequenceEqualSubscriber.prototype._next = function (value) {
+        if (this._oneComplete && this._b.length === 0) {
+            this.emit(false);
+        }
+        else {
+            this._a.push(value);
+            this.checkValues();
+        }
+    };
+    SequenceEqualSubscriber.prototype._complete = function () {
+        if (this._oneComplete) {
+            this.emit(this._a.length === 0 && this._b.length === 0);
+        }
+        else {
+            this._oneComplete = true;
+        }
+        this.unsubscribe();
+    };
+    SequenceEqualSubscriber.prototype.checkValues = function () {
+        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
+        while (_a.length > 0 && _b.length > 0) {
+            var a = _a.shift();
+            var b = _b.shift();
+            var areEqual = false;
+            try {
+                areEqual = comparator ? comparator(a, b) : a === b;
+            }
+            catch (e) {
+                this.destination.error(e);
+            }
+            if (!areEqual) {
+                this.emit(false);
+            }
+        }
+    };
+    SequenceEqualSubscriber.prototype.emit = function (value) {
+        var destination = this.destination;
+        destination.next(value);
+        destination.complete();
+    };
+    SequenceEqualSubscriber.prototype.nextB = function (value) {
+        if (this._oneComplete && this._a.length === 0) {
+            this.emit(false);
+        }
+        else {
+            this._b.push(value);
+            this.checkValues();
+        }
+    };
+    SequenceEqualSubscriber.prototype.completeB = function () {
+        if (this._oneComplete) {
+            this.emit(this._a.length === 0 && this._b.length === 0);
+        }
+        else {
+            this._oneComplete = true;
+        }
+    };
+    return SequenceEqualSubscriber;
+}(Subscriber_1.Subscriber));
+exports.SequenceEqualSubscriber = SequenceEqualSubscriber;
+var SequenceEqualCompareToSubscriber = (function (_super) {
+    __extends(SequenceEqualCompareToSubscriber, _super);
+    function SequenceEqualCompareToSubscriber(destination, parent) {
+        var _this = _super.call(this, destination) || this;
+        _this.parent = parent;
+        return _this;
+    }
+    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
+        this.parent.nextB(value);
+    };
+    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
+        this.parent.error(err);
+        this.unsubscribe();
+    };
+    SequenceEqualCompareToSubscriber.prototype._complete = function () {
+        this.parent.completeB();
+        this.unsubscribe();
+    };
+    return SequenceEqualCompareToSubscriber;
+}(Subscriber_1.Subscriber));
 
-               /**
-                * Traditional reduce function, similar to `Array.prototype.reduceRight()`, but
-                * input may contain promises and/or values, and reduceFunc
-                * may return either a value or a promise, *and* initialValue may
-                * be a promise for the starting value.
-                * @param {Array|Promise} promises array or promise for an array of anything,
-                *      may contain a mix of promises and values.
-                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
-                * @returns {Promise} that will resolve to the final reduced value
-                */
-               function reduceRight(promises, f /*, initialValue */) {
-                       return arguments.length > 2 ? arr.call(promises, liftCombine(f), arguments[2])
-                                       : arr.call(promises, liftCombine(f));
-               }
-
-               function liftCombine(f) {
-                       return function(z, x, i) {
-                               return applyFold(f, void 0, [z,x,i]);
-                       };
-               }
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+},{"../Subscriber":55}],156:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var multicast_1 = require("./multicast");
+var refCount_1 = require("./refCount");
+var Subject_1 = require("../Subject");
+function shareSubjectFactory() {
+    return new Subject_1.Subject();
+}
+function share() {
+    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
+}
+exports.share = share;
 
-},{"../apply":190,"../state":203}],192:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../Subject":53,"./multicast":135,"./refCount":147}],157:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ReplaySubject_1 = require("../ReplaySubject");
+function shareReplay(configOrBufferSize, windowTime, scheduler) {
+    var config;
+    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
+        config = configOrBufferSize;
+    }
+    else {
+        config = {
+            bufferSize: configOrBufferSize,
+            windowTime: windowTime,
+            refCount: false,
+            scheduler: scheduler
+        };
+    }
+    return function (source) { return source.lift(shareReplayOperator(config)); };
+}
+exports.shareReplay = shareReplay;
+function shareReplayOperator(_a) {
+    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
+    var subject;
+    var refCount = 0;
+    var subscription;
+    var hasError = false;
+    var isComplete = false;
+    return function shareReplayOperation(source) {
+        refCount++;
+        if (!subject || hasError) {
+            hasError = false;
+            subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
+            subscription = source.subscribe({
+                next: function (value) { subject.next(value); },
+                error: function (err) {
+                    hasError = true;
+                    subject.error(err);
+                },
+                complete: function () {
+                    isComplete = true;
+                    subscription = undefined;
+                    subject.complete();
+                },
+            });
+        }
+        var innerSub = subject.subscribe(this);
+        this.add(function () {
+            refCount--;
+            innerSub.unsubscribe();
+            if (subscription && !isComplete && useRefCount && refCount === 0) {
+                subscription.unsubscribe();
+                subscription = undefined;
+                subject = undefined;
+            }
+        });
+    };
+}
 
-(function(define) { 'use strict';
-define(function() {
+},{"../ReplaySubject":51}],158:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var EmptyError_1 = require("../util/EmptyError");
+function single(predicate) {
+    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
+}
+exports.single = single;
+var SingleOperator = (function () {
+    function SingleOperator(predicate, source) {
+        this.predicate = predicate;
+        this.source = source;
+    }
+    SingleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
+    };
+    return SingleOperator;
+}());
+var SingleSubscriber = (function (_super) {
+    __extends(SingleSubscriber, _super);
+    function SingleSubscriber(destination, predicate, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.source = source;
+        _this.seenValue = false;
+        _this.index = 0;
+        return _this;
+    }
+    SingleSubscriber.prototype.applySingleValue = function (value) {
+        if (this.seenValue) {
+            this.destination.error('Sequence contains more than one element');
+        }
+        else {
+            this.seenValue = true;
+            this.singleValue = value;
+        }
+    };
+    SingleSubscriber.prototype._next = function (value) {
+        var index = this.index++;
+        if (this.predicate) {
+            this.tryNext(value, index);
+        }
+        else {
+            this.applySingleValue(value);
+        }
+    };
+    SingleSubscriber.prototype.tryNext = function (value, index) {
+        try {
+            if (this.predicate(value, index, this.source)) {
+                this.applySingleValue(value);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    SingleSubscriber.prototype._complete = function () {
+        var destination = this.destination;
+        if (this.index > 0) {
+            destination.next(this.seenValue ? this.singleValue : undefined);
+            destination.complete();
+        }
+        else {
+            destination.error(new EmptyError_1.EmptyError);
+        }
+    };
+    return SingleSubscriber;
+}(Subscriber_1.Subscriber));
 
-       return function flow(Promise) {
+},{"../Subscriber":55,"../util/EmptyError":212}],159:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function skip(count) {
+    return function (source) { return source.lift(new SkipOperator(count)); };
+}
+exports.skip = skip;
+var SkipOperator = (function () {
+    function SkipOperator(total) {
+        this.total = total;
+    }
+    SkipOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SkipSubscriber(subscriber, this.total));
+    };
+    return SkipOperator;
+}());
+var SkipSubscriber = (function (_super) {
+    __extends(SkipSubscriber, _super);
+    function SkipSubscriber(destination, total) {
+        var _this = _super.call(this, destination) || this;
+        _this.total = total;
+        _this.count = 0;
+        return _this;
+    }
+    SkipSubscriber.prototype._next = function (x) {
+        if (++this.count > this.total) {
+            this.destination.next(x);
+        }
+    };
+    return SkipSubscriber;
+}(Subscriber_1.Subscriber));
 
-               var resolve = Promise.resolve;
-               var reject = Promise.reject;
-               var origCatch = Promise.prototype['catch'];
+},{"../Subscriber":55}],160:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+function skipLast(count) {
+    return function (source) { return source.lift(new SkipLastOperator(count)); };
+}
+exports.skipLast = skipLast;
+var SkipLastOperator = (function () {
+    function SkipLastOperator(_skipCount) {
+        this._skipCount = _skipCount;
+        if (this._skipCount < 0) {
+            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+        }
+    }
+    SkipLastOperator.prototype.call = function (subscriber, source) {
+        if (this._skipCount === 0) {
+            return source.subscribe(new Subscriber_1.Subscriber(subscriber));
+        }
+        else {
+            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
+        }
+    };
+    return SkipLastOperator;
+}());
+var SkipLastSubscriber = (function (_super) {
+    __extends(SkipLastSubscriber, _super);
+    function SkipLastSubscriber(destination, _skipCount) {
+        var _this = _super.call(this, destination) || this;
+        _this._skipCount = _skipCount;
+        _this._count = 0;
+        _this._ring = new Array(_skipCount);
+        return _this;
+    }
+    SkipLastSubscriber.prototype._next = function (value) {
+        var skipCount = this._skipCount;
+        var count = this._count++;
+        if (count < skipCount) {
+            this._ring[count] = value;
+        }
+        else {
+            var currentIndex = count % skipCount;
+            var ring = this._ring;
+            var oldValue = ring[currentIndex];
+            ring[currentIndex] = value;
+            this.destination.next(oldValue);
+        }
+    };
+    return SkipLastSubscriber;
+}(Subscriber_1.Subscriber));
 
-               /**
-                * Handle the ultimate fulfillment value or rejection reason, and assume
-                * responsibility for all errors.  If an error propagates out of result
-                * or handleFatalError, it will be rethrown to the host, resulting in a
-                * loud stack track on most platforms and a crash on some.
-                * @param {function?} onResult
-                * @param {function?} onError
-                * @returns {undefined}
-                */
-               Promise.prototype.done = function(onResult, onError) {
-                       this._handler.visit(this._handler.receiver, onResult, onError);
-               };
+},{"../Subscriber":55,"../util/ArgumentOutOfRangeError":211}],161:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function skipUntil(notifier) {
+    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
+}
+exports.skipUntil = skipUntil;
+var SkipUntilOperator = (function () {
+    function SkipUntilOperator(notifier) {
+        this.notifier = notifier;
+    }
+    SkipUntilOperator.prototype.call = function (destination, source) {
+        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
+    };
+    return SkipUntilOperator;
+}());
+var SkipUntilSubscriber = (function (_super) {
+    __extends(SkipUntilSubscriber, _super);
+    function SkipUntilSubscriber(destination, notifier) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasValue = false;
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(_this, undefined, undefined);
+        _this.add(innerSubscriber);
+        _this.innerSubscription = innerSubscriber;
+        var innerSubscription = subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            _this.add(innerSubscription);
+            _this.innerSubscription = innerSubscription;
+        }
+        return _this;
+    }
+    SkipUntilSubscriber.prototype._next = function (value) {
+        if (this.hasValue) {
+            _super.prototype._next.call(this, value);
+        }
+    };
+    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.hasValue = true;
+        if (this.innerSubscription) {
+            this.innerSubscription.unsubscribe();
+        }
+    };
+    SkipUntilSubscriber.prototype.notifyComplete = function () {
+    };
+    return SkipUntilSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               /**
-                * Add Error-type and predicate matching to catch.  Examples:
-                * promise.catch(TypeError, handleTypeError)
-                *   .catch(predicate, handleMatchedErrors)
-                *   .catch(handleRemainingErrors)
-                * @param onRejected
-                * @returns {*}
-                */
-               Promise.prototype['catch'] = Promise.prototype.otherwise = function(onRejected) {
-                       if (arguments.length < 2) {
-                               return origCatch.call(this, onRejected);
-                       }
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],162:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function skipWhile(predicate) {
+    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
+}
+exports.skipWhile = skipWhile;
+var SkipWhileOperator = (function () {
+    function SkipWhileOperator(predicate) {
+        this.predicate = predicate;
+    }
+    SkipWhileOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
+    };
+    return SkipWhileOperator;
+}());
+var SkipWhileSubscriber = (function (_super) {
+    __extends(SkipWhileSubscriber, _super);
+    function SkipWhileSubscriber(destination, predicate) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.skipping = true;
+        _this.index = 0;
+        return _this;
+    }
+    SkipWhileSubscriber.prototype._next = function (value) {
+        var destination = this.destination;
+        if (this.skipping) {
+            this.tryCallPredicate(value);
+        }
+        if (!this.skipping) {
+            destination.next(value);
+        }
+    };
+    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
+        try {
+            var result = this.predicate(value, this.index++);
+            this.skipping = Boolean(result);
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    return SkipWhileSubscriber;
+}(Subscriber_1.Subscriber));
 
-                       if(typeof onRejected !== 'function') {
-                               return this.ensure(rejectInvalidPredicate);
-                       }
+},{"../Subscriber":55}],163:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concat_1 = require("../observable/concat");
+var isScheduler_1 = require("../util/isScheduler");
+function startWith() {
+    var array = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        array[_i] = arguments[_i];
+    }
+    var scheduler = array[array.length - 1];
+    if (isScheduler_1.isScheduler(scheduler)) {
+        array.pop();
+        return function (source) { return concat_1.concat(array, source, scheduler); };
+    }
+    else {
+        return function (source) { return concat_1.concat(array, source); };
+    }
+}
+exports.startWith = startWith;
 
-                       return origCatch.call(this, createCatchFilter(arguments[1], onRejected));
-               };
+},{"../observable/concat":63,"../util/isScheduler":230}],164:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var SubscribeOnObservable_1 = require("../observable/SubscribeOnObservable");
+function subscribeOn(scheduler, delay) {
+    if (delay === void 0) { delay = 0; }
+    return function subscribeOnOperatorFunction(source) {
+        return source.lift(new SubscribeOnOperator(scheduler, delay));
+    };
+}
+exports.subscribeOn = subscribeOn;
+var SubscribeOnOperator = (function () {
+    function SubscribeOnOperator(scheduler, delay) {
+        this.scheduler = scheduler;
+        this.delay = delay;
+    }
+    SubscribeOnOperator.prototype.call = function (subscriber, source) {
+        return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
+    };
+    return SubscribeOnOperator;
+}());
 
-               /**
-                * Wraps the provided catch handler, so that it will only be called
-                * if the predicate evaluates truthy
-                * @param {?function} handler
-                * @param {function} predicate
-                * @returns {function} conditional catch handler
-                */
-               function createCatchFilter(handler, predicate) {
-                       return function(e) {
-                               return evaluatePredicate(e, predicate)
-                                       ? handler.call(this, e)
-                                       : reject(e);
-                       };
-               }
+},{"../observable/SubscribeOnObservable":59}],165:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var switchMap_1 = require("./switchMap");
+var identity_1 = require("../util/identity");
+function switchAll() {
+    return switchMap_1.switchMap(identity_1.identity);
+}
+exports.switchAll = switchAll;
 
-               /**
-                * Ensures that onFulfilledOrRejected will be called regardless of whether
-                * this promise is fulfilled or rejected.  onFulfilledOrRejected WILL NOT
-                * receive the promises' value or reason.  Any returned value will be disregarded.
-                * onFulfilledOrRejected may throw or return a rejected promise to signal
-                * an additional error.
-                * @param {function} handler handler to be called regardless of
-                *  fulfillment or rejection
-                * @returns {Promise}
-                */
-               Promise.prototype['finally'] = Promise.prototype.ensure = function(handler) {
-                       if(typeof handler !== 'function') {
-                               return this;
-                       }
-
-                       return this.then(function(x) {
-                               return runSideEffect(handler, this, identity, x);
-                       }, function(e) {
-                               return runSideEffect(handler, this, reject, e);
-                       });
-               };
-
-               function runSideEffect (handler, thisArg, propagate, value) {
-                       var result = handler.call(thisArg);
-                       return maybeThenable(result)
-                               ? propagateValue(result, propagate, value)
-                               : propagate(value);
-               }
-
-               function propagateValue (result, propagate, x) {
-                       return resolve(result).then(function () {
-                               return propagate(x);
-                       });
-               }
-
-               /**
-                * Recover from a failure by returning a defaultValue.  If defaultValue
-                * is a promise, it's fulfillment value will be used.  If defaultValue is
-                * a promise that rejects, the returned promise will reject with the
-                * same reason.
-                * @param {*} defaultValue
-                * @returns {Promise} new promise
-                */
-               Promise.prototype['else'] = Promise.prototype.orElse = function(defaultValue) {
-                       return this.then(void 0, function() {
-                               return defaultValue;
-                       });
-               };
-
-               /**
-                * Shortcut for .then(function() { return value; })
-                * @param  {*} value
-                * @return {Promise} a promise that:
-                *  - is fulfilled if value is not a promise, or
-                *  - if value is a promise, will fulfill with its value, or reject
-                *    with its reason.
-                */
-               Promise.prototype['yield'] = function(value) {
-                       return this.then(function() {
-                               return value;
-                       });
-               };
-
-               /**
-                * Runs a side effect when this promise fulfills, without changing the
-                * fulfillment value.
-                * @param {function} onFulfilledSideEffect
-                * @returns {Promise}
-                */
-               Promise.prototype.tap = function(onFulfilledSideEffect) {
-                       return this.then(onFulfilledSideEffect)['yield'](this);
-               };
+},{"../util/identity":219,"./switchMap":166}],166:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var map_1 = require("./map");
+var from_1 = require("../observable/from");
+function switchMap(project, resultSelector) {
+    if (typeof resultSelector === 'function') {
+        return function (source) { return source.pipe(switchMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
+    }
+    return function (source) { return source.lift(new SwitchMapOperator(project)); };
+}
+exports.switchMap = switchMap;
+var SwitchMapOperator = (function () {
+    function SwitchMapOperator(project) {
+        this.project = project;
+    }
+    SwitchMapOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
+    };
+    return SwitchMapOperator;
+}());
+var SwitchMapSubscriber = (function (_super) {
+    __extends(SwitchMapSubscriber, _super);
+    function SwitchMapSubscriber(destination, project) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.index = 0;
+        return _this;
+    }
+    SwitchMapSubscriber.prototype._next = function (value) {
+        var result;
+        var index = this.index++;
+        try {
+            result = this.project(value, index);
+        }
+        catch (error) {
+            this.destination.error(error);
+            return;
+        }
+        this._innerSub(result, value, index);
+    };
+    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
+        var innerSubscription = this.innerSubscription;
+        if (innerSubscription) {
+            innerSubscription.unsubscribe();
+        }
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
+        if (this.innerSubscription !== innerSubscriber) {
+            destination.add(this.innerSubscription);
+        }
+    };
+    SwitchMapSubscriber.prototype._complete = function () {
+        var innerSubscription = this.innerSubscription;
+        if (!innerSubscription || innerSubscription.closed) {
+            _super.prototype._complete.call(this);
+        }
+        this.unsubscribe();
+    };
+    SwitchMapSubscriber.prototype._unsubscribe = function () {
+        this.innerSubscription = null;
+    };
+    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.innerSubscription = null;
+        if (this.isStopped) {
+            _super.prototype._complete.call(this);
+        }
+    };
+    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    return SwitchMapSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               return Promise;
-       };
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],167:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var switchMap_1 = require("./switchMap");
+function switchMapTo(innerObservable, resultSelector) {
+    return resultSelector ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
+}
+exports.switchMapTo = switchMapTo;
 
-       function rejectInvalidPredicate() {
-               throw new TypeError('catch predicate must be a function');
-       }
+},{"./switchMap":166}],168:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+var empty_1 = require("../observable/empty");
+function take(count) {
+    return function (source) {
+        if (count === 0) {
+            return empty_1.empty();
+        }
+        else {
+            return source.lift(new TakeOperator(count));
+        }
+    };
+}
+exports.take = take;
+var TakeOperator = (function () {
+    function TakeOperator(total) {
+        this.total = total;
+        if (this.total < 0) {
+            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+        }
+    }
+    TakeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TakeSubscriber(subscriber, this.total));
+    };
+    return TakeOperator;
+}());
+var TakeSubscriber = (function (_super) {
+    __extends(TakeSubscriber, _super);
+    function TakeSubscriber(destination, total) {
+        var _this = _super.call(this, destination) || this;
+        _this.total = total;
+        _this.count = 0;
+        return _this;
+    }
+    TakeSubscriber.prototype._next = function (value) {
+        var total = this.total;
+        var count = ++this.count;
+        if (count <= total) {
+            this.destination.next(value);
+            if (count === total) {
+                this.destination.complete();
+                this.unsubscribe();
+            }
+        }
+    };
+    return TakeSubscriber;
+}(Subscriber_1.Subscriber));
 
-       function evaluatePredicate(e, predicate) {
-               return isError(predicate) ? e instanceof predicate : predicate(e);
-       }
+},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":211}],169:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+var empty_1 = require("../observable/empty");
+function takeLast(count) {
+    return function takeLastOperatorFunction(source) {
+        if (count === 0) {
+            return empty_1.empty();
+        }
+        else {
+            return source.lift(new TakeLastOperator(count));
+        }
+    };
+}
+exports.takeLast = takeLast;
+var TakeLastOperator = (function () {
+    function TakeLastOperator(total) {
+        this.total = total;
+        if (this.total < 0) {
+            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+        }
+    }
+    TakeLastOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
+    };
+    return TakeLastOperator;
+}());
+var TakeLastSubscriber = (function (_super) {
+    __extends(TakeLastSubscriber, _super);
+    function TakeLastSubscriber(destination, total) {
+        var _this = _super.call(this, destination) || this;
+        _this.total = total;
+        _this.ring = new Array();
+        _this.count = 0;
+        return _this;
+    }
+    TakeLastSubscriber.prototype._next = function (value) {
+        var ring = this.ring;
+        var total = this.total;
+        var count = this.count++;
+        if (ring.length < total) {
+            ring.push(value);
+        }
+        else {
+            var index = count % total;
+            ring[index] = value;
+        }
+    };
+    TakeLastSubscriber.prototype._complete = function () {
+        var destination = this.destination;
+        var count = this.count;
+        if (count > 0) {
+            var total = this.count >= this.total ? this.total : this.count;
+            var ring = this.ring;
+            for (var i = 0; i < total; i++) {
+                var idx = (count++) % total;
+                destination.next(ring[idx]);
+            }
+        }
+        destination.complete();
+    };
+    return TakeLastSubscriber;
+}(Subscriber_1.Subscriber));
 
-       function isError(predicate) {
-               return predicate === Error
-                       || (predicate != null && predicate.prototype instanceof Error);
-       }
+},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":211}],170:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function takeUntil(notifier) {
+    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
+}
+exports.takeUntil = takeUntil;
+var TakeUntilOperator = (function () {
+    function TakeUntilOperator(notifier) {
+        this.notifier = notifier;
+    }
+    TakeUntilOperator.prototype.call = function (subscriber, source) {
+        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
+        var notifierSubscription = subscribeToResult_1.subscribeToResult(takeUntilSubscriber, this.notifier);
+        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
+            takeUntilSubscriber.add(notifierSubscription);
+            return source.subscribe(takeUntilSubscriber);
+        }
+        return takeUntilSubscriber;
+    };
+    return TakeUntilOperator;
+}());
+var TakeUntilSubscriber = (function (_super) {
+    __extends(TakeUntilSubscriber, _super);
+    function TakeUntilSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.seenValue = false;
+        return _this;
+    }
+    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.seenValue = true;
+        this.complete();
+    };
+    TakeUntilSubscriber.prototype.notifyComplete = function () {
+    };
+    return TakeUntilSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-       function maybeThenable(x) {
-               return (typeof x === 'object' || typeof x === 'function') && x !== null;
-       }
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],171:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function takeWhile(predicate, inclusive) {
+    if (inclusive === void 0) { inclusive = false; }
+    return function (source) {
+        return source.lift(new TakeWhileOperator(predicate, inclusive));
+    };
+}
+exports.takeWhile = takeWhile;
+var TakeWhileOperator = (function () {
+    function TakeWhileOperator(predicate, inclusive) {
+        this.predicate = predicate;
+        this.inclusive = inclusive;
+    }
+    TakeWhileOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
+    };
+    return TakeWhileOperator;
+}());
+var TakeWhileSubscriber = (function (_super) {
+    __extends(TakeWhileSubscriber, _super);
+    function TakeWhileSubscriber(destination, predicate, inclusive) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.inclusive = inclusive;
+        _this.index = 0;
+        return _this;
+    }
+    TakeWhileSubscriber.prototype._next = function (value) {
+        var destination = this.destination;
+        var result;
+        try {
+            result = this.predicate(value, this.index++);
+        }
+        catch (err) {
+            destination.error(err);
+            return;
+        }
+        this.nextOrComplete(value, result);
+    };
+    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
+        var destination = this.destination;
+        if (Boolean(predicateResult)) {
+            destination.next(value);
+        }
+        else {
+            if (this.inclusive) {
+                destination.next(value);
+            }
+            destination.complete();
+        }
+    };
+    return TakeWhileSubscriber;
+}(Subscriber_1.Subscriber));
 
-       function identity(x) {
-               return x;
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],193:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-/** @author Jeff Escalante */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function fold(Promise) {
+},{"../Subscriber":55}],172:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var noop_1 = require("../util/noop");
+var isFunction_1 = require("../util/isFunction");
+function tap(nextOrObserver, error, complete) {
+    return function tapOperatorFunction(source) {
+        return source.lift(new DoOperator(nextOrObserver, error, complete));
+    };
+}
+exports.tap = tap;
+var DoOperator = (function () {
+    function DoOperator(nextOrObserver, error, complete) {
+        this.nextOrObserver = nextOrObserver;
+        this.error = error;
+        this.complete = complete;
+    }
+    DoOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
+    };
+    return DoOperator;
+}());
+var TapSubscriber = (function (_super) {
+    __extends(TapSubscriber, _super);
+    function TapSubscriber(destination, observerOrNext, error, complete) {
+        var _this = _super.call(this, destination) || this;
+        _this._tapNext = noop_1.noop;
+        _this._tapError = noop_1.noop;
+        _this._tapComplete = noop_1.noop;
+        _this._tapError = error || noop_1.noop;
+        _this._tapComplete = complete || noop_1.noop;
+        if (isFunction_1.isFunction(observerOrNext)) {
+            _this._context = _this;
+            _this._tapNext = observerOrNext;
+        }
+        else if (observerOrNext) {
+            _this._context = observerOrNext;
+            _this._tapNext = observerOrNext.next || noop_1.noop;
+            _this._tapError = observerOrNext.error || noop_1.noop;
+            _this._tapComplete = observerOrNext.complete || noop_1.noop;
+        }
+        return _this;
+    }
+    TapSubscriber.prototype._next = function (value) {
+        try {
+            this._tapNext.call(this._context, value);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(value);
+    };
+    TapSubscriber.prototype._error = function (err) {
+        try {
+            this._tapError.call(this._context, err);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.error(err);
+    };
+    TapSubscriber.prototype._complete = function () {
+        try {
+            this._tapComplete.call(this._context);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        return this.destination.complete();
+    };
+    return TapSubscriber;
+}(Subscriber_1.Subscriber));
 
-               Promise.prototype.fold = function(f, z) {
-                       var promise = this._beget();
+},{"../Subscriber":55,"../util/isFunction":223,"../util/noop":231}],173:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+exports.defaultThrottleConfig = {
+    leading: true,
+    trailing: false
+};
+function throttle(durationSelector, config) {
+    if (config === void 0) { config = exports.defaultThrottleConfig; }
+    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
+}
+exports.throttle = throttle;
+var ThrottleOperator = (function () {
+    function ThrottleOperator(durationSelector, leading, trailing) {
+        this.durationSelector = durationSelector;
+        this.leading = leading;
+        this.trailing = trailing;
+    }
+    ThrottleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
+    };
+    return ThrottleOperator;
+}());
+var ThrottleSubscriber = (function (_super) {
+    __extends(ThrottleSubscriber, _super);
+    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.durationSelector = durationSelector;
+        _this._leading = _leading;
+        _this._trailing = _trailing;
+        _this._hasValue = false;
+        return _this;
+    }
+    ThrottleSubscriber.prototype._next = function (value) {
+        this._hasValue = true;
+        this._sendValue = value;
+        if (!this._throttled) {
+            if (this._leading) {
+                this.send();
+            }
+            else {
+                this.throttle(value);
+            }
+        }
+    };
+    ThrottleSubscriber.prototype.send = function () {
+        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
+        if (_hasValue) {
+            this.destination.next(_sendValue);
+            this.throttle(_sendValue);
+        }
+        this._hasValue = false;
+        this._sendValue = null;
+    };
+    ThrottleSubscriber.prototype.throttle = function (value) {
+        var duration = this.tryDurationSelector(value);
+        if (!!duration) {
+            this.add(this._throttled = subscribeToResult_1.subscribeToResult(this, duration));
+        }
+    };
+    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
+        try {
+            return this.durationSelector(value);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return null;
+        }
+    };
+    ThrottleSubscriber.prototype.throttlingDone = function () {
+        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
+        if (_throttled) {
+            _throttled.unsubscribe();
+        }
+        this._throttled = null;
+        if (_trailing) {
+            this.send();
+        }
+    };
+    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.throttlingDone();
+    };
+    ThrottleSubscriber.prototype.notifyComplete = function () {
+        this.throttlingDone();
+    };
+    return ThrottleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-                       this._handler.fold(function(z, x, to) {
-                               Promise._handler(z).fold(function(x, z, to) {
-                                       to.resolve(f.call(this, z, x));
-                               }, x, this, to);
-                       }, z, promise._handler.receiver, promise._handler);
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],174:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var async_1 = require("../scheduler/async");
+var throttle_1 = require("./throttle");
+function throttleTime(duration, scheduler, config) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
+    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
+}
+exports.throttleTime = throttleTime;
+var ThrottleTimeOperator = (function () {
+    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
+        this.duration = duration;
+        this.scheduler = scheduler;
+        this.leading = leading;
+        this.trailing = trailing;
+    }
+    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
+    };
+    return ThrottleTimeOperator;
+}());
+var ThrottleTimeSubscriber = (function (_super) {
+    __extends(ThrottleTimeSubscriber, _super);
+    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
+        var _this = _super.call(this, destination) || this;
+        _this.duration = duration;
+        _this.scheduler = scheduler;
+        _this.leading = leading;
+        _this.trailing = trailing;
+        _this._hasTrailingValue = false;
+        _this._trailingValue = null;
+        return _this;
+    }
+    ThrottleTimeSubscriber.prototype._next = function (value) {
+        if (this.throttled) {
+            if (this.trailing) {
+                this._trailingValue = value;
+                this._hasTrailingValue = true;
+            }
+        }
+        else {
+            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
+            if (this.leading) {
+                this.destination.next(value);
+            }
+            else if (this.trailing) {
+                this._trailingValue = value;
+                this._hasTrailingValue = true;
+            }
+        }
+    };
+    ThrottleTimeSubscriber.prototype._complete = function () {
+        if (this._hasTrailingValue) {
+            this.destination.next(this._trailingValue);
+            this.destination.complete();
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
+        var throttled = this.throttled;
+        if (throttled) {
+            if (this.trailing && this._hasTrailingValue) {
+                this.destination.next(this._trailingValue);
+                this._trailingValue = null;
+                this._hasTrailingValue = false;
+            }
+            throttled.unsubscribe();
+            this.remove(throttled);
+            this.throttled = null;
+        }
+    };
+    return ThrottleTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchNext(arg) {
+    var subscriber = arg.subscriber;
+    subscriber.clearThrottle();
+}
 
-                       return promise;
-               };
+},{"../Subscriber":55,"../scheduler/async":206,"./throttle":173}],175:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyError_1 = require("../util/EmptyError");
+var Subscriber_1 = require("../Subscriber");
+function throwIfEmpty(errorFactory) {
+    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
+    return function (source) {
+        return source.lift(new ThrowIfEmptyOperator(errorFactory));
+    };
+}
+exports.throwIfEmpty = throwIfEmpty;
+var ThrowIfEmptyOperator = (function () {
+    function ThrowIfEmptyOperator(errorFactory) {
+        this.errorFactory = errorFactory;
+    }
+    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
+    };
+    return ThrowIfEmptyOperator;
+}());
+var ThrowIfEmptySubscriber = (function (_super) {
+    __extends(ThrowIfEmptySubscriber, _super);
+    function ThrowIfEmptySubscriber(destination, errorFactory) {
+        var _this = _super.call(this, destination) || this;
+        _this.errorFactory = errorFactory;
+        _this.hasValue = false;
+        return _this;
+    }
+    ThrowIfEmptySubscriber.prototype._next = function (value) {
+        this.hasValue = true;
+        this.destination.next(value);
+    };
+    ThrowIfEmptySubscriber.prototype._complete = function () {
+        if (!this.hasValue) {
+            var err = void 0;
+            try {
+                err = this.errorFactory();
+            }
+            catch (e) {
+                err = e;
+            }
+            this.destination.error(err);
+        }
+        else {
+            return this.destination.complete();
+        }
+    };
+    return ThrowIfEmptySubscriber;
+}(Subscriber_1.Subscriber));
+function defaultErrorFactory() {
+    return new EmptyError_1.EmptyError();
+}
 
-               return Promise;
-       };
+},{"../Subscriber":55,"../util/EmptyError":212}],176:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var scan_1 = require("./scan");
+var defer_1 = require("../observable/defer");
+var map_1 = require("./map");
+function timeInterval(scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) { return defer_1.defer(function () {
+        return source.pipe(scan_1.scan(function (_a, value) {
+            var current = _a.current;
+            return ({ value: value, current: scheduler.now(), last: current });
+        }, { current: scheduler.now(), value: undefined, last: undefined }), map_1.map(function (_a) {
+            var current = _a.current, last = _a.last, value = _a.value;
+            return new TimeInterval(value, current - last);
+        }));
+    }); };
+}
+exports.timeInterval = timeInterval;
+var TimeInterval = (function () {
+    function TimeInterval(value, interval) {
+        this.value = value;
+        this.interval = interval;
+    }
+    return TimeInterval;
+}());
+exports.TimeInterval = TimeInterval;
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+},{"../observable/defer":64,"../scheduler/async":206,"./map":125,"./scan":154}],177:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var TimeoutError_1 = require("../util/TimeoutError");
+var timeoutWith_1 = require("./timeoutWith");
+var throwError_1 = require("../observable/throwError");
+function timeout(due, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return timeoutWith_1.timeoutWith(due, throwError_1.throwError(new TimeoutError_1.TimeoutError()), scheduler);
+}
+exports.timeout = timeout;
 
-},{}],194:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../observable/throwError":82,"../scheduler/async":206,"../util/TimeoutError":215,"./timeoutWith":178}],178:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var isDate_1 = require("../util/isDate");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function timeoutWith(due, withObservable, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) {
+        var absoluteTimeout = isDate_1.isDate(due);
+        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
+        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
+    };
+}
+exports.timeoutWith = timeoutWith;
+var TimeoutWithOperator = (function () {
+    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
+        this.waitFor = waitFor;
+        this.absoluteTimeout = absoluteTimeout;
+        this.withObservable = withObservable;
+        this.scheduler = scheduler;
+    }
+    TimeoutWithOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
+    };
+    return TimeoutWithOperator;
+}());
+var TimeoutWithSubscriber = (function (_super) {
+    __extends(TimeoutWithSubscriber, _super);
+    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.absoluteTimeout = absoluteTimeout;
+        _this.waitFor = waitFor;
+        _this.withObservable = withObservable;
+        _this.scheduler = scheduler;
+        _this.action = null;
+        _this.scheduleTimeout();
+        return _this;
+    }
+    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
+        var withObservable = subscriber.withObservable;
+        subscriber._unsubscribeAndRecycle();
+        subscriber.add(subscribeToResult_1.subscribeToResult(subscriber, withObservable));
+    };
+    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
+        var action = this.action;
+        if (action) {
+            this.action = action.schedule(this, this.waitFor);
+        }
+        else {
+            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
+        }
+    };
+    TimeoutWithSubscriber.prototype._next = function (value) {
+        if (!this.absoluteTimeout) {
+            this.scheduleTimeout();
+        }
+        _super.prototype._next.call(this, value);
+    };
+    TimeoutWithSubscriber.prototype._unsubscribe = function () {
+        this.action = null;
+        this.scheduler = null;
+        this.withObservable = null;
+    };
+    return TimeoutWithSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-(function(define) { 'use strict';
-define(function(require) {
+},{"../OuterSubscriber":50,"../scheduler/async":206,"../util/isDate":222,"../util/subscribeToResult":239}],179:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var map_1 = require("./map");
+function timestamp(scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return map_1.map(function (value) { return new Timestamp(value, scheduler.now()); });
+}
+exports.timestamp = timestamp;
+var Timestamp = (function () {
+    function Timestamp(value, timestamp) {
+        this.value = value;
+        this.timestamp = timestamp;
+    }
+    return Timestamp;
+}());
+exports.Timestamp = Timestamp;
 
-       var inspect = require('../state').inspect;
+},{"../scheduler/async":206,"./map":125}],180:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var reduce_1 = require("./reduce");
+function toArrayReducer(arr, item, index) {
+    if (index === 0) {
+        return [item];
+    }
+    arr.push(item);
+    return arr;
+}
+function toArray() {
+    return reduce_1.reduce(toArrayReducer, []);
+}
+exports.toArray = toArray;
 
-       return function inspection(Promise) {
+},{"./reduce":146}],181:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function window(windowBoundaries) {
+    return function windowOperatorFunction(source) {
+        return source.lift(new WindowOperator(windowBoundaries));
+    };
+}
+exports.window = window;
+var WindowOperator = (function () {
+    function WindowOperator(windowBoundaries) {
+        this.windowBoundaries = windowBoundaries;
+    }
+    WindowOperator.prototype.call = function (subscriber, source) {
+        var windowSubscriber = new WindowSubscriber(subscriber);
+        var sourceSubscription = source.subscribe(windowSubscriber);
+        if (!sourceSubscription.closed) {
+            windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber, this.windowBoundaries));
+        }
+        return sourceSubscription;
+    };
+    return WindowOperator;
+}());
+var WindowSubscriber = (function (_super) {
+    __extends(WindowSubscriber, _super);
+    function WindowSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.window = new Subject_1.Subject();
+        destination.next(_this.window);
+        return _this;
+    }
+    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.openWindow();
+    };
+    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
+        this._complete();
+    };
+    WindowSubscriber.prototype._next = function (value) {
+        this.window.next(value);
+    };
+    WindowSubscriber.prototype._error = function (err) {
+        this.window.error(err);
+        this.destination.error(err);
+    };
+    WindowSubscriber.prototype._complete = function () {
+        this.window.complete();
+        this.destination.complete();
+    };
+    WindowSubscriber.prototype._unsubscribe = function () {
+        this.window = null;
+    };
+    WindowSubscriber.prototype.openWindow = function () {
+        var prevWindow = this.window;
+        if (prevWindow) {
+            prevWindow.complete();
+        }
+        var destination = this.destination;
+        var newWindow = this.window = new Subject_1.Subject();
+        destination.next(newWindow);
+    };
+    return WindowSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-               Promise.prototype.inspect = function() {
-                       return inspect(Promise._handler(this));
-               };
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],182:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Subject_1 = require("../Subject");
+function windowCount(windowSize, startWindowEvery) {
+    if (startWindowEvery === void 0) { startWindowEvery = 0; }
+    return function windowCountOperatorFunction(source) {
+        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
+    };
+}
+exports.windowCount = windowCount;
+var WindowCountOperator = (function () {
+    function WindowCountOperator(windowSize, startWindowEvery) {
+        this.windowSize = windowSize;
+        this.startWindowEvery = startWindowEvery;
+    }
+    WindowCountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
+    };
+    return WindowCountOperator;
+}());
+var WindowCountSubscriber = (function (_super) {
+    __extends(WindowCountSubscriber, _super);
+    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.windowSize = windowSize;
+        _this.startWindowEvery = startWindowEvery;
+        _this.windows = [new Subject_1.Subject()];
+        _this.count = 0;
+        destination.next(_this.windows[0]);
+        return _this;
+    }
+    WindowCountSubscriber.prototype._next = function (value) {
+        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
+        var destination = this.destination;
+        var windowSize = this.windowSize;
+        var windows = this.windows;
+        var len = windows.length;
+        for (var i = 0; i < len && !this.closed; i++) {
+            windows[i].next(value);
+        }
+        var c = this.count - windowSize + 1;
+        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
+            windows.shift().complete();
+        }
+        if (++this.count % startWindowEvery === 0 && !this.closed) {
+            var window_1 = new Subject_1.Subject();
+            windows.push(window_1);
+            destination.next(window_1);
+        }
+    };
+    WindowCountSubscriber.prototype._error = function (err) {
+        var windows = this.windows;
+        if (windows) {
+            while (windows.length > 0 && !this.closed) {
+                windows.shift().error(err);
+            }
+        }
+        this.destination.error(err);
+    };
+    WindowCountSubscriber.prototype._complete = function () {
+        var windows = this.windows;
+        if (windows) {
+            while (windows.length > 0 && !this.closed) {
+                windows.shift().complete();
+            }
+        }
+        this.destination.complete();
+    };
+    WindowCountSubscriber.prototype._unsubscribe = function () {
+        this.count = 0;
+        this.windows = null;
+    };
+    return WindowCountSubscriber;
+}(Subscriber_1.Subscriber));
 
-               return Promise;
-       };
+},{"../Subject":53,"../Subscriber":55}],183:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var async_1 = require("../scheduler/async");
+var Subscriber_1 = require("../Subscriber");
+var isNumeric_1 = require("../util/isNumeric");
+var isScheduler_1 = require("../util/isScheduler");
+function windowTime(windowTimeSpan) {
+    var scheduler = async_1.async;
+    var windowCreationInterval = null;
+    var maxWindowSize = Number.POSITIVE_INFINITY;
+    if (isScheduler_1.isScheduler(arguments[3])) {
+        scheduler = arguments[3];
+    }
+    if (isScheduler_1.isScheduler(arguments[2])) {
+        scheduler = arguments[2];
+    }
+    else if (isNumeric_1.isNumeric(arguments[2])) {
+        maxWindowSize = arguments[2];
+    }
+    if (isScheduler_1.isScheduler(arguments[1])) {
+        scheduler = arguments[1];
+    }
+    else if (isNumeric_1.isNumeric(arguments[1])) {
+        windowCreationInterval = arguments[1];
+    }
+    return function windowTimeOperatorFunction(source) {
+        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
+    };
+}
+exports.windowTime = windowTime;
+var WindowTimeOperator = (function () {
+    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
+        this.windowTimeSpan = windowTimeSpan;
+        this.windowCreationInterval = windowCreationInterval;
+        this.maxWindowSize = maxWindowSize;
+        this.scheduler = scheduler;
+    }
+    WindowTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
+    };
+    return WindowTimeOperator;
+}());
+var CountedSubject = (function (_super) {
+    __extends(CountedSubject, _super);
+    function CountedSubject() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this._numberOfNextedValues = 0;
+        return _this;
+    }
+    CountedSubject.prototype.next = function (value) {
+        this._numberOfNextedValues++;
+        _super.prototype.next.call(this, value);
+    };
+    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
+        get: function () {
+            return this._numberOfNextedValues;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    return CountedSubject;
+}(Subject_1.Subject));
+var WindowTimeSubscriber = (function (_super) {
+    __extends(WindowTimeSubscriber, _super);
+    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.windowTimeSpan = windowTimeSpan;
+        _this.windowCreationInterval = windowCreationInterval;
+        _this.maxWindowSize = maxWindowSize;
+        _this.scheduler = scheduler;
+        _this.windows = [];
+        var window = _this.openWindow();
+        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
+            var closeState = { subscriber: _this, window: window, context: null };
+            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
+            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
+            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
+        }
+        else {
+            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
+            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
+        }
+        return _this;
+    }
+    WindowTimeSubscriber.prototype._next = function (value) {
+        var windows = this.windows;
+        var len = windows.length;
+        for (var i = 0; i < len; i++) {
+            var window_1 = windows[i];
+            if (!window_1.closed) {
+                window_1.next(value);
+                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
+                    this.closeWindow(window_1);
+                }
+            }
+        }
+    };
+    WindowTimeSubscriber.prototype._error = function (err) {
+        var windows = this.windows;
+        while (windows.length > 0) {
+            windows.shift().error(err);
+        }
+        this.destination.error(err);
+    };
+    WindowTimeSubscriber.prototype._complete = function () {
+        var windows = this.windows;
+        while (windows.length > 0) {
+            var window_2 = windows.shift();
+            if (!window_2.closed) {
+                window_2.complete();
+            }
+        }
+        this.destination.complete();
+    };
+    WindowTimeSubscriber.prototype.openWindow = function () {
+        var window = new CountedSubject();
+        this.windows.push(window);
+        var destination = this.destination;
+        destination.next(window);
+        return window;
+    };
+    WindowTimeSubscriber.prototype.closeWindow = function (window) {
+        window.complete();
+        var windows = this.windows;
+        windows.splice(windows.indexOf(window), 1);
+    };
+    return WindowTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchWindowTimeSpanOnly(state) {
+    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
+    if (window) {
+        subscriber.closeWindow(window);
+    }
+    state.window = subscriber.openWindow();
+    this.schedule(state, windowTimeSpan);
+}
+function dispatchWindowCreation(state) {
+    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
+    var window = subscriber.openWindow();
+    var action = this;
+    var context = { action: action, subscription: null };
+    var timeSpanState = { subscriber: subscriber, window: window, context: context };
+    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
+    action.add(context.subscription);
+    action.schedule(state, windowCreationInterval);
+}
+function dispatchWindowClose(state) {
+    var subscriber = state.subscriber, window = state.window, context = state.context;
+    if (context && context.action && context.subscription) {
+        context.action.remove(context.subscription);
+    }
+    subscriber.closeWindow(window);
+}
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+},{"../Subject":53,"../Subscriber":55,"../scheduler/async":206,"../util/isNumeric":226,"../util/isScheduler":230}],184:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var Subscription_1 = require("../Subscription");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function windowToggle(openings, closingSelector) {
+    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
+}
+exports.windowToggle = windowToggle;
+var WindowToggleOperator = (function () {
+    function WindowToggleOperator(openings, closingSelector) {
+        this.openings = openings;
+        this.closingSelector = closingSelector;
+    }
+    WindowToggleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
+    };
+    return WindowToggleOperator;
+}());
+var WindowToggleSubscriber = (function (_super) {
+    __extends(WindowToggleSubscriber, _super);
+    function WindowToggleSubscriber(destination, openings, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.openings = openings;
+        _this.closingSelector = closingSelector;
+        _this.contexts = [];
+        _this.add(_this.openSubscription = subscribeToResult_1.subscribeToResult(_this, openings, openings));
+        return _this;
+    }
+    WindowToggleSubscriber.prototype._next = function (value) {
+        var contexts = this.contexts;
+        if (contexts) {
+            var len = contexts.length;
+            for (var i = 0; i < len; i++) {
+                contexts[i].window.next(value);
+            }
+        }
+    };
+    WindowToggleSubscriber.prototype._error = function (err) {
+        var contexts = this.contexts;
+        this.contexts = null;
+        if (contexts) {
+            var len = contexts.length;
+            var index = -1;
+            while (++index < len) {
+                var context_1 = contexts[index];
+                context_1.window.error(err);
+                context_1.subscription.unsubscribe();
+            }
+        }
+        _super.prototype._error.call(this, err);
+    };
+    WindowToggleSubscriber.prototype._complete = function () {
+        var contexts = this.contexts;
+        this.contexts = null;
+        if (contexts) {
+            var len = contexts.length;
+            var index = -1;
+            while (++index < len) {
+                var context_2 = contexts[index];
+                context_2.window.complete();
+                context_2.subscription.unsubscribe();
+            }
+        }
+        _super.prototype._complete.call(this);
+    };
+    WindowToggleSubscriber.prototype._unsubscribe = function () {
+        var contexts = this.contexts;
+        this.contexts = null;
+        if (contexts) {
+            var len = contexts.length;
+            var index = -1;
+            while (++index < len) {
+                var context_3 = contexts[index];
+                context_3.window.unsubscribe();
+                context_3.subscription.unsubscribe();
+            }
+        }
+    };
+    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        if (outerValue === this.openings) {
+            var closingNotifier = void 0;
+            try {
+                var closingSelector = this.closingSelector;
+                closingNotifier = closingSelector(innerValue);
+            }
+            catch (e) {
+                return this.error(e);
+            }
+            var window_1 = new Subject_1.Subject();
+            var subscription = new Subscription_1.Subscription();
+            var context_4 = { window: window_1, subscription: subscription };
+            this.contexts.push(context_4);
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context_4);
+            if (innerSubscription.closed) {
+                this.closeWindow(this.contexts.length - 1);
+            }
+            else {
+                innerSubscription.context = context_4;
+                subscription.add(innerSubscription);
+            }
+            this.destination.next(window_1);
+        }
+        else {
+            this.closeWindow(this.contexts.indexOf(outerValue));
+        }
+    };
+    WindowToggleSubscriber.prototype.notifyError = function (err) {
+        this.error(err);
+    };
+    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
+        if (inner !== this.openSubscription) {
+            this.closeWindow(this.contexts.indexOf(inner.context));
+        }
+    };
+    WindowToggleSubscriber.prototype.closeWindow = function (index) {
+        if (index === -1) {
+            return;
+        }
+        var contexts = this.contexts;
+        var context = contexts[index];
+        var window = context.window, subscription = context.subscription;
+        contexts.splice(index, 1);
+        window.complete();
+        subscription.unsubscribe();
+    };
+    return WindowToggleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../state":203}],195:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../OuterSubscriber":50,"../Subject":53,"../Subscription":56,"../util/subscribeToResult":239}],185:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function windowWhen(closingSelector) {
+    return function windowWhenOperatorFunction(source) {
+        return source.lift(new WindowOperator(closingSelector));
+    };
+}
+exports.windowWhen = windowWhen;
+var WindowOperator = (function () {
+    function WindowOperator(closingSelector) {
+        this.closingSelector = closingSelector;
+    }
+    WindowOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
+    };
+    return WindowOperator;
+}());
+var WindowSubscriber = (function (_super) {
+    __extends(WindowSubscriber, _super);
+    function WindowSubscriber(destination, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.closingSelector = closingSelector;
+        _this.openWindow();
+        return _this;
+    }
+    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.openWindow(innerSub);
+    };
+    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.openWindow(innerSub);
+    };
+    WindowSubscriber.prototype._next = function (value) {
+        this.window.next(value);
+    };
+    WindowSubscriber.prototype._error = function (err) {
+        this.window.error(err);
+        this.destination.error(err);
+        this.unsubscribeClosingNotification();
+    };
+    WindowSubscriber.prototype._complete = function () {
+        this.window.complete();
+        this.destination.complete();
+        this.unsubscribeClosingNotification();
+    };
+    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
+        if (this.closingNotification) {
+            this.closingNotification.unsubscribe();
+        }
+    };
+    WindowSubscriber.prototype.openWindow = function (innerSub) {
+        if (innerSub === void 0) { innerSub = null; }
+        if (innerSub) {
+            this.remove(innerSub);
+            innerSub.unsubscribe();
+        }
+        var prevWindow = this.window;
+        if (prevWindow) {
+            prevWindow.complete();
+        }
+        var window = this.window = new Subject_1.Subject();
+        this.destination.next(window);
+        var closingNotifier;
+        try {
+            var closingSelector = this.closingSelector;
+            closingNotifier = closingSelector();
+        }
+        catch (e) {
+            this.destination.error(e);
+            this.window.error(e);
+            return;
+        }
+        this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));
+    };
+    return WindowSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-(function(define) { 'use strict';
-define(function() {
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],186:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function withLatestFrom() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        args[_i] = arguments[_i];
+    }
+    return function (source) {
+        var project;
+        if (typeof args[args.length - 1] === 'function') {
+            project = args.pop();
+        }
+        var observables = args;
+        return source.lift(new WithLatestFromOperator(observables, project));
+    };
+}
+exports.withLatestFrom = withLatestFrom;
+var WithLatestFromOperator = (function () {
+    function WithLatestFromOperator(observables, project) {
+        this.observables = observables;
+        this.project = project;
+    }
+    WithLatestFromOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
+    };
+    return WithLatestFromOperator;
+}());
+var WithLatestFromSubscriber = (function (_super) {
+    __extends(WithLatestFromSubscriber, _super);
+    function WithLatestFromSubscriber(destination, observables, project) {
+        var _this = _super.call(this, destination) || this;
+        _this.observables = observables;
+        _this.project = project;
+        _this.toRespond = [];
+        var len = observables.length;
+        _this.values = new Array(len);
+        for (var i = 0; i < len; i++) {
+            _this.toRespond.push(i);
+        }
+        for (var i = 0; i < len; i++) {
+            var observable = observables[i];
+            _this.add(subscribeToResult_1.subscribeToResult(_this, observable, observable, i));
+        }
+        return _this;
+    }
+    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.values[outerIndex] = innerValue;
+        var toRespond = this.toRespond;
+        if (toRespond.length > 0) {
+            var found = toRespond.indexOf(outerIndex);
+            if (found !== -1) {
+                toRespond.splice(found, 1);
+            }
+        }
+    };
+    WithLatestFromSubscriber.prototype.notifyComplete = function () {
+    };
+    WithLatestFromSubscriber.prototype._next = function (value) {
+        if (this.toRespond.length === 0) {
+            var args = [value].concat(this.values);
+            if (this.project) {
+                this._tryProject(args);
+            }
+            else {
+                this.destination.next(args);
+            }
+        }
+    };
+    WithLatestFromSubscriber.prototype._tryProject = function (args) {
+        var result;
+        try {
+            result = this.project.apply(this, args);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return WithLatestFromSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
 
-       return function generate(Promise) {
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],187:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var zip_1 = require("../observable/zip");
+function zip() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function zipOperatorFunction(source) {
+        return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables)));
+    };
+}
+exports.zip = zip;
 
-               var resolve = Promise.resolve;
+},{"../observable/zip":85}],188:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var zip_1 = require("../observable/zip");
+function zipAll(project) {
+    return function (source) { return source.lift(new zip_1.ZipOperator(project)); };
+}
+exports.zipAll = zipAll;
 
-               Promise.iterate = iterate;
-               Promise.unfold = unfold;
+},{"../observable/zip":85}],189:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+function scheduleArray(input, scheduler) {
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        var i = 0;
+        sub.add(scheduler.schedule(function () {
+            if (i === input.length) {
+                subscriber.complete();
+                return;
+            }
+            subscriber.next(input[i++]);
+            if (!subscriber.closed) {
+                sub.add(this.schedule());
+            }
+        }));
+        return sub;
+    });
+}
+exports.scheduleArray = scheduleArray;
 
-               return Promise;
+},{"../Observable":48,"../Subscription":56}],190:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+var iterator_1 = require("../symbol/iterator");
+function scheduleIterable(input, scheduler) {
+    if (!input) {
+        throw new Error('Iterable cannot be null');
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        var iterator;
+        sub.add(function () {
+            if (iterator && typeof iterator.return === 'function') {
+                iterator.return();
+            }
+        });
+        sub.add(scheduler.schedule(function () {
+            iterator = input[iterator_1.iterator]();
+            sub.add(scheduler.schedule(function () {
+                if (subscriber.closed) {
+                    return;
+                }
+                var value;
+                var done;
+                try {
+                    var result = iterator.next();
+                    value = result.value;
+                    done = result.done;
+                }
+                catch (err) {
+                    subscriber.error(err);
+                    return;
+                }
+                if (done) {
+                    subscriber.complete();
+                }
+                else {
+                    subscriber.next(value);
+                    this.schedule();
+                }
+            }));
+        }));
+        return sub;
+    });
+}
+exports.scheduleIterable = scheduleIterable;
 
-               /**
-                * @deprecated Use github.com/cujojs/most streams and most.iterate
-                * Generate a (potentially infinite) stream of promised values:
-                * x, f(x), f(f(x)), etc. until condition(x) returns true
-                * @param {function} f function to generate a new x from the previous x
-                * @param {function} condition function that, given the current x, returns
-                *  truthy when the iterate should stop
-                * @param {function} handler function to handle the value produced by f
-                * @param {*|Promise} x starting value, may be a promise
-                * @return {Promise} the result of the last call to f before
-                *  condition returns true
-                */
-               function iterate(f, condition, handler, x) {
-                       return unfold(function(x) {
-                               return [x, f(x)];
-                       }, condition, handler, x);
-               }
+},{"../Observable":48,"../Subscription":56,"../symbol/iterator":208}],191:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+var observable_1 = require("../symbol/observable");
+function scheduleObservable(input, scheduler) {
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        sub.add(scheduler.schedule(function () {
+            var observable = input[observable_1.observable]();
+            sub.add(observable.subscribe({
+                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
+                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
+                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
+            }));
+        }));
+        return sub;
+    });
+}
+exports.scheduleObservable = scheduleObservable;
 
-               /**
-                * @deprecated Use github.com/cujojs/most streams and most.unfold
-                * Generate a (potentially infinite) stream of promised values
-                * by applying handler(generator(seed)) iteratively until
-                * condition(seed) returns true.
-                * @param {function} unspool function that generates a [value, newSeed]
-                *  given a seed.
-                * @param {function} condition function that, given the current seed, returns
-                *  truthy when the unfold should stop
-                * @param {function} handler function to handle the value produced by unspool
-                * @param x {*|Promise} starting value, may be a promise
-                * @return {Promise} the result of the last value produced by unspool before
-                *  condition returns true
-                */
-               function unfold(unspool, condition, handler, x) {
-                       return resolve(x).then(function(seed) {
-                               return resolve(condition(seed)).then(function(done) {
-                                       return done ? seed : resolve(unspool(seed)).spread(next);
-                               });
-                       });
-
-                       function next(item, newSeed) {
-                               return resolve(handler(item)).then(function() {
-                                       return unfold(unspool, condition, handler, newSeed);
-                               });
-                       }
-               }
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],196:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function progress(Promise) {
-
-               /**
-                * @deprecated
-                * Register a progress handler for this promise
-                * @param {function} onProgress
-                * @returns {Promise}
-                */
-               Promise.prototype.progress = function(onProgress) {
-                       return this.then(void 0, void 0, onProgress);
-               };
+},{"../Observable":48,"../Subscription":56,"../symbol/observable":209}],192:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+function schedulePromise(input, scheduler) {
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        sub.add(scheduler.schedule(function () { return input.then(function (value) {
+            sub.add(scheduler.schedule(function () {
+                subscriber.next(value);
+                sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
+            }));
+        }, function (err) {
+            sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
+        }); }));
+        return sub;
+    });
+}
+exports.schedulePromise = schedulePromise;
 
-               return Promise;
-       };
+},{"../Observable":48,"../Subscription":56}],193:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var scheduleObservable_1 = require("./scheduleObservable");
+var schedulePromise_1 = require("./schedulePromise");
+var scheduleArray_1 = require("./scheduleArray");
+var scheduleIterable_1 = require("./scheduleIterable");
+var isInteropObservable_1 = require("../util/isInteropObservable");
+var isPromise_1 = require("../util/isPromise");
+var isArrayLike_1 = require("../util/isArrayLike");
+var isIterable_1 = require("../util/isIterable");
+function scheduled(input, scheduler) {
+    if (input != null) {
+        if (isInteropObservable_1.isInteropObservable(input)) {
+            return scheduleObservable_1.scheduleObservable(input, scheduler);
+        }
+        else if (isPromise_1.isPromise(input)) {
+            return schedulePromise_1.schedulePromise(input, scheduler);
+        }
+        else if (isArrayLike_1.isArrayLike(input)) {
+            return scheduleArray_1.scheduleArray(input, scheduler);
+        }
+        else if (isIterable_1.isIterable(input) || typeof input === 'string') {
+            return scheduleIterable_1.scheduleIterable(input, scheduler);
+        }
+    }
+    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
+}
+exports.scheduled = scheduled;
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+},{"../util/isArrayLike":221,"../util/isInteropObservable":224,"../util/isIterable":225,"../util/isPromise":229,"./scheduleArray":189,"./scheduleIterable":190,"./scheduleObservable":191,"./schedulePromise":192}],194:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("../Subscription");
+var Action = (function (_super) {
+    __extends(Action, _super);
+    function Action(scheduler, work) {
+        return _super.call(this) || this;
+    }
+    Action.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        return this;
+    };
+    return Action;
+}(Subscription_1.Subscription));
+exports.Action = Action;
 
-},{}],197:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"../Subscription":56}],195:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var AnimationFrameAction = (function (_super) {
+    __extends(AnimationFrameAction, _super);
+    function AnimationFrameAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        return _this;
+    }
+    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay !== null && delay > 0) {
+            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
+        }
+        scheduler.actions.push(this);
+        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
+    };
+    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
+            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
+        }
+        if (scheduler.actions.length === 0) {
+            cancelAnimationFrame(id);
+            scheduler.scheduled = undefined;
+        }
+        return undefined;
+    };
+    return AnimationFrameAction;
+}(AsyncAction_1.AsyncAction));
+exports.AnimationFrameAction = AnimationFrameAction;
 
-(function(define) { 'use strict';
-define(function(require) {
+},{"./AsyncAction":199}],196:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var AnimationFrameScheduler = (function (_super) {
+    __extends(AnimationFrameScheduler, _super);
+    function AnimationFrameScheduler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    AnimationFrameScheduler.prototype.flush = function (action) {
+        this.active = true;
+        this.scheduled = undefined;
+        var actions = this.actions;
+        var error;
+        var index = -1;
+        var count = actions.length;
+        action = action || actions.shift();
+        do {
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        } while (++index < count && (action = actions.shift()));
+        this.active = false;
+        if (error) {
+            while (++index < count && (action = actions.shift())) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    return AnimationFrameScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.AnimationFrameScheduler = AnimationFrameScheduler;
 
-       var env = require('../env');
-       var TimeoutError = require('../TimeoutError');
+},{"./AsyncScheduler":200}],197:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Immediate_1 = require("../util/Immediate");
+var AsyncAction_1 = require("./AsyncAction");
+var AsapAction = (function (_super) {
+    __extends(AsapAction, _super);
+    function AsapAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        return _this;
+    }
+    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay !== null && delay > 0) {
+            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
+        }
+        scheduler.actions.push(this);
+        return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
+    };
+    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
+            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
+        }
+        if (scheduler.actions.length === 0) {
+            Immediate_1.Immediate.clearImmediate(id);
+            scheduler.scheduled = undefined;
+        }
+        return undefined;
+    };
+    return AsapAction;
+}(AsyncAction_1.AsyncAction));
+exports.AsapAction = AsapAction;
 
-       function setTimeout(f, ms, x, y) {
-               return env.setTimer(function() {
-                       f(x, y, ms);
-               }, ms);
-       }
+},{"../util/Immediate":213,"./AsyncAction":199}],198:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var AsapScheduler = (function (_super) {
+    __extends(AsapScheduler, _super);
+    function AsapScheduler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    AsapScheduler.prototype.flush = function (action) {
+        this.active = true;
+        this.scheduled = undefined;
+        var actions = this.actions;
+        var error;
+        var index = -1;
+        var count = actions.length;
+        action = action || actions.shift();
+        do {
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        } while (++index < count && (action = actions.shift()));
+        this.active = false;
+        if (error) {
+            while (++index < count && (action = actions.shift())) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    return AsapScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.AsapScheduler = AsapScheduler;
 
-       return function timed(Promise) {
-               /**
-                * Return a new promise whose fulfillment value is revealed only
-                * after ms milliseconds
-                * @param {number} ms milliseconds
-                * @returns {Promise}
-                */
-               Promise.prototype.delay = function(ms) {
-                       var p = this._beget();
-                       this._handler.fold(handleDelay, ms, void 0, p._handler);
-                       return p;
-               };
+},{"./AsyncScheduler":200}],199:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Action_1 = require("./Action");
+var AsyncAction = (function (_super) {
+    __extends(AsyncAction, _super);
+    function AsyncAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        _this.pending = false;
+        return _this;
+    }
+    AsyncAction.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (this.closed) {
+            return this;
+        }
+        this.state = state;
+        var id = this.id;
+        var scheduler = this.scheduler;
+        if (id != null) {
+            this.id = this.recycleAsyncId(scheduler, id, delay);
+        }
+        this.pending = true;
+        this.delay = delay;
+        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
+        return this;
+    };
+    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        return setInterval(scheduler.flush.bind(scheduler, this), delay);
+    };
+    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay !== null && this.delay === delay && this.pending === false) {
+            return id;
+        }
+        clearInterval(id);
+        return undefined;
+    };
+    AsyncAction.prototype.execute = function (state, delay) {
+        if (this.closed) {
+            return new Error('executing a cancelled action');
+        }
+        this.pending = false;
+        var error = this._execute(state, delay);
+        if (error) {
+            return error;
+        }
+        else if (this.pending === false && this.id != null) {
+            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
+        }
+    };
+    AsyncAction.prototype._execute = function (state, delay) {
+        var errored = false;
+        var errorValue = undefined;
+        try {
+            this.work(state);
+        }
+        catch (e) {
+            errored = true;
+            errorValue = !!e && e || new Error(e);
+        }
+        if (errored) {
+            this.unsubscribe();
+            return errorValue;
+        }
+    };
+    AsyncAction.prototype._unsubscribe = function () {
+        var id = this.id;
+        var scheduler = this.scheduler;
+        var actions = scheduler.actions;
+        var index = actions.indexOf(this);
+        this.work = null;
+        this.state = null;
+        this.pending = false;
+        this.scheduler = null;
+        if (index !== -1) {
+            actions.splice(index, 1);
+        }
+        if (id != null) {
+            this.id = this.recycleAsyncId(scheduler, id, null);
+        }
+        this.delay = null;
+    };
+    return AsyncAction;
+}(Action_1.Action));
+exports.AsyncAction = AsyncAction;
 
-               function handleDelay(ms, x, h) {
-                       setTimeout(resolveDelay, ms, x, h);
-               }
+},{"./Action":194}],200:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Scheduler_1 = require("../Scheduler");
+var AsyncScheduler = (function (_super) {
+    __extends(AsyncScheduler, _super);
+    function AsyncScheduler(SchedulerAction, now) {
+        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
+        var _this = _super.call(this, SchedulerAction, function () {
+            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
+                return AsyncScheduler.delegate.now();
+            }
+            else {
+                return now();
+            }
+        }) || this;
+        _this.actions = [];
+        _this.active = false;
+        _this.scheduled = undefined;
+        return _this;
+    }
+    AsyncScheduler.prototype.schedule = function (work, delay, state) {
+        if (delay === void 0) { delay = 0; }
+        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
+            return AsyncScheduler.delegate.schedule(work, delay, state);
+        }
+        else {
+            return _super.prototype.schedule.call(this, work, delay, state);
+        }
+    };
+    AsyncScheduler.prototype.flush = function (action) {
+        var actions = this.actions;
+        if (this.active) {
+            actions.push(action);
+            return;
+        }
+        var error;
+        this.active = true;
+        do {
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        } while (action = actions.shift());
+        this.active = false;
+        if (error) {
+            while (action = actions.shift()) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    return AsyncScheduler;
+}(Scheduler_1.Scheduler));
+exports.AsyncScheduler = AsyncScheduler;
 
-               function resolveDelay(x, h) {
-                       h.resolve(x);
-               }
+},{"../Scheduler":52}],201:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var QueueAction = (function (_super) {
+    __extends(QueueAction, _super);
+    function QueueAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        return _this;
+    }
+    QueueAction.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay > 0) {
+            return _super.prototype.schedule.call(this, state, delay);
+        }
+        this.delay = delay;
+        this.state = state;
+        this.scheduler.flush(this);
+        return this;
+    };
+    QueueAction.prototype.execute = function (state, delay) {
+        return (delay > 0 || this.closed) ?
+            _super.prototype.execute.call(this, state, delay) :
+            this._execute(state, delay);
+    };
+    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
+            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
+        }
+        return scheduler.flush(this);
+    };
+    return QueueAction;
+}(AsyncAction_1.AsyncAction));
+exports.QueueAction = QueueAction;
 
-               /**
-                * Return a new promise that rejects after ms milliseconds unless
-                * this promise fulfills earlier, in which case the returned promise
-                * fulfills with the same value.
-                * @param {number} ms milliseconds
-                * @param {Error|*=} reason optional rejection reason to use, defaults
-                *   to a TimeoutError if not provided
-                * @returns {Promise}
-                */
-               Promise.prototype.timeout = function(ms, reason) {
-                       var p = this._beget();
-                       var h = p._handler;
+},{"./AsyncAction":199}],202:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var QueueScheduler = (function (_super) {
+    __extends(QueueScheduler, _super);
+    function QueueScheduler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    return QueueScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.QueueScheduler = QueueScheduler;
 
-                       var t = setTimeout(onTimeout, ms, reason, p._handler);
+},{"./AsyncScheduler":200}],203:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var VirtualTimeScheduler = (function (_super) {
+    __extends(VirtualTimeScheduler, _super);
+    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
+        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
+        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
+        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
+        _this.maxFrames = maxFrames;
+        _this.frame = 0;
+        _this.index = -1;
+        return _this;
+    }
+    VirtualTimeScheduler.prototype.flush = function () {
+        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
+        var error, action;
+        while ((action = actions[0]) && action.delay <= maxFrames) {
+            actions.shift();
+            this.frame = action.delay;
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        }
+        if (error) {
+            while (action = actions.shift()) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    VirtualTimeScheduler.frameTimeFactor = 10;
+    return VirtualTimeScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.VirtualTimeScheduler = VirtualTimeScheduler;
+var VirtualAction = (function (_super) {
+    __extends(VirtualAction, _super);
+    function VirtualAction(scheduler, work, index) {
+        if (index === void 0) { index = scheduler.index += 1; }
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        _this.index = index;
+        _this.active = true;
+        _this.index = scheduler.index = index;
+        return _this;
+    }
+    VirtualAction.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (!this.id) {
+            return _super.prototype.schedule.call(this, state, delay);
+        }
+        this.active = false;
+        var action = new VirtualAction(this.scheduler, this.work);
+        this.add(action);
+        return action.schedule(state, delay);
+    };
+    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        this.delay = scheduler.frame + delay;
+        var actions = scheduler.actions;
+        actions.push(this);
+        actions.sort(VirtualAction.sortActions);
+        return true;
+    };
+    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        return undefined;
+    };
+    VirtualAction.prototype._execute = function (state, delay) {
+        if (this.active === true) {
+            return _super.prototype._execute.call(this, state, delay);
+        }
+    };
+    VirtualAction.sortActions = function (a, b) {
+        if (a.delay === b.delay) {
+            if (a.index === b.index) {
+                return 0;
+            }
+            else if (a.index > b.index) {
+                return 1;
+            }
+            else {
+                return -1;
+            }
+        }
+        else if (a.delay > b.delay) {
+            return 1;
+        }
+        else {
+            return -1;
+        }
+    };
+    return VirtualAction;
+}(AsyncAction_1.AsyncAction));
+exports.VirtualAction = VirtualAction;
 
-                       this._handler.visit(h,
-                               function onFulfill(x) {
-                                       env.clearTimer(t);
-                                       this.resolve(x); // this = h
-                               },
-                               function onReject(x) {
-                                       env.clearTimer(t);
-                                       this.reject(x); // this = h
-                               },
-                               h.notify);
+},{"./AsyncAction":199,"./AsyncScheduler":200}],204:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AnimationFrameAction_1 = require("./AnimationFrameAction");
+var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
+exports.animationFrame = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
 
-                       return p;
-               };
+},{"./AnimationFrameAction":195,"./AnimationFrameScheduler":196}],205:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsapAction_1 = require("./AsapAction");
+var AsapScheduler_1 = require("./AsapScheduler");
+exports.asap = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
 
-               function onTimeout(reason, h, ms) {
-                       var e = typeof reason === 'undefined'
-                               ? new TimeoutError('timed out after ' + ms + 'ms')
-                               : reason;
-                       h.reject(e);
-               }
+},{"./AsapAction":197,"./AsapScheduler":198}],206:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var AsyncScheduler_1 = require("./AsyncScheduler");
+exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
 
-               return Promise;
-       };
+},{"./AsyncAction":199,"./AsyncScheduler":200}],207:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var QueueAction_1 = require("./QueueAction");
+var QueueScheduler_1 = require("./QueueScheduler");
+exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+},{"./QueueAction":201,"./QueueScheduler":202}],208:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function getSymbolIterator() {
+    if (typeof Symbol !== 'function' || !Symbol.iterator) {
+        return '@@iterator';
+    }
+    return Symbol.iterator;
+}
+exports.getSymbolIterator = getSymbolIterator;
+exports.iterator = getSymbolIterator();
+exports.$$iterator = exports.iterator;
 
-},{"../TimeoutError":189,"../env":200}],198:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{}],209:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();
 
-(function(define) { 'use strict';
-define(function(require) {
+},{}],210:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.rxSubscriber = (function () {
+    return typeof Symbol === 'function'
+        ? Symbol('rxSubscriber')
+        : '@@rxSubscriber_' + Math.random();
+})();
+exports.$$rxSubscriber = exports.rxSubscriber;
 
-       var setTimer = require('../env').setTimer;
-       var format = require('../format');
+},{}],211:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ArgumentOutOfRangeErrorImpl = (function () {
+    function ArgumentOutOfRangeErrorImpl() {
+        Error.call(this);
+        this.message = 'argument out of range';
+        this.name = 'ArgumentOutOfRangeError';
+        return this;
+    }
+    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
+    return ArgumentOutOfRangeErrorImpl;
+})();
+exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
 
-       return function unhandledRejection(Promise) {
+},{}],212:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyErrorImpl = (function () {
+    function EmptyErrorImpl() {
+        Error.call(this);
+        this.message = 'no elements in sequence';
+        this.name = 'EmptyError';
+        return this;
+    }
+    EmptyErrorImpl.prototype = Object.create(Error.prototype);
+    return EmptyErrorImpl;
+})();
+exports.EmptyError = EmptyErrorImpl;
 
-               var logError = noop;
-               var logInfo = noop;
-               var localConsole;
+},{}],213:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var nextHandle = 1;
+var RESOLVED = (function () { return Promise.resolve(); })();
+var activeHandles = {};
+function findAndClearHandle(handle) {
+    if (handle in activeHandles) {
+        delete activeHandles[handle];
+        return true;
+    }
+    return false;
+}
+exports.Immediate = {
+    setImmediate: function (cb) {
+        var handle = nextHandle++;
+        activeHandles[handle] = true;
+        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
+        return handle;
+    },
+    clearImmediate: function (handle) {
+        findAndClearHandle(handle);
+    },
+};
+exports.TestTools = {
+    pending: function () {
+        return Object.keys(activeHandles).length;
+    }
+};
 
-               if(typeof console !== 'undefined') {
-                       // Alias console to prevent things like uglify's drop_console option from
-                       // removing console.log/error. Unhandled rejections fall into the same
-                       // category as uncaught exceptions, and build tools shouldn't silence them.
-                       localConsole = console;
-                       logError = typeof localConsole.error !== 'undefined'
-                               ? function (e) { localConsole.error(e); }
-                               : function (e) { localConsole.log(e); };
+},{}],214:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ObjectUnsubscribedErrorImpl = (function () {
+    function ObjectUnsubscribedErrorImpl() {
+        Error.call(this);
+        this.message = 'object unsubscribed';
+        this.name = 'ObjectUnsubscribedError';
+        return this;
+    }
+    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
+    return ObjectUnsubscribedErrorImpl;
+})();
+exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
 
-                       logInfo = typeof localConsole.info !== 'undefined'
-                               ? function (e) { localConsole.info(e); }
-                               : function (e) { localConsole.log(e); };
-               }
+},{}],215:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var TimeoutErrorImpl = (function () {
+    function TimeoutErrorImpl() {
+        Error.call(this);
+        this.message = 'Timeout has occurred';
+        this.name = 'TimeoutError';
+        return this;
+    }
+    TimeoutErrorImpl.prototype = Object.create(Error.prototype);
+    return TimeoutErrorImpl;
+})();
+exports.TimeoutError = TimeoutErrorImpl;
 
-               Promise.onPotentiallyUnhandledRejection = function(rejection) {
-                       enqueue(report, rejection);
-               };
+},{}],216:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var UnsubscriptionErrorImpl = (function () {
+    function UnsubscriptionErrorImpl(errors) {
+        Error.call(this);
+        this.message = errors ?
+            errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
+        this.name = 'UnsubscriptionError';
+        this.errors = errors;
+        return this;
+    }
+    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
+    return UnsubscriptionErrorImpl;
+})();
+exports.UnsubscriptionError = UnsubscriptionErrorImpl;
 
-               Promise.onPotentiallyUnhandledRejectionHandled = function(rejection) {
-                       enqueue(unreport, rejection);
-               };
+},{}],217:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function canReportError(observer) {
+    while (observer) {
+        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
+        if (closed_1 || isStopped) {
+            return false;
+        }
+        else if (destination && destination instanceof Subscriber_1.Subscriber) {
+            observer = destination;
+        }
+        else {
+            observer = null;
+        }
+    }
+    return true;
+}
+exports.canReportError = canReportError;
 
-               Promise.onFatalRejection = function(rejection) {
-                       enqueue(throwit, rejection.value);
-               };
+},{"../Subscriber":55}],218:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function hostReportError(err) {
+    setTimeout(function () { throw err; }, 0);
+}
+exports.hostReportError = hostReportError;
 
-               var tasks = [];
-               var reported = [];
-               var running = null;
+},{}],219:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function identity(x) {
+    return x;
+}
+exports.identity = identity;
 
-               function report(r) {
-                       if(!r.handled) {
-                               reported.push(r);
-                               logError('Potentially unhandled rejection [' + r.id + '] ' + format.formatError(r.value));
-                       }
-               }
+},{}],220:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();
 
-               function unreport(r) {
-                       var i = reported.indexOf(r);
-                       if(i >= 0) {
-                               reported.splice(i, 1);
-                               logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value));
-                       }
-               }
+},{}],221:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
 
-               function enqueue(f, x) {
-                       tasks.push(f, x);
-                       if(running === null) {
-                               running = setTimer(flush, 0);
-                       }
-               }
+},{}],222:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isDate(value) {
+    return value instanceof Date && !isNaN(+value);
+}
+exports.isDate = isDate;
 
-               function flush() {
-                       running = null;
-                       while(tasks.length > 0) {
-                               tasks.shift()(tasks.shift());
-                       }
-               }
+},{}],223:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isFunction(x) {
+    return typeof x === 'function';
+}
+exports.isFunction = isFunction;
 
-               return Promise;
-       };
+},{}],224:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var observable_1 = require("../symbol/observable");
+function isInteropObservable(input) {
+    return input && typeof input[observable_1.observable] === 'function';
+}
+exports.isInteropObservable = isInteropObservable;
 
-       function throwit(e) {
-               throw e;
-       }
+},{"../symbol/observable":209}],225:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var iterator_1 = require("../symbol/iterator");
+function isIterable(input) {
+    return input && typeof input[iterator_1.iterator] === 'function';
+}
+exports.isIterable = isIterable;
 
-       function noop() {}
+},{"../symbol/iterator":208}],226:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("./isArray");
+function isNumeric(val) {
+    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
+}
+exports.isNumeric = isNumeric;
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+},{"./isArray":220}],227:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isObject(x) {
+    return x !== null && typeof x === 'object';
+}
+exports.isObject = isObject;
 
-},{"../env":200,"../format":201}],199:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{}],228:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+function isObservable(obj) {
+    return !!obj && (obj instanceof Observable_1.Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
+}
+exports.isObservable = isObservable;
 
-(function(define) { 'use strict';
-define(function() {
+},{"../Observable":48}],229:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isPromise(value) {
+    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
+}
+exports.isPromise = isPromise;
 
-       return function addWith(Promise) {
-               /**
-                * Returns a promise whose handlers will be called with `this` set to
-                * the supplied receiver.  Subsequent promises derived from the
-                * returned promise will also have their handlers called with receiver
-                * as `this`. Calling `with` with undefined or no arguments will return
-                * a promise whose handlers will again be called in the usual Promises/A+
-                * way (no `this`) thus safely undoing any previous `with` in the
-                * promise chain.
-                *
-                * WARNING: Promises returned from `with`/`withThis` are NOT Promises/A+
-                * compliant, specifically violating 2.2.5 (http://promisesaplus.com/#point-41)
-                *
-                * @param {object} receiver `this` value for all handlers attached to
-                *  the returned promise.
-                * @returns {Promise}
-                */
-               Promise.prototype['with'] = Promise.prototype.withThis = function(receiver) {
-                       var p = this._beget();
-                       var child = p._handler;
-                       child.receiver = receiver;
-                       this._handler.chain(child, receiver);
-                       return p;
-               };
+},{}],230:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isScheduler(value) {
+    return value && typeof value.schedule === 'function';
+}
+exports.isScheduler = isScheduler;
 
-               return Promise;
-       };
+},{}],231:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function noop() { }
+exports.noop = noop;
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+},{}],232:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function not(pred, thisArg) {
+    function notPred() {
+        return !(notPred.pred.apply(notPred.thisArg, arguments));
+    }
+    notPred.pred = pred;
+    notPred.thisArg = thisArg;
+    return notPred;
+}
+exports.not = not;
 
+},{}],233:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var identity_1 = require("./identity");
+function pipe() {
+    var fns = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        fns[_i] = arguments[_i];
+    }
+    return pipeFromArray(fns);
+}
+exports.pipe = pipe;
+function pipeFromArray(fns) {
+    if (fns.length === 0) {
+        return identity_1.identity;
+    }
+    if (fns.length === 1) {
+        return fns[0];
+    }
+    return function piped(input) {
+        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
+    };
+}
+exports.pipeFromArray = pipeFromArray;
 
-},{}],200:[function(require,module,exports){
-(function (process){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+},{"./identity":219}],234:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var subscribeToArray_1 = require("./subscribeToArray");
+var subscribeToPromise_1 = require("./subscribeToPromise");
+var subscribeToIterable_1 = require("./subscribeToIterable");
+var subscribeToObservable_1 = require("./subscribeToObservable");
+var isArrayLike_1 = require("./isArrayLike");
+var isPromise_1 = require("./isPromise");
+var isObject_1 = require("./isObject");
+var iterator_1 = require("../symbol/iterator");
+var observable_1 = require("../symbol/observable");
+exports.subscribeTo = function (result) {
+    if (!!result && typeof result[observable_1.observable] === 'function') {
+        return subscribeToObservable_1.subscribeToObservable(result);
+    }
+    else if (isArrayLike_1.isArrayLike(result)) {
+        return subscribeToArray_1.subscribeToArray(result);
+    }
+    else if (isPromise_1.isPromise(result)) {
+        return subscribeToPromise_1.subscribeToPromise(result);
+    }
+    else if (!!result && typeof result[iterator_1.iterator] === 'function') {
+        return subscribeToIterable_1.subscribeToIterable(result);
+    }
+    else {
+        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
+        var msg = "You provided " + value + " where a stream was expected."
+            + ' You can provide an Observable, Promise, Array, or Iterable.';
+        throw new TypeError(msg);
+    }
+};
 
-/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
-(function(define) { 'use strict';
-define(function(require) {
-       /*jshint maxcomplexity:6*/
+},{"../symbol/iterator":208,"../symbol/observable":209,"./isArrayLike":221,"./isObject":227,"./isPromise":229,"./subscribeToArray":235,"./subscribeToIterable":236,"./subscribeToObservable":237,"./subscribeToPromise":238}],235:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.subscribeToArray = function (array) { return function (subscriber) {
+    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
+        subscriber.next(array[i]);
+    }
+    subscriber.complete();
+}; };
 
-       // Sniff "best" async scheduling option
-       // Prefer process.nextTick or MutationObserver, then check for
-       // setTimeout, and finally vertx, since its the only env that doesn't
-       // have setTimeout
+},{}],236:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var iterator_1 = require("../symbol/iterator");
+exports.subscribeToIterable = function (iterable) { return function (subscriber) {
+    var iterator = iterable[iterator_1.iterator]();
+    do {
+        var item = iterator.next();
+        if (item.done) {
+            subscriber.complete();
+            break;
+        }
+        subscriber.next(item.value);
+        if (subscriber.closed) {
+            break;
+        }
+    } while (true);
+    if (typeof iterator.return === 'function') {
+        subscriber.add(function () {
+            if (iterator.return) {
+                iterator.return();
+            }
+        });
+    }
+    return subscriber;
+}; };
 
-       var MutationObs;
-       var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
+},{"../symbol/iterator":208}],237:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var observable_1 = require("../symbol/observable");
+exports.subscribeToObservable = function (obj) { return function (subscriber) {
+    var obs = obj[observable_1.observable]();
+    if (typeof obs.subscribe !== 'function') {
+        throw new TypeError('Provided object does not correctly implement Symbol.observable');
+    }
+    else {
+        return obs.subscribe(subscriber);
+    }
+}; };
 
-       // Default env
-       var setTimer = function(f, ms) { return setTimeout(f, ms); };
-       var clearTimer = function(t) { return clearTimeout(t); };
-       var asap = function (f) { return capturedSetTimeout(f, 0); };
+},{"../symbol/observable":209}],238:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var hostReportError_1 = require("./hostReportError");
+exports.subscribeToPromise = function (promise) { return function (subscriber) {
+    promise.then(function (value) {
+        if (!subscriber.closed) {
+            subscriber.next(value);
+            subscriber.complete();
+        }
+    }, function (err) { return subscriber.error(err); })
+        .then(null, hostReportError_1.hostReportError);
+    return subscriber;
+}; };
 
-       // Detect specific env
-       if (isNode()) { // Node
-               asap = function (f) { return process.nextTick(f); };
+},{"./hostReportError":218}],239:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeTo_1 = require("./subscribeTo");
+var Observable_1 = require("../Observable");
+function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
+    if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
+    if (innerSubscriber.closed) {
+        return undefined;
+    }
+    if (result instanceof Observable_1.Observable) {
+        return result.subscribe(innerSubscriber);
+    }
+    return subscribeTo_1.subscribeTo(result)(innerSubscriber);
+}
+exports.subscribeToResult = subscribeToResult;
 
-       } else if (MutationObs = hasMutationObserver()) { // Modern browser
-               asap = initMutationObserver(MutationObs);
+},{"../InnerSubscriber":46,"../Observable":48,"./subscribeTo":234}],240:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var rxSubscriber_1 = require("../symbol/rxSubscriber");
+var Observer_1 = require("../Observer");
+function toSubscriber(nextOrObserver, error, complete) {
+    if (nextOrObserver) {
+        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
+            return nextOrObserver;
+        }
+        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
+            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
+        }
+    }
+    if (!nextOrObserver && !error && !complete) {
+        return new Subscriber_1.Subscriber(Observer_1.empty);
+    }
+    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
+}
+exports.toSubscriber = toSubscriber;
 
-       } else if (!capturedSetTimeout) { // vert.x
-               var vertxRequire = require;
-               var vertx = vertxRequire('vertx');
-               setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
-               clearTimer = vertx.cancelTimer;
-               asap = vertx.runOnLoop || vertx.runOnContext;
-       }
+},{"../Observer":49,"../Subscriber":55,"../symbol/rxSubscriber":210}],241:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var audit_1 = require("../internal/operators/audit");
+exports.audit = audit_1.audit;
+var auditTime_1 = require("../internal/operators/auditTime");
+exports.auditTime = auditTime_1.auditTime;
+var buffer_1 = require("../internal/operators/buffer");
+exports.buffer = buffer_1.buffer;
+var bufferCount_1 = require("../internal/operators/bufferCount");
+exports.bufferCount = bufferCount_1.bufferCount;
+var bufferTime_1 = require("../internal/operators/bufferTime");
+exports.bufferTime = bufferTime_1.bufferTime;
+var bufferToggle_1 = require("../internal/operators/bufferToggle");
+exports.bufferToggle = bufferToggle_1.bufferToggle;
+var bufferWhen_1 = require("../internal/operators/bufferWhen");
+exports.bufferWhen = bufferWhen_1.bufferWhen;
+var catchError_1 = require("../internal/operators/catchError");
+exports.catchError = catchError_1.catchError;
+var combineAll_1 = require("../internal/operators/combineAll");
+exports.combineAll = combineAll_1.combineAll;
+var combineLatest_1 = require("../internal/operators/combineLatest");
+exports.combineLatest = combineLatest_1.combineLatest;
+var concat_1 = require("../internal/operators/concat");
+exports.concat = concat_1.concat;
+var concatAll_1 = require("../internal/operators/concatAll");
+exports.concatAll = concatAll_1.concatAll;
+var concatMap_1 = require("../internal/operators/concatMap");
+exports.concatMap = concatMap_1.concatMap;
+var concatMapTo_1 = require("../internal/operators/concatMapTo");
+exports.concatMapTo = concatMapTo_1.concatMapTo;
+var count_1 = require("../internal/operators/count");
+exports.count = count_1.count;
+var debounce_1 = require("../internal/operators/debounce");
+exports.debounce = debounce_1.debounce;
+var debounceTime_1 = require("../internal/operators/debounceTime");
+exports.debounceTime = debounceTime_1.debounceTime;
+var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
+exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
+var delay_1 = require("../internal/operators/delay");
+exports.delay = delay_1.delay;
+var delayWhen_1 = require("../internal/operators/delayWhen");
+exports.delayWhen = delayWhen_1.delayWhen;
+var dematerialize_1 = require("../internal/operators/dematerialize");
+exports.dematerialize = dematerialize_1.dematerialize;
+var distinct_1 = require("../internal/operators/distinct");
+exports.distinct = distinct_1.distinct;
+var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
+exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
+var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
+exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
+var elementAt_1 = require("../internal/operators/elementAt");
+exports.elementAt = elementAt_1.elementAt;
+var endWith_1 = require("../internal/operators/endWith");
+exports.endWith = endWith_1.endWith;
+var every_1 = require("../internal/operators/every");
+exports.every = every_1.every;
+var exhaust_1 = require("../internal/operators/exhaust");
+exports.exhaust = exhaust_1.exhaust;
+var exhaustMap_1 = require("../internal/operators/exhaustMap");
+exports.exhaustMap = exhaustMap_1.exhaustMap;
+var expand_1 = require("../internal/operators/expand");
+exports.expand = expand_1.expand;
+var filter_1 = require("../internal/operators/filter");
+exports.filter = filter_1.filter;
+var finalize_1 = require("../internal/operators/finalize");
+exports.finalize = finalize_1.finalize;
+var find_1 = require("../internal/operators/find");
+exports.find = find_1.find;
+var findIndex_1 = require("../internal/operators/findIndex");
+exports.findIndex = findIndex_1.findIndex;
+var first_1 = require("../internal/operators/first");
+exports.first = first_1.first;
+var groupBy_1 = require("../internal/operators/groupBy");
+exports.groupBy = groupBy_1.groupBy;
+var ignoreElements_1 = require("../internal/operators/ignoreElements");
+exports.ignoreElements = ignoreElements_1.ignoreElements;
+var isEmpty_1 = require("../internal/operators/isEmpty");
+exports.isEmpty = isEmpty_1.isEmpty;
+var last_1 = require("../internal/operators/last");
+exports.last = last_1.last;
+var map_1 = require("../internal/operators/map");
+exports.map = map_1.map;
+var mapTo_1 = require("../internal/operators/mapTo");
+exports.mapTo = mapTo_1.mapTo;
+var materialize_1 = require("../internal/operators/materialize");
+exports.materialize = materialize_1.materialize;
+var max_1 = require("../internal/operators/max");
+exports.max = max_1.max;
+var merge_1 = require("../internal/operators/merge");
+exports.merge = merge_1.merge;
+var mergeAll_1 = require("../internal/operators/mergeAll");
+exports.mergeAll = mergeAll_1.mergeAll;
+var mergeMap_1 = require("../internal/operators/mergeMap");
+exports.mergeMap = mergeMap_1.mergeMap;
+var mergeMap_2 = require("../internal/operators/mergeMap");
+exports.flatMap = mergeMap_2.mergeMap;
+var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
+exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
+var mergeScan_1 = require("../internal/operators/mergeScan");
+exports.mergeScan = mergeScan_1.mergeScan;
+var min_1 = require("../internal/operators/min");
+exports.min = min_1.min;
+var multicast_1 = require("../internal/operators/multicast");
+exports.multicast = multicast_1.multicast;
+var observeOn_1 = require("../internal/operators/observeOn");
+exports.observeOn = observeOn_1.observeOn;
+var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
+exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
+var pairwise_1 = require("../internal/operators/pairwise");
+exports.pairwise = pairwise_1.pairwise;
+var partition_1 = require("../internal/operators/partition");
+exports.partition = partition_1.partition;
+var pluck_1 = require("../internal/operators/pluck");
+exports.pluck = pluck_1.pluck;
+var publish_1 = require("../internal/operators/publish");
+exports.publish = publish_1.publish;
+var publishBehavior_1 = require("../internal/operators/publishBehavior");
+exports.publishBehavior = publishBehavior_1.publishBehavior;
+var publishLast_1 = require("../internal/operators/publishLast");
+exports.publishLast = publishLast_1.publishLast;
+var publishReplay_1 = require("../internal/operators/publishReplay");
+exports.publishReplay = publishReplay_1.publishReplay;
+var race_1 = require("../internal/operators/race");
+exports.race = race_1.race;
+var reduce_1 = require("../internal/operators/reduce");
+exports.reduce = reduce_1.reduce;
+var repeat_1 = require("../internal/operators/repeat");
+exports.repeat = repeat_1.repeat;
+var repeatWhen_1 = require("../internal/operators/repeatWhen");
+exports.repeatWhen = repeatWhen_1.repeatWhen;
+var retry_1 = require("../internal/operators/retry");
+exports.retry = retry_1.retry;
+var retryWhen_1 = require("../internal/operators/retryWhen");
+exports.retryWhen = retryWhen_1.retryWhen;
+var refCount_1 = require("../internal/operators/refCount");
+exports.refCount = refCount_1.refCount;
+var sample_1 = require("../internal/operators/sample");
+exports.sample = sample_1.sample;
+var sampleTime_1 = require("../internal/operators/sampleTime");
+exports.sampleTime = sampleTime_1.sampleTime;
+var scan_1 = require("../internal/operators/scan");
+exports.scan = scan_1.scan;
+var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
+exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
+var share_1 = require("../internal/operators/share");
+exports.share = share_1.share;
+var shareReplay_1 = require("../internal/operators/shareReplay");
+exports.shareReplay = shareReplay_1.shareReplay;
+var single_1 = require("../internal/operators/single");
+exports.single = single_1.single;
+var skip_1 = require("../internal/operators/skip");
+exports.skip = skip_1.skip;
+var skipLast_1 = require("../internal/operators/skipLast");
+exports.skipLast = skipLast_1.skipLast;
+var skipUntil_1 = require("../internal/operators/skipUntil");
+exports.skipUntil = skipUntil_1.skipUntil;
+var skipWhile_1 = require("../internal/operators/skipWhile");
+exports.skipWhile = skipWhile_1.skipWhile;
+var startWith_1 = require("../internal/operators/startWith");
+exports.startWith = startWith_1.startWith;
+var subscribeOn_1 = require("../internal/operators/subscribeOn");
+exports.subscribeOn = subscribeOn_1.subscribeOn;
+var switchAll_1 = require("../internal/operators/switchAll");
+exports.switchAll = switchAll_1.switchAll;
+var switchMap_1 = require("../internal/operators/switchMap");
+exports.switchMap = switchMap_1.switchMap;
+var switchMapTo_1 = require("../internal/operators/switchMapTo");
+exports.switchMapTo = switchMapTo_1.switchMapTo;
+var take_1 = require("../internal/operators/take");
+exports.take = take_1.take;
+var takeLast_1 = require("../internal/operators/takeLast");
+exports.takeLast = takeLast_1.takeLast;
+var takeUntil_1 = require("../internal/operators/takeUntil");
+exports.takeUntil = takeUntil_1.takeUntil;
+var takeWhile_1 = require("../internal/operators/takeWhile");
+exports.takeWhile = takeWhile_1.takeWhile;
+var tap_1 = require("../internal/operators/tap");
+exports.tap = tap_1.tap;
+var throttle_1 = require("../internal/operators/throttle");
+exports.throttle = throttle_1.throttle;
+var throttleTime_1 = require("../internal/operators/throttleTime");
+exports.throttleTime = throttleTime_1.throttleTime;
+var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
+exports.throwIfEmpty = throwIfEmpty_1.throwIfEmpty;
+var timeInterval_1 = require("../internal/operators/timeInterval");
+exports.timeInterval = timeInterval_1.timeInterval;
+var timeout_1 = require("../internal/operators/timeout");
+exports.timeout = timeout_1.timeout;
+var timeoutWith_1 = require("../internal/operators/timeoutWith");
+exports.timeoutWith = timeoutWith_1.timeoutWith;
+var timestamp_1 = require("../internal/operators/timestamp");
+exports.timestamp = timestamp_1.timestamp;
+var toArray_1 = require("../internal/operators/toArray");
+exports.toArray = toArray_1.toArray;
+var window_1 = require("../internal/operators/window");
+exports.window = window_1.window;
+var windowCount_1 = require("../internal/operators/windowCount");
+exports.windowCount = windowCount_1.windowCount;
+var windowTime_1 = require("../internal/operators/windowTime");
+exports.windowTime = windowTime_1.windowTime;
+var windowToggle_1 = require("../internal/operators/windowToggle");
+exports.windowToggle = windowToggle_1.windowToggle;
+var windowWhen_1 = require("../internal/operators/windowWhen");
+exports.windowWhen = windowWhen_1.windowWhen;
+var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
+exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
+var zip_1 = require("../internal/operators/zip");
+exports.zip = zip_1.zip;
+var zipAll_1 = require("../internal/operators/zipAll");
+exports.zipAll = zipAll_1.zipAll;
+
+},{"../internal/operators/audit":86,"../internal/operators/auditTime":87,"../internal/operators/buffer":88,"../internal/operators/bufferCount":89,"../internal/operators/bufferTime":90,"../internal/operators/bufferToggle":91,"../internal/operators/bufferWhen":92,"../internal/operators/catchError":93,"../internal/operators/combineAll":94,"../internal/operators/combineLatest":95,"../internal/operators/concat":96,"../internal/operators/concatAll":97,"../internal/operators/concatMap":98,"../internal/operators/concatMapTo":99,"../internal/operators/count":100,"../internal/operators/debounce":101,"../internal/operators/debounceTime":102,"../internal/operators/defaultIfEmpty":103,"../internal/operators/delay":104,"../internal/operators/delayWhen":105,"../internal/operators/dematerialize":106,"../internal/operators/distinct":107,"../internal/operators/distinctUntilChanged":108,"../internal/operators/distinctUntilKeyChanged":109,"../internal/operators/elementAt":110,"../internal/operators/endWith":111,"../internal/operators/every":112,"../internal/operators/exhaust":113,"../internal/operators/exhaustMap":114,"../internal/operators/expand":115,"../internal/operators/filter":116,"../internal/operators/finalize":117,"../internal/operators/find":118,"../internal/operators/findIndex":119,"../internal/operators/first":120,"../internal/operators/groupBy":121,"../internal/operators/ignoreElements":122,"../internal/operators/isEmpty":123,"../internal/operators/last":124,"../internal/operators/map":125,"../internal/operators/mapTo":126,"../internal/operators/materialize":127,"../internal/operators/max":128,"../internal/operators/merge":129,"../internal/operators/mergeAll":130,"../internal/operators/mergeMap":131,"../internal/operators/mergeMapTo":132,"../internal/operators/mergeScan":133,"../internal/operators/min":134,"../internal/operators/multicast":135,"../internal/operators/observeOn":136,"../internal/operators/onErrorResumeNext":137,"../internal/operators/pairwise":138,"../internal/operators/partition":139,"../internal/operators/pluck":140,"../internal/operators/publish":141,"../internal/operators/publishBehavior":142,"../internal/operators/publishLast":143,"../internal/operators/publishReplay":144,"../internal/operators/race":145,"../internal/operators/reduce":146,"../internal/operators/refCount":147,"../internal/operators/repeat":148,"../internal/operators/repeatWhen":149,"../internal/operators/retry":150,"../internal/operators/retryWhen":151,"../internal/operators/sample":152,"../internal/operators/sampleTime":153,"../internal/operators/scan":154,"../internal/operators/sequenceEqual":155,"../internal/operators/share":156,"../internal/operators/shareReplay":157,"../internal/operators/single":158,"../internal/operators/skip":159,"../internal/operators/skipLast":160,"../internal/operators/skipUntil":161,"../internal/operators/skipWhile":162,"../internal/operators/startWith":163,"../internal/operators/subscribeOn":164,"../internal/operators/switchAll":165,"../internal/operators/switchMap":166,"../internal/operators/switchMapTo":167,"../internal/operators/take":168,"../internal/operators/takeLast":169,"../internal/operators/takeUntil":170,"../internal/operators/takeWhile":171,"../internal/operators/tap":172,"../internal/operators/throttle":173,"../internal/operators/throttleTime":174,"../internal/operators/throwIfEmpty":175,"../internal/operators/timeInterval":176,"../internal/operators/timeout":177,"../internal/operators/timeoutWith":178,"../internal/operators/timestamp":179,"../internal/operators/toArray":180,"../internal/operators/window":181,"../internal/operators/windowCount":182,"../internal/operators/windowTime":183,"../internal/operators/windowToggle":184,"../internal/operators/windowWhen":185,"../internal/operators/withLatestFrom":186,"../internal/operators/zip":187,"../internal/operators/zipAll":188}],242:[function(require,module,exports){
+// threejs.org/license
+(function(k,ua){"object"===typeof exports&&"undefined"!==typeof module?ua(exports):"function"===typeof define&&define.amd?define(["exports"],ua):(k=k||self,ua(k.THREE={}))})(this,function(k){function ua(){}function v(a,b){this.x=a||0;this.y=b||0}function ya(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function W(a,b,c,d,e,f,g,h,l,m){Object.defineProperty(this,"id",{value:ej++});this.uuid=O.generateUUID();
+this.name="";this.image=void 0!==a?a:W.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:W.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==l?l:1;this.format=void 0!==g?g:1023;this.internalFormat=null;this.type=void 0!==h?h:1009;this.offset=new v(0,0);this.repeat=new v(1,1);this.center=new v(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ya;this.generateMipmaps=
+!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function R(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Ba(a,b,c){this.width=a;this.height=b;this.scissor=new R(0,0,a,b);this.scissorTest=!1;this.viewport=new R(0,0,a,b);c=c||{};this.texture=new W(void 0,c.mapping,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.texture.image={};this.texture.image.width=
+a;this.texture.image.height=b;this.texture.generateMipmaps=void 0!==c.generateMipmaps?c.generateMipmaps:!1;this.texture.minFilter=void 0!==c.minFilter?c.minFilter:1006;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Xf(a,b,c){Ba.call(this,a,b,c);this.samples=4}function va(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a,b,
+c){this.x=a||0;this.y=b||0;this.z=c||0}function N(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Ub(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Ub.DefaultOrder}function De(){this.mask=1}function y(){Object.defineProperty(this,"id",{value:fj++});this.uuid=O.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=y.DefaultUp.clone();
+var a=new p,b=new Ub,c=new va,d=new p(1,1,1);b._onChange(function(){c.setFromEuler(b,!1)});c._onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:a},rotation:{configurable:!0,enumerable:!0,value:b},quaternion:{configurable:!0,enumerable:!0,value:c},scale:{configurable:!0,enumerable:!0,value:d},modelViewMatrix:{value:new N},normalMatrix:{value:new ya}});this.matrix=new N;this.matrixWorld=new N;this.matrixAutoUpdate=y.DefaultMatrixAutoUpdate;
+this.matrixWorldNeedsUpdate=!1;this.layers=new De;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function zc(){y.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.environment=this.background=null;this.autoUpdate=!0;"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Va(a,b){this.min=void 0!==a?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==
+b?b:new p(-Infinity,-Infinity,-Infinity)}function Yf(a,b,c,d,e){var f;var g=0;for(f=a.length-3;g<=f;g+=3){Vb.fromArray(a,g);var h=e.x*Math.abs(Vb.x)+e.y*Math.abs(Vb.y)+e.z*Math.abs(Vb.z),l=b.dot(Vb),m=c.dot(Vb),z=d.dot(Vb);if(Math.max(-Math.max(l,m,z),Math.min(l,m,z))>h)return!1}return!0}function eb(a,b){this.center=void 0!==a?a:new p;this.radius=void 0!==b?b:-1}function Wb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p(0,0,-1)}function Wa(a,b){this.normal=void 0!==a?a:new p(1,
+0,0);this.constant=void 0!==b?b:0}function pa(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==b?b:new p;this.c=void 0!==c?c:new p}function D(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function Zf(a,b,c){0>c&&(c+=1);1<c&&--c;return c<1/6?a+6*(b-a)*c:.5>c?b:c<2/3?a+6*(b-a)*(2/3-c):a}function $f(a){return.04045>a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}function ag(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}function Ac(a,b,c,d,e,f){this.a=a;this.b=
+b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new D;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function K(){Object.defineProperty(this,"id",{value:gj++});this.uuid=O.generateUUID();this.name="";this.type="Material";this.fog=!0;this.blending=1;this.side=0;this.vertexColors=this.flatShading=!1;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=
+this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.stencilWriteMask=255;this.stencilFunc=519;this.stencilRef=0;this.stencilFuncMask=255;this.stencilZPass=this.stencilZFail=this.stencilFail=7680;this.stencilWrite=!1;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.shadowSide=null;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=
+!1;this.toneMapped=this.visible=!0;this.userData={};this.version=0}function Pa(a){K.call(this);this.type="MeshBasicMaterial";this.color=new D(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphTargets=this.skinning=!1;this.setValues(a)}
+function G(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.usage=35044;this.updateRange={offset:0,count:-1};this.version=0}function yd(a,b,c){G.call(this,new Int8Array(a),b,c)}function zd(a,b,c){G.call(this,new Uint8Array(a),b,c)}function Ad(a,b,c){G.call(this,new Uint8ClampedArray(a),b,c)}function Bd(a,b,c){G.call(this,new Int16Array(a),
+b,c)}function Xb(a,b,c){G.call(this,new Uint16Array(a),b,c)}function Cd(a,b,c){G.call(this,new Int32Array(a),b,c)}function Yb(a,b,c){G.call(this,new Uint32Array(a),b,c)}function B(a,b,c){G.call(this,new Float32Array(a),b,c)}function Dd(a,b,c){G.call(this,new Float64Array(a),b,c)}function rh(){this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=
+this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function sh(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function F(){Object.defineProperty(this,"id",{value:hj+=2});this.uuid=O.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.morphTargetsRelative=!1;this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};
+this.userData={}}function ea(a,b){y.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new Pa;this.updateMorphTargets()}function th(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;Ee.copy(h);Ee.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(Ee);return b<c.near||b>c.far?null:{distance:b,point:Ee.clone(),object:a}}function Fe(a,b,c,d,e,f,g,h,l,m,z,n){Db.fromBufferAttribute(e,m);Eb.fromBufferAttribute(e,
+z);Fb.fromBufferAttribute(e,n);e=a.morphTargetInfluences;if(b.morphTargets&&f&&e){Ge.set(0,0,0);He.set(0,0,0);Ie.set(0,0,0);for(var t=0,r=f.length;t<r;t++){var k=e[t],u=f[t];0!==k&&(bg.fromBufferAttribute(u,m),cg.fromBufferAttribute(u,z),dg.fromBufferAttribute(u,n),g?(Ge.addScaledVector(bg,k),He.addScaledVector(cg,k),Ie.addScaledVector(dg,k)):(Ge.addScaledVector(bg.sub(Db),k),He.addScaledVector(cg.sub(Eb),k),Ie.addScaledVector(dg.sub(Fb),k)))}Db.add(Ge);Eb.add(He);Fb.add(Ie)}a.isSkinnedMesh&&(a.boneTransform(m,
+Db),a.boneTransform(z,Eb),a.boneTransform(n,Fb));if(a=th(a,b,c,d,Db,Eb,Fb,Ed))h&&(Bc.fromBufferAttribute(h,m),Cc.fromBufferAttribute(h,z),Dc.fromBufferAttribute(h,n),a.uv=pa.getUV(Ed,Db,Eb,Fb,Bc,Cc,Dc,new v)),l&&(Bc.fromBufferAttribute(l,m),Cc.fromBufferAttribute(l,z),Dc.fromBufferAttribute(l,n),a.uv2=pa.getUV(Ed,Db,Eb,Fb,Bc,Cc,Dc,new v)),h=new Ac(m,z,n),pa.getNormal(Db,Eb,Fb,h.normal),a.face=h;return a}function L(){Object.defineProperty(this,"id",{value:ij+=2});this.uuid=O.generateUUID();this.name=
+"";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Ec(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||
+e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}function wa(a){for(var b={},c=0;c<a.length;c++){var d=Ec(a[c]),e;for(e in d)b[e]=d[e]}return b}function Ca(a){K.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
+this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.uniformsNeedUpdate=!1;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}
+function fb(){y.call(this);this.type="Camera";this.matrixWorldInverse=new N;this.projectionMatrix=new N;this.projectionMatrixInverse=new N}function P(a,b,c,d){fb.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function Fc(a,b,c){y.call(this);this.type="CubeCamera";if(!0!==c.isWebGLCubeRenderTarget)console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");
+else{this.renderTarget=c;var d=new P(90,1,a,b);d.layers=this.layers;d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new P(90,1,a,b);e.layers=this.layers;e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new P(90,1,a,b);f.layers=this.layers;f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new P(90,1,a,b);g.layers=this.layers;g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new P(90,1,a,b);h.layers=this.layers;h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);
+var l=new P(90,1,a,b);l.layers=this.layers;l.up.set(0,-1,0);l.lookAt(new p(0,0,-1));this.add(l);this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var m=a.xr.enabled,z=a.getRenderTarget();a.xr.enabled=!1;var r=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;a.setRenderTarget(c,0);a.render(b,d);a.setRenderTarget(c,1);a.render(b,e);a.setRenderTarget(c,2);a.render(b,f);a.setRenderTarget(c,3);a.render(b,g);a.setRenderTarget(c,4);a.render(b,h);c.texture.generateMipmaps=r;a.setRenderTarget(c,
+5);a.render(b,l);a.setRenderTarget(z);a.xr.enabled=m};this.clear=function(a,b,d,e){for(var f=a.getRenderTarget(),g=0;6>g;g++)a.setRenderTarget(c,g),a.clear(b,d,e);a.setRenderTarget(f)}}}function Zb(a,b,c){Number.isInteger(b)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),b=c);Ba.call(this,a,a,b)}function $b(a,b,c,d,e,f,g,h,l,m,z,n){W.call(this,null,f,g,h,l,m,d,e,z,n);this.image={data:a||null,width:b||1,height:c||1};this.magFilter=
+void 0!==l?l:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1;this.needsUpdate=!0}function Gc(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Wa,void 0!==b?b:new Wa,void 0!==c?c:new Wa,void 0!==d?d:new Wa,void 0!==e?e:new Wa,void 0!==f?f:new Wa]}function uh(){function a(e,f){!1!==c&&(d(e,f),b.requestAnimationFrame(a))}var b=null,c=!1,d=null;return{start:function(){!0!==c&&null!==d&&(b.requestAnimationFrame(a),c=!0)},stop:function(){c=!1},setAnimationLoop:function(a){d=
+a},setContext:function(a){b=a}}}function jj(a,b){function c(b,c){var d=b.array,e=b.usage,f=a.createBuffer();a.bindBuffer(c,f);a.bufferData(c,d,e);b.onUploadCallback();c=5126;d instanceof Float32Array?c=5126:d instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):d instanceof Uint16Array?c=5123:d instanceof Int16Array?c=5122:d instanceof Uint32Array?c=5125:d instanceof Int32Array?c=5124:d instanceof Int8Array?c=5120:d instanceof Uint8Array&&(c=
+5121);return{buffer:f,type:c,bytesPerElement:d.BYTES_PER_ELEMENT,version:b.version}}var d=b.isWebGL2,e=new WeakMap;return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return e.get(a)},remove:function(b){b.isInterleavedBufferAttribute&&(b=b.data);var c=e.get(b);c&&(a.deleteBuffer(c.buffer),e.delete(b))},update:function(b,g){b.isInterleavedBufferAttribute&&(b=b.data);var f=e.get(b);if(void 0===f)e.set(b,c(b,g));else if(f.version<b.version){var l=b.array,m=b.updateRange;a.bindBuffer(g,
+f.buffer);-1===m.count?a.bufferSubData(g,0,l):(d?a.bufferSubData(g,m.offset*l.BYTES_PER_ELEMENT,l,m.offset,m.count):a.bufferSubData(g,m.offset*l.BYTES_PER_ELEMENT,l.subarray(m.offset,m.offset+m.count)),m.count=-1);f.version=b.version}}}}function Fd(a,b,c,d){L.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new ac(a,b,c,d));this.mergeVertices()}function ac(a,b,c,d){F.call(this);this.type="PlaneBufferGeometry";this.parameters=
+{width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,l=a/c,m=b/d,z=[],n=[],t=[],r=[];for(a=0;a<h;a++){var k=a*m-f;for(b=0;b<g;b++)n.push(b*l-e,-k,0),t.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,z.push(b+g*a,e,h),z.push(e,f,h);this.setIndex(z);this.setAttribute("position",new B(n,3));this.setAttribute("normal",new B(t,3));this.setAttribute("uv",new B(r,2))}
+function kj(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new D(0),g=0,h,l,m=null,z=0,n=null;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,k,u){d=d.background;k=a.xr;(k=k.getSession&&k.getSession())&&"additive"===k.environmentBlendMode&&(d=null);null===d?e(f,g):d&&d.isColor&&(e(d,1),u=!0);(a.autoClear||u)&&a.clear(a.autoClearColor,
+a.autoClearDepth,a.autoClearStencil);if(d&&(d.isCubeTexture||d.isWebGLCubeRenderTarget||306===d.mapping)){void 0===l&&(l=new ea(new Gd(1,1,1),new Ca({type:"BackgroundCubeMaterial",uniforms:Ec(gb.cube.uniforms),vertexShader:gb.cube.vertexShader,fragmentShader:gb.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),l.geometry.deleteAttribute("uv"),l.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},Object.defineProperty(l.material,
+"envMap",{get:function(){return this.uniforms.envMap.value}}),c.update(l));u=d.isWebGLCubeRenderTarget?d.texture:d;l.material.uniforms.envMap.value=u;l.material.uniforms.flipEnvMap.value=u.isCubeTexture?-1:1;if(m!==d||z!==u.version||n!==a.toneMapping)l.material.needsUpdate=!0,m=d,z=u.version,n=a.toneMapping;b.unshift(l,l.geometry,l.material,0,0,null)}else if(d&&d.isTexture){void 0===h&&(h=new ea(new ac(2,2),new Ca({type:"BackgroundMaterial",uniforms:Ec(gb.background.uniforms),vertexShader:gb.background.vertexShader,
+fragmentShader:gb.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),Object.defineProperty(h.material,"map",{get:function(){return this.uniforms.t2D.value}}),c.update(h));h.material.uniforms.t2D.value=d;!0===d.matrixAutoUpdate&&d.updateMatrix();h.material.uniforms.uvTransform.value.copy(d.matrix);if(m!==d||z!==d.version||n!==a.toneMapping)h.material.needsUpdate=!0,m=d,z=d.version,n=a.toneMapping;b.unshift(h,h.geometry,h.material,0,0,null)}}}}
+function lj(a,b,c,d){var e=d.isWebGL2,f;this.setMode=function(a){f=a};this.render=function(b,d){a.drawArrays(f,b,d);c.update(d,f)};this.renderInstances=function(d,h,l,m){if(0!==m){if(e){d=a;var g="drawArraysInstanced"}else if(d=b.get("ANGLE_instanced_arrays"),g="drawArraysInstancedANGLE",null===d){console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}d[g](f,h,l,m);c.update(l,f,m)}}}function mj(a,b,c){function d(b){if("highp"===
+b){if(0<a.getShaderPrecisionFormat(35633,36338).precision&&0<a.getShaderPrecisionFormat(35632,36338).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(35633,36337).precision&&0<a.getShaderPrecisionFormat(35632,36337).precision?"mediump":"lowp"}var e,f="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext||"undefined"!==typeof WebGL2ComputeRenderingContext&&a instanceof WebGL2ComputeRenderingContext,g=void 0!==c.precision?c.precision:"highp",
+h=d(g);h!==g&&(console.warn("THREE.WebGLRenderer:",g,"not supported, using",h,"instead."),g=h);c=!0===c.logarithmicDepthBuffer;h=a.getParameter(34930);var l=a.getParameter(35660),m=a.getParameter(3379),z=a.getParameter(34076),n=a.getParameter(34921),k=a.getParameter(36347),r=a.getParameter(36348),q=a.getParameter(36349),u=0<l,p=f||!!b.get("OES_texture_float"),x=u&&p,w=f?a.getParameter(36183):0;return{isWebGL2:f,getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");
+return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:g,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:l,maxTextureSize:m,maxCubemapSize:z,maxAttributes:n,maxVertexUniforms:k,maxVaryings:r,maxFragmentUniforms:q,vertexTextures:u,floatFragmentTextures:p,floatVertexTextures:x,maxSamples:w}}function nj(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==
+f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;l.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,l),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;c.numIntersection=0;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Wa,l=new ya,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);
+e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,l,k,q,u){if(!f||null===c||0===c.length||g&&!l)g?b(null):a();else{l=g?0:e;var n=4*l,z=q.clippingState||null;m.value=z;z=b(c,k,n,u);for(c=0;c!==n;++c)z[c]=d[c];q.clippingState=z;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=l}}}function oj(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||
+a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;
+case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function pj(a,b,c){function d(a){var e=a.target;a=f.get(e);null!==a.index&&b.remove(a.index);for(var h in a.attributes)b.remove(a.attributes[h]);e.removeEventListener("dispose",d);f.delete(e);if(h=g.get(a))b.remove(h),g.delete(a);
+c.memory.geometries--}function e(a){var c=[],d=a.index,e=a.attributes.position;if(null!==d){var f=d.array;d=d.version;e=0;for(var h=f.length;e<h;e+=3){var k=f[e+0],q=f[e+1],u=f[e+2];c.push(k,q,q,u,u,k)}}else for(f=e.array,d=e.version,e=0,h=f.length/3-1;e<h;e+=3)k=e+0,q=e+1,u=e+2,c.push(k,q,q,u,u,k);c=new (65535<sh(c)?Yb:Xb)(c,1);c.version=d;b.update(c,34963);(f=g.get(a))&&b.remove(f);g.set(a,c)}var f=new WeakMap,g=new WeakMap;return{get:function(a,b){var e=f.get(b);if(e)return e;b.addEventListener("dispose",
+d);b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new F).setFromObject(a)),e=b._bufferGeometry);f.set(b,e);c.memory.geometries++;return e},update:function(a){var c=a.index,d=a.attributes;null!==c&&b.update(c,34963);for(var e in d)b.update(d[e],34962);a=a.morphAttributes;for(e in a){c=a[e];d=0;for(var f=c.length;d<f;d++)b.update(c[d],34962)}},getWireframeAttribute:function(a){var b=g.get(a);if(b){var c=a.index;null!==c&&b.version<c.version&&e(a)}else e(a);return g.get(a)}}}
+function qj(a,b,c,d){var e=d.isWebGL2,f,g,h;this.setMode=function(a){f=a};this.setIndex=function(a){g=a.type;h=a.bytesPerElement};this.render=function(b,d){a.drawElements(f,d,g,b*h);c.update(d,f)};this.renderInstances=function(d,m,z,n){if(0!==n){if(e){d=a;var l="drawElementsInstanced"}else if(d=b.get("ANGLE_instanced_arrays"),l="drawElementsInstancedANGLE",null===d){console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
+return}d[l](f,z,g,m*h,n);c.update(z,f,n)}}}function rj(a){var b={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:b,programs:null,autoReset:!0,reset:function(){b.frame++;b.calls=0;b.triangles=0;b.points=0;b.lines=0},update:function(a,d,e){e=e||1;b.calls++;switch(d){case 4:b.triangles+=a/3*e;break;case 1:b.lines+=a/2*e;break;case 3:b.lines+=e*(a-1);break;case 2:b.lines+=e*a;break;case 0:b.points+=e*a;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",
+d)}}}}function sj(a,b){return Math.abs(b[1])-Math.abs(a[1])}function tj(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,l=void 0===h?0:h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<l;m++)d[m]=[m,0];b[e.id]=d}var z=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<l;m++){var n=d[m];0!==n[1]&&(z&&e.deleteAttribute("morphTarget"+m),f&&e.deleteAttribute("morphNormal"+m))}for(m=0;m<l;m++)n=d[m],n[0]=m,
+n[1]=h[m];d.sort(sj);for(m=h=0;8>m;m++){if(n=d[m])if(l=n[0],n=n[1]){z&&e.setAttribute("morphTarget"+m,z[l]);f&&e.setAttribute("morphNormal"+m,f[l]);c[m]=n;h+=n;continue}c[m]=0}e=e.morphTargetsRelative?1:1-h;g.getUniforms().setValue(a,"morphTargetBaseInfluence",e);g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function uj(a,b,c,d){var e=new WeakMap;return{update:function(a){var f=d.render.frame,h=a.geometry,l=b.get(a,h);e.get(l)!==f&&(h.isGeometry&&l.updateFromObject(a),b.update(l),e.set(l,
+f));a.isInstancedMesh&&c.update(a.instanceMatrix,34962);return l},dispose:function(){e=new WeakMap}}}function qb(a,b,c,d,e,f,g,h,l,m){a=void 0!==a?a:[];W.call(this,a,void 0!==b?b:301,c,d,e,f,void 0!==g?g:1022,h,l,m);this.flipY=!1}function Hc(a,b,c,d){W.call(this,null);this.image={data:a||null,width:b||1,height:c||1,depth:d||1};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1;this.needsUpdate=!0}function Ic(a,b,c,d){W.call(this,null);this.image={data:a||null,width:b||
+1,height:c||1,depth:d||1};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1;this.needsUpdate=!0}function Jc(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=vh[e];void 0===f&&(f=new Float32Array(e),vh[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function Qa(a,b){if(a.length!==b.length)return!1;for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;return!0}function Ja(a,b){for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}function wh(a,
+b){var c=xh[b];void 0===c&&(c=new Int32Array(b),xh[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocateTextureUnit();return c}function vj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1f(this.addr,b),c[0]=b)}function wj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y)a.uniform2f(this.addr,b.x,b.y),c[0]=b.x,c[1]=b.y}else Qa(c,b)||(a.uniform2fv(this.addr,b),Ja(c,b))}function xj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z)a.uniform3f(this.addr,b.x,b.y,b.z),c[0]=b.x,
+c[1]=b.y,c[2]=b.z}else if(void 0!==b.r){if(c[0]!==b.r||c[1]!==b.g||c[2]!==b.b)a.uniform3f(this.addr,b.r,b.g,b.b),c[0]=b.r,c[1]=b.g,c[2]=b.b}else Qa(c,b)||(a.uniform3fv(this.addr,b),Ja(c,b))}function yj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z||c[3]!==b.w)a.uniform4f(this.addr,b.x,b.y,b.z,b.w),c[0]=b.x,c[1]=b.y,c[2]=b.z,c[3]=b.w}else Qa(c,b)||(a.uniform4fv(this.addr,b),Ja(c,b))}function zj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix2fv(this.addr,
+!1,b),Ja(c,b)):Qa(c,d)||(yh.set(d),a.uniformMatrix2fv(this.addr,!1,yh),Ja(c,d))}function Aj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix3fv(this.addr,!1,b),Ja(c,b)):Qa(c,d)||(zh.set(d),a.uniformMatrix3fv(this.addr,!1,zh),Ja(c,d))}function Bj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),Ja(c,b)):Qa(c,d)||(Ah.set(d),a.uniformMatrix4fv(this.addr,!1,Ah),Ja(c,d))}function Cj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==
+e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTexture2D(b||Bh,e)}function Dj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture2DArray(b||Ej,e)}function Fj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture3D(b||Gj,e)}function Hj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTextureCube(b||Ch,e)}function Ij(a,b){var c=this.cache;c[0]!==
+b&&(a.uniform1i(this.addr,b),c[0]=b)}function Jj(a,b){var c=this.cache;Qa(c,b)||(a.uniform2iv(this.addr,b),Ja(c,b))}function Kj(a,b){var c=this.cache;Qa(c,b)||(a.uniform3iv(this.addr,b),Ja(c,b))}function Lj(a,b){var c=this.cache;Qa(c,b)||(a.uniform4iv(this.addr,b),Ja(c,b))}function Mj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1ui(this.addr,b),c[0]=b)}function Nj(a){switch(a){case 5126:return vj;case 35664:return wj;case 35665:return xj;case 35666:return yj;case 35674:return zj;case 35675:return Aj;
+case 35676:return Bj;case 5124:case 35670:return Ij;case 35667:case 35671:return Jj;case 35668:case 35672:return Kj;case 35669:case 35673:return Lj;case 5125:return Mj;case 35678:case 36198:case 36298:case 36306:case 35682:return Cj;case 35679:case 36299:case 36307:return Fj;case 35680:case 36300:case 36308:case 36293:return Hj;case 36289:case 36303:case 36311:case 36292:return Dj}}function Oj(a,b){a.uniform1fv(this.addr,b)}function Pj(a,b){a.uniform1iv(this.addr,b)}function Qj(a,b){a.uniform2iv(this.addr,
+b)}function Rj(a,b){a.uniform3iv(this.addr,b)}function Sj(a,b){a.uniform4iv(this.addr,b)}function Tj(a,b){b=Jc(b,this.size,2);a.uniform2fv(this.addr,b)}function Uj(a,b){b=Jc(b,this.size,3);a.uniform3fv(this.addr,b)}function Vj(a,b){b=Jc(b,this.size,4);a.uniform4fv(this.addr,b)}function Wj(a,b){b=Jc(b,this.size,4);a.uniformMatrix2fv(this.addr,!1,b)}function Xj(a,b){b=Jc(b,this.size,9);a.uniformMatrix3fv(this.addr,!1,b)}function Yj(a,b){b=Jc(b,this.size,16);a.uniformMatrix4fv(this.addr,!1,b)}function Zj(a,
+b,c){var d=b.length,e=wh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTexture2D(b[a]||Bh,e[a])}function ak(a,b,c){var d=b.length,e=wh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTextureCube(b[a]||Ch,e[a])}function bk(a){switch(a){case 5126:return Oj;case 35664:return Tj;case 35665:return Uj;case 35666:return Vj;case 35674:return Wj;case 35675:return Xj;case 35676:return Yj;case 5124:case 35670:return Pj;case 35667:case 35671:return Qj;case 35668:case 35672:return Rj;case 35669:case 35673:return Sj;
+case 35678:case 36198:case 36298:case 36306:case 35682:return Zj;case 35680:case 36300:case 36308:case 36293:return ak}}function ck(a,b,c){this.id=a;this.addr=c;this.cache=[];this.setValue=Nj(b.type)}function Dh(a,b,c){this.id=a;this.addr=c;this.cache=[];this.size=b.size;this.setValue=bk(b.type)}function Eh(a){this.id=a;this.seq=[];this.map={}}function Gb(a,b){this.seq=[];this.map={};for(var c=a.getProgramParameter(b,35718),d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),
+g=this,h=e.name,l=h.length;for(eg.lastIndex=0;;){var m=eg.exec(h),z=eg.lastIndex,n=m[1],k=m[3];"]"===m[2]&&(n|=0);if(void 0===k||"["===k&&z+2===l){h=g;e=void 0===k?new ck(n,e,f):new Dh(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else k=g.map[n],void 0===k&&(k=new Eh(n),n=g,g=k,n.seq.push(g),n.map[g.id]=g),g=k}}}function Fh(a,b,c){b=a.createShader(b);a.shaderSource(b,c);a.compileShader(b);return b}function Gh(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE",
+"( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:throw Error("unsupported encoding: "+a);}}function Hh(a,b,c){var d=a.getShaderParameter(b,35713),e=a.getShaderInfoLog(b).trim();if(d&&""===e)return"";a=a.getShaderSource(b).split("\n");for(b=0;b<a.length;b++)a[b]=b+1+": "+a[b];a=a.join("\n");return"THREE.WebGLShader: gl.getShaderInfoLog() "+
+c+"\n"+e+a}function Hd(a,b){b=Gh(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function dk(a,b){b=Gh(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+b[0]+b[1]+"; }"}function ek(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;case 5:b="ACESFilmic";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function fk(a){var b=
+[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function Id(a){return""!==a}function Ih(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,b.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,b.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,
+b.numPointLightShadows)}function Jh(a,b){return a.replace(/NUM_CLIPPING_PLANES/g,b.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,b.numClippingPlanes-b.numClipIntersection)}function fg(a,b){a=M[b];if(void 0===a)throw Error("Can not resolve #include <"+b+">");return a.replace(gg,fg)}function Kh(a,b,c,d){console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.");return hg(a,b,c,d)}function hg(a,b,c,d){a="";for(b=parseInt(b);b<
+parseInt(c);b++)a+=d.replace(/\[ i \]/g,"[ "+b+" ]").replace(/UNROLLED_LOOP_INDEX/g,b);return a}function Lh(a){var b="precision "+a.precision+" float;\nprecision "+a.precision+" int;";"highp"===a.precision?b+="\n#define HIGH_PRECISION":"mediump"===a.precision?b+="\n#define MEDIUM_PRECISION":"lowp"===a.precision&&(b+="\n#define LOW_PRECISION");return b}function gk(a){var b="SHADOWMAP_TYPE_BASIC";1===a.shadowMapType?b="SHADOWMAP_TYPE_PCF":2===a.shadowMapType?b="SHADOWMAP_TYPE_PCF_SOFT":3===a.shadowMapType&&
+(b="SHADOWMAP_TYPE_VSM");return b}function hk(a){var b="ENVMAP_TYPE_CUBE";if(a.envMap)switch(a.envMapMode){case 301:case 302:b="ENVMAP_TYPE_CUBE";break;case 306:case 307:b="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:b="ENVMAP_TYPE_EQUIREC";break;case 305:b="ENVMAP_TYPE_SPHERE"}return b}function ik(a){var b="ENVMAP_MODE_REFLECTION";if(a.envMap)switch(a.envMapMode){case 302:case 304:b="ENVMAP_MODE_REFRACTION"}return b}function jk(a){var b="ENVMAP_BLENDING_NONE";if(a.envMap)switch(a.combine){case 0:b=
+"ENVMAP_BLENDING_MULTIPLY";break;case 1:b="ENVMAP_BLENDING_MIX";break;case 2:b="ENVMAP_BLENDING_ADD"}return b}function kk(a,b,c){var d=a.getContext(),e=c.defines,f=c.vertexShader,g=c.fragmentShader,h=gk(c),l=hk(c),m=ik(c),z=jk(c),n=0<a.gammaFactor?a.gammaFactor:1,k=c.isWebGL2?"":[c.extensionDerivatives||c.envMapCubeUV||c.bumpMap||c.tangentSpaceNormalMap||c.clearcoatNormalMap||c.flatShading||"physical"===c.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(c.extensionFragDepth||c.logarithmicDepthBuffer)&&
+c.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",c.extensionDrawBuffers&&c.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(c.extensionShaderTextureLOD||c.envMap)&&c.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Id).join("\n"),r=fk(e),q=d.createProgram();c.isRawShaderMaterial?(e=[r].filter(Id).join("\n"),0<e.length&&(e+="\n"),h=[k,r].filter(Id).join("\n"),0<h.length&&(h+="\n")):(e=[Lh(c),"#define SHADER_NAME "+
+c.shaderName,r,c.instancing?"#define USE_INSTANCING":"",c.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+n,"#define MAX_BONES "+c.maxBones,c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.envMap?"#define "+m:"",c.lightMap?"#define USE_LIGHTMAP":"",c.aoMap?"#define USE_AOMAP":"",c.emissiveMap?"#define USE_EMISSIVEMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":
+"",c.normalMap&&c.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",c.normalMap&&c.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",c.clearcoatMap?"#define USE_CLEARCOATMAP":"",c.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",c.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",c.displacementMap&&c.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.roughnessMap?"#define USE_ROUGHNESSMAP":"",c.metalnessMap?"#define USE_METALNESSMAP":
+"",c.alphaMap?"#define USE_ALPHAMAP":"",c.vertexTangents?"#define USE_TANGENT":"",c.vertexColors?"#define USE_COLOR":"",c.vertexUvs?"#define USE_UV":"",c.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",c.flatShading?"#define FLAT_SHADED":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals&&!1===c.flatShading?"#define USE_MORPHNORMALS":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":
+"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapEnabled?"#define "+h:"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"",c.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",c.logarithmicDepthBuffer&&c.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING",
+" attribute mat4 instanceMatrix;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;",
+"\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Id).join("\n"),h=[k,Lh(c),"#define SHADER_NAME "+c.shaderName,r,c.alphaTest?"#define ALPHATEST "+c.alphaTest+(c.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+n,c.useFog&&c.fog?"#define USE_FOG":
+"",c.useFog&&c.fogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.matcap?"#define USE_MATCAP":"",c.envMap?"#define USE_ENVMAP":"",c.envMap?"#define "+l:"",c.envMap?"#define "+m:"",c.envMap?"#define "+z:"",c.lightMap?"#define USE_LIGHTMAP":"",c.aoMap?"#define USE_AOMAP":"",c.emissiveMap?"#define USE_EMISSIVEMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.normalMap&&c.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",c.normalMap&&c.tangentSpaceNormalMap?
+"#define TANGENTSPACE_NORMALMAP":"",c.clearcoatMap?"#define USE_CLEARCOATMAP":"",c.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",c.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.roughnessMap?"#define USE_ROUGHNESSMAP":"",c.metalnessMap?"#define USE_METALNESSMAP":"",c.alphaMap?"#define USE_ALPHAMAP":"",c.sheen?"#define USE_SHEEN":"",c.vertexTangents?"#define USE_TANGENT":"",c.vertexColors?"#define USE_COLOR":"",c.vertexUvs?"#define USE_UV":
+"",c.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",c.gradientMap?"#define USE_GRADIENTMAP":"",c.flatShading?"#define FLAT_SHADED":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapEnabled?"#define "+h:"",c.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",c.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",c.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",c.logarithmicDepthBuffer&&c.rendererExtensionFragDepth?
+"#define USE_LOGDEPTHBUF_EXT":"",(c.extensionShaderTextureLOD||c.envMap)&&c.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==c.toneMapping?"#define TONE_MAPPING":"",0!==c.toneMapping?M.tonemapping_pars_fragment:"",0!==c.toneMapping?ek("toneMapping",c.toneMapping):"",c.dithering?"#define DITHERING":"",c.outputEncoding||c.mapEncoding||c.matcapEncoding||c.envMapEncoding||c.emissiveMapEncoding||
+c.lightMapEncoding?M.encodings_pars_fragment:"",c.mapEncoding?Hd("mapTexelToLinear",c.mapEncoding):"",c.matcapEncoding?Hd("matcapTexelToLinear",c.matcapEncoding):"",c.envMapEncoding?Hd("envMapTexelToLinear",c.envMapEncoding):"",c.emissiveMapEncoding?Hd("emissiveMapTexelToLinear",c.emissiveMapEncoding):"",c.lightMapEncoding?Hd("lightMapTexelToLinear",c.lightMapEncoding):"",c.outputEncoding?dk("linearToOutputTexel",c.outputEncoding):"",c.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(Id).join("\n"));
+f=f.replace(gg,fg);f=Ih(f,c);f=Jh(f,c);g=g.replace(gg,fg);g=Ih(g,c);g=Jh(g,c);f=f.replace(Mh,hg).replace(Nh,Kh);g=g.replace(Mh,hg).replace(Nh,Kh);c.isWebGL2&&!c.isRawShaderMaterial&&(l=!1,m=/^\s*#version\s+300\s+es\s*\n/,c.isShaderMaterial&&null!==f.match(m)&&null!==g.match(m)&&(l=!0,f=f.replace(m,""),g=g.replace(m,"")),e="#version 300 es\n\n#define attribute in\n#define varying out\n#define texture2D texture\n"+e,h=["#version 300 es\n\n#define varying in",l?"":"out highp vec4 pc_fragColor;",l?"":
+"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+h);g=h+g;f=Fh(d,35633,e+f);g=Fh(d,35632,g);d.attachShader(q,f);d.attachShader(q,
+g);void 0!==c.index0AttributeName?d.bindAttribLocation(q,0,c.index0AttributeName):!0===c.morphTargets&&d.bindAttribLocation(q,0,"position");d.linkProgram(q);if(a.debug.checkShaderErrors){a=d.getProgramInfoLog(q).trim();l=d.getShaderInfoLog(f).trim();m=d.getShaderInfoLog(g).trim();n=z=!0;if(!1===d.getProgramParameter(q,35714))z=!1,k=Hh(d,f,"vertex"),r=Hh(d,g,"fragment"),console.error("THREE.WebGLProgram: shader error: ",d.getError(),"35715",d.getProgramParameter(q,35715),"gl.getProgramInfoLog",a,k,
+r);else if(""!==a)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",a);else if(""===l||""===m)n=!1;n&&(this.diagnostics={runnable:z,programLog:a,vertexShader:{log:l,prefix:e},fragmentShader:{log:m,prefix:h}})}d.deleteShader(f);d.deleteShader(g);var u;this.getUniforms=function(){void 0===u&&(u=new Gb(d,q));return u};var p;this.getAttributes=function(){if(void 0===p){for(var a={},b=d.getProgramParameter(q,35721),c=0;c<b;c++){var e=d.getActiveAttrib(q,c).name;a[e]=d.getAttribLocation(q,e)}p=
+a}return p};this.destroy=function(){d.deleteProgram(q);this.program=void 0};this.name=c.shaderName;this.id=lk++;this.cacheKey=b;this.usedTimes=1;this.program=q;this.vertexShader=f;this.fragmentShader=g;return this}function mk(a,b,c){function d(a){if(a)a.isTexture?b=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),b=a.texture.encoding);else var b=3E3;return b}var e=[],f=c.isWebGL2,
+g=c.logarithmicDepthBuffer,h=c.floatVertexTextures,l=c.precision,m=c.maxVertexUniforms,z=c.vertexTextures,n={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},
+k="precision isWebGL2 supportsVertexTextures outputEncoding instancing map mapEncoding matcap matcapEncoding envMap envMapMode envMapEncoding envMapCubeUV lightMap lightMapEncoding aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap tangentSpaceNormalMap clearcoatMap clearcoatRoughnessMap clearcoatNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors vertexTangents vertexUvs uvsVertexOnly fog useFog fogExp2 flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights numDirLightShadows numPointLightShadows numSpotLightShadows shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering sheen".split(" ");
+this.getParameters=function(e,k,t,p,x,w,ja){var q=p.fog;p=e.isMeshStandardMaterial?p.environment:null;p=e.envMap||p;var r=n[e.type];if(ja.isSkinnedMesh){var u=ja.skeleton.bones;if(h)u=1024;else{var E=Math.min(Math.floor((m-20)/4),u.length);E<u.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+u.length+" bones. This GPU supports "+E+"."),u=0):u=E}}else u=0;null!==e.precision&&(l=c.getMaxPrecision(e.precision),l!==e.precision&&console.warn("THREE.WebGLProgram.getParameters:",e.precision,"not supported, using",
+l,"instead."));r?(E=gb[r],E={name:e.type,uniforms:Oh.clone(E.uniforms),vertexShader:E.vertexShader,fragmentShader:E.fragmentShader}):E={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader};e.onBeforeCompile(E,a);var v=a.getRenderTarget();return{isWebGL2:f,shaderID:r,shaderName:E.name,uniforms:E.uniforms,vertexShader:E.vertexShader,fragmentShader:E.fragmentShader,defines:e.defines,isRawShaderMaterial:e.isRawShaderMaterial,isShaderMaterial:e.isShaderMaterial,
+precision:l,instancing:!0===ja.isInstancedMesh,supportsVertexTextures:z,outputEncoding:null!==v?d(v.texture):a.outputEncoding,map:!!e.map,mapEncoding:d(e.map),matcap:!!e.matcap,matcapEncoding:d(e.matcap),envMap:!!p,envMapMode:p&&p.mapping,envMapEncoding:d(p),envMapCubeUV:!!p&&(306===p.mapping||307===p.mapping),lightMap:!!e.lightMap,lightMapEncoding:d(e.lightMap),aoMap:!!e.aoMap,emissiveMap:!!e.emissiveMap,emissiveMapEncoding:d(e.emissiveMap),bumpMap:!!e.bumpMap,normalMap:!!e.normalMap,objectSpaceNormalMap:1===
+e.normalMapType,tangentSpaceNormalMap:0===e.normalMapType,clearcoatMap:!!e.clearcoatMap,clearcoatRoughnessMap:!!e.clearcoatRoughnessMap,clearcoatNormalMap:!!e.clearcoatNormalMap,displacementMap:!!e.displacementMap,roughnessMap:!!e.roughnessMap,metalnessMap:!!e.metalnessMap,specularMap:!!e.specularMap,alphaMap:!!e.alphaMap,gradientMap:!!e.gradientMap,sheen:!!e.sheen,combine:e.combine,vertexTangents:e.normalMap&&e.vertexTangents,vertexColors:e.vertexColors,vertexUvs:!!e.map||!!e.bumpMap||!!e.normalMap||
+!!e.specularMap||!!e.alphaMap||!!e.emissiveMap||!!e.roughnessMap||!!e.metalnessMap||!!e.clearcoatMap||!!e.clearcoatRoughnessMap||!!e.clearcoatNormalMap||!!e.displacementMap,uvsVertexOnly:!(e.map||e.bumpMap||e.normalMap||e.specularMap||e.alphaMap||e.emissiveMap||e.roughnessMap||e.metalnessMap||e.clearcoatNormalMap)&&!!e.displacementMap,fog:!!q,useFog:e.fog,fogExp2:q&&q.isFogExp2,flatShading:e.flatShading,sizeAttenuation:e.sizeAttenuation,logarithmicDepthBuffer:g,skinning:e.skinning&&0<u,maxBones:u,
+useVertexTexture:h,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:k.directional.length,numPointLights:k.point.length,numSpotLights:k.spot.length,numRectAreaLights:k.rectArea.length,numHemiLights:k.hemi.length,numDirLightShadows:k.directionalShadowMap.length,numPointLightShadows:k.pointShadowMap.length,numSpotLightShadows:k.spotShadowMap.length,numClippingPlanes:x,numClipIntersection:w,dithering:e.dithering,shadowMapEnabled:a.shadowMap.enabled&&
+0<t.length,shadowMapType:a.shadowMap.type,toneMapping:e.toneMapped?a.toneMapping:0,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:e.premultipliedAlpha,alphaTest:e.alphaTest,doubleSided:2===e.side,flipSided:1===e.side,depthPacking:void 0!==e.depthPacking?e.depthPacking:!1,index0AttributeName:e.index0AttributeName,extensionDerivatives:e.extensions&&e.extensions.derivatives,extensionFragDepth:e.extensions&&e.extensions.fragDepth,extensionDrawBuffers:e.extensions&&e.extensions.drawBuffers,
+extensionShaderTextureLOD:e.extensions&&e.extensions.shaderTextureLOD,rendererExtensionFragDepth:f||null!==b.get("EXT_frag_depth"),rendererExtensionDrawBuffers:f||null!==b.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:f||null!==b.get("EXT_shader_texture_lod"),onBeforeCompile:e.onBeforeCompile}};this.getProgramCacheKey=function(b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(b.fragmentShader),c.push(b.vertexShader));if(void 0!==b.defines)for(var d in b.defines)c.push(d),c.push(b.defines[d]);
+if(void 0===b.isRawShaderMaterial){for(d=0;d<k.length;d++)c.push(b[k[d]]);c.push(a.outputEncoding);c.push(a.gammaFactor)}c.push(b.onBeforeCompile.toString());return c.join()};this.acquireProgram=function(b,c){for(var d,f=0,g=e.length;f<g;f++){var h=e[f];if(h.cacheKey===c){d=h;++d.usedTimes;break}}void 0===d&&(d=new kk(a,c,b),e.push(d));return d};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function nk(){var a=new WeakMap;
+return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function ok(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function pk(a,b){return a.groupOrder!==b.groupOrder?
+a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Ph(){function a(a,d,e,m,z,n){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||f,groupOrder:m,renderOrder:a.renderOrder,z:z,group:n},b[c]=g):(g.id=a.id,g.object=a,g.geometry=d,g.material=e,g.program=e.program||f,g.groupOrder=m,g.renderOrder=a.renderOrder,g.z=z,g.group=n);c++;return g}var b=[],c=0,d=[],e=[],f={id:-1};return{opaque:d,transparent:e,
+init:function(){c=0;d.length=0;e.length=0},push:function(b,c,f,m,z,n){b=a(b,c,f,m,z,n);(!0===f.transparent?e:d).push(b)},unshift:function(b,c,f,m,z,n){b=a(b,c,f,m,z,n);(!0===f.transparent?e:d).unshift(b)},finish:function(){for(var a=c,d=b.length;a<d;a++){var e=b[a];if(null===e.id)break;e.id=null;e.object=null;e.geometry=null;e.material=null;e.program=null;e.group=null}},sort:function(a,b){1<d.length&&d.sort(a||ok);1<e.length&&e.sort(b||pk)}}}function qk(){function a(c){c=c.target;c.removeEventListener("dispose",
+a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Ph;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Ph,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function rk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new p,color:new D};break;case "SpotLight":c={position:new p,direction:new p,color:new D,distance:0,
+coneCos:0,penumbraCos:0,decay:0};break;case "PointLight":c={position:new p,color:new D,distance:0,decay:0};break;case "HemisphereLight":c={direction:new p,skyColor:new D,groundColor:new D};break;case "RectAreaLight":c={color:new D,position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function sk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={shadowBias:0,shadowRadius:1,shadowMapSize:new v};break;case "SpotLight":c={shadowBias:0,
+shadowRadius:1,shadowMapSize:new v};break;case "PointLight":c={shadowBias:0,shadowRadius:1,shadowMapSize:new v,shadowCameraNear:1,shadowCameraFar:1E3}}return a[b.id]=c}}}function tk(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function uk(){for(var a=new rk,b=sk(),c={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],
+directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},d=0;9>d;d++)c.probe.push(new p);var e=new p,f=new N,g=new N;return{setup:function(d,l,m){for(var h=0,n=0,k=0,r=0;9>r;r++)c.probe[r].set(0,0,0);var q=l=0,u=0,p=0,x=0,w=0,ja=0,T=0;m=m.matrixWorldInverse;d.sort(tk);r=0;for(var Z=d.length;r<Z;r++){var C=d[r],v=C.color,Q=C.intensity,Da=C.distance,Ka=C.shadow&&C.shadow.map?C.shadow.map.texture:
+null;if(C.isAmbientLight)h+=v.r*Q,n+=v.g*Q,k+=v.b*Q;else if(C.isLightProbe)for(Ka=0;9>Ka;Ka++)c.probe[Ka].addScaledVector(C.sh.coefficients[Ka],Q);else if(C.isDirectionalLight){var U=a.get(C);U.color.copy(C.color).multiplyScalar(C.intensity);U.direction.setFromMatrixPosition(C.matrixWorld);e.setFromMatrixPosition(C.target.matrixWorld);U.direction.sub(e);U.direction.transformDirection(m);C.castShadow&&(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,c.directionalShadow[l]=
+v,c.directionalShadowMap[l]=Ka,c.directionalShadowMatrix[l]=C.shadow.matrix,w++);c.directional[l]=U;l++}else C.isSpotLight?(U=a.get(C),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),U.color.copy(v).multiplyScalar(Q),U.distance=Da,U.direction.setFromMatrixPosition(C.matrixWorld),e.setFromMatrixPosition(C.target.matrixWorld),U.direction.sub(e),U.direction.transformDirection(m),U.coneCos=Math.cos(C.angle),U.penumbraCos=Math.cos(C.angle*(1-C.penumbra)),U.decay=C.decay,C.castShadow&&
+(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,c.spotShadow[u]=v,c.spotShadowMap[u]=Ka,c.spotShadowMatrix[u]=C.shadow.matrix,T++),c.spot[u]=U,u++):C.isRectAreaLight?(U=a.get(C),U.color.copy(v).multiplyScalar(Q),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),g.identity(),f.copy(C.matrixWorld),f.premultiply(m),g.extractRotation(f),U.halfWidth.set(.5*C.width,0,0),U.halfHeight.set(0,.5*C.height,0),U.halfWidth.applyMatrix4(g),U.halfHeight.applyMatrix4(g),
+c.rectArea[p]=U,p++):C.isPointLight?(U=a.get(C),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),U.color.copy(C.color).multiplyScalar(C.intensity),U.distance=C.distance,U.decay=C.decay,C.castShadow&&(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,v.shadowCameraNear=Q.camera.near,v.shadowCameraFar=Q.camera.far,c.pointShadow[q]=v,c.pointShadowMap[q]=Ka,c.pointShadowMatrix[q]=C.shadow.matrix,ja++),c.point[q]=U,q++):C.isHemisphereLight&&
+(U=a.get(C),U.direction.setFromMatrixPosition(C.matrixWorld),U.direction.transformDirection(m),U.direction.normalize(),U.skyColor.copy(C.color).multiplyScalar(Q),U.groundColor.copy(C.groundColor).multiplyScalar(Q),c.hemi[x]=U,x++)}c.ambient[0]=h;c.ambient[1]=n;c.ambient[2]=k;d=c.hash;if(d.directionalLength!==l||d.pointLength!==q||d.spotLength!==u||d.rectAreaLength!==p||d.hemiLength!==x||d.numDirectionalShadows!==w||d.numPointShadows!==ja||d.numSpotShadows!==T)c.directional.length=l,c.spot.length=
+u,c.rectArea.length=p,c.point.length=q,c.hemi.length=x,c.directionalShadow.length=w,c.directionalShadowMap.length=w,c.pointShadow.length=ja,c.pointShadowMap.length=ja,c.spotShadow.length=T,c.spotShadowMap.length=T,c.directionalShadowMatrix.length=w,c.pointShadowMatrix.length=ja,c.spotShadowMatrix.length=T,d.directionalLength=l,d.pointLength=q,d.spotLength=u,d.rectAreaLength=p,d.hemiLength=x,d.numDirectionalShadows=w,d.numPointShadows=ja,d.numSpotShadows=T,c.version=vk++},state:c}}function Qh(){var a=
+new uk,b=[],c=[];return{init:function(){b.length=0;c.length=0},state:{lightsArray:b,shadowsArray:c,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},pushShadow:function(a){c.push(a)}}}function wk(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){if(!1===b.has(c)){var e=new Qh;b.set(c,new WeakMap);b.get(c).set(d,e);c.addEventListener("dispose",a)}else!1===b.get(c).has(d)?(e=new Qh,b.get(c).set(d,e)):
+e=b.get(c).get(d);return e},dispose:function(){b=new WeakMap}}}function Hb(a){K.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.fog=!1;this.setValues(a)}function Ib(a){K.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new p;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=
+!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.fog=!1;this.setValues(a)}function Rh(a,b,c){function d(a,b,c){c=a<<0|b<<1|c<<2;var d=n[c];void 0===d&&(d=new Hb({depthPacking:3201,morphTargets:a,skinning:b}),n[c]=d);return d}function e(a,b,c){c=a<<0|b<<1|c<<2;var d=k[c];void 0===d&&(d=new Ib({morphTargets:a,skinning:b}),k[c]=d);return d}function f(b,c,f,g,h,l,m){var n=d,k=b.customDepthMaterial;!0===g.isPointLight&&(n=e,k=b.customDistanceMaterial);
+void 0===k?(k=!1,!0===f.morphTargets&&(k=c.morphAttributes&&c.morphAttributes.position&&0<c.morphAttributes.position.length),c=!1,!0===b.isSkinnedMesh&&(!0===f.skinning?c=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b)),b=n(k,c,!0===b.isInstancedMesh)):b=k;a.localClippingEnabled&&!0===f.clipShadows&&0!==f.clippingPlanes.length&&(k=b.uuid,n=f.uuid,c=r[k],void 0===c&&(c={},r[k]=c),k=c[n],void 0===k&&(k=b.clone(),c[n]=k),b=k);b.visible=f.visible;b.wireframe=
+f.wireframe;b.side=3===m?null!==f.shadowSide?f.shadowSide:f.side:null!==f.shadowSide?f.shadowSide:q[f.side];b.clipShadows=f.clipShadows;b.clippingPlanes=f.clippingPlanes;b.clipIntersection=f.clipIntersection;b.wireframeLinewidth=f.wireframeLinewidth;b.linewidth=f.linewidth;!0===g.isPointLight&&!0===b.isMeshDistanceMaterial&&(b.referencePosition.setFromMatrixPosition(g.matrixWorld),b.nearDistance=h,b.farDistance=l);return b}function g(c,d,e,l,m){if(!1!==c.visible){if(c.layers.test(d.layers)&&(c.isMesh||
+c.isLine||c.isPoints)&&(c.castShadow||c.receiveShadow&&3===m)&&(!c.frustumCulled||h.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(e.matrixWorldInverse,c.matrixWorld);var n=b.update(c),k=c.material;if(Array.isArray(k))for(var z=n.groups,t=0,q=z.length;t<q;t++){var r=z[t],u=k[r.materialIndex];u&&u.visible&&(u=f(c,n,u,l,e.near,e.far,m),a.renderBufferDirect(e,null,n,u,c,r))}else k.visible&&(u=f(c,n,k,l,e.near,e.far,m),a.renderBufferDirect(e,null,n,u,c,null))}c=c.children;n=0;for(k=c.length;n<
+k;n++)g(c[n],d,e,l,m)}}var h=new Gc,l=new v,m=new v,z=new R,n=[],k=[],r={},q={0:1,1:0,2:2},u=new Ca({defines:{SAMPLE_RATE:.25,HALF_SAMPLE_RATE:.125},uniforms:{shadow_pass:{value:null},resolution:{value:new v},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = sqrt( squared_mean - mean * mean );\n  gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),
+p=u.clone();p.defines.HORIZONAL_PASS=1;var x=new F;x.setAttribute("position",new G(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var w=new ea(x,u),ja=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.render=function(d,e,f){if(!1!==ja.enabled&&(!1!==ja.autoUpdate||!1!==ja.needsUpdate)&&0!==d.length){var n=a.getRenderTarget(),k=a.getActiveCubeFace(),t=a.getActiveMipmapLevel(),q=a.state;q.setBlending(0);q.buffers.color.setClear(1,1,1,1);q.buffers.depth.setTest(!0);q.setScissorTest(!1);
+for(var r=0,E=d.length;r<E;r++){var x=d[r],C=x.shadow;if(void 0===C)console.warn("THREE.WebGLShadowMap:",x,"has no shadow.");else{l.copy(C.mapSize);var v=C.getFrameExtents();l.multiply(v);m.copy(C.mapSize);if(l.x>c||l.y>c)l.x>c&&(m.x=Math.floor(c/v.x),l.x=m.x*v.x,C.mapSize.x=m.x),l.y>c&&(m.y=Math.floor(c/v.y),l.y=m.y*v.y,C.mapSize.y=m.y);null!==C.map||C.isPointLightShadow||3!==this.type||(v={minFilter:1006,magFilter:1006,format:1023},C.map=new Ba(l.x,l.y,v),C.map.texture.name=x.name+".shadowMap",
+C.mapPass=new Ba(l.x,l.y,v),C.camera.updateProjectionMatrix());null===C.map&&(v={minFilter:1003,magFilter:1003,format:1023},C.map=new Ba(l.x,l.y,v),C.map.texture.name=x.name+".shadowMap",C.camera.updateProjectionMatrix());a.setRenderTarget(C.map);a.clear();v=C.getViewportCount();for(var Z=0;Z<v;Z++){var T=C.getViewport(Z);z.set(m.x*T.x,m.y*T.y,m.x*T.z,m.y*T.w);q.viewport(z);C.updateMatrices(x,Z);h=C.getFrustum();g(e,f,C.camera,x,this.type)}C.isPointLightShadow||3!==this.type||(x=C,C=f,v=b.update(w),
+u.uniforms.shadow_pass.value=x.map.texture,u.uniforms.resolution.value=x.mapSize,u.uniforms.radius.value=x.radius,a.setRenderTarget(x.mapPass),a.clear(),a.renderBufferDirect(C,null,v,u,w,null),p.uniforms.shadow_pass.value=x.mapPass.texture,p.uniforms.resolution.value=x.mapSize,p.uniforms.radius.value=x.radius,a.setRenderTarget(x.map),a.clear(),a.renderBufferDirect(C,null,v,p,w,null))}}ja.needsUpdate=!1;a.setRenderTarget(n,k,t)}}}function xk(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();
+a.bindTexture(b,f);a.texParameteri(b,10241,9728);a.texParameteri(b,10240,9728);for(b=0;b<d;b++)a.texImage2D(c+b,0,6408,1,1,0,6408,5121,e);return f}function e(c,d){p[c]=1;0===x[c]&&(a.enableVertexAttribArray(c),x[c]=1);w[c]!==d&&((t?a:b.get("ANGLE_instanced_arrays"))[t?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](c,d),w[c]=d)}function f(b){!0!==v[b]&&(a.enable(b),v[b]=!0)}function g(b){!1!==v[b]&&(a.disable(b),v[b]=!1)}function h(b,c,d,e,h,l,m,n){if(0===b)Z&&(g(3042),Z=!1);else if(Z||(f(3042),
+Z=!0),5!==b){if(b!==C||n!==y){if(100!==B||100!==Ka)a.blendEquation(32774),Ka=B=100;if(n)switch(b){case 1:a.blendFuncSeparate(1,771,1,771);break;case 2:a.blendFunc(1,1);break;case 3:a.blendFuncSeparate(0,0,769,771);break;case 4:a.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",b)}else switch(b){case 1:a.blendFuncSeparate(770,771,1,771);break;case 2:a.blendFunc(770,1);break;case 3:a.blendFunc(0,769);break;case 4:a.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",
+b)}A=U=Da=Q=null;C=b;y=n}}else{h=h||c;l=l||d;m=m||e;if(c!==B||h!==Ka)a.blendEquationSeparate(xa[c],xa[h]),B=c,Ka=h;if(d!==Q||e!==Da||l!==U||m!==A)a.blendFuncSeparate(J[d],J[e],J[l],J[m]),Q=d,Da=e,U=l,A=m;C=b;y=null}}function l(b){D!==b&&(b?a.frontFace(2304):a.frontFace(2305),D=b)}function m(b){0!==b?(f(2884),b!==F&&(1===b?a.cullFace(1029):2===b?a.cullFace(1028):a.cullFace(1032))):g(2884);F=b}function k(b,c,d){if(b){if(f(32823),G!==c||K!==d)a.polygonOffset(c,d),G=c,K=d}else g(32823)}function n(b){void 0===
+b&&(b=33984+L-1);N!==b&&(a.activeTexture(b),N=b)}var t=c.isWebGL2,r=new function(){var b=!1,c=new R,d=null,e=new R(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},q=new function(){var b=!1,c=null,d=null,e=null;return{setTest:function(a){a?f(2929):g(2929)},setMask:function(d){c===
+d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(512);break;case 1:a.depthFunc(519);break;case 2:a.depthFunc(513);break;case 3:a.depthFunc(515);break;case 4:a.depthFunc(514);break;case 5:a.depthFunc(518);break;case 6:a.depthFunc(516);break;case 7:a.depthFunc(517);break;default:a.depthFunc(515)}else a.depthFunc(515);d=b}},setLocked:function(a){b=a},setClear:function(b){e!==b&&(a.clearDepth(b),e=b)},reset:function(){b=!1;e=d=c=null}}},u=new function(){var b=
+!1,c=null,d=null,e=null,h=null,l=null,m=null,n=null,k=null;return{setTest:function(a){b||(a?f(2960):g(2960))},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,f){if(d!==b||e!==c||h!==f)a.stencilFunc(b,c,f),d=b,e=c,h=f},setOp:function(b,c,d){if(l!==b||m!==c||n!==d)a.stencilOp(b,c,d),l=b,m=c,n=d},setLocked:function(a){b=a},setClear:function(b){k!==b&&(a.clearStencil(b),k=b)},reset:function(){b=!1;k=n=m=l=h=e=d=c=null}}};c=a.getParameter(34921);var p=new Uint8Array(c),x=new Uint8Array(c),
+w=new Uint8Array(c),v={},T=null,Z=null,C=null,B=null,Q=null,Da=null,Ka=null,U=null,A=null,y=!1,D=null,F=null,H=null,G=null,K=null,L=a.getParameter(35661),O=!1;c=0;c=a.getParameter(7938);-1!==c.indexOf("WebGL")?(c=parseFloat(/^WebGL ([0-9])/.exec(c)[1]),O=1<=c):-1!==c.indexOf("OpenGL ES")&&(c=parseFloat(/^OpenGL ES ([0-9])/.exec(c)[1]),O=2<=c);var N=null,Jd={},aa=new R,Sh=new R,Ra={};Ra[3553]=d(3553,3553,1);Ra[34067]=d(34067,34069,6);r.setClear(0,0,0,1);q.setClear(1);u.setClear(0);f(2929);q.setFunc(3);
+l(!1);m(1);f(2884);h(0);var xa={100:32774,101:32778,102:32779};t?(xa[103]=32775,xa[104]=32776):(c=b.get("EXT_blend_minmax"),null!==c&&(xa[103]=c.MIN_EXT,xa[104]=c.MAX_EXT));var J={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};return{buffers:{color:r,depth:q,stencil:u},initAttributes:function(){for(var a=0,b=p.length;a<b;a++)p[a]=0},enableAttribute:function(a){e(a,0)},enableAttributeAndDivisor:e,disableUnusedAttributes:function(){for(var b=0,c=x.length;b!==c;++b)x[b]!==
+p[b]&&(a.disableVertexAttribArray(b),x[b]=0)},vertexAttribPointer:function(b,c,d,e,f,g){!0!==t||5124!==d&&5125!==d?a.vertexAttribPointer(b,c,d,e,f,g):a.vertexAttribIPointer(b,c,d,e,f,g)},enable:f,disable:g,useProgram:function(b){return T!==b?(a.useProgram(b),T=b,!0):!1},setBlending:h,setMaterial:function(a,b){2===a.side?g(2884):f(2884);var c=1===a.side;b&&(c=!c);l(c);1===a.blending&&!1===a.transparent?h(0):h(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,
+a.premultipliedAlpha);q.setFunc(a.depthFunc);q.setTest(a.depthTest);q.setMask(a.depthWrite);r.setMask(a.colorWrite);b=a.stencilWrite;u.setTest(b);b&&(u.setMask(a.stencilWriteMask),u.setFunc(a.stencilFunc,a.stencilRef,a.stencilFuncMask),u.setOp(a.stencilFail,a.stencilZFail,a.stencilZPass));k(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)},setFlipSided:l,setCullFace:m,setLineWidth:function(b){b!==H&&(O&&a.lineWidth(b),H=b)},setPolygonOffset:k,setScissorTest:function(a){a?f(3089):g(3089)},
+activeTexture:n,bindTexture:function(b,c){null===N&&n();var d=Jd[N];void 0===d&&(d={type:void 0,texture:void 0},Jd[N]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||Ra[b]),d.type=b,d.texture=c},unbindTexture:function(){var b=Jd[N];void 0!==b&&void 0!==b.type&&(a.bindTexture(b.type,null),b.type=void 0,b.texture=void 0)},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",ca)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",
+ca)}},texImage3D:function(){try{a.texImage3D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",ca)}},scissor:function(b){!1===aa.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),aa.copy(b))},viewport:function(b){!1===Sh.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),Sh.copy(b))},reset:function(){for(var b=0;b<x.length;b++)1===x[b]&&(a.disableVertexAttribArray(b),x[b]=0);v={};N=null;Jd={};F=D=C=T=null;r.reset();q.reset();u.reset()}}}function yk(a,b,c,d,e,f,g){function h(a,b){return G?new OffscreenCanvas(a,
+b):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function l(a,b,c,d){var e=1;if(a.width>d||a.height>d)e=d/Math.max(a.width,a.height);if(1>e||!0===b){if("undefined"!==typeof HTMLImageElement&&a instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&a instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&a instanceof ImageBitmap)return d=b?O.floorPowerOfTwo:Math.floor,b=d(e*a.width),e=d(e*a.height),void 0===H&&(H=h(b,e)),c=c?h(b,e):H,c.width=b,c.height=e,
+c.getContext("2d").drawImage(a,0,0,b,e),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+a.width+"x"+a.height+") to ("+b+"x"+e+")."),c;"data"in a&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+a.width+"x"+a.height+").")}return a}function m(a){return O.isPowerOfTwo(a.width)&&O.isPowerOfTwo(a.height)}function k(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function n(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,
+f))*Math.LOG2E}function t(c,d,e){if(!1===Da)return d;if(null!==c){if(void 0!==a[c])return a[c];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+c+"'")}c=d;6403===d&&(5126===e&&(c=33326),5131===e&&(c=33325),5121===e&&(c=33321));6407===d&&(5126===e&&(c=34837),5131===e&&(c=34843),5121===e&&(c=32849));6408===d&&(5126===e&&(c=34836),5131===e&&(c=34842),5121===e&&(c=32856));33325!==c&&33326!==c&&34842!==c&&34836!==c||b.get("EXT_color_buffer_float");return c}function r(a){return 1003===
+a||1004===a||1005===a?9728:9729}function q(b){b=b.target;b.removeEventListener("dispose",q);var c=d.get(b);void 0!==c.__webglInit&&(a.deleteTexture(c.__webglTexture),d.remove(b));b.isVideoTexture&&F.delete(b);g.memory.textures--}function u(b){b=b.target;b.removeEventListener("dispose",u);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLCubeRenderTarget)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),
+c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer),c.__webglMultisampledFramebuffer&&a.deleteFramebuffer(c.__webglMultisampledFramebuffer),c.__webglColorRenderbuffer&&a.deleteRenderbuffer(c.__webglColorRenderbuffer),c.__webglDepthRenderbuffer&&a.deleteRenderbuffer(c.__webglDepthRenderbuffer);d.remove(b.texture);d.remove(b)}g.memory.textures--}function p(a,b){var e=d.get(a);
+if(a.isVideoTexture){var f=g.render.frame;F.get(a)!==f&&(F.set(a,f),a.update())}if(0<a.version&&e.__version!==a.version)if(f=a.image,void 0===f)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else if(!1===f.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Z(e,a,b);return}c.activeTexture(33984+b);c.bindTexture(3553,e.__webglTexture)}function x(b,e){if(6===b.image.length){var g=d.get(b);if(0<b.version&&g.__version!==
+b.version){T(g,b);c.activeTexture(33984+e);c.bindTexture(34067,g.__webglTexture);a.pixelStorei(37440,b.flipY);var h=b&&(b.isCompressedTexture||b.image[0].isCompressedTexture);e=b.image[0]&&b.image[0].isDataTexture;for(var z=[],q=0;6>q;q++)z[q]=h||e?e?b.image[q].image:b.image[q]:l(b.image[q],!1,!0,U);var r=z[0],u=m(r)||Da,p=f.convert(b.format),E=f.convert(b.type),w=t(b.internalFormat,p,E);v(34067,b,u);if(h){for(q=0;6>q;q++){var x=z[q].mipmaps;for(h=0;h<x.length;h++){var aa=x[h];1023!==b.format&&1022!==
+b.format?null!==p?c.compressedTexImage2D(34069+q,h,w,aa.width,aa.height,0,aa.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(34069+q,h,w,aa.width,aa.height,0,p,E,aa.data)}}g.__maxMipLevel=x.length-1}else{x=b.mipmaps;for(q=0;6>q;q++)if(e)for(c.texImage2D(34069+q,0,w,z[q].width,z[q].height,0,p,E,z[q].data),h=0;h<x.length;h++)aa=x[h],aa=aa.image[q].image,c.texImage2D(34069+q,h+1,w,aa.width,aa.height,0,p,E,aa.data);else for(c.texImage2D(34069+
+q,0,w,p,E,z[q]),h=0;h<x.length;h++)aa=x[h],c.texImage2D(34069+q,h+1,w,p,E,aa.image[q]);g.__maxMipLevel=x.length}k(b,u)&&n(34067,b,r.width,r.height);g.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(33984+e),c.bindTexture(34067,g.__webglTexture)}}function w(a,b){c.activeTexture(33984+b);c.bindTexture(34067,d.get(a).__webglTexture)}function v(c,f,g){g?(a.texParameteri(c,10242,L[f.wrapS]),a.texParameteri(c,10243,L[f.wrapT]),32879!==c&&35866!==c||a.texParameteri(c,32882,L[f.wrapR]),
+a.texParameteri(c,10240,N[f.magFilter]),a.texParameteri(c,10241,N[f.minFilter])):(a.texParameteri(c,10242,33071),a.texParameteri(c,10243,33071),32879!==c&&35866!==c||a.texParameteri(c,32882,33071),1001===f.wrapS&&1001===f.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),a.texParameteri(c,10240,r(f.magFilter)),a.texParameteri(c,10241,r(f.minFilter)),1003!==f.minFilter&&1006!==f.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));
+!(g=b.get("EXT_texture_filter_anisotropic"))||1015===f.type&&null===b.get("OES_texture_float_linear")||1016===f.type&&null===(Da||b.get("OES_texture_half_float_linear"))||!(1<f.anisotropy||d.get(f).__currentAnisotropy)||(a.texParameterf(c,g.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(f.anisotropy,e.getMaxAnisotropy())),d.get(f).__currentAnisotropy=f.anisotropy)}function T(b,c){void 0===b.__webglInit&&(b.__webglInit=!0,c.addEventListener("dispose",q),b.__webglTexture=a.createTexture(),g.memory.textures++)}
+function Z(b,d,e){var g=3553;d.isDataTexture2DArray&&(g=35866);d.isDataTexture3D&&(g=32879);T(b,d);c.activeTexture(33984+e);c.bindTexture(g,b.__webglTexture);a.pixelStorei(37440,d.flipY);a.pixelStorei(37441,d.premultiplyAlpha);a.pixelStorei(3317,d.unpackAlignment);e=Da?!1:1001!==d.wrapS||1001!==d.wrapT||1003!==d.minFilter&&1006!==d.minFilter;e=e&&!1===m(d.image);e=l(d.image,e,!1,y);var h=m(e)||Da,z=f.convert(d.format),q=f.convert(d.type),r=t(d.internalFormat,z,q);v(g,d,h);var u=d.mipmaps;if(d.isDepthTexture)r=
+6402,Da?r=1015===d.type?36012:1014===d.type?33190:1020===d.type?35056:33189:1015===d.type&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),1026===d.format&&6402===r&&1012!==d.type&&1014!==d.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),d.type=1012,q=f.convert(d.type)),1027===d.format&&6402===r&&(r=34041,1020!==d.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),
+d.type=1020,q=f.convert(d.type))),c.texImage2D(3553,0,r,e.width,e.height,0,z,q,null);else if(d.isDataTexture)if(0<u.length&&h){for(var p=0,E=u.length;p<E;p++){var w=u[p];c.texImage2D(3553,p,r,w.width,w.height,0,z,q,w.data)}d.generateMipmaps=!1;b.__maxMipLevel=u.length-1}else c.texImage2D(3553,0,r,e.width,e.height,0,z,q,e.data),b.__maxMipLevel=0;else if(d.isCompressedTexture){p=0;for(E=u.length;p<E;p++)w=u[p],1023!==d.format&&1022!==d.format?null!==z?c.compressedTexImage2D(3553,p,r,w.width,w.height,
+0,w.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(3553,p,r,w.width,w.height,0,z,q,w.data);b.__maxMipLevel=u.length-1}else if(d.isDataTexture2DArray)c.texImage3D(35866,0,r,e.width,e.height,e.depth,0,z,q,e.data),b.__maxMipLevel=0;else if(d.isDataTexture3D)c.texImage3D(32879,0,r,e.width,e.height,e.depth,0,z,q,e.data),b.__maxMipLevel=0;else if(0<u.length&&h){p=0;for(E=u.length;p<E;p++)w=u[p],c.texImage2D(3553,p,r,z,q,
+w);d.generateMipmaps=!1;b.__maxMipLevel=u.length-1}else c.texImage2D(3553,0,r,z,q,e),b.__maxMipLevel=0;k(d,h)&&n(g,d,e.width,e.height);b.__version=d.version;if(d.onUpdate)d.onUpdate(d)}function C(b,e,g,h){var l=f.convert(e.texture.format),m=f.convert(e.texture.type),n=t(e.texture.internalFormat,l,m);c.texImage2D(h,0,n,e.width,e.height,0,l,m,null);a.bindFramebuffer(36160,b);a.framebufferTexture2D(36160,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(36160,null)}function B(b,c,d){a.bindRenderbuffer(36161,
+b);if(c.depthBuffer&&!c.stencilBuffer){var e=33189;d?((d=c.depthTexture)&&d.isDepthTexture&&(1015===d.type?e=36012:1014===d.type&&(e=33190)),d=Q(c),a.renderbufferStorageMultisample(36161,d,e,c.width,c.height)):a.renderbufferStorage(36161,e,c.width,c.height);a.framebufferRenderbuffer(36160,36096,36161,b)}else c.depthBuffer&&c.stencilBuffer?(d?(d=Q(c),a.renderbufferStorageMultisample(36161,d,35056,c.width,c.height)):a.renderbufferStorage(36161,34041,c.width,c.height),a.framebufferRenderbuffer(36160,
+33306,36161,b)):(b=f.convert(c.texture.format),e=f.convert(c.texture.type),e=t(c.texture.internalFormat,b,e),d?(d=Q(c),a.renderbufferStorageMultisample(36161,d,e,c.width,c.height)):a.renderbufferStorage(36161,e,c.width,c.height));a.bindRenderbuffer(36161,null)}function Q(a){return Da&&a.isWebGLMultisampleRenderTarget?Math.min(D,a.samples):0}var Da=e.isWebGL2,A=e.maxTextures,U=e.maxCubemapSize,y=e.maxTextureSize,D=e.maxSamples,F=new WeakMap,H,G=!1;try{G="undefined"!==typeof OffscreenCanvas&&null!==
+(new OffscreenCanvas(1,1)).getContext("2d")}catch(Jd){}var K=0,L={1E3:10497,1001:33071,1002:33648},N={1003:9728,1004:9984,1005:9986,1006:9729,1007:9985,1008:9987},M=!1,R=!1;this.allocateTextureUnit=function(){var a=K;a>=A&&console.warn("THREE.WebGLTextures: Trying to use "+a+" texture units while this GPU supports only "+A);K+=1;return a};this.resetTextureUnits=function(){K=0};this.setTexture2D=p;this.setTexture2DArray=function(a,b){var e=d.get(a);0<a.version&&e.__version!==a.version?Z(e,a,b):(c.activeTexture(33984+
+b),c.bindTexture(35866,e.__webglTexture))};this.setTexture3D=function(a,b){var e=d.get(a);0<a.version&&e.__version!==a.version?Z(e,a,b):(c.activeTexture(33984+b),c.bindTexture(32879,e.__webglTexture))};this.setTextureCube=x;this.setTextureCubeDynamic=w;this.setupRenderTarget=function(b){var e=d.get(b),h=d.get(b.texture);b.addEventListener("dispose",u);h.__webglTexture=a.createTexture();g.memory.textures++;var l=!0===b.isWebGLCubeRenderTarget,z=!0===b.isWebGLMultisampleRenderTarget,q=m(b)||Da;!Da||
+1022!==b.texture.format||1015!==b.texture.type&&1016!==b.texture.type||(b.texture.format=1023,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead."));if(l)for(e.__webglFramebuffer=[],z=0;6>z;z++)e.__webglFramebuffer[z]=a.createFramebuffer();else if(e.__webglFramebuffer=a.createFramebuffer(),z)if(Da){e.__webglMultisampledFramebuffer=a.createFramebuffer();e.__webglColorRenderbuffer=a.createRenderbuffer();a.bindRenderbuffer(36161,e.__webglColorRenderbuffer);
+z=f.convert(b.texture.format);var r=f.convert(b.texture.type);z=t(b.texture.internalFormat,z,r);r=Q(b);a.renderbufferStorageMultisample(36161,r,z,b.width,b.height);a.bindFramebuffer(36160,e.__webglMultisampledFramebuffer);a.framebufferRenderbuffer(36160,36064,36161,e.__webglColorRenderbuffer);a.bindRenderbuffer(36161,null);b.depthBuffer&&(e.__webglDepthRenderbuffer=a.createRenderbuffer(),B(e.__webglDepthRenderbuffer,b,!0));a.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");
+if(l){c.bindTexture(34067,h.__webglTexture);v(34067,b.texture,q);for(z=0;6>z;z++)C(e.__webglFramebuffer[z],b,36064,34069+z);k(b.texture,q)&&n(34067,b.texture,b.width,b.height);c.bindTexture(34067,null)}else c.bindTexture(3553,h.__webglTexture),v(3553,b.texture,q),C(e.__webglFramebuffer,b,36064,3553),k(b.texture,q)&&n(3553,b.texture,b.width,b.height),c.bindTexture(3553,null);if(b.depthBuffer){e=d.get(b);h=!0===b.isWebGLCubeRenderTarget;if(b.depthTexture){if(h)throw Error("target.depthTexture not supported in Cube render targets");
+if(b&&b.isWebGLCubeRenderTarget)throw Error("Depth Texture with cube render targets is not supported");a.bindFramebuffer(36160,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);
+p(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(36160,36096,3553,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(36160,33306,3553,e,0);else throw Error("Unknown depthTexture format");}else if(h)for(e.__webglDepthbuffer=[],h=0;6>h;h++)a.bindFramebuffer(36160,e.__webglFramebuffer[h]),e.__webglDepthbuffer[h]=a.createRenderbuffer(),B(e.__webglDepthbuffer[h],b,!1);else a.bindFramebuffer(36160,e.__webglFramebuffer),e.__webglDepthbuffer=
+a.createRenderbuffer(),B(e.__webglDepthbuffer,b,!1);a.bindFramebuffer(36160,null)}};this.updateRenderTargetMipmap=function(a){var b=a.texture,e=m(a)||Da;if(k(b,e)){e=a.isWebGLCubeRenderTarget?34067:3553;var f=d.get(b).__webglTexture;c.bindTexture(e,f);n(e,b,a.width,a.height);c.bindTexture(e,null)}};this.updateMultisampleRenderTarget=function(b){if(b.isWebGLMultisampleRenderTarget)if(Da){var c=d.get(b);a.bindFramebuffer(36008,c.__webglMultisampledFramebuffer);a.bindFramebuffer(36009,c.__webglFramebuffer);
+var e=b.width,f=b.height,g=16384;b.depthBuffer&&(g|=256);b.stencilBuffer&&(g|=1024);a.blitFramebuffer(0,0,e,f,0,0,e,f,g,9728);a.bindFramebuffer(36160,c.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")};this.safeSetTexture2D=function(a,b){a&&a.isWebGLRenderTarget&&(!1===M&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),M=!0),a=a.texture);
+p(a,b)};this.safeSetTextureCube=function(a,b){a&&a.isWebGLCubeRenderTarget&&(!1===R&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),R=!0),a=a.texture);a&&a.isCubeTexture||Array.isArray(a.image)&&6===a.image.length?x(a,b):w(a,b)}}function Th(a,b,c){var d=c.isWebGL2;return{convert:function(a){if(1009===a)return 5121;if(1017===a)return 32819;if(1018===a)return 32820;if(1019===a)return 33635;if(1010===a)return 5120;
+if(1011===a)return 5122;if(1012===a)return 5123;if(1013===a)return 5124;if(1014===a)return 5125;if(1015===a)return 5126;if(1016===a){if(d)return 5131;var c=b.get("OES_texture_half_float");return null!==c?c.HALF_FLOAT_OES:null}if(1021===a)return 6406;if(1022===a)return 6407;if(1023===a)return 6408;if(1024===a)return 6409;if(1025===a)return 6410;if(1026===a)return 6402;if(1027===a)return 34041;if(1028===a)return 6403;if(1029===a)return 36244;if(1030===a)return 33319;if(1031===a)return 33320;if(1032===
+a)return 36248;if(1033===a)return 36249;if(33776===a||33777===a||33778===a||33779===a)if(c=b.get("WEBGL_compressed_texture_s3tc"),null!==c){if(33776===a)return c.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===a)return c.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===a)return c.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===a)return c.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(35840===a||35841===a||35842===a||35843===a)if(c=b.get("WEBGL_compressed_texture_pvrtc"),null!==c){if(35840===a)return c.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
+if(35841===a)return c.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===a)return c.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===a)return c.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(36196===a)return c=b.get("WEBGL_compressed_texture_etc1"),null!==c?c.COMPRESSED_RGB_ETC1_WEBGL:null;if(37492===a||37496===a)if(c=b.get("WEBGL_compressed_texture_etc"),null!==c){if(37492===a)return c.COMPRESSED_RGB8_ETC2;if(37496===a)return c.COMPRESSED_RGBA8_ETC2_EAC}if(37808===a||37809===a||37810===a||37811===a||37812===
+a||37813===a||37814===a||37815===a||37816===a||37817===a||37818===a||37819===a||37820===a||37821===a||37840===a||37841===a||37842===a||37843===a||37844===a||37845===a||37846===a||37847===a||37848===a||37849===a||37850===a||37851===a||37852===a||37853===a)return c=b.get("WEBGL_compressed_texture_astc"),null!==c?a:null;if(36492===a)return c=b.get("EXT_texture_compression_bptc"),null!==c?a:null;if(1020===a){if(d)return 34042;c=b.get("WEBGL_depth_texture");return null!==c?c.UNSIGNED_INT_24_8_WEBGL:null}}}}
+function Le(a){P.call(this);this.cameras=a||[]}function Kc(){y.call(this);this.type="Group"}function Me(){this._grip=this._targetRay=null}function Uh(a,b){function c(a){var b=q.get(a.inputSource);b&&b.dispatchEvent({type:a.type})}function d(){q.forEach(function(a,b){a.disconnect(b)});q.clear();a.setFramebuffer(null);a.setRenderTarget(a.getRenderTarget());Q.stop();h.isPresenting=!1;h.dispatchEvent({type:"sessionend"})}function e(a){k=a;Q.setContext(l);Q.start();h.isPresenting=!0;h.dispatchEvent({type:"sessionstart"})}
+function f(a){for(var b=l.inputSources,c=0;c<r.length;c++)q.set(b[c],r[c]);for(c=0;c<a.removed.length;c++){b=a.removed[c];var d=q.get(b);d&&(d.dispatchEvent({type:"disconnected",data:b}),q.delete(b))}for(c=0;c<a.added.length;c++)b=a.added[c],(d=q.get(b))&&d.dispatchEvent({type:"connected",data:b})}function g(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var h=this,l=null,m=1,k=null,n="local-floor",t=
+null,r=[],q=new Map,u=new P;u.layers.enable(1);u.viewport=new R;var E=new P;E.layers.enable(2);E.viewport=new R;var x=[u,E],w=new Le;w.layers.enable(1);w.layers.enable(2);var v=null,T=null;this.isPresenting=this.enabled=!1;this.getController=function(a){var b=r[a];void 0===b&&(b=new Me,r[a]=b);return b.getTargetRaySpace()};this.getControllerGrip=function(a){var b=r[a];void 0===b&&(b=new Me,r[a]=b);return b.getGripSpace()};this.setFramebufferScaleFactor=function(a){m=a;!0===h.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")};
+this.setReferenceSpaceType=function(a){n=a;!0===h.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")};this.getReferenceSpace=function(){return k};this.getSession=function(){return l};this.setSession=function(a){l=a;null!==l&&(l.addEventListener("select",c),l.addEventListener("selectstart",c),l.addEventListener("selectend",c),l.addEventListener("squeeze",c),l.addEventListener("squeezestart",c),l.addEventListener("squeezeend",c),l.addEventListener("end",
+d),a=b.getContextAttributes(),!0!==a.xrCompatible&&b.makeXRCompatible(),a=new XRWebGLLayer(l,b,{antialias:a.antialias,alpha:a.alpha,depth:a.depth,stencil:a.stencil,framebufferScaleFactor:m}),l.updateRenderState({baseLayer:a}),l.requestReferenceSpace(n).then(e),l.addEventListener("inputsourceschange",f))};var Z=new p,C=new p;this.getCamera=function(a){w.near=E.near=u.near=a.near;w.far=E.far=u.far=a.far;if(v!==w.near||T!==w.far)l.updateRenderState({depthNear:w.near,depthFar:w.far}),v=w.near,T=w.far;
+var b=a.parent,c=w.cameras;g(w,b);for(var d=0;d<c.length;d++)g(c[d],b);a.matrixWorld.copy(w.matrixWorld);a=a.children;d=0;for(b=a.length;d<b;d++)a[d].updateMatrixWorld(!0);if(2===c.length){Z.setFromMatrixPosition(u.matrixWorld);C.setFromMatrixPosition(E.matrixWorld);c=Z.distanceTo(C);var e=u.projectionMatrix.elements,f=E.projectionMatrix.elements,h=e[14]/(e[10]-1);d=e[14]/(e[10]+1);a=(e[9]+1)/e[5];b=(e[9]-1)/e[5];var m=(e[8]-1)/e[0],n=(f[8]+1)/f[0];f=h*m;e=h*n;n=c/(-m+n);m=n*-m;u.matrixWorld.decompose(w.position,
+w.quaternion,w.scale);w.translateX(m);w.translateZ(n);w.matrixWorld.compose(w.position,w.quaternion,w.scale);w.matrixWorldInverse.getInverse(w.matrixWorld);h+=n;n=d+n;w.projectionMatrix.makePerspective(f-m,e+(c-m),a*d/n*h,b*d/n*h,h,n)}else w.projectionMatrix.copy(u.projectionMatrix);return w};var B=null,Q=new uh;Q.setAnimationLoop(function(b,c){t=c.getViewerPose(k);if(null!==t){var d=t.views,e=l.renderState.baseLayer;a.setFramebuffer(e.framebuffer);var f=!1;d.length!==w.cameras.length&&(w.cameras.length=
+0,f=!0);for(var g=0;g<d.length;g++){var h=d[g],m=e.getViewport(h),n=x[g];n.matrix.fromArray(h.transform.matrix);n.projectionMatrix.fromArray(h.projectionMatrix);n.viewport.set(m.x,m.y,m.width,m.height);0===g&&w.matrix.copy(n.matrix);!0===f&&w.cameras.push(n)}}d=l.inputSources;for(g=0;g<r.length;g++)r[g].update(d[g],c,k);B&&B(b,c)});this.setAnimationLoop=function(a){B=a};this.dispose=function(){}}function zk(a){function b(b,c,f){b.opacity.value=c.opacity;c.color&&b.diffuse.value.copy(c.color);c.emissive&&
+b.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);c.map&&(b.map.value=c.map);c.alphaMap&&(b.alphaMap.value=c.alphaMap);c.specularMap&&(b.specularMap.value=c.specularMap);if(f=c.envMap||f)b.envMap.value=f,b.flipEnvMap.value=f.isCubeTexture?-1:1,b.reflectivity.value=c.reflectivity,b.refractionRatio.value=c.refractionRatio,b.maxMipLevel.value=a.get(f).__maxMipLevel;c.lightMap&&(b.lightMap.value=c.lightMap,b.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(b.aoMap.value=c.aoMap,
+b.aoMapIntensity.value=c.aoMapIntensity);if(c.map)var d=c.map;else c.specularMap?d=c.specularMap:c.displacementMap?d=c.displacementMap:c.normalMap?d=c.normalMap:c.bumpMap?d=c.bumpMap:c.roughnessMap?d=c.roughnessMap:c.metalnessMap?d=c.metalnessMap:c.alphaMap?d=c.alphaMap:c.emissiveMap&&(d=c.emissiveMap);void 0!==d&&(d.isWebGLRenderTarget&&(d=d.texture),!0===d.matrixAutoUpdate&&d.updateMatrix(),b.uvTransform.value.copy(d.matrix));if(c.aoMap)var e=c.aoMap;else c.lightMap&&(e=c.lightMap);void 0!==e&&
+(e.isWebGLRenderTarget&&(e=e.texture),!0===e.matrixAutoUpdate&&e.updateMatrix(),b.uv2Transform.value.copy(e.matrix))}function c(a,b,c){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,
+a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);if(b.envMap||c)a.envMapIntensity.value=b.envMapIntensity}return{refreshFogUniforms:function(a,b){a.fogColor.value.copy(b.color);b.isFog?(a.fogNear.value=b.near,a.fogFar.value=b.far):b.isFogExp2&&(a.fogDensity.value=b.density)},refreshMaterialUniforms:function(a,e,f,
+g,h){if(e.isMeshBasicMaterial)b(a,e);else if(e.isMeshLambertMaterial)b(a,e),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap);else if(e.isMeshToonMaterial)b(a,e),a.specular.value.copy(e.specular),a.shininess.value=Math.max(e.shininess,1E-4),e.gradientMap&&(a.gradientMap.value=e.gradientMap),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),
+1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshPhongMaterial)b(a,e),a.specular.value.copy(e.specular),a.shininess.value=Math.max(e.shininess,1E-4),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,
+a.normalScale.value.copy(e.normalScale),1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshStandardMaterial)b(a,e,f),e.isMeshPhysicalMaterial?(c(a,e,f),a.reflectivity.value=e.reflectivity,a.clearcoat.value=e.clearcoat,a.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&a.sheen.value.copy(e.sheen),e.clearcoatMap&&(a.clearcoatMap.value=
+e.clearcoatMap),e.clearcoatRoughnessMap&&(a.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(a.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),a.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&a.clearcoatNormalScale.value.negate()),a.transparency.value=e.transparency):c(a,e,f);else if(e.isMeshMatcapMaterial)b(a,e),e.matcap&&(a.matcap.value=e.matcap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),
+e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshDepthMaterial)b(a,e),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshDistanceMaterial)b(a,
+e),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias),a.referencePosition.value.copy(e.referencePosition),a.nearDistance.value=e.nearDistance,a.farDistance.value=e.farDistance;else if(e.isMeshNormalMaterial)b(a,e),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),
+1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isLineBasicMaterial)a.diffuse.value.copy(e.color),a.opacity.value=e.opacity,e.isLineDashedMaterial&&(a.dashSize.value=e.dashSize,a.totalSize.value=e.dashSize+e.gapSize,a.scale.value=e.scale);else if(e.isPointsMaterial){a.diffuse.value.copy(e.color);a.opacity.value=e.opacity;a.size.value=e.size*g;
+a.scale.value=.5*h;e.map&&(a.map.value=e.map);e.alphaMap&&(a.alphaMap.value=e.alphaMap);if(e.map)var d=e.map;else e.alphaMap&&(d=e.alphaMap);void 0!==d&&(!0===d.matrixAutoUpdate&&d.updateMatrix(),a.uvTransform.value.copy(d.matrix))}else if(e.isSpriteMaterial){a.diffuse.value.copy(e.color);a.opacity.value=e.opacity;a.rotation.value=e.rotation;e.map&&(a.map.value=e.map);e.alphaMap&&(a.alphaMap.value=e.alphaMap);if(e.map)var m=e.map;else e.alphaMap&&(m=e.alphaMap);void 0!==m&&(!0===m.matrixAutoUpdate&&
+m.updateMatrix(),a.uvTransform.value.copy(m.matrix))}else e.isShadowMaterial?(a.color.value.copy(e.color),a.opacity.value=e.opacity):e.isShaderMaterial&&(e.uniformsNeedUpdate=!1)}}}function jg(a){var b;function c(){sa=new oj(I);Ha=new mj(I,sa,a);!1===Ha.isWebGL2&&(sa.get("WEBGL_depth_texture"),sa.get("OES_texture_float"),sa.get("OES_texture_half_float"),sa.get("OES_texture_half_float_linear"),sa.get("OES_standard_derivatives"),sa.get("OES_element_index_uint"),sa.get("ANGLE_instanced_arrays"));sa.get("OES_texture_float_linear");
+ra=new Th(I,sa,Ha);X=new xk(I,sa,Ha);X.scissor(S.copy(ka).multiplyScalar(xa).floor());X.viewport(Y.copy(da).multiplyScalar(xa).floor());fa=new rj(I);P=new nk;ba=new yk(I,sa,X,P,Ha,ra,fa);oa=new jj(I,Ha);va=new pj(I,oa,fa);pa=new uj(I,va,oa,fa);Aa=new tj(I);ta=new mk(y,sa,Ha);za=new zk(P);ya=new qk;wa=new wk;qa=new kj(y,X,pa,ja);Ca=new lj(I,sa,fa,Ha);Ea=new qj(I,sa,fa,Ha);fa.programs=ta.programs;y.capabilities=Ha;y.extensions=sa;y.properties=P;y.renderLists=ya;y.state=X;y.info=fa}function d(a){a.preventDefault();
+console.log("THREE.WebGLRenderer: Context Lost.");F=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");F=!1;c()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);P.remove(a)}function g(a){var b=P.get(a).program;a.program=void 0;void 0!==b&&ta.releaseProgram(b)}function h(a,b){a.render(function(a){y.renderBufferImmediate(a,b)})}function l(a,b,c,d){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isGroup)c=a.renderOrder;else if(a.isLOD)!0===a.autoUpdate&&a.update(b);
+else if(a.isLight)Q.pushLight(a),a.castShadow&&Q.pushShadow(a);else if(a.isSprite){if(!a.frustumCulled||na.intersectsSprite(a)){d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la);var e=pa.update(a),f=a.material;f.visible&&B.push(a,e,f,c,Jb.z,null)}}else if(a.isImmediateRenderObject)d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la),B.push(a,null,a.material,c,Jb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.frame!==fa.render.frame&&(a.skeleton.update(),
+a.skeleton.frame=fa.render.frame),!a.frustumCulled||na.intersectsObject(a))if(d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la),e=pa.update(a),f=a.material,Array.isArray(f))for(var g=e.groups,h=0,m=g.length;h<m;h++){var n=g[h],k=f[n.materialIndex];k&&k.visible&&B.push(a,e,k,c,Jb.z,n)}else f.visible&&B.push(a,e,f,c,Jb.z,null);a=a.children;h=0;for(m=a.length;h<m;h++)l(a[h],b,c,d)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,m=void 0===d?g.material:
+d;g=g.group;if(c.isArrayCamera){W=c;for(var n=c.cameras,z=0,q=n.length;z<q;z++){var t=n[z];h.layers.test(t.layers)&&(X.viewport(Y.copy(t.viewport)),Q.setupLights(t),k(h,b,t,l,m,g))}}else W=null,k(h,b,c,l,m,g)}}function k(a,c,d,e,f,g){a.onBeforeRender(y,c,d,e,f,g);Q=wa.get(c,W||d);a.modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){var l=t(d,c,f,a);X.setMaterial(f);V=b=null;Ke=!1;h(a,l)}else y.renderBufferDirect(d,
+c,e,f,a,g);a.onAfterRender(y,c,d,e,f,g);Q=wa.get(c,W||d)}function n(a,b,c){var d=P.get(a),e=Q.state.lights,h=e.state.version;c=ta.getParameters(a,e.state,Q.state.shadowsArray,b,ha.numPlanes,ha.numIntersection,c);var l=ta.getProgramCacheKey(c),m=d.program,n=!0;if(void 0===m)a.addEventListener("dispose",f);else if(m.cacheKey!==l)g(a);else{if(d.lightsStateVersion!==h)d.lightsStateVersion=h;else if(void 0!==c.shaderID)return;n=!1}n&&(m=ta.acquireProgram(c,l),d.program=m,d.uniforms=c.uniforms,d.outputEncoding=
+c.outputEncoding,a.program=m);c=m.getAttributes();if(a.morphTargets)for(l=a.numSupportedMorphTargets=0;l<y.maxMorphTargets;l++)0<=c["morphTarget"+l]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(l=a.numSupportedMorphNormals=0;l<y.maxMorphNormals;l++)0<=c["morphNormal"+l]&&a.numSupportedMorphNormals++;c=d.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=ha.numPlanes,d.numIntersection=ha.numIntersection,c.clippingPlanes=ha.uniform;d.environment=a.isMeshStandardMaterial?
+b.environment:null;d.fog=b.fog;d.needsLights=a.isMeshLambertMaterial||a.isMeshToonMaterial||a.isMeshPhongMaterial||a.isMeshStandardMaterial||a.isShadowMaterial||a.isShaderMaterial&&!0===a.lights;d.lightsStateVersion=h;d.needsLights&&(c.ambientLightColor.value=e.state.ambient,c.lightProbe.value=e.state.probe,c.directionalLights.value=e.state.directional,c.directionalLightShadows.value=e.state.directionalShadow,c.spotLights.value=e.state.spot,c.spotLightShadows.value=e.state.spotShadow,c.rectAreaLights.value=
+e.state.rectArea,c.pointLights.value=e.state.point,c.pointLightShadows.value=e.state.pointShadow,c.hemisphereLights.value=e.state.hemi,c.directionalShadowMap.value=e.state.directionalShadowMap,c.directionalShadowMatrix.value=e.state.directionalShadowMatrix,c.spotShadowMap.value=e.state.spotShadowMap,c.spotShadowMatrix.value=e.state.spotShadowMatrix,c.pointShadowMap.value=e.state.pointShadowMap,c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Gb.seqWithValue(a.seq,c);
+d.uniformsList=a}function t(a,b,c,d){ba.resetTextureUnits();var e=b.fog,f=c.isMeshStandardMaterial?b.environment:null,g=null===G?y.outputEncoding:G.texture.encoding,h=P.get(c),l=Q.state.lights;Je&&(ig||a!==ia)&&ha.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,h,a===ia&&c.id===M);c.version===h.__version?void 0===h.program?n(c,b,d):c.fog&&h.fog!==e?n(c,b,d):h.environment!==f?n(c,b,d):h.needsLights&&h.lightsStateVersion!==l.state.version?n(c,b,d):void 0===h.numClippingPlanes||h.numClippingPlanes===
+ha.numPlanes&&h.numIntersection===ha.numIntersection?h.outputEncoding!==g&&n(c,b,d):n(c,b,d):(n(c,b,d),h.__version=c.version);var m=!1,k=!1,z=!1;b=h.program;g=b.getUniforms();l=h.uniforms;X.useProgram(b.program)&&(z=k=m=!0);c.id!==M&&(M=c.id,k=!0);if(m||ia!==a){g.setValue(I,"projectionMatrix",a.projectionMatrix);Ha.logarithmicDepthBuffer&&g.setValue(I,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));ia!==a&&(ia=a,z=k=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshStandardMaterial||
+c.envMap)m=g.map.cameraPosition,void 0!==m&&m.setValue(I,Jb.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial)&&g.setValue(I,"isOrthographic",!0===a.isOrthographicCamera);(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&g.setValue(I,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&
+(g.setOptional(I,d,"bindMatrix"),g.setOptional(I,d,"bindMatrixInverse"),a=d.skeleton))if(m=a.bones,Ha.floatVertexTextures){if(void 0===a.boneTexture){m=Math.sqrt(4*m.length);m=O.ceilPowerOfTwo(m);m=Math.max(m,4);var q=new Float32Array(m*m*4);q.set(a.boneMatrices);var t=new $b(q,m,m,1023,1015);a.boneMatrices=q;a.boneTexture=t;a.boneTextureSize=m}g.setValue(I,"boneTexture",a.boneTexture,ba);g.setValue(I,"boneTextureSize",a.boneTextureSize)}else g.setOptional(I,a,"boneMatrices");if(k||h.receiveShadow!==
+d.receiveShadow)h.receiveShadow=d.receiveShadow,g.setValue(I,"receiveShadow",d.receiveShadow);k&&(g.setValue(I,"toneMappingExposure",y.toneMappingExposure),g.setValue(I,"toneMappingWhitePoint",y.toneMappingWhitePoint),h.needsLights&&(k=z,l.ambientLightColor.needsUpdate=k,l.lightProbe.needsUpdate=k,l.directionalLights.needsUpdate=k,l.directionalLightShadows.needsUpdate=k,l.pointLights.needsUpdate=k,l.pointLightShadows.needsUpdate=k,l.spotLights.needsUpdate=k,l.spotLightShadows.needsUpdate=k,l.rectAreaLights.needsUpdate=
+k,l.hemisphereLights.needsUpdate=k),e&&c.fog&&za.refreshFogUniforms(l,e),za.refreshMaterialUniforms(l,c,f,xa,Ra),void 0!==l.ltc_1&&(l.ltc_1.value=A.LTC_1),void 0!==l.ltc_2&&(l.ltc_2.value=A.LTC_2),Gb.upload(I,h.uniformsList,l,ba));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Gb.upload(I,h.uniformsList,l,ba),c.uniformsNeedUpdate=!1);c.isSpriteMaterial&&g.setValue(I,"center",d.center);g.setValue(I,"modelViewMatrix",d.modelViewMatrix);g.setValue(I,"normalMatrix",d.normalMatrix);g.setValue(I,"modelMatrix",
+d.matrixWorld);return b}a=a||{};var r=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),q=void 0!==a.context?a.context:null,u=void 0!==a.alpha?a.alpha:!1,E=void 0!==a.depth?a.depth:!0,x=void 0!==a.stencil?a.stencil:!0,w=void 0!==a.antialias?a.antialias:!1,ja=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,T=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,Z=void 0!==a.powerPreference?a.powerPreference:"default",C=void 0!==a.failIfMajorPerformanceCaveat?
+a.failIfMajorPerformanceCaveat:!1,B=null,Q=null;this.domElement=r;this.debug={checkShaderErrors:!0};this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.outputEncoding=3E3;this.physicallyCorrectLights=!1;this.toneMapping=0;this.toneMappingWhitePoint=this.toneMappingExposure=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var y=this,F=!1,D=null,H=0,K=0,G=null,L=null,M=-1;var V=b=
+null;var Ke=!1;var ia=null,W=null,Y=new R,S=new R,aa=null,ea=r.width,Ra=r.height,xa=1,J=null,ca=null,da=new R(0,0,ea,Ra),ka=new R(0,0,ea,Ra),ma=!1,na=new Gc,ha=new nj,Je=!1,ig=!1,la=new N,Jb=new p;try{u={alpha:u,depth:E,stencil:x,antialias:w,premultipliedAlpha:ja,preserveDrawingBuffer:T,powerPreference:Z,failIfMajorPerformanceCaveat:C};r.addEventListener("webglcontextlost",d,!1);r.addEventListener("webglcontextrestored",e,!1);var I=q||r.getContext("webgl",u)||r.getContext("experimental-webgl",u);
+if(null===I){if(null!==r.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");throw Error("Error creating WebGL context.");}void 0===I.getShaderPrecisionFormat&&(I.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Vh){throw console.error("THREE.WebGLRenderer: "+Vh.message),Vh;}var sa,Ha,X,fa,P,ba,oa,va,pa,ta,za,ya,wa,qa,Aa,Ca,Ea,ra;c();var ua=new Uh(y,I);this.xr=ua;var Ga=new Rh(y,pa,Ha.maxTextureSize);this.shadowMap=Ga;
+this.getContext=function(){return I};this.getContextAttributes=function(){return I.getContextAttributes()};this.forceContextLoss=function(){var a=sa.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=sa.get("WEBGL_lose_context");a&&a.restoreContext()};this.getPixelRatio=function(){return xa};this.setPixelRatio=function(a){void 0!==a&&(xa=a,this.setSize(ea,Ra,!1))};this.getSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),
+a=new v);return a.set(ea,Ra)};this.setSize=function(a,b,c){ua.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(ea=a,Ra=b,r.width=Math.floor(a*xa),r.height=Math.floor(b*xa),!1!==c&&(r.style.width=a+"px",r.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),a=new v);return a.set(ea*xa,Ra*xa).floor()};this.setDrawingBufferSize=
+function(a,b,c){ea=a;Ra=b;xa=c;r.width=Math.floor(a*c);r.height=Math.floor(b*c);this.setViewport(0,0,a,b)};this.getCurrentViewport=function(a){void 0===a&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),a=new R);return a.copy(Y)};this.getViewport=function(a){return a.copy(da)};this.setViewport=function(a,b,c,d){a.isVector4?da.set(a.x,a.y,a.z,a.w):da.set(a,b,c,d);X.viewport(Y.copy(da).multiplyScalar(xa).floor())};this.getScissor=function(a){return a.copy(ka)};
+this.setScissor=function(a,b,c,d){a.isVector4?ka.set(a.x,a.y,a.z,a.w):ka.set(a,b,c,d);X.scissor(S.copy(ka).multiplyScalar(xa).floor())};this.getScissorTest=function(){return ma};this.setScissorTest=function(a){X.setScissorTest(ma=a)};this.setOpaqueSort=function(a){J=a};this.setTransparentSort=function(a){ca=a};this.getClearColor=function(){return qa.getClearColor()};this.setClearColor=function(){qa.setClearColor.apply(qa,arguments)};this.getClearAlpha=function(){return qa.getClearAlpha()};this.setClearAlpha=
+function(){qa.setClearAlpha.apply(qa,arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=16384;if(void 0===b||b)d|=256;if(void 0===c||c)d|=1024;I.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.dispose=function(){r.removeEventListener("webglcontextlost",d,!1);r.removeEventListener("webglcontextrestored",e,!1);ya.dispose();wa.dispose();P.dispose();pa.dispose();ua.dispose();
+Ba.stop()};this.renderBufferImmediate=function(a,b){X.initAttributes();var c=P.get(a);a.hasPositions&&!c.position&&(c.position=I.createBuffer());a.hasNormals&&!c.normal&&(c.normal=I.createBuffer());a.hasUvs&&!c.uv&&(c.uv=I.createBuffer());a.hasColors&&!c.color&&(c.color=I.createBuffer());b=b.getAttributes();a.hasPositions&&(I.bindBuffer(34962,c.position),I.bufferData(34962,a.positionArray,35048),X.enableAttribute(b.position),I.vertexAttribPointer(b.position,3,5126,!1,0,0));a.hasNormals&&(I.bindBuffer(34962,
+c.normal),I.bufferData(34962,a.normalArray,35048),X.enableAttribute(b.normal),I.vertexAttribPointer(b.normal,3,5126,!1,0,0));a.hasUvs&&(I.bindBuffer(34962,c.uv),I.bufferData(34962,a.uvArray,35048),X.enableAttribute(b.uv),I.vertexAttribPointer(b.uv,2,5126,!1,0,0));a.hasColors&&(I.bindBuffer(34962,c.color),I.bufferData(34962,a.colorArray,35048),X.enableAttribute(b.color),I.vertexAttribPointer(b.color,3,5126,!1,0,0));X.disableUnusedAttributes();I.drawArrays(4,0,a.count);a.count=0};var Ia=new zc;this.renderBufferDirect=
+function(a,c,d,e,f,g){null===c&&(c=Ia);var h=f.isMesh&&0>f.matrixWorld.determinant(),l=t(a,c,e,f);X.setMaterial(e,h);var m=!1;if(b!==d.id||V!==l.id||Ke!==(!0===e.wireframe))b=d.id,V=l.id,Ke=!0===e.wireframe,m=!0;if(e.morphTargets||e.morphNormals)Aa.update(f,d,e,l),m=!0;!0===f.isInstancedMesh&&(m=!0);a=d.index;c=d.attributes.position;if(null===a){if(void 0===c||0===c.count)return}else if(0===a.count)return;var n=1;!0===e.wireframe&&(a=va.getWireframeAttribute(d),n=2);h=Ca;if(null!==a){var k=oa.get(a);
+h=Ea;h.setIndex(k)}if(m){if(!1!==Ha.isWebGL2||!f.isInstancedMesh&&!d.isInstancedBufferGeometry||null!==sa.get("ANGLE_instanced_arrays")){X.initAttributes();m=d.attributes;l=l.getAttributes();var z=e.defaultAttributeValues;for(ja in l){var q=l[ja];if(0<=q){var r=m[ja];if(void 0!==r){var u=r.normalized,p=r.itemSize,w=oa.get(r);if(void 0!==w){var E=w.buffer,x=w.type;w=w.bytesPerElement;if(r.isInterleavedBufferAttribute){var v=r.data,C=v.stride;r=r.offset;v&&v.isInstancedInterleavedBuffer?(X.enableAttributeAndDivisor(q,
+v.meshPerAttribute),void 0===d._maxInstanceCount&&(d._maxInstanceCount=v.meshPerAttribute*v.count)):X.enableAttribute(q);I.bindBuffer(34962,E);X.vertexAttribPointer(q,p,x,u,C*w,r*w)}else r.isInstancedBufferAttribute?(X.enableAttributeAndDivisor(q,r.meshPerAttribute),void 0===d._maxInstanceCount&&(d._maxInstanceCount=r.meshPerAttribute*r.count)):X.enableAttribute(q),I.bindBuffer(34962,E),X.vertexAttribPointer(q,p,x,u,0,0)}}else if("instanceMatrix"===ja)w=oa.get(f.instanceMatrix),void 0!==w&&(E=w.buffer,
+x=w.type,X.enableAttributeAndDivisor(q+0,1),X.enableAttributeAndDivisor(q+1,1),X.enableAttributeAndDivisor(q+2,1),X.enableAttributeAndDivisor(q+3,1),I.bindBuffer(34962,E),I.vertexAttribPointer(q+0,4,x,!1,64,0),I.vertexAttribPointer(q+1,4,x,!1,64,16),I.vertexAttribPointer(q+2,4,x,!1,64,32),I.vertexAttribPointer(q+3,4,x,!1,64,48));else if(void 0!==z&&(u=z[ja],void 0!==u))switch(u.length){case 2:I.vertexAttrib2fv(q,u);break;case 3:I.vertexAttrib3fv(q,u);break;case 4:I.vertexAttrib4fv(q,u);break;default:I.vertexAttrib1fv(q,
+u)}}}X.disableUnusedAttributes()}null!==a&&I.bindBuffer(34963,k.buffer)}var ja=d.drawRange.start*n;m=null!==g?g.start*n:0;k=Math.max(ja,m);g=Math.max(0,Math.min(null!==a?a.count:c.count,ja+d.drawRange.count*n,m+(null!==g?g.count*n:Infinity))-1-k+1);0!==g&&(f.isMesh?!0===e.wireframe?(X.setLineWidth(e.wireframeLinewidth*(null===G?xa:1)),h.setMode(1)):h.setMode(4):f.isLine?(e=e.linewidth,void 0===e&&(e=1),X.setLineWidth(e*(null===G?xa:1)),f.isLineSegments?h.setMode(1):f.isLineLoop?h.setMode(2):h.setMode(3)):
+f.isPoints?h.setMode(0):f.isSprite&&h.setMode(4),f.isInstancedMesh?h.renderInstances(d,k,g,f.count):d.isInstancedBufferGeometry?h.renderInstances(d,k,g,Math.min(d.instanceCount,d._maxInstanceCount)):h.render(k,g))};this.compile=function(a,b){Q=wa.get(a,b);Q.init();a.traverse(function(a){a.isLight&&(Q.pushLight(a),a.castShadow&&Q.pushShadow(a))});Q.setupLights(b);var c={};a.traverse(function(b){var d=b.material;if(d)if(Array.isArray(d))for(var e=0;e<d.length;e++){var f=d[e];!1===f.uuid in c&&(n(f,
+a,b),c[f.uuid]=!0)}else!1===d.uuid in c&&(n(d,a,b),c[d.uuid]=!0)})};var Fa=null,Ba=new uh;Ba.setAnimationLoop(function(a){ua.isPresenting||Fa&&Fa(a)});"undefined"!==typeof window&&Ba.setContext(window);this.setAnimationLoop=function(a){Fa=a;ua.setAnimationLoop(a);Ba.start()};this.render=function(a,c,d,e){if(void 0!==d){console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.");var f=d}if(void 0!==e){console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.");
+var g=e}c&&c.isCamera?F||(V=b=null,Ke=!1,M=-1,ia=null,!0===a.autoUpdate&&a.updateMatrixWorld(),null===c.parent&&c.updateMatrixWorld(),ua.enabled&&ua.isPresenting&&(c=ua.getCamera(c)),a.onBeforeRender(y,a,c,f||G),Q=wa.get(a,c),Q.init(),la.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse),na.setFromProjectionMatrix(la),ig=this.localClippingEnabled,Je=ha.init(this.clippingPlanes,ig,c),B=ya.get(a,c),B.init(),l(a,c,0,y.sortObjects),B.finish(),!0===y.sortObjects&&B.sort(J,ca),Je&&ha.beginShadows(),
+Ga.render(Q.state.shadowsArray,a,c),Q.setupLights(c),Je&&ha.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==f&&this.setRenderTarget(f),qa.render(B,a,c,g),d=B.opaque,e=B.transparent,a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,c,f),e.length&&m(e,a,c,f)):(d.length&&m(d,a,c),e.length&&m(e,a,c)),a.onAfterRender(y,a,c),null!==G&&(ba.updateRenderTargetMipmap(G),ba.updateMultisampleRenderTarget(G)),X.buffers.depth.setTest(!0),X.buffers.depth.setMask(!0),X.buffers.color.setMask(!0),
+X.setPolygonOffset(!1),Q=B=null):console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFramebuffer=function(a){D!==a&&null===G&&I.bindFramebuffer(36160,a);D=a};this.getActiveCubeFace=function(){return H};this.getActiveMipmapLevel=function(){return K};this.getRenderTarget=function(){return G};this.setRenderTarget=function(a,b,c){G=a;H=b;K=c;a&&void 0===P.get(a).__webglFramebuffer&&ba.setupRenderTarget(a);var d=D,e=!1;a?(d=P.get(a).__webglFramebuffer,a.isWebGLCubeRenderTarget?
+(d=d[b||0],e=!0):d=a.isWebGLMultisampleRenderTarget?P.get(a).__webglMultisampledFramebuffer:d,Y.copy(a.viewport),S.copy(a.scissor),aa=a.scissorTest):(Y.copy(da).multiplyScalar(xa).floor(),S.copy(ka).multiplyScalar(xa).floor(),aa=ma);L!==d&&(I.bindFramebuffer(36160,d),L=d);X.viewport(Y);X.scissor(S);X.setScissorTest(aa);e&&(a=P.get(a.texture),I.framebufferTexture2D(36160,36064,34069+(b||0),a.__webglTexture,c||0))};this.readRenderTargetPixels=function(a,b,c,d,e,f,g){if(a&&a.isWebGLRenderTarget){var h=
+P.get(a).__webglFramebuffer;a.isWebGLCubeRenderTarget&&void 0!==g&&(h=h[g]);if(h){g=!1;h!==L&&(I.bindFramebuffer(36160,h),g=!0);try{var l=a.texture,m=l.format,n=l.type;1023!==m&&ra.convert(m)!==I.getParameter(35739)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||ra.convert(n)===I.getParameter(35738)||1015===n&&(Ha.isWebGL2||sa.get("OES_texture_float")||sa.get("WEBGL_color_buffer_float"))||1016===n&&(Ha.isWebGL2?
+sa.get("EXT_color_buffer_float"):sa.get("EXT_color_buffer_half_float"))?36053===I.checkFramebufferStatus(36160)?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&I.readPixels(b,c,d,e,ra.convert(m),ra.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{g&&I.bindFramebuffer(36160,L)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};
+this.copyFramebufferToTexture=function(a,b,c){void 0===c&&(c=0);var d=Math.pow(2,-c),e=Math.floor(b.image.width*d);d=Math.floor(b.image.height*d);var f=ra.convert(b.format);ba.setTexture2D(b,0);I.copyTexImage2D(3553,c,f,a.x,a.y,e,d,0);X.unbindTexture()};this.copyTextureToTexture=function(a,b,c,d){void 0===d&&(d=0);var e=b.image.width,f=b.image.height,g=ra.convert(c.format),h=ra.convert(c.type);ba.setTexture2D(c,0);b.isDataTexture?I.texSubImage2D(3553,d,a.x,a.y,e,f,g,h,b.image.data):b.isCompressedTexture?
+I.compressedTexSubImage2D(3553,d,a.x,a.y,b.mipmaps[0].width,b.mipmaps[0].height,g,b.mipmaps[0].data):I.texSubImage2D(3553,d,a.x,a.y,g,h,b.image);0===d&&c.generateMipmaps&&I.generateMipmap(3553);X.unbindTexture()};this.initTexture=function(a){ba.setTexture2D(a,0);X.unbindTexture()};"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Ne(a,b){this.name="";this.color=new D(a);this.density=void 0!==b?b:2.5E-4}function Oe(a,b,c){this.name=
+"";this.color=new D(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function rb(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.usage=35044;this.updateRange={offset:0,count:-1};this.version=0}function Kd(a,b,c,d){this.name="";this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function Kb(a){K.call(this);this.type="SpriteMaterial";this.color=new D(16777215);this.alphaMap=this.map=null;this.rotation=0;this.transparent=this.sizeAttenuation=!0;this.setValues(a)}
+function Ld(a){y.call(this);this.type="Sprite";if(void 0===Lc){Lc=new F;var b=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]);b=new rb(b,5);Lc.setIndex([0,1,2,0,2,3]);Lc.setAttribute("position",new Kd(b,3,0,!1));Lc.setAttribute("uv",new Kd(b,2,3,!1))}this.geometry=Lc;this.material=void 0!==a?a:new Kb;this.center=new v(.5,.5)}function Pe(a,b,c,d,e,f){Mc.subVectors(a,c).addScalar(.5).multiply(d);void 0!==e?(Md.x=f*Mc.x-e*Mc.y,Md.y=e*Mc.x+f*Mc.y):Md.copy(Mc);a.copy(b);a.x+=Md.x;
+a.y+=Md.y;a.applyMatrix4(Wh)}function Nd(){y.call(this);this._currentLevel=0;this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}});this.autoUpdate=!0}function Qe(a,b){a&&a.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");ea.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new N;this.bindMatrixInverse=new N}function Re(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*
+this.bones.length);this.frame=-1;if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new N)}function kg(){y.call(this);this.type="Bone"}function Se(a,b,c){ea.call(this,a,b);this.instanceMatrix=new G(new Float32Array(16*c),16);this.count=c;this.frustumCulled=!1}function da(a){K.call(this);this.type=
+"LineBasicMaterial";this.color=new D(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.morphTargets=!1;this.setValues(a)}function La(a,b,c){1===c&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");y.call(this);this.type="Line";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new da;this.updateMorphTargets()}function ma(a,b){La.call(this,a,b);this.type="LineSegments"}function Te(a,b){La.call(this,a,b);this.type=
+"LineLoop"}function Xa(a){K.call(this);this.type="PointsMaterial";this.color=new D(16777215);this.alphaMap=this.map=null;this.size=1;this.sizeAttenuation=!0;this.morphTargets=!1;this.setValues(a)}function Nc(a,b){y.call(this);this.type="Points";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new Xa;this.updateMorphTargets()}function lg(a,b,c,d,e,f,g){var h=mg.distanceSqToPoint(a);h<c&&(c=new p,mg.closestPointToPoint(a,c),c.applyMatrix4(d),a=e.ray.origin.distanceTo(c),a<e.near||a>e.far||
+f.push({distance:a,distanceToRay:Math.sqrt(h),point:c,index:b,face:null,object:g}))}function ng(a,b,c,d,e,f,g,h,l){W.call(this,a,b,c,d,e,f,g,h,l);this.format=void 0!==g?g:1022;this.minFilter=void 0!==f?f:1006;this.magFilter=void 0!==e?e:1006;this.generateMipmaps=!1}function Oc(a,b,c,d,e,f,g,h,l,m,k,n){W.call(this,null,f,g,h,l,m,d,e,k,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Od(a,b,c,d,e,f,g,h,l){W.call(this,a,b,c,d,e,f,g,h,l);this.needsUpdate=!0}
+function Pd(a,b,c,d,e,f,g,h,l,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);W.call(this,null,d,e,f,g,h,m,c,l);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Pc(a){F.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&
+a.isGeometry){var l=a.faces;var m=0;for(d=l.length;m<d;m++){var k=l[m];for(c=0;3>c;c++){var n=k[h[c]];var t=k[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m=g[n],h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){l=a.attributes.position;k=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:k.count,materialIndex:0}]);a=0;for(e=
+r.length;a<e;++a)for(m=r[a],c=m.start,d=m.count,m=c,d=c+d;m<d;m+=3)for(c=0;3>c;c++)n=k.getX(m+c),t=k.getX(m+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n],h.fromBufferAttribute(l,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(l,m.index2),b.push(h.x,h.y,h.z)}else for(l=a.attributes.position,m=0,d=l.count/3;m<d;m++)for(c=0;3>c;c++)g=3*m+c,h.fromBufferAttribute(l,g),b.push(h.x,h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(l,
+g),b.push(h.x,h.y,h.z);this.setAttribute("position",new B(b,3))}function Qd(a,b,c){L.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Qc(a,b,c));this.mergeVertices()}function Qc(a,b,c){F.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,l=new p,m=new p,k=new p,n=new p,t,r;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");
+var q=b+1;for(t=0;t<=c;t++){var u=t/c;for(r=0;r<=b;r++){var E=r/b;a(E,u,l);e.push(l.x,l.y,l.z);0<=E-1E-5?(a(E-1E-5,u,m),k.subVectors(l,m)):(a(E+1E-5,u,m),k.subVectors(m,l));0<=u-1E-5?(a(E,u-1E-5,m),n.subVectors(l,m)):(a(E,u+1E-5,m),n.subVectors(m,l));h.crossVectors(k,n).normalize();f.push(h.x,h.y,h.z);g.push(E,u)}}for(t=0;t<c;t++)for(r=0;r<b;r++)a=t*q+r+1,h=(t+1)*q+r+1,l=(t+1)*q+r,d.push(t*q+r,a,l),d.push(a,h,l);this.setIndex(d);this.setAttribute("position",new B(e,3));this.setAttribute("normal",
+new B(f,3));this.setAttribute("uv",new B(g,2))}function Rd(a,b,c,d){L.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new Ga(a,b,c,d));this.mergeVertices()}function Ga(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a,b,c,d){0>d&&1===a.x&&(l[b]=a.x-1);0===c.x&&0===c.z&&(l[b]=d/2/Math.PI+.5)}F.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,
+indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],l=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var l,m,k=c,x=d,w=g,v=Math.pow(2,a),T=[];for(m=0;m<=v;m++){T[m]=[];var Z=k.clone().lerp(w,m/v),C=x.clone().lerp(w,m/v),y=v-m;for(l=0;l<=y;l++)T[m][l]=0===l&&m===v?Z:Z.clone().lerp(C,l/y)}for(m=0;m<v;m++)for(l=0;l<2*(v-m)-1;l++)k=Math.floor(l/2),0===l%2?(e(T[m][k+1]),e(T[m+1][k]),e(T[m][k])):(e(T[m][k+1]),e(T[m+1][k+1]),e(T[m+1][k]))}})(d);(function(a){for(var b=
+new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],l.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));a=new p;b=new p;for(var c=new p,d=new p,e=new v,f=new v,k=new v,E=0,x=0;E<h.length;E+=9,x+=6){a.set(h[E+0],h[E+1],h[E+2]);b.set(h[E+3],h[E+4],h[E+5]);c.set(h[E+6],h[E+7],h[E+8]);e.set(l[x+0],
+l[x+1]);f.set(l[x+2],l[x+3]);k.set(l[x+4],l[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var w=Math.atan2(d.z,-d.x);g(e,x+0,a,w);g(f,x+2,b,w);g(k,x+4,c,w)}for(a=0;a<l.length;a+=6)b=l[a+0],c=l[a+2],d=l[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(l[a+0]+=1),.2>c&&(l[a+2]+=1),.2>d&&(l[a+4]+=1))})();this.setAttribute("position",new B(h,3));this.setAttribute("normal",new B(h.slice(),3));this.setAttribute("uv",new B(l,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Sd(a,
+b){L.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rc(a,b));this.mergeVertices()}function Rc(a,b){Ga.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Td(a,b){L.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new bc(a,b));this.mergeVertices()}function bc(a,b){Ga.call(this,[1,0,0,
+-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ud(a,b){L.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sc(a,b));this.mergeVertices()}function Sc(a,b){var c=(1+Math.sqrt(5))/2;Ga.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,
+11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Vd(a,b){L.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tc(a,b));this.mergeVertices()}function Tc(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;Ga.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,
+0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Wd(a,b,c,d,e,f){L.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,
+closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new cc(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function cc(a,b,c,d,e){function f(e){k=a.getPointAt(e/b,k);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var m=t/d*Math.PI*2,n=Math.sin(m);m=-Math.cos(m);l.x=m*f.x+n*e.x;l.y=m*f.y+n*e.y;l.z=m*f.z+n*e.z;l.normalize();q.push(l.x,l.y,l.z);h.x=k.x+c*l.x;h.y=k.y+c*l.y;h.z=
+k.z+c*l.z;r.push(h.x,h.y,h.z)}}F.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,l=new p,m=new v,k=new p,n,t,r=[],q=[],u=[],E=[];for(n=0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(t=0;t<=d;t++)m.x=n/b,m.y=t/d,u.push(m.x,m.y);(function(){for(t=1;t<=b;t++)for(n=1;n<=d;n++){var a=
+(d+1)*t+(n-1),c=(d+1)*t+n,e=(d+1)*(t-1)+n;E.push((d+1)*(t-1)+(n-1),a,e);E.push(a,c,e)}})();this.setIndex(E);this.setAttribute("position",new B(r,3));this.setAttribute("normal",new B(q,3));this.setAttribute("uv",new B(u,2))}function Xd(a,b,c,d,e,f,g){L.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");this.fromBufferGeometry(new Uc(a,
+b,c,d,e,f));this.mergeVertices()}function Uc(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}F.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],l=[],m=[],k=[],n,t=new p,r=new p,q=new p,u=new p,E=new p,x=new p,w=new p;for(n=0;n<=c;++n){var v=n/c*e*Math.PI*2;
+g(v,e,f,a,q);g(v+.01,e,f,a,u);x.subVectors(u,q);w.addVectors(u,q);E.crossVectors(x,w);w.crossVectors(E,x);E.normalize();w.normalize();for(v=0;v<=d;++v){var T=v/d*Math.PI*2,Z=-b*Math.cos(T);T=b*Math.sin(T);t.x=q.x+(Z*w.x+T*E.x);t.y=q.y+(Z*w.y+T*E.y);t.z=q.z+(Z*w.z+T*E.z);l.push(t.x,t.y,t.z);r.subVectors(t,q).normalize();m.push(r.x,r.y,r.z);k.push(n/c);k.push(v/d)}}for(v=1;v<=c;v++)for(n=1;n<=d;n++)a=(d+1)*v+(n-1),b=(d+1)*v+n,e=(d+1)*(v-1)+n,h.push((d+1)*(v-1)+(n-1),a,e),h.push(a,b,e);this.setIndex(h);
+this.setAttribute("position",new B(l,3));this.setAttribute("normal",new B(m,3));this.setAttribute("uv",new B(k,2))}function Yd(a,b,c,d,e){L.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Vc(a,b,c,d,e));this.mergeVertices()}function Vc(a,b,c,d,e){F.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||.4;c=Math.floor(c)||8;d=Math.floor(d)||
+6;e=e||2*Math.PI;var f=[],g=[],h=[],l=[],m=new p,k=new p,n=new p,t,r;for(t=0;t<=c;t++)for(r=0;r<=d;r++){var q=r/d*e,u=t/c*Math.PI*2;k.x=(a+b*Math.cos(u))*Math.cos(q);k.y=(a+b*Math.cos(u))*Math.sin(q);k.z=b*Math.sin(u);g.push(k.x,k.y,k.z);m.x=a*Math.cos(q);m.y=a*Math.sin(q);n.subVectors(k,m).normalize();h.push(n.x,n.y,n.z);l.push(r/d);l.push(t/c)}for(t=1;t<=c;t++)for(r=1;r<=d;r++)a=(d+1)*(t-1)+r-1,b=(d+1)*(t-1)+r,e=(d+1)*t+r,f.push((d+1)*t+r-1,a,e),f.push(a,b,e);this.setIndex(f);this.setAttribute("position",
+new B(g,3));this.setAttribute("normal",new B(h,3));this.setAttribute("uv",new B(l,2))}function Xh(a,b,c,d,e){for(var f,g=0,h=b,l=c-d;h<c;h+=d)g+=(a[l]-a[h])*(a[h+1]+a[l+1]),l=h;if(e===0<g)for(e=b;e<c;e+=d)f=Yh(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=Yh(e,a[e],a[e+1],f);f&&Ue(f,f.next)&&(Zd(f),f=f.next);return f}function Lb(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!Ue(a,a.next)&&0!==na(a.prev,a,a.next))a=a.next;else{Zd(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
+function $d(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=og(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,k,n,t,r=1;do{l=h;var q=h=null;for(k=0;l;){k++;var p=l;for(m=n=0;m<r&&(n++,p=p.nextZ,p);m++);for(t=r;0<n||0<t&&p;)0!==n&&(0===t||!p||l.z<=p.z)?(m=l,l=l.nextZ,n--):(m=p,p=p.nextZ,t--),q?q.nextZ=m:h=m,m.prevZ=q,q=m;l=p}q.nextZ=null;r*=2}while(1<k)}for(h=a;a.prev!==a.next;){l=a.prev;p=a.next;if(f)q=Ak(a,d,e,f);else a:if(q=
+a,k=q.prev,n=q,r=q.next,0<=na(k,n,r))q=!1;else{for(m=q.next.next;m!==q.prev;){if(Wc(k.x,k.y,n.x,n.y,r.x,r.y,m.x,m.y)&&0<=na(m.prev,m,m.next)){q=!1;break a}m=m.next}q=!0}if(q)b.push(l.i/c),b.push(a.i/c),b.push(p.i/c),Zd(a),h=a=p.next;else if(a=p,a===h){if(!g)$d(Lb(a),b,c,d,e,f,1);else if(1===g){a=Lb(a);g=b;h=c;l=a;do p=l.prev,q=l.next.next,!Ue(p,q)&&Zh(p,l,l.next,q)&&ae(p,q)&&ae(q,p)&&(g.push(p.i/h),g.push(l.i/h),g.push(q.i/h),Zd(l),Zd(l.next),l=a=q),l=l.next;while(l!==a);a=Lb(l);$d(a,b,c,d,e,f,2)}else if(2===
+g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;p=h;if(q=l.next.i!==p.i&&l.prev.i!==p.i){b:{q=l;do{if(q.i!==l.i&&q.next.i!==l.i&&q.i!==p.i&&q.next.i!==p.i&&Zh(q,q.next,l,p)){q=!0;break b}q=q.next}while(q!==l);q=!1}q=!q}if(q){if(q=ae(l,p)&&ae(p,l)){q=l;k=!1;n=(l.x+p.x)/2;r=(l.y+p.y)/2;do q.y>r!==q.next.y>r&&q.next.y!==q.y&&n<(q.next.x-q.x)*(r-q.y)/(q.next.y-q.y)+q.x&&(k=!k),q=q.next;while(q!==l);q=k}q=q&&(na(l.prev,l,p.prev)||na(l,p.prev,p))||Ue(l,p)&&0<na(l.prev,l,l.next)&&0<na(p.prev,
+p,p.next)}l=q}if(l){a=$h(g,h);g=Lb(g,g.next);a=Lb(a,a.next);$d(g,b,c,d,e,f);$d(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ak(a,b,c,d){var e=a.prev,f=a.next;if(0<=na(e,a,f))return!1;var g=e.x>a.x?e.x>f.x?e.x:f.x:a.x>f.x?a.x:f.x,h=e.y>a.y?e.y>f.y?e.y:f.y:a.y>f.y?a.y:f.y,l=og(e.x<a.x?e.x<f.x?e.x:f.x:a.x<f.x?a.x:f.x,e.y<a.y?e.y<f.y?e.y:f.y:a.y<f.y?a.y:f.y,b,c,d);b=og(g,h,b,c,d);c=a.prevZ;for(d=a.nextZ;c&&c.z>=l&&d&&d.z<=b;){if(c!==a.prev&&c!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,
+f.y,c.x,c.y)&&0<=na(c.prev,c,c.next))return!1;c=c.prevZ;if(d!==a.prev&&d!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=na(d.prev,d,d.next))return!1;d=d.nextZ}for(;c&&c.z>=l;){if(c!==a.prev&&c!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=na(c.prev,c,c.next))return!1;c=c.prevZ}for(;d&&d.z<=b;){if(d!==a.prev&&d!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=na(d.prev,d,d.next))return!1;d=d.nextZ}return!0}function Bk(a,b){return a.x-b.x}function Ck(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=
+c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x<c.next.x?c:c.next}}c=c.next}while(c!==b);if(!h)return null;if(d===f)return h;b=h;g=h.x;var l=h.y,m=Infinity;c=h;do{if(d>=c.x&&c.x>=g&&d!==c.x&&Wc(e<l?d:f,e,g,l,e<l?f:d,e,c.x,c.y)){var k=Math.abs(e-c.y)/(d-c.x);var n;if((n=ae(c,a))&&!(n=k<m)&&(n=k===m)&&!(n=c.x>h.x)&&(n=c.x===h.x)){n=h;var t=c;n=0>na(n.prev,n,t.prev)&&0>na(t.next,
+n,n.next)}n&&(h=c,m=k)}c=c.next}while(c!==b);return h}function og(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function Dk(a){var b=a,c=a;do{if(b.x<c.x||b.x===c.x&&b.y<c.y)c=b;b=b.next}while(b!==a);return c}function Wc(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function na(a,
+b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function Ue(a,b){return a.x===b.x&&a.y===b.y}function Zh(a,b,c,d){var e=Ve(na(a,b,c)),f=Ve(na(a,b,d)),g=Ve(na(c,d,a)),h=Ve(na(c,d,b));return e!==f&&g!==h||0===e&&We(a,c,b)||0===f&&We(a,d,b)||0===g&&We(c,a,d)||0===h&&We(c,b,d)?!0:!1}function We(a,b,c){return b.x<=Math.max(a.x,c.x)&&b.x>=Math.min(a.x,c.x)&&b.y<=Math.max(a.y,c.y)&&b.y>=Math.min(a.y,c.y)}function Ve(a){return 0<a?1:0>a?-1:0}function ae(a,b){return 0>na(a.prev,a,a.next)?0<=na(a,b,a.next)&&
+0<=na(a,a.prev,b):0>na(a,b,a.prev)||0>na(a,a.next,b)}function $h(a,b){var c=new pg(a.i,a.x,a.y),d=new pg(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Yh(a,b,c,d){a=new pg(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Zd(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function pg(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=
+this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function ai(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function bi(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),a.push(b[c].y)}function dc(a,b){L.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new hb(a,b));this.mergeVertices()}function hb(a,b){function c(a){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}
+function g(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var l=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/l;b=b.y+d/l;g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new v(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new v(f/e,d/
+e)}function h(a,b){for(J=a.length;0<=--J;){var c=J;var f=J-1;0>f&&(f=a.length-1);var g,h=w+2*B;for(g=0;g<h;g++){var l=W*g,m=W*(g+1),k=b+f+l,n=b+f+m;m=b+c+m;q(b+c+l);q(k);q(m);q(k);q(n);q(m);l=e.length/3;l=F.generateSideWallUV(d,e,l-6,l-3,l-2,l-1);u(l[0]);u(l[1]);u(l[3]);u(l[1]);u(l[2]);u(l[3])}}}function l(a,b,c){E.push(a);E.push(b);E.push(c)}function k(a,b,c){q(a);q(b);q(c);a=e.length/3;a=F.generateTopUV(d,e,a-3,a-2,a-1);u(a[0]);u(a[1]);u(a[2])}function q(a){e.push(E[3*a]);e.push(E[3*a+1]);e.push(E[3*
+a+2])}function u(a){f.push(a.x);f.push(a.y)}var E=[],x=void 0!==b.curveSegments?b.curveSegments:12,w=void 0!==b.steps?b.steps:1,ja=void 0!==b.depth?b.depth:100,T=void 0!==b.bevelEnabled?b.bevelEnabled:!0,Z=void 0!==b.bevelThickness?b.bevelThickness:6,C=void 0!==b.bevelSize?b.bevelSize:Z-2,y=void 0!==b.bevelOffset?b.bevelOffset:0,B=void 0!==b.bevelSegments?b.bevelSegments:3,A=b.extrudePath,F=void 0!==b.UVGenerator?b.UVGenerator:Ek;void 0!==b.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),
+ja=b.amount);var D=!1;if(A){var G=A.getSpacedPoints(w);D=!0;T=!1;var H=A.computeFrenetFrames(w,!1);var K=new p;var L=new p;var N=new p}T||(y=C=Z=B=0);var O;x=a.extractPoints(x);a=x.shape;var M=x.holes;if(!sb.isClockWise(a)){a=a.reverse();var ia=0;for(O=M.length;ia<O;ia++){var P=M[ia];sb.isClockWise(P)&&(M[ia]=P.reverse())}}var Y=sb.triangulateShape(a,M),V=a;ia=0;for(O=M.length;ia<O;ia++)P=M[ia],a=a.concat(P);var aa,W=a.length,R,ea=Y.length;x=[];var J=0;var ca=V.length;var S=ca-1;for(aa=J+1;J<ca;J++,
+S++,aa++)S===ca&&(S=0),aa===ca&&(aa=0),x[J]=g(V[J],V[S],V[aa]);A=[];var fa=x.concat();ia=0;for(O=M.length;ia<O;ia++){P=M[ia];var ba=[];J=0;ca=P.length;S=ca-1;for(aa=J+1;J<ca;J++,S++,aa++)S===ca&&(S=0),aa===ca&&(aa=0),ba[J]=g(P[J],P[S],P[aa]);A.push(ba);fa=fa.concat(ba)}for(S=0;S<B;S++){ca=S/B;var da=Z*Math.cos(ca*Math.PI/2);aa=C*Math.sin(ca*Math.PI/2)+y;J=0;for(ca=V.length;J<ca;J++){var ha=c(V[J],x[J],aa);l(ha.x,ha.y,-da)}ia=0;for(O=M.length;ia<O;ia++)for(P=M[ia],ba=A[ia],J=0,ca=P.length;J<ca;J++)ha=
+c(P[J],ba[J],aa),l(ha.x,ha.y,-da)}aa=C+y;for(J=0;J<W;J++)ha=T?c(a[J],fa[J],aa):a[J],D?(L.copy(H.normals[0]).multiplyScalar(ha.x),K.copy(H.binormals[0]).multiplyScalar(ha.y),N.copy(G[0]).add(L).add(K),l(N.x,N.y,N.z)):l(ha.x,ha.y,0);for(ca=1;ca<=w;ca++)for(J=0;J<W;J++)ha=T?c(a[J],fa[J],aa):a[J],D?(L.copy(H.normals[ca]).multiplyScalar(ha.x),K.copy(H.binormals[ca]).multiplyScalar(ha.y),N.copy(G[ca]).add(L).add(K),l(N.x,N.y,N.z)):l(ha.x,ha.y,ja/w*ca);for(S=B-1;0<=S;S--){ca=S/B;da=Z*Math.cos(ca*Math.PI/
+2);aa=C*Math.sin(ca*Math.PI/2)+y;J=0;for(ca=V.length;J<ca;J++)ha=c(V[J],x[J],aa),l(ha.x,ha.y,ja+da);ia=0;for(O=M.length;ia<O;ia++)for(P=M[ia],ba=A[ia],J=0,ca=P.length;J<ca;J++)ha=c(P[J],ba[J],aa),D?l(ha.x,ha.y+G[w-1].y,G[w-1].x+da):l(ha.x,ha.y,ja+da)}(function(){var a=e.length/3;if(T){var b=0*W;for(J=0;J<ea;J++)R=Y[J],k(R[2]+b,R[1]+b,R[0]+b);b=W*(w+2*B);for(J=0;J<ea;J++)R=Y[J],k(R[0]+b,R[1]+b,R[2]+b)}else{for(J=0;J<ea;J++)R=Y[J],k(R[2],R[1],R[0]);for(J=0;J<ea;J++)R=Y[J],k(R[0]+W*w,R[1]+W*w,R[2]+W*
+w)}d.addGroup(a,e.length/3-a,0)})();(function(){var a=e.length/3,b=0;h(V,b);b+=V.length;ia=0;for(O=M.length;ia<O;ia++)P=M[ia],h(P,b),b+=P.length;d.addGroup(a,e.length/3-a,1)})()}F.call(this);this.type="ExtrudeBufferGeometry";this.parameters={shapes:a,options:b};a=Array.isArray(a)?a:[a];for(var d=this,e=[],f=[],g=0,h=a.length;g<h;g++)c(a[g]);this.setAttribute("position",new B(e,3));this.setAttribute("uv",new B(f,2));this.computeVertexNormals()}function ci(a,b,c){c.shapes=[];if(Array.isArray(a))for(var d=
+0,e=a.length;d<e;d++)c.shapes.push(a[d].uuid);else c.shapes.push(a.uuid);void 0!==b.extrudePath&&(c.options.extrudePath=b.extrudePath.toJSON());return c}function be(a,b){L.call(this);this.type="TextGeometry";this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Xc(a,b));this.mergeVertices()}function Xc(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new L;a=c.generateShapes(a,b.size);b.depth=void 0!==
+b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);hb.call(this,a,b);this.type="TextBufferGeometry"}function ce(a,b,c,d,e,f,g){L.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new ec(a,b,c,d,e,f,g));this.mergeVertices()}function ec(a,b,c,d,e,f,g){F.call(this);this.type="SphereBufferGeometry";
+this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=Math.min(f+g,Math.PI),l,m,k=0,n=[],t=new p,r=new p,q=[],u=[],E=[],v=[];for(m=0;m<=c;m++){var w=[],y=m/c,T=0;0==m&&0==f?T=.5/b:m==c&&h==Math.PI&&(T=-.5/b);for(l=0;l<=b;l++){var Z=l/b;t.x=-a*Math.cos(d+Z*e)*Math.sin(f+y*g);t.y=a*Math.cos(f+
+y*g);t.z=a*Math.sin(d+Z*e)*Math.sin(f+y*g);u.push(t.x,t.y,t.z);r.copy(t).normalize();E.push(r.x,r.y,r.z);v.push(Z+T,1-y);w.push(k++)}n.push(w)}for(m=0;m<c;m++)for(l=0;l<b;l++)a=n[m][l+1],d=n[m][l],e=n[m+1][l],g=n[m+1][l+1],(0!==m||0<f)&&q.push(a,d,g),(m!==c-1||h<Math.PI)&&q.push(d,e,g);this.setIndex(q);this.setAttribute("position",new B(u,3));this.setAttribute("normal",new B(E,3));this.setAttribute("uv",new B(v,2))}function de(a,b,c,d,e,f){L.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,
+outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Yc(a,b,c,d,e,f));this.mergeVertices()}function Yc(a,b,c,d,e,f){F.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],l=[],m=[],k=a,n=(b-a)/d,t=new p,r=new v,q,u;for(q=0;q<=d;q++){for(u=
+0;u<=c;u++)a=e+u/c*f,t.x=k*Math.cos(a),t.y=k*Math.sin(a),h.push(t.x,t.y,t.z),l.push(0,0,1),r.x=(t.x/b+1)/2,r.y=(t.y/b+1)/2,m.push(r.x,r.y);k+=n}for(q=0;q<d;q++)for(b=q*(c+1),u=0;u<c;u++)a=u+b,e=a+c+1,f=a+c+2,k=a+1,g.push(a,e,k),g.push(e,f,k);this.setIndex(g);this.setAttribute("position",new B(h,3));this.setAttribute("normal",new B(l,3));this.setAttribute("uv",new B(m,2))}function ee(a,b,c,d){L.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Zc(a,
+b,c,d));this.mergeVertices()}function Zc(a,b,c,d){F.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=O.clamp(d,0,2*Math.PI);var e=[],f=[],g=[],h=1/b,l=new p,m=new v,k;for(k=0;k<=b;k++){var n=c+k*h*d;var t=Math.sin(n),r=Math.cos(n);for(n=0;n<=a.length-1;n++)l.x=a[n].x*t,l.y=a[n].y,l.z=a[n].x*r,f.push(l.x,l.y,l.z),m.x=k/b,m.y=n/(a.length-1),g.push(m.x,m.y)}for(k=0;k<b;k++)for(n=0;n<a.length-1;n++)c=n+
+k*a.length,h=c+a.length,l=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,l,m);this.setIndex(e);this.setAttribute("position",new B(f,3));this.setAttribute("uv",new B(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=k=0;k<a.length;k++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function fc(a,b){L.call(this);
+this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new gc(a,b));this.mergeVertices()}function gc(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var m=a.shape,k=a.holes;!1===sb.isClockWise(m)&&(m=m.reverse());a=0;for(c=k.length;a<c;a++){var z=k[a];!0===sb.isClockWise(z)&&(k[a]=z.reverse())}var p=sb.triangulateShape(m,k);a=0;for(c=k.length;a<
+c;a++)z=k[a],m=m.concat(z);a=0;for(c=m.length;a<c;a++)z=m[a],e.push(z.x,z.y,0),f.push(0,0,1),g.push(z.x,z.y);a=0;for(c=p.length;a<c;a++)m=p[a],d.push(m[0]+h,m[1]+h,m[2]+h),l+=3}F.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,l=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,l,m),h+=l,l=0;this.setIndex(d);this.setAttribute("position",new B(e,3));this.setAttribute("normal",new B(f,3));
+this.setAttribute("uv",new B(g,2))}function di(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid);return b}function $c(a,b){F.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(O.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=new L;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,l=
+g.length;h<l;h++)for(var m=g[h],k=0;3>k;k++){var n=m[f[k]];var t=m[f[(k+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.setAttribute("position",new B(c,3))}function hc(a,b,c,d,e,f,g,h){L.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,
+radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new tb(a,b,c,d,e,f,g,h));this.mergeVertices()}function tb(a,b,c,d,e,f,g,h){function l(c){var e,f=new v,l=new p,z=0,u=!0===c?a:b,w=!0===c?1:-1;var y=q;for(e=1;e<=d;e++)n.push(0,E*w,0),t.push(0,w,0),r.push(.5,.5),q++;var B=q;for(e=0;e<=d;e++){var A=e/d*h+g,D=Math.cos(A);A=Math.sin(A);l.x=u*A;l.y=E*w;l.z=u*D;n.push(l.x,l.y,l.z);t.push(0,w,0);f.x=.5*D+.5;f.y=.5*A*w+.5;r.push(f.x,f.y);
+q++}for(e=0;e<d;e++)f=y+e,l=B+e,!0===c?k.push(l,l+1,f):k.push(l+1,l,f),z+=3;m.addGroup(x,z,!0===c?1:2);x+=z}F.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var k=[],n=[],t=[],r=[],q=0,u=[],E=c/2,x=0;(function(){var f,l,z=new p,
+v=new p,C=0,y=(b-a)/c;for(l=0;l<=e;l++){var B=[],A=l/e,D=A*(b-a)+a;for(f=0;f<=d;f++){var F=f/d,G=F*h+g,H=Math.sin(G);G=Math.cos(G);v.x=D*H;v.y=-A*c+E;v.z=D*G;n.push(v.x,v.y,v.z);z.set(H,y,G).normalize();t.push(z.x,z.y,z.z);r.push(F,1-A);B.push(q++)}u.push(B)}for(f=0;f<d;f++)for(l=0;l<e;l++)z=u[l+1][f],v=u[l+1][f+1],y=u[l][f+1],k.push(u[l][f],z,y),k.push(z,v,y),C+=6;m.addGroup(x,C,0);x+=C})();!1===f&&(0<a&&l(!0),0<b&&l(!1));this.setIndex(k);this.setAttribute("position",new B(n,3));this.setAttribute("normal",
+new B(t,3));this.setAttribute("uv",new B(r,2))}function fe(a,b,c,d,e,f,g){hc.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function ge(a,b,c,d,e,f,g){tb.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function he(a,b,c,d){L.call(this);this.type="CircleGeometry";this.parameters=
+{radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new ad(a,b,c,d));this.mergeVertices()}function ad(a,b,c,d){F.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],h=[],l,m=new p,k=new v;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(l=3;n<=b;n++,l+=3){var t=c+n/b*d;m.x=a*Math.cos(t);m.y=a*Math.sin(t);f.push(m.x,m.y,
+m.z);g.push(0,0,1);k.x=(f[l]/a+1)/2;k.y=(f[l+1]/a+1)/2;h.push(k.x,k.y)}for(l=1;l<=b;l++)e.push(l,l+1,0);this.setIndex(e);this.setAttribute("position",new B(f,3));this.setAttribute("normal",new B(g,3));this.setAttribute("uv",new B(h,2))}function ic(a){K.call(this);this.type="ShadowMaterial";this.color=new D(0);this.transparent=!0;this.setValues(a)}function ub(a){Ca.call(this,a);this.type="RawShaderMaterial"}function ib(a){K.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=
+new D(16777215);this.roughness=1;this.metalness=0;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=
+!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.vertexTangents=this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function jc(a){ib.call(this);this.defines={STANDARD:"",PHYSICAL:""};this.type="MeshPhysicalMaterial";this.clearcoat=0;this.clearcoatMap=null;this.clearcoatRoughness=0;this.clearcoatRoughnessMap=null;this.clearcoatNormalScale=new v(1,1);this.clearcoatNormalMap=null;this.reflectivity=.5;this.sheen=null;this.transparency=0;this.setValues(a)}
+function Mb(a){K.call(this);this.type="MeshPhongMaterial";this.color=new D(16777215);this.specular=new D(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=
+null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function kc(a){K.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.color=new D(16777215);this.specular=new D(1118481);this.shininess=30;this.lightMap=this.gradientMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=
+new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=this.specularMap=null;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function lc(a){K.call(this);this.type="MeshNormalMaterial";this.bumpMap=
+null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.fog=!1;this.setValues(a)}function mc(a){K.call(this);this.type="MeshLambertMaterial";this.color=new D(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=
+1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function nc(a){K.call(this);this.defines={MATCAP:""};this.type="MeshMatcapMaterial";this.color=new D(16777215);this.bumpMap=this.map=this.matcap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=
+0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=null;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function oc(a){da.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function Ma(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Xe(a,b,c,d){Ma.call(this,
+a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function ie(a,b,c,d){Ma.call(this,a,b,c,d)}function Ye(a,b,c,d){Ma.call(this,a,b,c,d)}function ta(a,b,c,d){if(void 0===a)throw Error("THREE.KeyframeTrack: track name is undefined");if(void 0===b||0===b.length)throw Error("THREE.KeyframeTrack: no keyframes in track named "+a);this.name=a;this.times=ka.convertArray(b,this.TimeBufferType);this.values=ka.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation)}
+function Ze(a,b,c){ta.call(this,a,b,c)}function $e(a,b,c,d){ta.call(this,a,b,c,d)}function bd(a,b,c,d){ta.call(this,a,b,c,d)}function af(a,b,c,d){Ma.call(this,a,b,c,d)}function je(a,b,c,d){ta.call(this,a,b,c,d)}function bf(a,b,c,d){ta.call(this,a,b,c,d)}function cd(a,b,c,d){ta.call(this,a,b,c,d)}function Sa(a,b,c,d){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.blendMode=void 0!==d?d:2500;this.uuid=O.generateUUID();0>this.duration&&this.resetDuration()}function Fk(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return bd;
+case "vector":case "vector2":case "vector3":case "vector4":return cd;case "color":return $e;case "quaternion":return je;case "bool":case "boolean":return Ze;case "string":return bf}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function Gk(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=Fk(a.type);if(void 0===a.times){var c=[],d=[];ka.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,
+a.times,a.values,a.interpolation)}function qg(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0,l=[];this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=
+a;return this};this.addHandler=function(a,b){l.push(a,b);return this};this.removeHandler=function(a){a=l.indexOf(a);-1!==a&&l.splice(a,2);return this};this.getHandler=function(a){for(var b=0,c=l.length;b<c;b+=2){var d=l[b],e=l[b+1];d.global&&(d.lastIndex=0);if(d.test(a))return e}return null}}function V(a){this.manager=void 0!==a?a:ei;this.crossOrigin="anonymous";this.resourcePath=this.path="";this.requestHeader={}}function Ta(a){V.call(this,a)}function rg(a){V.call(this,a)}function sg(a){V.call(this,
+a)}function cf(a){V.call(this,a)}function dd(a){V.call(this,a)}function df(a){V.call(this,a)}function ef(a){V.call(this,a)}function H(){this.type="Curve";this.arcLengthDivisions=200}function Na(a,b,c,d,e,f,g,h){H.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function ed(a,b,c,d,e,f){Na.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function tg(){var a=0,b=
+0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,l){e=l*(g-e);h=l*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,l,m,k){e=((f-e)/l-(g-e)/(l+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+k)+(h-g)/k)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function qa(a,b,c,d){H.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function fi(a,b,c,d,e){b=.5*(d-
+b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function ke(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function le(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function Ya(a,b,c,d){H.call(this);this.type="CubicBezierCurve";this.v0=a||new v;this.v1=b||new v;this.v2=c||new v;this.v3=d||new v}function jb(a,b,c,d){H.call(this);this.type="CubicBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function Ia(a,b){H.call(this);
+this.type="LineCurve";this.v1=a||new v;this.v2=b||new v}function Za(a,b){H.call(this);this.type="LineCurve3";this.v1=a||new p;this.v2=b||new p}function $a(a,b,c){H.call(this);this.type="QuadraticBezierCurve";this.v0=a||new v;this.v1=b||new v;this.v2=c||new v}function kb(a,b,c){H.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p}function ab(a){H.call(this);this.type="SplineCurve";this.points=a||[]}function vb(){H.call(this);this.type="CurvePath";this.curves=
+[];this.autoClose=!1}function bb(a){vb.call(this);this.type="Path";this.currentPoint=new v;a&&this.setFromPoints(a)}function Nb(a){bb.call(this,a);this.uuid=O.generateUUID();this.type="Shape";this.holes=[]}function S(a,b){y.call(this);this.type="Light";this.color=new D(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function ff(a,b,c){S.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(y.DefaultUp);this.updateMatrix();this.groundColor=new D(b)}function lb(a){this.camera=
+a;this.bias=0;this.radius=1;this.mapSize=new v(512,512);this.mapPass=this.map=null;this.matrix=new N;this._frustum=new Gc;this._frameExtents=new v(1,1);this._viewportCount=1;this._viewports=[new R(0,0,1,1)]}function gf(){lb.call(this,new P(50,1,.5,500))}function hf(a,b,c,d,e,f){S.call(this,a,b);this.type="SpotLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=
+a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new gf}function ug(){lb.call(this,new P(90,1,.5,500));this._frameExtents=new v(4,2);this._viewportCount=6;this._viewports=[new R(2,1,1,1),new R(0,1,1,1),new R(3,1,1,1),new R(1,1,1,1),new R(3,0,1,1),new R(1,0,1,1)];this._cubeDirections=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)];this._cubeUps=[new p(0,1,0),new p(0,1,0),
+new p(0,1,0),new p(0,1,0),new p(0,0,1),new p(0,0,-1)]}function jf(a,b,c,d){S.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new ug}function fd(a,b,c,d,e,f){fb.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=void 0!==a?a:-1;this.right=void 0!==b?b:1;this.top=void 0!==c?c:1;this.bottom=
+void 0!==d?d:-1;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function kf(){lb.call(this,new fd(-5,5,5,-5,.5,500))}function lf(a,b){S.call(this,a,b);this.type="DirectionalLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;this.shadow=new kf}function mf(a,b){S.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function nf(a,b,c,d){S.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:
+10}function of(){this.coefficients=[];for(var a=0;9>a;a++)this.coefficients.push(new p)}function Ua(a,b){S.call(this,void 0,b);this.type="LightProbe";this.sh=void 0!==a?a:new of}function pf(a){V.call(this,a);this.textures={}}function me(){F.call(this);this.type="InstancedBufferGeometry";this.instanceCount=Infinity}function qf(a,b,c,d){"number"===typeof c&&(d=c,c=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument."));G.call(this,a,b,c);this.meshPerAttribute=
+d||1}function rf(a){V.call(this,a)}function sf(a){V.call(this,a)}function vg(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");V.call(this,a);this.options=void 0}function wg(){this.type="ShapePath";this.color=new D;this.subPaths=[];this.currentPath=null}function xg(a){this.type="Font";this.data=a}function yg(a){V.call(this,a)}function tf(a){V.call(this,
+a)}function zg(a,b,c){Ua.call(this,void 0,c);a=(new D).set(a);c=(new D).set(b);b=new p(a.r,a.g,a.b);a=new p(c.r,c.g,c.b);c=Math.sqrt(Math.PI);var d=c*Math.sqrt(.75);this.sh.coefficients[0].copy(b).add(a).multiplyScalar(c);this.sh.coefficients[1].copy(b).sub(a).multiplyScalar(d)}function Ag(a,b){Ua.call(this,void 0,b);a=(new D).set(a);this.sh.coefficients[0].set(a.r,a.g,a.b).multiplyScalar(2*Math.sqrt(Math.PI))}function gi(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new P;
+this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new P;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1;this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}function Bg(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function Cg(){y.call(this);this.type="AudioListener";this.context=Dg.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);
+this.filter=null;this.timeDelta=0;this._clock=new Bg}function gd(a){y.call(this);this.type="Audio";this.listener=a;this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.detune=0;this.loop=!1;this.offset=this.loopEnd=this.loopStart=0;this.duration=void 0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this._progress=this._startedAt=0;this.filters=[]}function Eg(a){gd.call(this,a);this.panner=
+this.context.createPanner();this.panner.panningModel="HRTF";this.panner.connect(this.gain)}function Fg(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function Gg(a,b,c){this.binding=a;this.valueSize=c;switch(b){case "quaternion":a=this._slerp;b=this._slerpAdditive;var d=this._setAdditiveIdentityQuaternion;this.buffer=new Float64Array(6*c);this._workIndex=5;break;case "string":case "bool":b=
+a=this._select;d=this._setAdditiveIdentityOther;this.buffer=Array(5*c);break;default:a=this._lerp,b=this._lerpAdditive,d=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*c)}this._mixBufferRegion=a;this._mixBufferRegionAdditive=b;this._setIdentity=d;this._origIndex=3;this._addIndex=4;this.referenceCount=this.useCount=this.cumulativeWeightAdditive=this.cumulativeWeight=0}function hi(a,b,c){c=c||Aa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function Aa(a,b,
+c){this.path=b;this.parsedPath=c||Aa.parseTrackName(b);this.node=Aa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function ii(){this.uuid=O.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-
+d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function ji(a,b,c,d){this._mixer=a;this._clip=b;this._localRoot=c||null;this.blendMode=d||b.blendMode;a=b.tracks;b=a.length;c=Array(b);d={endingStart:2400,endingEnd:2400};for(var e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=
+2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Hg(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function uf(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Ig(a,b,c){rb.call(this,
+a,b);this.meshPerAttribute=c||1}function Jg(a,b,c,d){this.ray=new Wb(a,b);this.near=c||0;this.far=d||Infinity;this.camera=null;this.layers=new De;this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function ki(a,b){return a.distance-b.distance}function Kg(a,b,c,d){a.layers.test(b.layers)&&a.raycast(b,
+c);if(!0===d){a=a.children;d=0;for(var e=a.length;d<e;d++)Kg(a[d],b,c,!0)}}function li(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function mi(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function Lg(a,b){this.min=void 0!==a?a:new v(Infinity,Infinity);this.max=void 0!==b?b:new v(-Infinity,-Infinity)}function Mg(a,b){this.start=void 0!==a?a:new p;this.end=void 0!==b?b:new p}function ne(a){y.call(this);
+this.material=a;this.render=function(){};this.hasUvs=this.hasColors=this.hasNormals=this.hasPositions=!1;this.uvArray=this.colorArray=this.normalArray=this.positionArray=null;this.count=0}function hd(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new F;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,
+Math.cos(f),Math.sin(f),1)}a.setAttribute("position",new B(b,3));b=new da({fog:!1,toneMapped:!1});this.cone=new ma(a,b);this.add(this.cone);this.update()}function ni(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,ni(a.children[c]));return b}function pc(a){for(var b=ni(a),c=new F,d=[],e=[],f=new D(0,0,1),g=new D(0,1,0),h=0;h<b.length;h++){var l=b[h];l.parent&&l.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.setAttribute("position",
+new B(d,3));c.setAttribute("color",new B(e,3));d=new da({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0});ma.call(this,c,d);this.type="SkeletonHelper";this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function id(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new ec(b,4,2);b=new Pa({wireframe:!0,fog:!1,toneMapped:!1});ea.call(this,a,b);this.type="PointLightHelper";this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}
+function jd(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new bc(b);a.rotateY(.5*Math.PI);this.material=new Pa({wireframe:!0,fog:!1,toneMapped:!1});void 0===this.color&&(this.material.vertexColors=!0);b=a.getAttribute("position");b=new Float32Array(3*b.count);a.setAttribute("color",new G(b,3));this.add(new ea(a,this.material));this.update()}function vf(a,b,c,d){a=a||10;b=b||10;c=new D(void 0!==c?c:4473924);d=new D(void 0!==
+d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],l=0,m=0,k=-g;l<=b;l++,k+=f){a.push(-g,0,k,g,0,k);a.push(k,0,-g,k,0,g);var n=l===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}b=new F;b.setAttribute("position",new B(a,3));b.setAttribute("color",new B(h,3));c=new da({vertexColors:!0,toneMapped:!1});ma.call(this,b,c);this.type="GridHelper"}function wf(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new D(void 0!==e?e:4473924);f=new D(void 0!==f?f:8947848);var g=
+[],h=[],l;for(l=0;l<=b;l++){var m=l/b*2*Math.PI;var k=Math.sin(m)*a;m=Math.cos(m)*a;g.push(0,0,0);g.push(k,0,m);var n=l&1?e:f;h.push(n.r,n.g,n.b);h.push(n.r,n.g,n.b)}for(l=0;l<=c;l++){n=l&1?e:f;var t=a-a/c*l;for(b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*t,m=Math.cos(m)*t,g.push(k,0,m),h.push(n.r,n.g,n.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*t,m=Math.cos(m)*t,g.push(k,0,m),h.push(n.r,n.g,n.b)}a=new F;a.setAttribute("position",new B(g,3));a.setAttribute("color",new B(h,3));g=new da({vertexColors:!0,toneMapped:!1});
+ma.call(this,a,g);this.type="PolarGridHelper"}function kd(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new F;a.setAttribute("position",new B([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));b=new da({fog:!1,toneMapped:!1});this.lightPlane=new La(a,b);this.add(this.lightPlane);a=new F;a.setAttribute("position",new B([0,0,0,0,0,1],3));this.targetLine=new La(a,b);this.add(this.targetLine);this.update()}function oe(a){function b(a,
+b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new F,e=new da({color:16777215,vertexColors:!0,toneMapped:!1}),f=[],g=[],h={},l=new D(16755200),m=new D(16711680),k=new D(43775),n=new D(16777215),t=new D(3355443);b("n1","n2",l);b("n2","n4",l);b("n4","n3",l);b("n3","n1",l);b("f1","f2",l);b("f2","f4",l);b("f4","f3",l);b("f3","f1",l);b("n1","f1",l);b("n2","f2",l);b("n3","f3",l);b("n4","f4",l);b("p","n1",m);b("p","n2",m);b("p",
+"n3",m);b("p","n4",m);b("u1","u2",k);b("u2","u3",k);b("u3","u1",k);b("c","t",n);b("p","c",t);b("cn1","cn2",t);b("cn3","cn4",t);b("cf1","cf2",t);b("cf3","cf4",t);d.setAttribute("position",new B(f,3));d.setAttribute("color",new B(g,3));ma.call(this,d,e);this.type="CameraHelper";this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function fa(a,b,c,d,e,f,g){xf.set(e,f,g).unproject(d);a=
+b[a];if(void 0!==a)for(c=c.getAttribute("position"),b=0,d=a.length;b<d;b++)c.setXYZ(a[b],xf.x,xf.y,xf.z)}function wb(a,b){this.object=a;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new F;d.setIndex(new G(a,1));d.setAttribute("position",new G(c,3));ma.call(this,d,new da({color:b,toneMapped:!1}));this.type="BoxHelper";this.matrixAutoUpdate=!1;this.update()}function pe(a,b){this.type="Box3Helper";this.box=a;b=b||16776960;a=
+new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new F;c.setIndex(new G(a,1));c.setAttribute("position",new B([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));ma.call(this,c,new da({color:b,toneMapped:!1}));this.type="Box3Helper";this.geometry.computeBoundingSphere()}function qe(a,b,c){this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new F;b.setAttribute("position",new B([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));
+b.computeBoundingSphere();La.call(this,b,new da({color:a,toneMapped:!1}));this.type="PlaneHelper";b=new F;b.setAttribute("position",new B([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();this.add(new ea(b,new Pa({color:a,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}function xb(a,b,c,d,e,f){y.call(this);this.type="ArrowHelper";void 0===a&&(a=new p(0,0,1));void 0===b&&(b=new p(0,0,0));void 0===c&&(c=1);void 0===d&&(d=16776960);void 0===e&&(e=.2*c);void 0===f&&(f=
+.2*e);void 0===yf&&(yf=new F,yf.setAttribute("position",new B([0,0,0,0,1,0],3)),Ng=new tb(0,.5,1,5,1),Ng.translate(0,-.5,0));this.position.copy(b);this.line=new La(yf,new da({color:d,toneMapped:!1}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ea(Ng,new Pa({color:d,toneMapped:!1}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function re(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new F;a.setAttribute("position",new B(b,
+3));a.setAttribute("color",new B([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new da({vertexColors:!0,toneMapped:!1});ma.call(this,a,b);this.type="AxesHelper"}function Og(a){this._renderer=a;this._pingPongRenderTarget=null;a=new Float32Array(20);var b=new p(0,1,0);a=new ub({defines:{n:20},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:a},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:b},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},vertexShader:Pg(),
+fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform int samples;\nuniform float weights[n];\nuniform bool latitudinal;\nuniform float dTheta;\nuniform float mipInt;\nuniform vec3 poleAxis;\n\n"+Qg()+"\n\n#define ENVMAP_TYPE_CUBE_UV\n#include <cube_uv_reflection_fragment>\n\nvec3 getSample(float theta, vec3 axis) {\n\tfloat cosTheta = cos(theta);\n\t// Rodrigues' axis-angle rotation\n\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t+ cross(axis, vOutputDirection) * sin(theta)\n\t\t+ axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);\n\treturn bilinearCubeUV(envMap, sampleDirection, mipInt);\n}\n\nvoid main() {\n\tvec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);\n\tif (all(equal(axis, vec3(0.0))))\n\t\taxis = vec3(vOutputDirection.z, 0.0, - vOutputDirection.x);\n\taxis = normalize(axis);\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb += weights[0] * getSample(0.0, axis);\n\tfor (int i = 1; i < n; i++) {\n\t\tif (i >= samples)\n\t\t\tbreak;\n\t\tfloat theta = dTheta * float(i);\n\t\tgl_FragColor.rgb += weights[i] * getSample(-1.0 * theta, axis);\n\t\tgl_FragColor.rgb += weights[i] * getSample(theta, axis);\n\t}\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
+blending:0,depthTest:!1,depthWrite:!1});a.type="SphericalGaussianBlur";this._blurMaterial=a;this._cubemapShader=this._equirectShader=null;this._compileMaterial(this._blurMaterial)}function oi(a){a=new Ba(3*nb,3*nb,a);a.texture.mapping=306;a.texture.name="PMREM.cubeUv";a.scissorTest=!0;return a}function Rg(a,b,c,d,e){a.viewport.set(b,c,d,e);a.scissor.set(b,c,d,e)}function pi(){var a=new v(1,1);a=new ub({uniforms:{envMap:{value:null},texelSize:{value:a},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},
+vertexShader:Pg(),fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform vec2 texelSize;\n\n"+Qg()+"\n\n#include <common>\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tvec3 outputDirection = normalize(vOutputDirection);\n\tvec2 uv = equirectUv( outputDirection );\n\tvec2 f = fract(uv / texelSize - 0.5);\n\tuv -= f * texelSize;\n\tvec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x += texelSize.x;\n\tvec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.y += texelSize.y;\n\tvec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x -= texelSize.x;\n\tvec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tvec3 tm = mix(tl, tr, f.x);\n\tvec3 bm = mix(bl, br, f.x);\n\tgl_FragColor.rgb = mix(tm, bm, f.y);\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
+blending:0,depthTest:!1,depthWrite:!1});a.type="EquirectangularToCubeUV";return a}function qi(){var a=new ub({uniforms:{envMap:{value:null},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},vertexShader:Pg(),fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform samplerCube envMap;\n\n"+Qg()+"\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
+blending:0,depthTest:!1,depthWrite:!1});a.type="CubemapToCubeUV";return a}function Pg(){return"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\n\n// RH coordinate system; PMREM face-indexing convention\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\t} else if (face == 2.0) {\n\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\t} else if (face == 5.0) {\n\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\t}\n\treturn direction;\n}\n\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t"}
+function Qg(){return"\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include <encodings_pars_fragment>\n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t"}
+function ri(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom";this.closed=!0}function si(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom"}function Sg(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,
+-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&(Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=
+Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b});Object.assign(ua.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,
+b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;b=b.slice(0);for(var c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});for(var za=[],se=0;256>se;se++)za[se]=(16>se?"0":"")+se.toString(16);var O={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a=4294967295*Math.random()|0,b=4294967295*Math.random()|0,c=4294967295*Math.random()|
+0,d=4294967295*Math.random()|0;return(za[a&255]+za[a>>8&255]+za[a>>16&255]+za[a>>24&255]+"-"+za[b&255]+za[b>>8&255]+"-"+za[b>>16&15|64]+za[b>>24&255]+"-"+za[c&63|128]+za[c>>8&255]+"-"+za[c>>16&255]+za[c>>24&255]+za[d&255]+za[d>>8&255]+za[d>>16&255]+za[d>>24&255]).toUpperCase()},clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,
+b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*O.DEG2RAD},radToDeg:function(a){return a*O.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,
+Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/Math.LN2))},setQuaternionFromProperEuler:function(a,b,c,d,e){var f=Math.cos,g=Math.sin,h=f(c/2);c=g(c/2);var l=f((b+d)/2),m=g((b+d)/2),k=f((b-d)/2),n=g((b-d)/2);f=f((d-b)/2);b=g((d-b)/2);switch(e){case "XYX":a.set(h*m,c*k,c*n,h*l);break;case "YZY":a.set(c*n,h*m,c*k,h*l);break;case "ZXZ":a.set(c*k,c*n,h*m,h*l);break;case "XZX":a.set(h*m,c*b,c*f,h*l);break;case "YXY":a.set(c*f,h*m,c*b,h*l);break;case "ZYZ":a.set(c*
+b,c*f,h*m,h*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+e)}}};Object.defineProperties(v.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(v.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=
+a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
+this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},
+subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},
+max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);
+return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},cross:function(a){return this.x*a.y-this.y*a.x},lengthSq:function(){return this.x*
+this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-
+a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==
+c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this},random:function(){this.x=Math.random();this.y=Math.random();return this}});Object.assign(ya.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=
+l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},extractBasis:function(a,b,c){a.setFromMatrix3Column(this,0);b.setFromMatrix3Column(this,1);c.setFromMatrix3Column(this,2);return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],
+a[5],a[9],a[2],a[6],a[10]);return this},multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],l=c[7],m=c[2],k=c[5];c=c[8];var n=d[0],t=d[3],p=d[6],q=d[1],u=d[4],v=d[7],x=d[2],w=d[5];d=d[8];b[0]=a*n+e*q+f*x;b[3]=a*t+e*u+f*w;b[6]=a*p+e*v+f*d;b[1]=g*n+h*q+l*x;b[4]=g*t+h*u+l*w;b[7]=g*p+h*v+l*d;b[2]=m*n+k*q+c*x;b[5]=m*t+k*
+u+c*w;b[8]=m*p+k*v+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7];a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var c=a.elements;a=this.elements;b=c[0];var d=c[1],
+e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7];c=c[8];var k=c*g-h*m,n=h*l-c*f,p=m*f-g*l,r=b*k+d*n+e*p;if(0===r)return this.set(0,0,0,0,0,0,0,0,0);r=1/r;a[0]=k*r;a[1]=(e*m-c*d)*r;a[2]=(h*d-e*g)*r;a[3]=n*r;a[4]=(c*b-e*l)*r;a[5]=(e*f-h*b)*r;a[6]=p*r;a[7]=(d*l-m*b)*r;a[8]=(g*b-d*f)*r;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},
+transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],
+l=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*l;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*l;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=
+this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var ld,Ob={getDataURL:function(a){if("undefined"==typeof HTMLCanvasElement)return a.src;if(!(a instanceof HTMLCanvasElement)){void 0===ld&&(ld=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"));ld.width=a.width;ld.height=a.height;var b=ld.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=ld}return 2048<
+a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},ej=0;W.DEFAULT_IMAGE=void 0;W.DEFAULT_MAPPING=300;W.prototype=Object.assign(Object.create(ua.prototype),{constructor:W,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);
+this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.internalFormat=a.internalFormat;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=
+a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,
+minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=O.generateUUID());if(!b&&void 0===a.images[d.uuid]){if(Array.isArray(d)){var e=[];for(var f=0,g=d.length;f<g;f++)e.push(Ob.getDataURL(d[f]))}else e=Ob.getDataURL(d);a.images[d.uuid]={uuid:d.uuid,url:e}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},
+transformUv:function(a){if(300!==this.mapping)return a;a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y);return a}});Object.defineProperty(W.prototype,
+"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.defineProperties(R.prototype,{width:{get:function(){return this.z},set:function(a){this.z=a}},height:{get:function(){return this.w},set:function(a){this.w=a}}});Object.assign(R.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=
+a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=
+a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*
+b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=
+a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=
+a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var l=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-l)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+l)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+l)/4;b>f&&b>m?.01>b?(l=0,c=h=.707106781):(l=Math.sqrt(b),h=c/l,c=d/l):f>m?.01>f?(l=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),l=c/h,c=g/h):.01>m?(h=l=.707106781,c=0):(c=
+Math.sqrt(m),l=d/c,h=g/c);this.set(l,h,c,a);return this}a=Math.sqrt((l-g)*(l-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(l-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,
+b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,Math.min(b,this.z));this.w=Math.max(a,Math.min(b,this.w));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=
+Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);
+this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+
+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;this.z=a.z+(b.z-a.z)*c;this.w=a.w+(b.w-a.w)*c;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&
+a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this},random:function(){this.x=Math.random();this.y=
+Math.random();this.z=Math.random();this.w=Math.random();return this}});Ba.prototype=Object.assign(Object.create(ua.prototype),{constructor:Ba,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.texture.image.width=a,this.texture.image.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);
+this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Xf.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Xf,isWebGLMultisampleRenderTarget:!0,copy:function(a){Ba.prototype.copy.call(this,a);this.samples=a.samples;return this}});Object.assign(va,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=
+c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==n){f=1-g;var p=h*d+l*k+m*n+c*e,r=0<=p?1:-1,q=1-p*p;q>Number.EPSILON&&(q=Math.sqrt(q),p=Math.atan2(q,p*r),f=Math.sin(f*p)/q,g=Math.sin(g*p)/q);r*=g;h=h*f+d*r;l=l*f+k*r;m=m*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=m;a[b+3]=c},multiplyQuaternionsFlat:function(a,b,c,d,e,f){var g=c[d],h=c[d+1],l=c[d+2];c=c[d+3];d=e[f];var m=e[f+1],k=e[f+2];e=
+e[f+3];a[b]=g*e+c*d+h*k-l*m;a[b+1]=h*e+c*m+l*d-g*k;a[b+2]=l*e+c*k+g*m-h*d;a[b+3]=c*e-g*d-h*m-l*k;return a}});Object.defineProperties(va.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this._onChangeCallback()}}});Object.assign(va.prototype,
+{isQuaternion:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this._onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,
+g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);switch(a){case "XYZ":this._x=c*l*f+h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f-c*d*e;break;case "YXZ":this._x=c*l*f+h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f+c*d*e;break;case "ZXY":this._x=c*l*f-h*d*e;this._y=h*d*f+c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f-c*d*e;break;case "ZYX":this._x=c*l*f-h*d*e;this._y=h*d*f+c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f+c*d*e;break;case "YZX":this._x=c*l*f+h*d*e;this._y=
+h*d*f+c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f-c*d*e;break;case "XZY":this._x=c*l*f-h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f+c*d*e;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}!1!==b&&this._onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this._onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];
+a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(l-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this._onChangeCallback();return this},setFromUnitVectors:function(a,
+b){var c=a.dot(b)+1;1E-6>c?(c=0,Math.abs(a.x)>Math.abs(a.z)?(this._x=-a.y,this._y=a.x,this._z=0):(this._x=0,this._y=-a.z,this._z=a.y)):(this._x=a.y*b.z-a.z*b.y,this._y=a.z*b.x-a.x*b.z,this._z=a.x*b.y-a.y*b.x);this._w=c;return this.normalize()},angleTo:function(a){return 2*Math.acos(Math.abs(O.clamp(this.dot(a),-1,1)))},rotateTowards:function(a,b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));return this},inverse:function(){return this.conjugate()},conjugate:function(){this._x*=
+-1;this._y*=-1;this._z*=-1;this._onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this._onChangeCallback();return this},
+multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this._onChangeCallback();
+return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize(),this._onChangeCallback(),this;a=Math.sqrt(a);var h=Math.atan2(a,
+g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this._onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+
+3]=this._w;return a},fromBufferAttribute:function(a,b){this._x=a.getX(b);this._y=a.getY(b);this._z=a.getZ(b);this._w=a.getW(b);return this},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});var Tg=new p,ti=new va;Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=
+a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
+this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;
+return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
+b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(ti.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(ti.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyNormalMatrix:function(a){return this.applyMatrix3(a).normalize()},
+applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(a){return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)},
+unproject:function(a){return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)},transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,
+a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,Math.min(b,this.z));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||
+1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=
+0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},
+lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;this.z=a.z+(b.z-a.z)*c;return this},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*
+e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.lengthSq();if(0===b)return this.set(0,0,0);b=a.dot(this)/b;return this.copy(a).multiplyScalar(b)},projectOnPlane:function(a){Tg.copy(this).projectOnVector(a);return this.sub(Tg)},reflect:function(a){return this.sub(Tg.copy(a).multiplyScalar(2*this.dot(a)))},angleTo:function(a){var b=Math.sqrt(this.lengthSq()*a.lengthSq());if(0===b)return Math.PI/2;a=this.dot(a)/b;return Math.acos(O.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},
+distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){return this.setFromSphericalCoords(a.radius,a.phi,a.theta)},setFromSphericalCoords:function(a,b,c){var d=Math.sin(b)*a;this.x=d*Math.sin(c);this.y=Math.cos(b)*a;this.z=d*Math.cos(c);return this},setFromCylindrical:function(a){return this.setFromCylindricalCoords(a.radius,a.theta,
+a.y)},setFromCylindricalCoords:function(a,b,c){this.x=a*Math.sin(b);this.y=c;this.z=a*Math.cos(b);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},setFromMatrix3Column:function(a,
+b){return this.fromArray(a.elements,3*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this},
+random:function(){this.x=Math.random();this.y=Math.random();this.z=Math.random();return this}});var md=new p,ba=new N,Hk=new p(0,0,0),Ik=new p(1,1,1),Pb=new p,zf=new p,Ea=new p;Object.assign(N.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,n,p,r,q,u){var z=this.elements;z[0]=a;z[4]=b;z[8]=c;z[12]=d;z[1]=e;z[5]=f;z[9]=g;z[13]=h;z[2]=l;z[6]=m;z[10]=k;z[14]=n;z[3]=p;z[7]=r;z[11]=q;z[15]=u;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new N).fromArray(this.elements)},
+copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,
+b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(a){var b=this.elements,c=a.elements,d=1/md.setFromMatrixColumn(a,0).length(),e=1/md.setFromMatrixColumn(a,1).length();a=1/md.setFromMatrixColumn(a,2).length();b[0]=c[0]*d;b[1]=c[1]*d;b[2]=c[2]*d;b[3]=0;b[4]=c[4]*e;b[5]=c[5]*e;b[6]=c[6]*e;b[7]=0;b[8]=c[8]*a;b[9]=c[9]*a;b[10]=c[10]*a;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
+var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=
+k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(Hk,
+a,Ik)},lookAt:function(a,b,c){var d=this.elements;Ea.subVectors(a,b);0===Ea.lengthSq()&&(Ea.z=1);Ea.normalize();Pb.crossVectors(c,Ea);0===Pb.lengthSq()&&(1===Math.abs(c.z)?Ea.x+=1E-4:Ea.z+=1E-4,Ea.normalize(),Pb.crossVectors(c,Ea));Pb.normalize();zf.crossVectors(Ea,Pb);d[0]=Pb.x;d[4]=zf.x;d[8]=Ea.x;d[1]=Pb.y;d[5]=zf.y;d[9]=Ea.y;d[2]=Pb.z;d[6]=zf.z;d[10]=Ea.z;return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
+this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],n=c[2],p=c[6],r=c[10],q=c[14],u=c[3],v=c[7],x=c[11];c=c[15];var w=d[0],y=d[4],B=d[8],Z=d[12],C=d[1],A=d[5],D=d[9],F=d[13],G=d[2],H=d[6],K=d[10],L=d[14],M=d[3],N=d[7],O=d[11];d=d[15];b[0]=a*w+e*C+f*G+g*M;b[4]=a*y+e*A+f*H+g*N;b[8]=a*B+e*D+f*K+
+g*O;b[12]=a*Z+e*F+f*L+g*d;b[1]=h*w+l*C+m*G+k*M;b[5]=h*y+l*A+m*H+k*N;b[9]=h*B+l*D+m*K+k*O;b[13]=h*Z+l*F+m*L+k*d;b[2]=n*w+p*C+r*G+q*M;b[6]=n*y+p*A+r*H+q*N;b[10]=n*B+p*D+r*K+q*O;b[14]=n*Z+p*F+r*L+q*d;b[3]=u*w+v*C+x*G+c*M;b[7]=u*y+v*A+x*H+c*N;b[11]=u*B+v*D+x*K+c*O;b[15]=u*Z+v*F+x*L+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},determinant:function(){var a=
+this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],l=a[13],m=a[2],k=a[6],n=a[10],p=a[14];return a[3]*(+e*h*k-d*l*k-e*g*n+c*l*n+d*g*p-c*h*p)+a[7]*(+b*h*p-b*l*n+e*f*n-d*f*p+d*l*m-e*h*m)+a[11]*(+b*l*k-b*g*p-e*f*k+c*f*p+e*g*m-c*l*m)+a[15]*(-d*g*m-b*h*k+b*g*n+d*f*k-c*f*n+c*h*m)},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a,
+b,c){var d=this.elements;a.isVector3?(d[12]=a.x,d[13]=a.y,d[14]=a.z):(d[12]=a,d[13]=b,d[14]=c);return this},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.");b=this.elements;var c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=c[13],v=c[14];c=c[15];var x=n*v*m-u*p*m+u*l*r-h*v*r-n*l*c+h*p*c,w=q*p*m-k*v*m-q*l*r+g*v*r+k*l*c-g*p*c,y=k*u*m-q*n*m+q*h*r-g*u*
+r-k*h*c+g*n*c,B=q*n*l-k*u*l-q*h*p+g*u*p+k*h*v-g*n*v,A=a*x+d*w+e*y+f*B;if(0===A)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);A=1/A;b[0]=x*A;b[1]=(u*p*f-n*v*f-u*e*r+d*v*r+n*e*c-d*p*c)*A;b[2]=(h*v*f-u*l*f+u*e*m-d*v*m-h*e*c+d*l*c)*A;b[3]=(n*l*f-h*p*f-n*e*m+d*p*m+h*e*r-d*l*r)*A;b[4]=w*A;b[5]=(k*v*f-q*p*f+q*e*r-a*v*r-k*e*c+a*p*c)*A;b[6]=(q*l*f-g*v*f-q*e*m+a*v*m+g*e*c-a*l*c)*A;b[7]=(g*p*f-k*l*f+k*e*m-a*p*m-g*e*r+a*l*r)*A;b[8]=y*A;b[9]=(q*n*f-k*u*f-q*d*r+a*u*r+k*d*c-a*n*c)*A;b[10]=(g*u*f-q*h*f+q*d*m-
+a*u*m-g*d*c+a*h*c)*A;b[11]=(k*h*f-g*n*f-k*d*m+a*n*m+g*d*r-a*h*r)*A;b[12]=B*A;b[13]=(k*u*e-q*n*e+q*d*p-a*u*p-k*d*v+a*n*v)*A;b[14]=(q*h*e-g*u*e-q*d*l+a*u*l+g*d*v-a*h*v)*A;b[15]=(g*n*e-k*h*e+k*d*l-a*n*l-g*d*p+a*h*p)*A;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*
+a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,
+b){var c=Math.cos(b);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){var d=this.elements,e=b._x,f=b._y,g=b._z,h=b._w,l=e+e,m=f+f,k=g+g;b=e*l;var n=e*m;e*=k;var p=f*m;f*=k;g*=k;l*=h;m*=h;h*=k;k=c.x;var r=
+c.y;c=c.z;d[0]=(1-(p+g))*k;d[1]=(n+h)*k;d[2]=(e-m)*k;d[3]=0;d[4]=(n-h)*r;d[5]=(1-(b+g))*r;d[6]=(f+l)*r;d[7]=0;d[8]=(e+m)*c;d[9]=(f-l)*c;d[10]=(1-(b+p))*c;d[11]=0;d[12]=a.x;d[13]=a.y;d[14]=a.z;d[15]=1;return this},decompose:function(a,b,c){var d=this.elements,e=md.set(d[0],d[1],d[2]).length(),f=md.set(d[4],d[5],d[6]).length(),g=md.set(d[8],d[9],d[10]).length();0>this.determinant()&&(e=-e);a.x=d[12];a.y=d[13];a.z=d[14];ba.copy(this);a=1/e;d=1/f;var h=1/g;ba.elements[0]*=a;ba.elements[1]*=a;ba.elements[2]*=
+a;ba.elements[4]*=d;ba.elements[5]*=d;ba.elements[6]*=d;ba.elements[8]*=h;ba.elements[9]*=h;ba.elements[10]*=h;b.setFromRotationMatrix(ba);c.x=e;c.y=f;c.z=g;return this},makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);
+g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),l=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},
+toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});var ui=new N,vi=new va;Ub.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");Ub.DefaultOrder="XYZ";Object.defineProperties(Ub.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},
+y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this._onChangeCallback()}}});Object.assign(Ub.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},
+copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this._onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=O.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],l=e[5],m=e[9],k=e[2],n=e[6];e=e[10];b=b||this._order;switch(b){case "XYZ":this._y=Math.asin(d(g,-1,1));.9999999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,l),this._z=0);break;case "YXZ":this._x=Math.asin(-d(m,-1,1));.9999999>Math.abs(m)?(this._y=
+Math.atan2(g,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-k,a),this._z=0);break;case "ZXY":this._x=Math.asin(d(n,-1,1));.9999999>Math.abs(n)?(this._y=Math.atan2(-k,e),this._z=Math.atan2(-f,l)):(this._y=0,this._z=Math.atan2(h,a));break;case "ZYX":this._y=Math.asin(-d(k,-1,1));.9999999>Math.abs(k)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,l));break;case "YZX":this._z=Math.asin(d(h,-1,1));.9999999>Math.abs(h)?(this._x=Math.atan2(-m,l),this._y=Math.atan2(-k,
+a)):(this._x=0,this._y=Math.atan2(g,e));break;case "XZY":this._z=Math.asin(-d(f,-1,1));.9999999>Math.abs(f)?(this._x=Math.atan2(n,l),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+b)}this._order=b;!1!==c&&this._onChangeCallback();return this},setFromQuaternion:function(a,b,c){ui.makeRotationFromQuaternion(a);return this.setFromRotationMatrix(ui,b,c)},setFromVector3:function(a,b){return this.set(a.x,
+a.y,a.z,b||this._order)},reorder:function(a){vi.setFromEuler(this);return this.setFromQuaternion(vi,a)},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,
+this._y,this._z):new p(this._x,this._y,this._z)},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});Object.assign(De.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},enableAll:function(){this.mask=-1},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},disableAll:function(){this.mask=0},test:function(a){return 0!==(this.mask&a.mask)}});var fj=0,wi=new p,nd=new va,yb=new N,Af=new p,te=new p,
+Jk=new p,Kk=new va,xi=new p(1,0,0),yi=new p(0,1,0),zi=new p(0,0,1),Lk={type:"added"},Mk={type:"removed"};y.DefaultUp=new p(0,1,0);y.DefaultMatrixAutoUpdate=!0;y.prototype=Object.assign(Object.create(ua.prototype),{constructor:y,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix4:function(a){this.matrixAutoUpdate&&this.updateMatrix();this.matrix.premultiply(a);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);
+return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.multiply(nd);return this},rotateOnWorldAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.premultiply(nd);return this},rotateX:function(a){return this.rotateOnAxis(xi,
+a)},rotateY:function(a){return this.rotateOnAxis(yi,a)},rotateZ:function(a){return this.rotateOnAxis(zi,a)},translateOnAxis:function(a,b){wi.copy(a).applyQuaternion(this.quaternion);this.position.add(wi.multiplyScalar(b));return this},translateX:function(a){return this.translateOnAxis(xi,a)},translateY:function(a){return this.translateOnAxis(yi,a)},translateZ:function(a){return this.translateOnAxis(zi,a)},localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(a){return a.applyMatrix4(yb.getInverse(this.matrixWorld))},
+lookAt:function(a,b,c){a.isVector3?Af.copy(a):Af.set(a,b,c);a=this.parent;this.updateWorldMatrix(!0,!1);te.setFromMatrixPosition(this.matrixWorld);this.isCamera||this.isLight?yb.lookAt(te,Af,this.up):yb.lookAt(Af,te,this.up);this.quaternion.setFromRotationMatrix(yb);a&&(yb.extractRotation(a.matrixWorld),nd.setFromRotationMatrix(yb),this.quaternion.premultiply(nd.inverse()))},add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",
+a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,this.children.push(a),a.dispatchEvent(Lk)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,this.children.splice(b,1),a.dispatchEvent(Mk));return this},attach:function(a){this.updateWorldMatrix(!0,!1);yb.getInverse(this.matrixWorld);
+null!==a.parent&&(a.parent.updateWorldMatrix(!0,!1),yb.multiply(a.parent.matrixWorld));a.applyMatrix4(yb);a.updateWorldMatrix(!1,!1);this.add(a);return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){void 0===
+a&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),a=new p);this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),a=new va);this.updateMatrixWorld(!0);this.matrixWorld.decompose(te,a,Jk);return a},getWorldScale:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),a=new p);this.updateMatrixWorld(!0);
+this.matrixWorld.decompose(te,Kk,a);return a},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),a=new p);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(b[8],b[9],b[10]).normalize()},raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},
+traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=
+0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},updateWorldMatrix:function(a,b){var c=this.parent;!0===a&&null!==c&&c.updateWorldMatrix(!0,!1);this.matrixAutoUpdate&&this.updateMatrix();null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix);if(!0===b)for(a=this.children,b=0,c=a.length;b<c;b++)a[b].updateWorldMatrix(!1,!0)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=
+[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);!1===this.frustumCulled&&(f.frustumCulled=!1);0!==this.renderOrder&&
+(f.renderOrder=this.renderOrder);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.layers=this.layers.mask;f.matrix=this.matrix.toArray();!1===this.matrixAutoUpdate&&(f.matrixAutoUpdate=!1);this.isInstancedMesh&&(f.type="InstancedMesh",f.count=this.count,f.instanceMatrix=this.instanceMatrix.toJSON());if(this.isMesh||this.isLine||this.isPoints){f.geometry=b(a.geometries,this.geometry);var g=this.geometry.parameters;if(void 0!==g&&void 0!==g.shapes)if(g=g.shapes,Array.isArray(g))for(var h=
+0,l=g.length;h<l;h++)b(a.shapes,g[h]);else b(a.shapes,g)}if(void 0!==this.material)if(Array.isArray(this.material)){g=[];h=0;for(l=this.material.length;h<l;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);if(d){d=c(a.geometries);h=c(a.materials);l=c(a.textures);var m=c(a.images);g=c(a.shapes);0<d.length&&(e.geometries=d);
+0<h.length&&(e.materials=h);0<l.length&&(e.textures=l);0<m.length&&(e.images=m);0<g.length&&(e.shapes=g)}e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;
+this.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});zc.prototype=Object.assign(Object.create(y.prototype),{constructor:zc,isScene:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());
+null!==a.environment&&(this.environment=a.environment.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=y.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.environment&&(b.object.environment=this.environment.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());
+return b},dispose:function(){this.dispatchEvent({type:"dispose"})}});var zb=[new p,new p,new p,new p,new p,new p,new p,new p],ue=new p,Ug=new Va,od=new p,pd=new p,qd=new p,Qb=new p,Rb=new p,qc=new p,ve=new p,Bf=new p,Cf=new p,Vb=new p;Object.assign(Va.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.length;h<l;h+=3){var m=a[h],k=a[h+1],n=a[h+2];m<b&&(b=
+m);k<c&&(c=k);n<d&&(d=n);m>e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.count;h<l;h++){var m=a.getX(h),k=a.getY(h),n=a.getZ(h);m<b&&(b=m);k<c&&(c=k);n<d&&(d=n);m>e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);
+return this},setFromCenterAndSize:function(a,b){b=ue.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<
+this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){void 0===a&&(console.warn("THREE.Box3: .getCenter() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box3: .getSize() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);
+this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(a){a.updateWorldMatrix(!1,!1);var b=a.geometry;void 0!==b&&(null===b.boundingBox&&b.computeBoundingBox(),Ug.copy(b.boundingBox),Ug.applyMatrix4(a.matrixWorld),this.union(Ug));a=a.children;b=0;for(var c=a.length;b<c;b++)this.expandByObject(a[b]);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||
+a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box3: .getParameter() target is now required"),b=new p);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||
+a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(a){this.clampPoint(a.center,ue);return ue.distanceToSquared(a.center)<=a.radius*a.radius},intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*
+this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=-a.constant&&c>=-a.constant},intersectsTriangle:function(a){if(this.isEmpty())return!1;this.getCenter(ve);Bf.subVectors(this.max,ve);od.subVectors(a.a,ve);pd.subVectors(a.b,ve);qd.subVectors(a.c,ve);Qb.subVectors(pd,od);Rb.subVectors(qd,pd);qc.subVectors(od,qd);a=[0,-Qb.z,Qb.y,0,-Rb.z,Rb.y,0,-qc.z,qc.y,Qb.z,0,-Qb.x,Rb.z,0,-Rb.x,qc.z,0,-qc.x,-Qb.y,Qb.x,0,-Rb.y,Rb.x,0,-qc.y,qc.x,0];if(!Yf(a,od,pd,qd,Bf))return!1;
+a=[1,0,0,0,1,0,0,0,1];if(!Yf(a,od,pd,qd,Bf))return!1;Cf.crossVectors(Qb,Rb);a=[Cf.x,Cf.y,Cf.z];return Yf(a,od,pd,qd,Bf)},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),b=new p);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return ue.copy(a).clamp(this.min,this.max).sub(a).length()},getBoundingSphere:function(a){void 0===a&&console.error("THREE.Box3: .getBoundingSphere() target is now required");this.getCenter(a.center);
+a.radius=.5*this.getSize(ue).length();return a},intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(a){if(this.isEmpty())return this;zb[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(a);zb[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(a);zb[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(a);zb[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(a);
+zb[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(a);zb[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(a);zb[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(a);zb[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(a);this.setFromPoints(zb);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Nk=new Va;Object.assign(eb.prototype,{set:function(a,b){this.center.copy(a);this.radius=
+b;return this},setFromPoints:function(a,b){var c=this.center;void 0!==b?c.copy(b):Nk.setFromPoints(a).getCenter(c);for(var d=b=0,e=a.length;d<e;d++)b=Math.max(b,c.distanceToSquared(a[d]));this.radius=Math.sqrt(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},isEmpty:function(){return 0>this.radius},makeEmpty:function(){this.center.set(0,0,0);this.radius=-1;return this},containsPoint:function(a){return a.distanceToSquared(this.center)<=
+this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),
+b=new p);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new Va);if(this.isEmpty())return a.makeEmpty(),a;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);
+return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});var Ab=new p,Vg=new p,Df=new p,Sb=new p,Wg=new p,Ef=new p,Xg=new p;Object.assign(Wb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){void 0===b&&(console.warn("THREE.Ray: .at() target is now required"),b=new p);
+return b.copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(a){this.origin.copy(this.at(a,Ab));return this},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),b=new p);b.subVectors(a,this.origin);a=b.dot(this.direction);return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},
+distanceSqToPoint:function(a){var b=Ab.subVectors(a,this.origin).dot(this.direction);if(0>b)return this.origin.distanceToSquared(a);Ab.copy(this.direction).multiplyScalar(b).add(this.origin);return Ab.distanceToSquared(a)},distanceSqToSegment:function(a,b,c,d){Vg.copy(a).add(b).multiplyScalar(.5);Df.copy(b).sub(a).normalize();Sb.copy(this.origin).sub(Vg);var e=.5*a.distanceTo(b),f=-this.direction.dot(Df),g=Sb.dot(this.direction),h=-Sb.dot(Df),l=Sb.lengthSq(),m=Math.abs(1-f*f);if(0<m){a=f*h-g;b=f*
+g-h;var k=e*m;0<=a?b>=-k?b<=k?(e=1/m,a*=e,b*=e,f=a*(a+f*b+2*g)+b*(f*a+b+2*h)+l):(b=e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l):(b=-e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l):b<=-k?(a=Math.max(0,-(-f*e+g)),b=0<a?-e:Math.min(Math.max(-e,-h),e),f=-a*a+b*(b+2*h)+l):b<=k?(a=0,b=Math.min(Math.max(-e,-h),e),f=b*(b+2*h)+l):(a=Math.max(0,-(f*e+g)),b=0<a?e:Math.min(Math.max(-e,-h),e),f=-a*a+b*(b+2*h)+l)}else b=0<f?-e:e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l;c&&c.copy(this.direction).multiplyScalar(a).add(this.origin);
+d&&d.copy(Df).multiplyScalar(b).add(Vg);return f},intersectSphere:function(a,b){Ab.subVectors(a.center,this.origin);var c=Ab.dot(this.direction),d=Ab.dot(Ab)-c*c;a=a.radius*a.radius;if(d>a)return null;a=Math.sqrt(a-d);d=c-a;c+=a;return 0>d&&0>c?null:0>d?this.at(c,b):this.at(d,b)},intersectsSphere:function(a){return this.distanceSqToPoint(a.center)<=a.radius*a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+
+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-
+f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(a){return null!==this.intersectBox(a,Ab)},intersectTriangle:function(a,b,c,d,e){Wg.subVectors(b,a);Ef.subVectors(c,a);Xg.crossVectors(Wg,Ef);b=this.direction.dot(Xg);if(0<b){if(d)return null;d=1}else if(0>b)d=-1,b=-b;else return null;
+Sb.subVectors(this.origin,a);a=d*this.direction.dot(Ef.crossVectors(Sb,Ef));if(0>a)return null;c=d*this.direction.dot(Wg.cross(Sb));if(0>c||a+c>b)return null;a=-d*Sb.dot(Xg);return 0>a?null:this.at(a/b,e)},applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});var Yg=new p,Ok=new p,Pk=new ya;Object.assign(Wa.prototype,{isPlane:!0,set:function(a,b){this.normal.copy(a);
+this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(a,b,c){b=Yg.subVectors(c,b).cross(Ok.subVectors(a,b)).normalize();this.setFromNormalAndCoplanarPoint(b,a);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;
+return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){void 0===b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new p);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},
+intersectLine:function(a,b){void 0===b&&(console.warn("THREE.Plane: .intersectLine() target is now required"),b=new p);var c=a.delta(Yg),d=this.normal.dot(c);if(0===d){if(0===this.distanceToPoint(a.start))return b.copy(a.start)}else if(d=-(a.start.dot(this.normal)+this.constant)/d,!(0>d||1<d))return b.copy(c).multiplyScalar(d).add(a.start)},intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},
+intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){void 0===a&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),a=new p);return a.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(a,b){b=b||Pk.getNormalMatrix(a);a=this.coplanarPoint(Yg).applyMatrix4(a);b=this.normal.applyMatrix3(b).normalize();this.constant=-a.dot(b);return this},translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&
+a.constant===this.constant}});var cb=new p,Bb=new p,Zg=new p,Cb=new p,rd=new p,sd=new p,Ai=new p,$g=new p,ah=new p,bh=new p;Object.assign(pa,{getNormal:function(a,b,c,d){void 0===d&&(console.warn("THREE.Triangle: .getNormal() target is now required"),d=new p);d.subVectors(c,b);cb.subVectors(a,b);d.cross(cb);a=d.lengthSq();return 0<a?d.multiplyScalar(1/Math.sqrt(a)):d.set(0,0,0)},getBarycoord:function(a,b,c,d,e){cb.subVectors(d,b);Bb.subVectors(c,b);Zg.subVectors(a,b);a=cb.dot(cb);b=cb.dot(Bb);c=cb.dot(Zg);
+var f=Bb.dot(Bb);d=Bb.dot(Zg);var g=a*f-b*b;void 0===e&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),e=new p);if(0===g)return e.set(-2,-1,-1);g=1/g;f=(f*c-b*d)*g;a=(a*d-b*c)*g;return e.set(1-f-a,a,f)},containsPoint:function(a,b,c,d){pa.getBarycoord(a,b,c,d,Cb);return 0<=Cb.x&&0<=Cb.y&&1>=Cb.x+Cb.y},getUV:function(a,b,c,d,e,f,g,h){this.getBarycoord(a,b,c,d,Cb);h.set(0,0);h.addScaledVector(e,Cb.x);h.addScaledVector(f,Cb.y);h.addScaledVector(g,Cb.z);return h},isFrontFacing:function(a,
+b,c,d){cb.subVectors(c,b);Bb.subVectors(a,b);return 0>cb.cross(Bb).dot(d)?!0:!1}});Object.assign(pa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},getArea:function(){cb.subVectors(this.c,this.b);Bb.subVectors(this.a,
+this.b);return.5*cb.cross(Bb).length()},getMidpoint:function(a){void 0===a&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),a=new p);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return pa.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new Wa);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return pa.getBarycoord(a,
+this.a,this.b,this.c,b)},getUV:function(a,b,c,d,e){return pa.getUV(a,this.a,this.b,this.c,b,c,d,e)},containsPoint:function(a){return pa.containsPoint(a,this.a,this.b,this.c)},isFrontFacing:function(a){return pa.isFrontFacing(this.a,this.b,this.c,a)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),b=new p);var c=this.a,d=this.b,e=this.c;rd.subVectors(d,c);sd.subVectors(e,
+c);$g.subVectors(a,c);var f=rd.dot($g),g=sd.dot($g);if(0>=f&&0>=g)return b.copy(c);ah.subVectors(a,d);var h=rd.dot(ah),l=sd.dot(ah);if(0<=h&&l<=h)return b.copy(d);var m=f*l-h*g;if(0>=m&&0<=f&&0>=h)return d=f/(f-h),b.copy(c).addScaledVector(rd,d);bh.subVectors(a,e);a=rd.dot(bh);var k=sd.dot(bh);if(0<=k&&a<=k)return b.copy(e);f=a*g-f*k;if(0>=f&&0<=g&&0>=k)return m=g/(g-k),b.copy(c).addScaledVector(sd,m);g=h*k-a*l;if(0>=g&&0<=l-h&&0<=a-k)return Ai.subVectors(e,d),m=(l-h)/(l-h+(a-k)),b.copy(d).addScaledVector(Ai,
+m);e=1/(g+f+m);d=f*e;m*=e;return b.copy(c).addScaledVector(rd,d).addScaledVector(sd,m)},equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});var Bi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,
+crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,
+floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,
+lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,
+moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,
+sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Fa={h:0,s:0,l:0},Ff={h:0,s:0,l:0};Object.assign(D.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===
+typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(a,b,c){a=O.euclideanModulo(a,1);b=O.clamp(b,0,1);c=O.clamp(c,0,1);0===b?this.r=this.g=this.b=c:(b=.5>=c?c*(1+b):c+b-c*b,c=2*c-b,this.r=Zf(c,b,a+1/3),this.g=Zf(c,b,a),this.b=Zf(c,b,a-1/3));return this},setStyle:function(a){function b(b){void 0!==
+b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=
+Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+
+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}return a&&0<a.length?this.setColorName(a):this},setColorName:function(a){var b=Bi[a];void 0!==b?this.setHex(b):console.warn("THREE.Color: Unknown color "+a);return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;
+this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(a){this.copyGammaToLinear(this,a);return this},convertLinearToGamma:function(a){this.copyLinearToGamma(this,a);return this},copySRGBToLinear:function(a){this.r=
+$f(a.r);this.g=$f(a.g);this.b=$f(a.b);return this},copyLinearToSRGB:function(a){this.r=ag(a.r);this.g=ag(a.g);this.b=ag(a.b);return this},convertSRGBToLinear:function(){this.copySRGBToLinear(this);return this},convertLinearToSRGB:function(){this.copyLinearToSRGB(this);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){void 0===a&&(console.warn("THREE.Color: .getHSL() target is now required"),
+a={h:0,s:0,l:0});var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var l=e-f;f=.5>=h?l/(e+f):l/(2-e-f);switch(e){case b:g=(c-d)/l+(c<d?6:0);break;case c:g=(d-b)/l+2;break;case d:g=(b-c)/l+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){this.getHSL(Fa);Fa.h+=a;Fa.s+=b;Fa.l+=c;this.setHSL(Fa.h,Fa.s,Fa.l);return this},add:function(a){this.r+=a.r;this.g+=
+a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=
+(a.b-this.b)*b;return this},lerpHSL:function(a,b){this.getHSL(Fa);a.getHSL(Ff);a=O.lerp(Fa.h,Ff.h,b);var c=O.lerp(Fa.s,Ff.s,b);b=O.lerp(Fa.l,Ff.l,b);this.setHSL(a,c,b);return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});D.NAMES=
+Bi;Object.assign(Ac.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var gj=0;K.prototype=Object.assign(Object.create(ua.prototype),{constructor:K,isMaterial:!0,
+onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]=
+c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.sheen&&
+this.sheen.isColor&&(d.sheen=this.sheen.getHex());this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.emissiveIntensity&&1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearcoat&&(d.clearcoat=this.clearcoat);void 0!==this.clearcoatRoughness&&(d.clearcoatRoughness=this.clearcoatRoughness);this.clearcoatMap&&
+this.clearcoatMap.isTexture&&(d.clearcoatMap=this.clearcoatMap.toJSON(a).uuid);this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(d.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(a).uuid);this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(d.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(a).uuid,d.clearcoatNormalScale=this.clearcoatNormalScale.toArray());this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.matcap&&this.matcap.isTexture&&(d.matcap=
+this.matcap.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.aoMap&&this.aoMap.isTexture&&(d.aoMap=this.aoMap.toJSON(a).uuid,d.aoMapIntensity=this.aoMapIntensity);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalMapType=
+this.normalMapType,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=
+this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity,d.refractionRatio=this.refractionRatio,void 0!==this.combine&&(d.combine=this.combine),void 0!==this.envMapIntensity&&(d.envMapIntensity=this.envMapIntensity));this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&
+(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);this.vertexColors&&(d.vertexColors=!0);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;d.stencilWrite=this.stencilWrite;d.stencilWriteMask=this.stencilWriteMask;
+d.stencilFunc=this.stencilFunc;d.stencilRef=this.stencilRef;d.stencilFuncMask=this.stencilFuncMask;d.stencilFail=this.stencilFail;d.stencilZFail=this.stencilZFail;d.stencilZPass=this.stencilZPass;this.rotation&&0!==this.rotation&&(d.rotation=this.rotation);!0===this.polygonOffset&&(d.polygonOffset=!0);0!==this.polygonOffsetFactor&&(d.polygonOffsetFactor=this.polygonOffsetFactor);0!==this.polygonOffsetUnits&&(d.polygonOffsetUnits=this.polygonOffsetUnits);this.linewidth&&1!==this.linewidth&&(d.linewidth=
+this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);
+"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.morphNormals&&(d.morphNormals=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);!1===this.toneMapped&&(d.toneMapped=!1);"{}"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=
+a.name;this.fog=a.fog;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.stencilWriteMask=a.stencilWriteMask;
+this.stencilFunc=a.stencilFunc;this.stencilRef=a.stencilRef;this.stencilFuncMask=a.stencilFuncMask;this.stencilFail=a.stencilFail;this.stencilZFail=a.stencilZFail;this.stencilZPass=a.stencilZPass;this.stencilWrite=a.stencilWrite;var b=a.clippingPlanes,c=null;if(null!==b){var d=b.length;c=Array(d);for(var e=0;e!==d;++e)c[e]=b[e].clone()}this.clippingPlanes=c;this.clipIntersection=a.clipIntersection;this.clipShadows=a.clipShadows;this.shadowSide=a.shadowSide;this.colorWrite=a.colorWrite;this.precision=
+a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.visible=a.visible;this.toneMapped=a.toneMapped;this.userData=JSON.parse(JSON.stringify(a.userData));return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(K.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});
+Pa.prototype=Object.create(K.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshBasicMaterial=!0;Pa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=
+a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};var Y=new p;Object.defineProperty(G.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(G.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(a){this.usage=a;return this},copy:function(a){this.name=a.name;this.array=new a.array.constructor(a.array);
+this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.usage=a.usage;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new D);b[c++]=f.r;b[c++]=f.g;b[c++]=
+f.b}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new v);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=
+this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new R);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},applyMatrix3:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyMatrix3(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},applyMatrix4:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyMatrix4(a),
+this.setXYZ(b,Y.x,Y.y,Y.z);return this},applyNormalMatrix:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyNormalMatrix(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},transformDirection:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.transformDirection(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*
+this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+
+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),
+normalized:this.normalized}}});yd.prototype=Object.create(G.prototype);yd.prototype.constructor=yd;zd.prototype=Object.create(G.prototype);zd.prototype.constructor=zd;Ad.prototype=Object.create(G.prototype);Ad.prototype.constructor=Ad;Bd.prototype=Object.create(G.prototype);Bd.prototype.constructor=Bd;Xb.prototype=Object.create(G.prototype);Xb.prototype.constructor=Xb;Cd.prototype=Object.create(G.prototype);Cd.prototype.constructor=Cd;Yb.prototype=Object.create(G.prototype);Yb.prototype.constructor=
+Yb;B.prototype=Object.create(G.prototype);B.prototype.constructor=B;Dd.prototype=Object.create(G.prototype);Dd.prototype.constructor=Dd;Object.assign(rh.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,
+e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var l=[];for(var m=0;m<h;m++)l[m]={name:g[m].name,data:[]};this.morphTargets.position=l}var k=a.morphNormals,n=k.length;if(0<n){var p=[];for(m=0;m<n;m++)p[m]={name:k[m].name,data:[]};this.morphTargets.normal=p}var r=a.skinIndices,q=a.skinWeights,u=r.length===c.length,E=q.length===c.length;0<c.length&&0===b.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(m=0;m<b.length;m++){var x=
+b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);var w=x.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=x.normal,this.normals.push(w,w,w));w=x.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=x.color,this.colors.push(w,w,w));!0===e&&(w=d[0][m],void 0!==w?this.uvs.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new v,new v,new v)));!0===f&&(w=d[1][m],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",
+m),this.uvs2.push(new v,new v,new v)));for(w=0;w<h;w++){var y=g[w].vertices;l[w].data.push(y[x.a],y[x.b],y[x.c])}for(w=0;w<n;w++)y=k[w].vertexNormals[m],p[w].data.push(y.a,y.b,y.c);u&&this.skinIndices.push(r[x.a],r[x.b],r[x.c]);E&&this.skinWeights.push(q[x.a],q[x.b],q[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;
+null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this}});var hj=1,ob=new N,ch=new y,td=new p,Oa=new Va,we=new Va,oa=new p;F.prototype=Object.assign(Object.create(ua.prototype),{constructor:F,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<sh(a)?Yb:Xb)(a,1):this.index=a},getAttribute:function(a){return this.attributes[a]},setAttribute:function(a,
+b){this.attributes[a]=b;return this},deleteAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix4:function(a){var b=this.attributes.position;void 0!==b&&(b.applyMatrix4(a),b.needsUpdate=!0);b=this.attributes.normal;if(void 0!==b){var c=(new ya).getNormalMatrix(a);b.applyNormalMatrix(c);
+b.needsUpdate=!0}b=this.attributes.tangent;void 0!==b&&(b.transformDirection(a),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(a){ob.makeRotationX(a);this.applyMatrix4(ob);return this},rotateY:function(a){ob.makeRotationY(a);this.applyMatrix4(ob);return this},rotateZ:function(a){ob.makeRotationZ(a);this.applyMatrix4(ob);return this},translate:function(a,b,c){ob.makeTranslation(a,b,c);this.applyMatrix4(ob);
+return this},scale:function(a,b,c){ob.makeScale(a,b,c);this.applyMatrix4(ob);return this},lookAt:function(a){ch.lookAt(a);ch.updateMatrix();this.applyMatrix4(ch.matrix);return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(td).negate();this.translate(td.x,td.y,td.z);return this},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new B(3*b.vertices.length,3);var c=new B(3*b.colors.length,3);this.setAttribute("position",a.copyVector3sArray(b.vertices));
+this.setAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new B(b.lineDistances.length,1),this.setAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,
+e.y,e.z||0)}this.setAttribute("position",new B(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=
+!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==
+c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new rh).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*
+a.vertices.length);this.setAttribute("position",(new G(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.setAttribute("normal",(new G(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.setAttribute("color",(new G(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.setAttribute("uv",(new G(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*
+a.uvs2.length),this.setAttribute("uv2",(new G(b,2)).copyVector2sArray(a.uvs2)));this.groups=a.groups;for(var c in a.morphTargets){b=[];for(var d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new B(3*g.data.length,3);h.name=g.name;b.push(h.copyVector3sArray(g.data))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new B(4*a.skinIndices.length,4),this.setAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new B(4*a.skinWeights.length,4),this.setAttribute("skinWeight",
+c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Va);var a=this.attributes.position,b=this.morphAttributes.position;if(void 0!==a){if(this.boundingBox.setFromBufferAttribute(a),b){a=0;for(var c=b.length;a<c;a++)Oa.setFromBufferAttribute(b[a]),this.morphTargetsRelative?(oa.addVectors(this.boundingBox.min,
+Oa.min),this.boundingBox.expandByPoint(oa),oa.addVectors(this.boundingBox.max,Oa.max),this.boundingBox.expandByPoint(oa)):(this.boundingBox.expandByPoint(Oa.min),this.boundingBox.expandByPoint(Oa.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){null===
+this.boundingSphere&&(this.boundingSphere=new eb);var a=this.attributes.position,b=this.morphAttributes.position;if(a){var c=this.boundingSphere.center;Oa.setFromBufferAttribute(a);if(b)for(var d=0,e=b.length;d<e;d++){var f=b[d];we.setFromBufferAttribute(f);this.morphTargetsRelative?(oa.addVectors(Oa.min,we.min),Oa.expandByPoint(oa),oa.addVectors(Oa.max,we.max),Oa.expandByPoint(oa)):(Oa.expandByPoint(we.min),Oa.expandByPoint(we.max))}Oa.getCenter(c);var g=0;d=0;for(e=a.count;d<e;d++)oa.fromBufferAttribute(a,
+d),g=Math.max(g,c.distanceToSquared(oa));if(b)for(d=0,e=b.length;d<e;d++){f=b[d];for(var h=this.morphTargetsRelative,l=0,m=f.count;l<m;l++)oa.fromBufferAttribute(f,l),h&&(td.fromBufferAttribute(a,l),oa.add(td)),g=Math.max(g,c.distanceToSquared(oa))}this.boundingSphere.radius=Math.sqrt(g);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}},computeFaceNormals:function(){},
+computeVertexNormals:function(){var a=this.index,b=this.attributes;if(b.position){var c=b.position.array;if(void 0===b.normal)this.setAttribute("normal",new G(new Float32Array(c.length),3));else for(var d=b.normal.array,e=0,f=d.length;e<f;e++)d[e]=0;d=b.normal.array;var g=new p,h=new p,l=new p,m=new p,k=new p;if(a){var n=a.array;e=0;for(f=a.count;e<f;e+=3){a=3*n[e+0];var t=3*n[e+1];var r=3*n[e+2];g.fromArray(c,a);h.fromArray(c,t);l.fromArray(c,r);m.subVectors(l,h);k.subVectors(g,h);m.cross(k);d[a]+=
+m.x;d[a+1]+=m.y;d[a+2]+=m.z;d[t]+=m.x;d[t+1]+=m.y;d[t+2]+=m.z;d[r]+=m.x;d[r+1]+=m.y;d[r+2]+=m.z}}else for(e=0,f=c.length;e<f;e+=9)g.fromArray(c,e),h.fromArray(c,e+3),l.fromArray(c,e+6),m.subVectors(l,h),k.subVectors(g,h),m.cross(k),d[e]=m.x,d[e+1]=m.y,d[e+2]=m.z,d[e+3]=m.x,d[e+4]=m.y,d[e+5]=m.z,d[e+6]=m.x,d[e+7]=m.y,d[e+8]=m.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));
+var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d]){var e=c[d].array,f=a.attributes[d],g=f.array,h=f.itemSize*b;f=Math.min(g.length,e.length-h);for(var l=0;l<f;l++,h++)e[h]=g[l]}return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){for(var a=this.attributes.normal,b=0,c=a.count;b<c;b++)oa.x=a.getX(b),oa.y=a.getY(b),oa.z=a.getZ(b),oa.normalize(),a.setXYZ(b,oa.x,oa.y,oa.z)},toNonIndexed:function(){function a(a,
+b){var c=a.array,d=a.itemSize;a=a.normalized;for(var e=new c.constructor(b.length*d),f,g=0,h=0,l=b.length;h<l;h++){f=b[h]*d;for(var m=0;m<d;m++)e[g++]=c[f++]}return new G(e,d,a)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var b=new F,c=this.index.array,d=this.attributes,e;for(e in d){var f=d[e];f=a(f,c);b.setAttribute(e,f)}var g=this.morphAttributes;for(e in g){var h=[],l=g[e];d=0;for(var m=l.length;d<m;d++)f=l[d],f=a(f,c),
+h.push(f);b.morphAttributes[e]=h}b.morphTargetsRelative=this.morphTargetsRelative;c=this.groups;d=0;for(e=c.length;d<e;d++)f=c[d],b.addGroup(f.start,f.count,f.materialIndex);return b},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);0<Object.keys(this.userData).length&&(a.userData=this.userData);if(void 0!==this.parameters){var b=this.parameters;for(m in b)void 0!==b[m]&&(a[m]=
+b[m]);return a}a.data={attributes:{}};b=this.index;null!==b&&(a.data.index={type:b.array.constructor.name,array:Array.prototype.slice.call(b.array)});var c=this.attributes;for(m in c){b=c[m];var d=b.toJSON();""!==b.name&&(d.name=b.name);a.data.attributes[m]=d}c={};var e=!1;for(m in this.morphAttributes){for(var f=this.morphAttributes[m],g=[],h=0,l=f.length;h<l;h++)b=f[h],d=b.toJSON(),""!==b.name&&(d.name=b.name),g.push(d);0<g.length&&(c[m]=g,e=!0)}e&&(a.data.morphAttributes=c,a.data.morphTargetsRelative=
+this.morphTargetsRelative);var m=this.groups;0<m.length&&(a.data.groups=JSON.parse(JSON.stringify(m)));m=this.boundingSphere;null!==m&&(a.data.boundingSphere={center:m.center.toArray(),radius:m.radius});return a},clone:function(){return(new F).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.setAttribute(g,
+c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}this.morphTargetsRelative=a.morphTargetsRelative;var g=a.groups;c=0;for(b=g.length;c<b;c++)d=g[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;this.userData=a.userData;
+return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var Ci=new N,rc=new Wb,dh=new eb,Db=new p,Eb=new p,Fb=new p,bg=new p,cg=new p,dg=new p,Ge=new p,He=new p,Ie=new p,Bc=new v,Cc=new v,Dc=new v,Ed=new p,Ee=new p;ea.prototype=Object.assign(Object.create(y.prototype),{constructor:ea,isMesh:!0,copy:function(a){y.prototype.copy.call(this,a);void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=
+Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")},
+raycast:function(a,b){var c=this.geometry,d=this.material,e=this.matrixWorld;if(void 0!==d&&(null===c.boundingSphere&&c.computeBoundingSphere(),dh.copy(c.boundingSphere),dh.applyMatrix4(e),!1!==a.ray.intersectsSphere(dh)&&(Ci.getInverse(e),rc.copy(a.ray).applyMatrix4(Ci),null===c.boundingBox||!1!==rc.intersectsBox(c.boundingBox))))if(c.isBufferGeometry){var f=c.index;e=c.attributes.position;var g=c.morphAttributes.position,h=c.morphTargetsRelative,l=c.attributes.uv,m=c.attributes.uv2,k=c.groups,n=
+c.drawRange,p,r;if(null!==f)if(Array.isArray(d)){var q=0;for(p=k.length;q<p;q++){var u=k[q];var E=d[u.materialIndex];var x=Math.max(u.start,n.start);for(r=c=Math.min(u.start+u.count,n.start+n.count);x<r;x+=3){c=f.getX(x);var w=f.getX(x+1);var y=f.getX(x+2);if(c=Fe(this,E,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(x/3),c.face.materialIndex=u.materialIndex,b.push(c)}}}else for(x=Math.max(0,n.start),c=Math.min(f.count,n.start+n.count),q=x,p=c;q<p;q+=3){if(c=f.getX(q),w=f.getX(q+1),y=f.getX(q+2),c=
+Fe(this,d,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(q/3),b.push(c)}else if(void 0!==e)if(Array.isArray(d))for(q=0,p=k.length;q<p;q++)for(u=k[q],E=d[u.materialIndex],x=Math.max(u.start,n.start),r=c=Math.min(u.start+u.count,n.start+n.count);x<r;x+=3){if(c=x,w=x+1,y=x+2,c=Fe(this,E,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(x/3),c.face.materialIndex=u.materialIndex,b.push(c)}else for(x=Math.max(0,n.start),c=Math.min(e.count,n.start+n.count),q=x,p=c;q<p;q+=3)if(c=q,w=q+1,y=q+2,c=Fe(this,d,a,rc,e,
+g,h,l,m,c,w,y))c.faceIndex=Math.floor(q/3),b.push(c)}else if(c.isGeometry)for(e=Array.isArray(d),g=c.vertices,h=c.faces,c=c.faceVertexUvs[0],0<c.length&&(f=c),n=0,q=h.length;n<q;n++)if(p=h[n],c=e?d[p.materialIndex]:d,void 0!==c&&(l=g[p.a],m=g[p.b],k=g[p.c],c=th(this,c,a,rc,l,m,k,Ed)))f&&f[n]&&(u=f[n],Bc.copy(u[0]),Cc.copy(u[1]),Dc.copy(u[2]),c.uv=pa.getUV(Ed,l,m,k,Bc,Cc,Dc,new v)),c.face=p,c.faceIndex=n,b.push(c)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
+var ij=0,pb=new N,eh=new y,Gf=new p;L.prototype=Object.assign(Object.create(ua.prototype),{constructor:L,isGeometry:!0,applyMatrix4:function(a){for(var b=(new ya).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&
+this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(a){pb.makeRotationX(a);this.applyMatrix4(pb);return this},rotateY:function(a){pb.makeRotationY(a);this.applyMatrix4(pb);return this},rotateZ:function(a){pb.makeRotationZ(a);this.applyMatrix4(pb);return this},translate:function(a,b,c){pb.makeTranslation(a,b,c);this.applyMatrix4(pb);return this},scale:function(a,b,c){pb.makeScale(a,b,c);this.applyMatrix4(pb);return this},lookAt:function(a){eh.lookAt(a);
+eh.updateMatrix();this.applyMatrix4(eh.matrix);return this},fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0===h?[]:[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()],k=void 0===g?[]:[(new p).fromArray(g,3*a),(new p).fromArray(g,3*b),(new p).fromArray(g,3*d)];e=new Ac(a,b,d,k,f,e);c.faces.push(e);void 0!==l&&c.faceVertexUvs[0].push([(new v).fromArray(l,2*a),(new v).fromArray(l,2*b),(new v).fromArray(l,2*d)]);void 0!==m&&c.faceVertexUvs[1].push([(new v).fromArray(m,2*a),(new v).fromArray(m,
+2*b),(new v).fromArray(m,2*d)])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes;if(void 0===e.position)return console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."),this;var f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,l=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(e=0;e<f.length;e+=3)c.vertices.push((new p).fromArray(f,
+e)),void 0!==h&&c.colors.push((new D).fromArray(h,e));var k=a.groups;if(0<k.length)for(e=0;e<k.length;e++){f=k[e];var n=f.start,t=n;for(n+=f.count;t<n;t+=3)void 0!==d?b(d[t],d[t+1],d[t+2],f.materialIndex):b(t,t+1,t+2,f.materialIndex)}else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());
+return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(Gf).negate();this.translate(Gf.x,Gf.y,Gf.z);return this},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius;b=0===b?1:1/b;var c=new N;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix4(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];
+a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===a&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var l=this.vertices[b.c];e.subVectors(l,h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),
+a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b=this.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<
+a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);
+var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new L;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=
+new p;var l={a:new p,b:new p,c:new p};d.push(h);g.push(l)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],l=g.vertexNormals[c],h.copy(d.normal),l.a.copy(d.vertexNormals[0]),l.b.copy(d.vertexNormals[1]),l.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeBoundingBox:function(){null===
+this.boundingBox&&(this.boundingBox=new Va);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new eb);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,l=a.faces,m=this.colors,k=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ya).getNormalMatrix(b));for(var n=0,p=g.length;n<p;n++){var r=g[n].clone();void 0!==
+b&&r.applyMatrix4(b);f.push(r)}n=0;for(p=k.length;n<p;n++)m.push(k[n].clone());n=0;for(p=l.length;n<p;n++){g=l[n];var q=g.vertexNormals;k=g.vertexColors;m=new Ac(g.a+e,g.b+e,g.c+e);m.normal.copy(g.normal);void 0!==d&&m.normal.applyMatrix3(d).normalize();b=0;for(f=q.length;b<f;b++)r=q[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),m.vertexNormals.push(r);m.color.copy(g.color);b=0;for(f=k.length;b<f;b++)r=k[b],m.vertexColors.push(r.clone());m.materialIndex=g.materialIndex+c;h.push(m)}n=0;for(p=
+a.faceVertexUvs.length;n<p;n++)for(c=a.faceVertexUvs[n],void 0===this.faceVertexUvs[n]&&(this.faceVertexUvs[n]=[]),b=0,f=c.length;b<f;b++){d=c[b];e=[];h=0;for(l=d.length;h<l;h++)e.push(d[h].clone());this.faceVertexUvs[n].push(e)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",
+a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=
+this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&
+e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==m[b])return m[b];m[b]=l.length/3;l.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=k.length;k.push(a.getHex());return n[b]}function d(a){var b=
+a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}h=[];var l=[],m={},k=[],n={},p=[],r={};for(g=0;g<this.faces.length;g++){var q=
+this.faces[g],u=void 0!==this.faceVertexUvs[0][g],v=0<q.normal.length(),x=0<q.vertexNormals.length,w=1!==q.color.r||1!==q.color.g||1!==q.color.b,y=0<q.vertexColors.length,A=0;A=a(A,0,0);A=a(A,1,!0);A=a(A,2,!1);A=a(A,3,u);A=a(A,4,v);A=a(A,5,x);A=a(A,6,w);A=a(A,7,y);h.push(A);h.push(q.a,q.b,q.c);h.push(q.materialIndex);u&&(u=this.faceVertexUvs[0][g],h.push(d(u[0]),d(u[1]),d(u[2])));v&&h.push(b(q.normal));x&&(v=q.vertexNormals,h.push(b(v[0]),b(v[1]),b(v[2])));w&&h.push(c(q.color));y&&(q=q.vertexColors,
+h.push(c(q[0]),c(q[1]),c(q[2])))}e.data={};e.data.vertices=f;e.data.normals=l;0<k.length&&(e.data.colors=k);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new L).copy(this)},copy:function(a){var b,c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<
+b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());e=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g=a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],l=[];var m=0;for(d=h.length;m<d;m++)l.push(h[m].clone());this.faceVertexUvs[f].push(l)}}m=a.morphTargets;f=0;for(b=m.length;f<b;f++){d={};d.name=m[f].name;if(void 0!==
+m[f].vertices)for(d.vertices=[],e=0,c=m[f].vertices.length;e<c;e++)d.vertices.push(m[f].vertices[e].clone());if(void 0!==m[f].normals)for(d.normals=[],e=0,c=m[f].normals.length;e<c;e++)d.normals.push(m[f].normals[e].clone());this.morphTargets.push(d)}m=a.morphNormals;f=0;for(b=m.length;f<b;f++){d={};if(void 0!==m[f].vertexNormals)for(d.vertexNormals=[],e=0,c=m[f].vertexNormals.length;e<c;e++)g=m[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==
+m[f].faceNormals)for(d.faceNormals=[],e=0,c=m[f].faceNormals.length;e<c;e++)d.faceNormals.push(m[f].faceNormals[e].clone());this.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone());e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=
+a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var fh=function(a){function b(b,d,e,f,g,h){a.call(this);this.type="BoxGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,
+depthSegments:h};this.fromBufferGeometry(new Gd(b,d,e,f,g,h));this.mergeVertices()}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(L),Gd=function(a){function b(b,d,e,f,g,h){function c(a,b,c,d,e,f,g,h,l,z,v){var w=f/l,x=g/z,y=f/2,A=g/2,E=h/2;g=l+1;for(var C=z+1,B=f=0,D=new p,F=0;F<C;F++)for(var G=F*x-A,H=0;H<g;H++)D[a]=(H*w-y)*d,D[b]=G*e,D[c]=E,n.push(D.x,D.y,D.z),D[a]=0,D[b]=0,D[c]=0<h?1:-1,t.push(D.x,D.y,D.z),r.push(H/l),r.push(1-F/z),f+=1;for(a=0;a<
+z;a++)for(b=0;b<l;b++)c=q+b+g*(a+1),d=q+(b+1)+g*(a+1),e=q+(b+1)+g*a,k.push(q+b+g*a,c,e),k.push(c,d,e),B+=6;m.addGroup(u,B,v);u+=B;q+=f}a.call(this);this.type="BoxBufferGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,depthSegments:h};var m=this;b=b||1;d=d||1;e=e||1;f=Math.floor(f)||1;g=Math.floor(g)||1;h=Math.floor(h)||1;var k=[],n=[],t=[],r=[],q=0,u=0;c("z","y","x",-1,-1,e,d,b,h,g,0);c("z","y","x",1,-1,e,d,-b,h,g,1);c("x","z","y",1,1,b,e,d,f,h,2);c("x","z","y",
+1,-1,b,e,-d,f,h,3);c("x","y","z",1,-1,b,d,e,f,g,4);c("x","y","z",-1,-1,b,d,-e,f,g,5);this.setIndex(k);this.setAttribute("position",new B(n,3));this.setAttribute("normal",new B(t,3));this.setAttribute("uv",new B(r,2))}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(F),Oh={clone:Ec,merge:wa};Ca.prototype=Object.create(K.prototype);Ca.prototype.constructor=Ca;Ca.prototype.isShaderMaterial=!0;Ca.prototype.copy=function(a){K.prototype.copy.call(this,a);this.fragmentShader=
+a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ec(a.uniforms);this.defines=Object.assign({},a.defines);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=Object.assign({},a.extensions);return this};Ca.prototype.toJSON=function(a){var b=K.prototype.toJSON.call(this,a);b.uniforms={};for(var c in this.uniforms){var d=
+this.uniforms[c].value;b.uniforms[c]=d&&d.isTexture?{type:"t",value:d.toJSON(a).uuid}:d&&d.isColor?{type:"c",value:d.getHex()}:d&&d.isVector2?{type:"v2",value:d.toArray()}:d&&d.isVector3?{type:"v3",value:d.toArray()}:d&&d.isVector4?{type:"v4",value:d.toArray()}:d&&d.isMatrix3?{type:"m3",value:d.toArray()}:d&&d.isMatrix4?{type:"m4",value:d.toArray()}:{value:d}}0<Object.keys(this.defines).length&&(b.defines=this.defines);b.vertexShader=this.vertexShader;b.fragmentShader=this.fragmentShader;a={};for(var e in this.extensions)!0===
+this.extensions[e]&&(a[e]=!0);0<Object.keys(a).length&&(b.extensions=a);return b};fb.prototype=Object.assign(Object.create(y.prototype),{constructor:fb,isCamera:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);this.projectionMatrixInverse.copy(a.projectionMatrixInverse);return this},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),
+a=new p);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(-b[8],-b[9],-b[10]).normalize()},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},updateWorldMatrix:function(a,b){y.prototype.updateWorldMatrix.call(this,a,b);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});P.prototype=Object.assign(Object.create(fb.prototype),{constructor:P,
+isPerspectiveCamera:!0,copy:function(a,b){fb.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*O.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*O.DEG2RAD*this.fov);return.5*this.getFilmHeight()/
+a},getEffectiveFOV:function(){return 2*O.RAD2DEG*Math.atan(Math.tan(.5*O.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=
+d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*O.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled){var g=f.fullWidth,h=f.fullHeight;e+=f.offsetX*d/g;b-=f.offsetY*c/h;d*=f.width/g;c*=f.height/h}f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,
+e+d,b,b-c,a,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});Fc.prototype=Object.create(y.prototype);Fc.prototype.constructor=Fc;Zb.prototype=
+Object.create(Ba.prototype);Zb.prototype.constructor=Zb;Zb.prototype.isWebGLCubeRenderTarget=!0;Zb.prototype.fromEquirectangularTexture=function(a,b){this.texture.type=b.type;this.texture.format=b.format;this.texture.encoding=b.encoding;var c=new zc,d=new Ca({type:"CubemapFromEquirect",uniforms:Ec({tEquirect:{value:null}}),vertexShader:"varying vec3 vWorldDirection;\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
+fragmentShader:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}",side:1,blending:0});d.uniforms.tEquirect.value=b;b=new ea(new Gd(5,5,5),d);c.add(b);(new Fc(1,10,this)).update(a,c);b.geometry.dispose();b.material.dispose();return this};$b.prototype=Object.create(W.prototype);$b.prototype.constructor=$b;$b.prototype.isDataTexture=
+!0;var ud=new eb,Hf=new p;Object.assign(Gc.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromProjectionMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=
+c[13],v=c[14];c=c[15];b[0].setComponents(f-a,m-g,r-k,c-q).normalize();b[1].setComponents(f+a,m+g,r+k,c+q).normalize();b[2].setComponents(f+d,m+h,r+n,c+u).normalize();b[3].setComponents(f-d,m-h,r-n,c-u).normalize();b[4].setComponents(f-e,m-l,r-p,c-v).normalize();b[5].setComponents(f+e,m+l,r+p,c+v).normalize();return this},intersectsObject:function(a){var b=a.geometry;null===b.boundingSphere&&b.computeBoundingSphere();ud.copy(b.boundingSphere).applyMatrix4(a.matrixWorld);return this.intersectsSphere(ud)},
+intersectsSprite:function(a){ud.center.set(0,0,0);ud.radius=.7071067811865476;ud.applyMatrix4(a.matrixWorld);return this.intersectsSphere(ud)},intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(a){for(var b=this.planes,c=0;6>c;c++){var d=b[c];Hf.x=0<d.normal.x?a.max.x:a.min.x;Hf.y=0<d.normal.y?a.max.y:a.min.y;Hf.z=0<d.normal.z?a.max.z:a.min.z;if(0>d.distanceToPoint(Hf))return!1}return!0},
+containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var A={common:{diffuse:{value:new D(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ya},uv2Transform:{value:new ya},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},
+lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new v(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new D(16777215)}},
+lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},
+spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new D(15658734)},opacity:{value:1},
+size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ya}},sprite:{diffuse:{value:new D(15658734)},opacity:{value:1},center:{value:new v(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ya}}};Fd.prototype=Object.create(L.prototype);Fd.prototype.constructor=Fd;ac.prototype=Object.create(F.prototype);ac.prototype.constructor=ac;var M={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",
+alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",
+aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha  = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",
+bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",
+clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",
+clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",
+color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n  return m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",
+cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_maxMipLevel 8.0\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_maxTileSize 256.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction) {\n    vec3 absDirection = abs(direction);\n    float face = -1.0;\n    if (absDirection.x > absDirection.z) {\n      if (absDirection.x > absDirection.y)\n        face = direction.x > 0.0 ? 0.0 : 3.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    } else {\n      if (absDirection.z > absDirection.y)\n        face = direction.z > 0.0 ? 2.0 : 5.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    }\n    return face;\n}\nvec2 getUV(vec3 direction, float face) {\n    vec2 uv;\n    if (face == 0.0) {\n      uv = vec2(direction.z, direction.y) / abs(direction.x);    } else if (face == 1.0) {\n      uv = vec2(-direction.x, -direction.z) / abs(direction.y);    } else if (face == 2.0) {\n      uv = vec2(-direction.x, direction.y) / abs(direction.z);    } else if (face == 3.0) {\n      uv = vec2(-direction.z, direction.y) / abs(direction.x);    } else if (face == 4.0) {\n      uv = vec2(-direction.x, direction.z) / abs(direction.y);    } else {\n      uv = vec2(direction.x, direction.y) / abs(direction.z);    }\n    return 0.5 * (uv + 1.0);\n}\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\n  float face = getFace(direction);\n  float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\n  mipInt = max(mipInt, cubeUV_minMipLevel);\n  float faceSize = exp2(mipInt);\n  float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\n  vec2 uv = getUV(direction, face) * (faceSize - 1.0);\n  vec2 f = fract(uv);\n  uv += 0.5 - f;\n  if (face > 2.0) {\n    uv.y += faceSize;\n    face -= 3.0;\n  }\n  uv.x += face * faceSize;\n  if(mipInt < cubeUV_maxMipLevel){\n    uv.y += 2.0 * cubeUV_maxTileSize;\n  }\n  uv.y += filterInt * 2.0 * cubeUV_minTileSize;\n  uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\n  uv *= texelSize;\n  vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x += texelSize;\n  vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.y += texelSize;\n  vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x -= texelSize;\n  vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  vec3 tm = mix(tl, tr, f.x);\n  vec3 bm = mix(bl, br, f.x);\n  return mix(tm, bm, f.y);\n}\n#define r0 1.0\n#define v0 0.339\n#define m0 -2.0\n#define r1 0.8\n#define v1 0.276\n#define m1 -1.0\n#define r4 0.4\n#define v4 0.046\n#define m4 2.0\n#define r5 0.305\n#define v5 0.016\n#define m5 3.0\n#define r6 0.21\n#define v6 0.0038\n#define m6 4.0\nfloat roughnessToMip(float roughness) {\n  float mip = 0.0;\n  if (roughness >= r1) {\n    mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\n  } else if (roughness >= r4) {\n    mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\n  } else if (roughness >= r5) {\n    mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\n  } else if (roughness >= r6) {\n    mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\n  } else {\n    mip = -2.0 * log2(1.16 * roughness);  }\n  return mip;\n}\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\n  float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\n  float mipF = fract(mip);\n  float mipInt = floor(mip);\n  vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\n  if (mipF == 0.0) {\n    return vec4(color0, 1.0);\n  } else {\n    vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\n    return vec4(mix(color0, color1, mipF), 1.0);\n  }\n}\n#endif",
+defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",
+displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",
+emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",
+envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t}  else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec2 sampleUV = equirectUv( reflectVec );\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",
+envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",
+envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t  vec3 reflectVec = reflect( -viewDir, normal );\n\t\t  reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t  vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV = equirectUv( reflectVec );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",
+envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",
+fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",
+gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",
+lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",
+lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",
+lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",
+lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",
+lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",
+lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",
+lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",
+lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",
+lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",
+logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",
+map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",
+map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",
+morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",
+morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",
+normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",
+normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",
+normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",
+clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",
+packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",
+premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",
+roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",
+shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",
+shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",
+shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",
+skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",
+skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",
+specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",
+uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",
+uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
+background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
+cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",
+depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",
+distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",
+distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",
+equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
+linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
+linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",
+meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",
+meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",
+meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",
+normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
+points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
+points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
+shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
+sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
+gb={basic:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.fog]),vertexShader:M.meshbasic_vert,fragmentShader:M.meshbasic_frag},lambert:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.fog,A.lights,{emissive:{value:new D(0)}}]),vertexShader:M.meshlambert_vert,fragmentShader:M.meshlambert_frag},phong:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.fog,A.lights,{emissive:{value:new D(0)},
+specular:{value:new D(1118481)},shininess:{value:30}}]),vertexShader:M.meshphong_vert,fragmentShader:M.meshphong_frag},standard:{uniforms:wa([A.common,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.roughnessmap,A.metalnessmap,A.fog,A.lights,{emissive:{value:new D(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:M.meshphysical_vert,fragmentShader:M.meshphysical_frag},toon:{uniforms:wa([A.common,A.specularmap,A.aomap,A.lightmap,
+A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.gradientmap,A.fog,A.lights,{emissive:{value:new D(0)},specular:{value:new D(1118481)},shininess:{value:30}}]),vertexShader:M.meshtoon_vert,fragmentShader:M.meshtoon_frag},matcap:{uniforms:wa([A.common,A.bumpmap,A.normalmap,A.displacementmap,A.fog,{matcap:{value:null}}]),vertexShader:M.meshmatcap_vert,fragmentShader:M.meshmatcap_frag},points:{uniforms:wa([A.points,A.fog]),vertexShader:M.points_vert,fragmentShader:M.points_frag},dashed:{uniforms:wa([A.common,
+A.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:M.linedashed_vert,fragmentShader:M.linedashed_frag},depth:{uniforms:wa([A.common,A.displacementmap]),vertexShader:M.depth_vert,fragmentShader:M.depth_frag},normal:{uniforms:wa([A.common,A.bumpmap,A.normalmap,A.displacementmap,{opacity:{value:1}}]),vertexShader:M.normal_vert,fragmentShader:M.normal_frag},sprite:{uniforms:wa([A.sprite,A.fog]),vertexShader:M.sprite_vert,fragmentShader:M.sprite_frag},background:{uniforms:{uvTransform:{value:new ya},
+t2D:{value:null}},vertexShader:M.background_vert,fragmentShader:M.background_frag},cube:{uniforms:wa([A.envmap,{opacity:{value:1}}]),vertexShader:M.cube_vert,fragmentShader:M.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:M.equirect_vert,fragmentShader:M.equirect_frag},distanceRGBA:{uniforms:wa([A.common,A.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:M.distanceRGBA_vert,fragmentShader:M.distanceRGBA_frag},shadow:{uniforms:wa([A.lights,
+A.fog,{color:{value:new D(0)},opacity:{value:1}}]),vertexShader:M.shadow_vert,fragmentShader:M.shadow_frag}};gb.physical={uniforms:wa([gb.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new v(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new D(0)},transparency:{value:0}}]),vertexShader:M.meshphysical_vert,fragmentShader:M.meshphysical_frag};qb.prototype=Object.create(W.prototype);qb.prototype.constructor=
+qb;qb.prototype.isCubeTexture=!0;Object.defineProperty(qb.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});Hc.prototype=Object.create(W.prototype);Hc.prototype.constructor=Hc;Hc.prototype.isDataTexture2DArray=!0;Ic.prototype=Object.create(W.prototype);Ic.prototype.constructor=Ic;Ic.prototype.isDataTexture3D=!0;var Bh=new W,Ej=new Hc,Gj=new Ic,Ch=new qb,vh=[],xh=[],Ah=new Float32Array(16),zh=new Float32Array(9),yh=new Float32Array(4);Dh.prototype.updateCache=function(a){var b=
+this.cache;a instanceof Float32Array&&b.length!==a.length&&(this.cache=new Float32Array(a.length));Ja(b,a)};Eh.prototype.setValue=function(a,b,c){for(var d=this.seq,e=0,f=d.length;e!==f;++e){var g=d[e];g.setValue(a,b[g.id],c)}};var eg=/([\w\d_]+)(\])?(\[|\.)?/g;Gb.prototype.setValue=function(a,b,c,d){b=this.map[b];void 0!==b&&b.setValue(a,c,d)};Gb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Gb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],
+h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Gb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var lk=0,gg=/^[ \t]*#include +<([\w\d./]+)>/gm,Nh=/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Mh=/#pragma unroll_loop_start[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}[\s]+?#pragma unroll_loop_end/g,vk=0;Hb.prototype=Object.create(K.prototype);Hb.prototype.constructor=
+Hb;Hb.prototype.isMeshDepthMaterial=!0;Hb.prototype.copy=function(a){K.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Ib.prototype=Object.create(K.prototype);Ib.prototype.constructor=
+Ib;Ib.prototype.isMeshDistanceMaterial=!0;Ib.prototype.copy=function(a){K.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;return this};Le.prototype=Object.assign(Object.create(P.prototype),
+{constructor:Le,isArrayCamera:!0});Kc.prototype=Object.assign(Object.create(y.prototype),{constructor:Kc,isGroup:!0});Object.assign(Me.prototype,{constructor:Me,getTargetRaySpace:function(){null===this._targetRay&&(this._targetRay=new Kc,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1);return this._targetRay},getGripSpace:function(){null===this._grip&&(this._grip=new Kc,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1);return this._grip},dispatchEvent:function(a){null!==this._targetRay&&
+this._targetRay.dispatchEvent(a);null!==this._grip&&this._grip.dispatchEvent(a);return this},disconnect:function(a){this.dispatchEvent({type:"disconnected",data:a});null!==this._targetRay&&(this._targetRay.visible=!1);null!==this._grip&&(this._grip.visible=!1);return this},update:function(a,b,c){var d=null,e=null,f=this._targetRay,g=this._grip;a&&(null!==f&&(d=b.getPose(a.targetRaySpace,c),null!==d&&(f.matrix.fromArray(d.transform.matrix),f.matrix.decompose(f.position,f.rotation,f.scale))),null!==
+g&&a.gripSpace&&(e=b.getPose(a.gripSpace,c),null!==e&&(g.matrix.fromArray(e.transform.matrix),g.matrix.decompose(g.position,g.rotation,g.scale))));null!==f&&(f.visible=null!==d);null!==g&&(g.visible=null!==e);return this}});Object.assign(Uh.prototype,ua.prototype);Object.assign(Ne.prototype,{isFogExp2:!0,clone:function(){return new Ne(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}});Object.assign(Oe.prototype,{isFog:!0,clone:function(){return new Oe(this.color,
+this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}});Object.defineProperty(rb.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(rb.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(a){this.usage=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.usage=a.usage;return this},copyAt:function(a,b,c){a*=this.stride;
+c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});var sc=new p;Object.defineProperties(Kd.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(Kd.prototype,{isInterleavedBufferAttribute:!0,applyMatrix4:function(a){for(var b=
+0,c=this.data.count;b<c;b++)sc.x=this.getX(b),sc.y=this.getY(b),sc.z=this.getZ(b),sc.applyMatrix4(a),this.setXYZ(b,sc.x,sc.y,sc.z);return this},setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*
+this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},
+setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this},clone:function(){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");for(var a=[],b=0;b<this.count;b++)for(var c=b*this.data.stride+this.offset,d=0;d<this.itemSize;d++)a.push(this.data.array[c+d]);return new G(new this.array.constructor(a),this.itemSize,this.normalized)},
+toJSON:function(){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");for(var a=[],b=0;b<this.count;b++)for(var c=b*this.data.stride+this.offset,d=0;d<this.itemSize;d++)a.push(this.data.array[c+d]);return{itemSize:this.itemSize,type:this.array.constructor.name,array:a,normalized:this.normalized}}});Kb.prototype=Object.create(K.prototype);Kb.prototype.constructor=Kb;Kb.prototype.isSpriteMaterial=!0;Kb.prototype.copy=function(a){K.prototype.copy.call(this,
+a);this.color.copy(a.color);this.map=a.map;this.alphaMap=a.alphaMap;this.rotation=a.rotation;this.sizeAttenuation=a.sizeAttenuation;return this};var Lc,xe=new p,vd=new p,wd=new p,Mc=new v,Md=new v,Wh=new N,If=new p,ye=new p,Jf=new p,Di=new v,gh=new v,Ei=new v;Ld.prototype=Object.assign(Object.create(y.prototype),{constructor:Ld,isSprite:!0,raycast:function(a,b){null===a.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');vd.setFromMatrixScale(this.matrixWorld);
+Wh.copy(a.camera.matrixWorld);this.modelViewMatrix.multiplyMatrices(a.camera.matrixWorldInverse,this.matrixWorld);wd.setFromMatrixPosition(this.modelViewMatrix);a.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&vd.multiplyScalar(-wd.z);var c=this.material.rotation;if(0!==c){var d=Math.cos(c);var e=Math.sin(c)}c=this.center;Pe(If.set(-.5,-.5,0),wd,c,vd,e,d);Pe(ye.set(.5,-.5,0),wd,c,vd,e,d);Pe(Jf.set(.5,.5,0),wd,c,vd,e,d);Di.set(0,0);gh.set(1,0);Ei.set(1,1);var f=a.ray.intersectTriangle(If,
+ye,Jf,!1,xe);if(null===f&&(Pe(ye.set(-.5,.5,0),wd,c,vd,e,d),gh.set(0,1),f=a.ray.intersectTriangle(If,Jf,ye,!1,xe),null===f))return;e=a.ray.origin.distanceTo(xe);e<a.near||e>a.far||b.push({distance:e,point:xe.clone(),uv:pa.getUV(xe,If,ye,Jf,Di,gh,Ei,new v),face:null,object:this})},clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){y.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});var Kf=new p,Fi=new p;Nd.prototype=Object.assign(Object.create(y.prototype),
+{constructor:Nd,isLOD:!0,copy:function(a){y.prototype.copy.call(this,a,!1);for(var b=a.levels,c=0,d=b.length;c<d;c++){var e=b[c];this.addLevel(e.object.clone(),e.distance)}this.autoUpdate=a.autoUpdate;return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a);return this},getCurrentLevel:function(){return this._currentLevel},getObjectForDistance:function(a){var b=this.levels;if(0<
+b.length){for(var c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object}return null},raycast:function(a,b){if(0<this.levels.length){Kf.setFromMatrixPosition(this.matrixWorld);var c=a.ray.origin.distanceTo(Kf);this.getObjectForDistance(c).raycast(a,b)}},update:function(a){var b=this.levels;if(1<b.length){Kf.setFromMatrixPosition(a.matrixWorld);Fi.setFromMatrixPosition(this.matrixWorld);a=Kf.distanceTo(Fi)/a.zoom;b[0].object.visible=!0;for(var c=1,d=b.length;c<d;c++)if(a>=b[c].distance)b[c-
+1].object.visible=!1,b[c].object.visible=!0;else break;for(this._currentLevel=c-1;c<d;c++)b[c].object.visible=!1}},toJSON:function(a){a=y.prototype.toJSON.call(this,a);!1===this.autoUpdate&&(a.object.autoUpdate=!1);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Qe.prototype=Object.assign(Object.create(ea.prototype),{constructor:Qe,isSkinnedMesh:!0,bind:function(a,b){this.skeleton=a;void 0===b&&
+(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){for(var a=new R,b=this.geometry.attributes.skinWeight,c=0,d=b.count;c<d;c++){a.x=b.getX(c);a.y=b.getY(c);a.z=b.getZ(c);a.w=b.getW(c);var e=1/a.manhattanLength();Infinity!==e?a.multiplyScalar(e):a.set(1,0,0,0);b.setXYZW(c,a.x,a.y,a.z,a.w)}},updateMatrixWorld:function(a){ea.prototype.updateMatrixWorld.call(this,
+a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)},boneTransform:function(){var a=new p,b=new R,c=new R,d=new p,e=new N;return function(f,g){var h=this.skeleton,l=this.geometry;b.fromBufferAttribute(l.attributes.skinIndex,f);c.fromBufferAttribute(l.attributes.skinWeight,
+f);a.fromBufferAttribute(l.attributes.position,f).applyMatrix4(this.bindMatrix);g.set(0,0,0);for(f=0;4>f;f++)if(l=c.getComponent(f),0!==l){var m=b.getComponent(f);e.multiplyMatrices(h.bones[m].matrixWorld,h.boneInverses[m]);g.addScaledVector(d.copy(a).applyMatrix4(e),l)}return g.applyMatrix4(this.bindMatrixInverse)}}()});var Gi=new N,Qk=new N;Object.assign(Re.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new N;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);
+this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){for(var a=this.bones,b=this.boneInverses,c=this.boneMatrices,d=this.boneTexture,e=0,f=
+a.length;e<f;e++)Gi.multiplyMatrices(a[e]?a[e].matrixWorld:Qk,b[e]),Gi.toArray(c,16*e);void 0!==d&&(d.needsUpdate=!0)},clone:function(){return new Re(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name===a)return d}},dispose:function(){this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=void 0)}});kg.prototype=Object.assign(Object.create(y.prototype),{constructor:kg,isBone:!0});var Hi=new N,Ii=new N,Lf=[],ze=new ea;
+Se.prototype=Object.assign(Object.create(ea.prototype),{constructor:Se,isInstancedMesh:!0,getMatrixAt:function(a,b){b.fromArray(this.instanceMatrix.array,16*a)},raycast:function(a,b){var c=this.matrixWorld,d=this.count;ze.geometry=this.geometry;ze.material=this.material;if(void 0!==ze.material)for(var e=0;e<d;e++){this.getMatrixAt(e,Hi);Ii.multiplyMatrices(c,Hi);ze.matrixWorld=Ii;ze.raycast(a,Lf);for(var f=0,g=Lf.length;f<g;f++){var h=Lf[f];h.instanceId=e;h.object=this;b.push(h)}Lf.length=0}},setMatrixAt:function(a,
+b){b.toArray(this.instanceMatrix.array,16*a)},updateMorphTargets:function(){}});da.prototype=Object.create(K.prototype);da.prototype.constructor=da;da.prototype.isLineBasicMaterial=!0;da.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;this.morphTargets=a.morphTargets;return this};var Ji=new p,Ki=new p,Li=new N,Mf=new Wb,Ae=new eb;La.prototype=Object.assign(Object.create(y.prototype),{constructor:La,
+isLine:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[0],d=1,e=b.count;d<e;d++)Ji.fromBufferAttribute(b,d-1),Ki.fromBufferAttribute(b,d),c[d]=c[d-1],c[d]+=Ji.distanceTo(Ki);a.setAttribute("lineDistance",new B(c,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,c[0]=0,d=1,e=b.length;d<e;d++)c[d]=
+c[d-1],c[d]+=b[d-1].distanceTo(b[d]);return this},raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Line.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Ae.copy(c.boundingSphere);Ae.applyMatrix4(d);Ae.radius+=e;if(!1!==a.ray.intersectsSphere(Ae)){Li.getInverse(d);Mf.copy(a.ray).applyMatrix4(Li);d=e/((this.scale.x+this.scale.y+this.scale.z)/3);d*=d;var f=new p,g=new p;e=new p;var h=new p,l=this&&this.isLineSegments?2:1;if(c.isBufferGeometry){var m=c.index,k=c.attributes.position.array;
+if(null!==m){m=m.array;c=0;for(var n=m.length-1;c<n;c+=l){var t=m[c+1];f.fromArray(k,3*m[c]);g.fromArray(k,3*t);t=Mf.distanceSqToSegment(f,g,h,e);t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}}else for(c=0,n=k.length/3-1;c<n;c+=l)f.fromArray(k,3*c),g.fromArray(k,3*c+3),t=Mf.distanceSqToSegment(f,g,h,e),t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),
+t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}else if(c.isGeometry)for(f=c.vertices,g=f.length,c=0;c<g-1;c+=l)t=Mf.distanceSqToSegment(f[c],f[c+1],h,e),t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=
+a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
+var Nf=new p,Of=new p;ma.prototype=Object.assign(Object.create(La.prototype),{constructor:ma,isLineSegments:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[],d=0,e=b.count;d<e;d+=2)Nf.fromBufferAttribute(b,d),Of.fromBufferAttribute(b,d+1),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Nf.distanceTo(Of);a.setAttribute("lineDistance",new B(c,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
+else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,d=0,e=b.length;d<e;d+=2)Nf.copy(b[d]),Of.copy(b[d+1]),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Nf.distanceTo(Of);return this}});Te.prototype=Object.assign(Object.create(La.prototype),{constructor:Te,isLineLoop:!0});Xa.prototype=Object.create(K.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isPointsMaterial=!0;Xa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.alphaMap=a.alphaMap;this.size=a.size;
+this.sizeAttenuation=a.sizeAttenuation;this.morphTargets=a.morphTargets;return this};var Mi=new N,mg=new Wb,Be=new eb,Pf=new p;Nc.prototype=Object.assign(Object.create(y.prototype),{constructor:Nc,isPoints:!0,raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Points.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Be.copy(c.boundingSphere);Be.applyMatrix4(d);Be.radius+=e;if(!1!==a.ray.intersectsSphere(Be))if(Mi.getInverse(d),mg.copy(a.ray).applyMatrix4(Mi),e/=(this.scale.x+
+this.scale.y+this.scale.z)/3,e*=e,c.isBufferGeometry){var f=c.index;c=c.attributes.position.array;if(null!==f){var g=f.array;f=0;for(var h=g.length;f<h;f++){var l=g[f];Pf.fromArray(c,3*l);lg(Pf,l,e,d,a,b,this)}}else for(f=0,g=c.length/3;f<g;f++)Pf.fromArray(c,3*f),lg(Pf,f,e,d,a,b,this)}else for(c=c.vertices,f=0,g=c.length;f<g;f++)lg(c[f],f,e,d,a,b,this)},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==
+c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});ng.prototype=Object.assign(Object.create(W.prototype),{constructor:ng,
+isVideoTexture:!0,update:function(){var a=this.image;a.readyState>=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Oc.prototype=Object.create(W.prototype);Oc.prototype.constructor=Oc;Oc.prototype.isCompressedTexture=!0;Od.prototype=Object.create(W.prototype);Od.prototype.constructor=Od;Od.prototype.isCanvasTexture=!0;Pd.prototype=Object.create(W.prototype);Pd.prototype.constructor=Pd;Pd.prototype.isDepthTexture=!0;Pc.prototype=Object.create(F.prototype);Pc.prototype.constructor=Pc;Qd.prototype=Object.create(L.prototype);
+Qd.prototype.constructor=Qd;Qc.prototype=Object.create(F.prototype);Qc.prototype.constructor=Qc;Rd.prototype=Object.create(L.prototype);Rd.prototype.constructor=Rd;Ga.prototype=Object.create(F.prototype);Ga.prototype.constructor=Ga;Sd.prototype=Object.create(L.prototype);Sd.prototype.constructor=Sd;Rc.prototype=Object.create(Ga.prototype);Rc.prototype.constructor=Rc;Td.prototype=Object.create(L.prototype);Td.prototype.constructor=Td;bc.prototype=Object.create(Ga.prototype);bc.prototype.constructor=
+bc;Ud.prototype=Object.create(L.prototype);Ud.prototype.constructor=Ud;Sc.prototype=Object.create(Ga.prototype);Sc.prototype.constructor=Sc;Vd.prototype=Object.create(L.prototype);Vd.prototype.constructor=Vd;Tc.prototype=Object.create(Ga.prototype);Tc.prototype.constructor=Tc;Wd.prototype=Object.create(L.prototype);Wd.prototype.constructor=Wd;cc.prototype=Object.create(F.prototype);cc.prototype.constructor=cc;cc.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);a.path=this.parameters.path.toJSON();
+return a};Xd.prototype=Object.create(L.prototype);Xd.prototype.constructor=Xd;Uc.prototype=Object.create(F.prototype);Uc.prototype.constructor=Uc;Yd.prototype=Object.create(L.prototype);Yd.prototype.constructor=Yd;Vc.prototype=Object.create(F.prototype);Vc.prototype.constructor=Vc;var Rk={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Xh(a,0,e,c,!0),g=[];if(!f||f.next===f.prev)return g;var h;if(d){var l=c;d=[];var m;var k=0;for(m=b.length;k<m;k++){var n=b[k]*l;var p=k<
+m-1?b[k+1]*l:a.length;n=Xh(a,n,p,l,!1);n===n.next&&(n.steiner=!0);d.push(Dk(n))}d.sort(Bk);for(k=0;k<d.length;k++){l=d[k];b=f;if(b=Ck(l,b))l=$h(b,l),Lb(b,b.next),Lb(l,l.next);f=Lb(f,f.next)}}if(a.length>80*c){var r=h=a[0];var q=d=a[1];for(l=c;l<e;l+=c)k=a[l],b=a[l+1],k<r&&(r=k),b<q&&(q=b),k>h&&(h=k),b>d&&(d=b);h=Math.max(h-r,d-q);h=0!==h?1/h:0}$d(f,g,c,r,q,h);return g}},sb={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>
+sb.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];ai(a);bi(c,a);var f=a.length;b.forEach(ai);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,bi(c,b[a]);b=Rk.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};dc.prototype=Object.create(L.prototype);dc.prototype.constructor=dc;dc.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return ci(this.parameters.shapes,this.parameters.options,a)};hb.prototype=Object.create(F.prototype);hb.prototype.constructor=
+hb;hb.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);return ci(this.parameters.shapes,this.parameters.options,a)};var Ek={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new v(b[3*c],b[3*c+1]),new v(a,d),new v(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],l=b[3*d+1];d=b[3*d+2];var k=b[3*e],p=b[3*e+1];e=b[3*e+2];var n=b[3*f],t=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-l)?[new v(a,1-c),new v(h,1-d),
+new v(k,1-e),new v(n,1-b)]:[new v(g,1-c),new v(l,1-d),new v(p,1-e),new v(t,1-b)]}};be.prototype=Object.create(L.prototype);be.prototype.constructor=be;Xc.prototype=Object.create(hb.prototype);Xc.prototype.constructor=Xc;ce.prototype=Object.create(L.prototype);ce.prototype.constructor=ce;ec.prototype=Object.create(F.prototype);ec.prototype.constructor=ec;de.prototype=Object.create(L.prototype);de.prototype.constructor=de;Yc.prototype=Object.create(F.prototype);Yc.prototype.constructor=Yc;ee.prototype=
+Object.create(L.prototype);ee.prototype.constructor=ee;Zc.prototype=Object.create(F.prototype);Zc.prototype.constructor=Zc;fc.prototype=Object.create(L.prototype);fc.prototype.constructor=fc;fc.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return di(this.parameters.shapes,a)};gc.prototype=Object.create(F.prototype);gc.prototype.constructor=gc;gc.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);return di(this.parameters.shapes,a)};$c.prototype=Object.create(F.prototype);
+$c.prototype.constructor=$c;hc.prototype=Object.create(L.prototype);hc.prototype.constructor=hc;tb.prototype=Object.create(F.prototype);tb.prototype.constructor=tb;fe.prototype=Object.create(hc.prototype);fe.prototype.constructor=fe;ge.prototype=Object.create(tb.prototype);ge.prototype.constructor=ge;he.prototype=Object.create(L.prototype);he.prototype.constructor=he;ad.prototype=Object.create(F.prototype);ad.prototype.constructor=ad;var ra=Object.freeze({__proto__:null,WireframeGeometry:Pc,ParametricGeometry:Qd,
+ParametricBufferGeometry:Qc,TetrahedronGeometry:Sd,TetrahedronBufferGeometry:Rc,OctahedronGeometry:Td,OctahedronBufferGeometry:bc,IcosahedronGeometry:Ud,IcosahedronBufferGeometry:Sc,DodecahedronGeometry:Vd,DodecahedronBufferGeometry:Tc,PolyhedronGeometry:Rd,PolyhedronBufferGeometry:Ga,TubeGeometry:Wd,TubeBufferGeometry:cc,TorusKnotGeometry:Xd,TorusKnotBufferGeometry:Uc,TorusGeometry:Yd,TorusBufferGeometry:Vc,TextGeometry:be,TextBufferGeometry:Xc,SphereGeometry:ce,SphereBufferGeometry:ec,RingGeometry:de,
+RingBufferGeometry:Yc,PlaneGeometry:Fd,PlaneBufferGeometry:ac,LatheGeometry:ee,LatheBufferGeometry:Zc,ShapeGeometry:fc,ShapeBufferGeometry:gc,ExtrudeGeometry:dc,ExtrudeBufferGeometry:hb,EdgesGeometry:$c,ConeGeometry:fe,ConeBufferGeometry:ge,CylinderGeometry:hc,CylinderBufferGeometry:tb,CircleGeometry:he,CircleBufferGeometry:ad,BoxGeometry:fh,BoxBufferGeometry:Gd});ic.prototype=Object.create(K.prototype);ic.prototype.constructor=ic;ic.prototype.isShadowMaterial=!0;ic.prototype.copy=function(a){K.prototype.copy.call(this,
+a);this.color.copy(a.color);return this};ub.prototype=Object.create(Ca.prototype);ub.prototype.constructor=ub;ub.prototype.isRawShaderMaterial=!0;ib.prototype=Object.create(K.prototype);ib.prototype.constructor=ib;ib.prototype.isMeshStandardMaterial=!0;ib.prototype.copy=function(a){K.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;
+this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=
+a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.vertexTangents=a.vertexTangents;return this};jc.prototype=Object.create(ib.prototype);jc.prototype.constructor=jc;jc.prototype.isMeshPhysicalMaterial=
+!0;jc.prototype.copy=function(a){ib.prototype.copy.call(this,a);this.defines={STANDARD:"",PHYSICAL:""};this.clearcoat=a.clearcoat;this.clearcoatMap=a.clearcoatMap;this.clearcoatRoughness=a.clearcoatRoughness;this.clearcoatRoughnessMap=a.clearcoatRoughnessMap;this.clearcoatNormalMap=a.clearcoatNormalMap;this.clearcoatNormalScale.copy(a.clearcoatNormalScale);this.reflectivity=a.reflectivity;this.sheen=a.sheen?(this.sheen||new D).copy(a.sheen):null;this.transparency=a.transparency;return this};Mb.prototype=
+Object.create(K.prototype);Mb.prototype.constructor=Mb;Mb.prototype.isMeshPhongMaterial=!0;Mb.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;
+this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=
+a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};kc.prototype=Object.create(K.prototype);kc.prototype.constructor=kc;kc.prototype.isMeshToonMaterial=!0;kc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.gradientMap=a.gradientMap;this.lightMap=a.lightMap;this.lightMapIntensity=
+a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;
+this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};lc.prototype=Object.create(K.prototype);lc.prototype.constructor=lc;lc.prototype.isMeshNormalMaterial=!0;lc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;
+this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};mc.prototype=Object.create(K.prototype);mc.prototype.constructor=mc;mc.prototype.isMeshLambertMaterial=!0;mc.prototype.copy=function(a){K.prototype.copy.call(this,
+a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;
+this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};nc.prototype=Object.create(K.prototype);nc.prototype.constructor=nc;nc.prototype.isMeshMatcapMaterial=!0;nc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.defines={MATCAP:""};this.color.copy(a.color);this.matcap=a.matcap;this.map=a.map;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=
+a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.alphaMap=a.alphaMap;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};oc.prototype=Object.create(da.prototype);oc.prototype.constructor=oc;oc.prototype.isLineDashedMaterial=!0;oc.prototype.copy=function(a){da.prototype.copy.call(this,a);
+this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Sk=Object.freeze({__proto__:null,ShadowMaterial:ic,SpriteMaterial:Kb,RawShaderMaterial:ub,ShaderMaterial:Ca,PointsMaterial:Xa,MeshPhysicalMaterial:jc,MeshStandardMaterial:ib,MeshPhongMaterial:Mb,MeshToonMaterial:kc,MeshNormalMaterial:lc,MeshLambertMaterial:mc,MeshDepthMaterial:Hb,MeshDistanceMaterial:Ib,MeshBasicMaterial:Pa,MeshMatcapMaterial:nc,LineDashedMaterial:oc,LineBasicMaterial:da,Material:K}),ka={arraySlice:function(a,
+b,c){return ka.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=
+new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,l=0;l!==b;++l)e[g++]=a[h+l];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];
+while(void 0!==f)}}},subclip:function(a,b,c,d,e){e=e||30;a=a.clone();a.name=b;var f=[];for(b=0;b<a.tracks.length;++b){for(var g=a.tracks[b],h=g.getValueSize(),l=[],k=[],p=0;p<g.times.length;++p){var n=g.times[p]*e;if(!(n<c||n>=d))for(l.push(g.times[p]),n=0;n<h;++n)k.push(g.values[p*h+n])}0!==l.length&&(g.times=ka.convertArray(l,g.times.constructor),g.values=ka.convertArray(k,g.values.constructor),f.push(g))}a.tracks=f;c=Infinity;for(b=0;b<a.tracks.length;++b)c>a.tracks[b].times[0]&&(c=a.tracks[b].times[0]);
+for(b=0;b<a.tracks.length;++b)a.tracks[b].shift(-1*c);a.resetDuration();return a},makeClipAdditive:function(a,b,c,d){void 0===b&&(b=0);void 0===c&&(c=a);if(void 0===d||0>=d)d=30;var e=a.tracks.length;b/=d;for(d=0;d<e;++d){var f=c.tracks[d],g=f.ValueTypeName;if("bool"!==g&&"string"!==g){var h=a.tracks.find(function(a){return a.name===f.name&&a.ValueTypeName===g});if(void 0!==h){var l=f.getValueSize(),k=f.times.length-1;b<=f.times[0]?k=ka.arraySlice(f.values,0,f.valueSize):b>=f.times[k]?k=ka.arraySlice(f.values,
+k*l):(k=f.createInterpolant(),k.evaluate(b),k=k.resultBuffer);"quaternion"===g&&(new va(k[0],k[1],k[2],k[3])).normalize().conjugate().toArray(k);for(var p=h.times.length,n=0;n<p;++n){var t=n*l;if("quaternion"===g)va.multiplyQuaternionsFlat(h.values,t,k,0,h.values,t);else for(var r=0;r<l;++r)h.values[t+r]-=k[r]}}}}a.blendMode=2501;return a}};Object.assign(Ma.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===
+d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-
+1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(){throw Error("call to abstract method");},intervalChanged_:function(){}});Object.assign(Ma.prototype,{beforeStart_:Ma.prototype.copySampleValue_,
+afterEnd_:Ma.prototype.copySampleValue_});Xe.prototype=Object.assign(Object.create(Ma.prototype),{constructor:Xe,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];
+break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,l=this._offsetPrev,k=this._offsetNext,p=this._weightPrev,n=this._weightNext,t=(c-b)/(d-b);c=t*t;d=c*t;b=-p*d+2*p*c-p*t;p=(1+p)*d+(-1.5-2*p)*c+(-.5+p)*t+1;t=(-1-n)*d+(1.5+n)*c+.5*t;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[l+c]+p*f[h+c]+t*f[a+c]+n*f[k+c];
+return e}});ie.prototype=Object.assign(Object.create(Ma.prototype),{constructor:ie,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Ye.prototype=Object.assign(Object.create(Ma.prototype),{constructor:Ye,interpolate_:function(a){return this.copySampleValue_(a-1)}});Object.assign(ta,{toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{b={name:a.name,
+times:ka.convertArray(a.times,Array),values:ka.convertArray(a.values,Array)};var c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b}});Object.assign(ta.prototype,{constructor:ta,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Ye(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new ie(this.times,this.values,this.getValueSize(),
+a)},InterpolantFactoryMethodSmooth:function(a){return new Xe(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);
+else throw Error(b);console.warn("THREE.KeyframeTrack:",b);return this}this.createInterpolant=b;return this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==
+a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=ka.arraySlice(c,e,f),this.values=ka.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),a=!1);var c=this.times;
+b=this.values;var d=c.length;0===d&&(console.error("THREE.KeyframeTrack: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrack: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ka.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrack: Value is not a valid number.",
+this,f,d);a=!1;break}return a},optimize:function(){for(var a=ka.arraySlice(this.times),b=ka.arraySlice(this.values),c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,l=a[g];if(l!==a[g+1]&&(1!==g||l!==l[0]))if(d)h=!0;else{var k=g*c,p=k-c,n=k+c;for(l=0;l!==c;++l){var t=b[k+l];if(t!==b[p+l]||t!==b[n+l]){h=!0;break}}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,k=e*c,l=0;l!==c;++l)b[k+l]=b[h+l];++e}}if(0<f){a[e]=a[f];h=f*c;k=e*c;for(l=0;l!==c;++l)b[k+l]=b[h+l];++e}e!==
+a.length?(this.times=ka.arraySlice(a,0,e),this.values=ka.arraySlice(b,0,e*c)):(this.times=a,this.values=b);return this},clone:function(){var a=ka.arraySlice(this.times,0),b=ka.arraySlice(this.values,0);a=new this.constructor(this.name,a,b);a.createInterpolant=this.createInterpolant;return a}});Ze.prototype=Object.assign(Object.create(ta.prototype),{constructor:Ze,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});
+$e.prototype=Object.assign(Object.create(ta.prototype),{constructor:$e,ValueTypeName:"color"});bd.prototype=Object.assign(Object.create(ta.prototype),{constructor:bd,ValueTypeName:"number"});af.prototype=Object.assign(Object.create(Ma.prototype),{constructor:af,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)va.slerpFlat(e,0,f,a-g,f,a,b);return e}});je.prototype=Object.assign(Object.create(ta.prototype),{constructor:je,
+ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new af(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});bf.prototype=Object.assign(Object.create(ta.prototype),{constructor:bf,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});cd.prototype=Object.assign(Object.create(ta.prototype),{constructor:cd,ValueTypeName:"vector"});
+Object.assign(Sa,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(Gk(c[e]).scale(d));return new Sa(a.name,a.duration,b,a.blendMode)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b,uuid:a.uuid,blendMode:a.blendMode};for(var d=0,e=c.length;d!==e;++d)b.push(ta.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],l=[];h.push((g+e-1)%e,g,(g+1)%e);l.push(0,1,0);var k=
+ka.getKeyframeOrder(h);h=ka.sortedArray(h,1,k);l=ka.sortedArray(l,1,k);d||0!==h[0]||(h.push(e),l.push(l[0]));f.push((new bd(".morphTargetInfluences["+b[g].name+"]",h,l)).scale(1/c))}return new Sa(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],l=h.name.match(e);
+if(l&&1<l.length){var k=l[1];(l=d[k])||(d[k]=l=[]);l.push(h)}}a=[];for(k in d)a.push(Sa.CreateFromMorphTargetSequence(k,d[k],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ka.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30,h=a.blendMode;a=a.hierarchy||[];for(var l=0;l<a.length;l++){var k=a[l].keys;
+if(k&&0!==k.length)if(k[0].morphTargets){f={};for(var p=0;p<k.length;p++)if(k[p].morphTargets)for(var n=0;n<k[p].morphTargets.length;n++)f[k[p].morphTargets[n]]=-1;for(var t in f){var r=[],q=[];for(n=0;n!==k[p].morphTargets.length;++n){var u=k[p];r.push(u.time);q.push(u.morphTarget===t?1:0)}d.push(new bd(".morphTargetInfluence["+t+"]",r,q))}f=f.length*(g||1)}else p=".bones["+b[l].name+"]",c(cd,p+".position",k,"pos",d),c(je,p+".quaternion",k,"rot",d),c(cd,p+".scale",k,"scl",d)}return 0===d.length?
+null:new Sa(e,f,d,h)}});Object.assign(Sa.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b){var d=this.tracks[b];a=Math.max(a,d.times[d.times.length-1])}this.duration=a;return this},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},validate:function(){for(var a=!0,b=0;b<this.tracks.length;b++)a=a&&this.tracks[b].validate();return a},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();
+return this},clone:function(){for(var a=[],b=0;b<this.tracks.length;b++)a.push(this.tracks[b].clone());return new Sa(this.name,this.duration,a,this.blendMode)}});var tc={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},ei=new qg;Object.assign(V.prototype,{load:function(){},loadAsync:function(a,b){var c=this;return new Promise(function(d,e){c.load(a,
+d,b,e)})},parse:function(){},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this},setResourcePath:function(a){this.resourcePath=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});var db={};Ta.prototype=Object.assign(Object.create(V.prototype),{constructor:Ta,load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=tc.get(a);if(void 0!==f)return e.manager.itemStart(a),
+setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==db[a])db[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=decodeURIComponent(g);h&&(g=atob(g));try{var l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":var k=new Uint8Array(g.length);for(h=0;h<g.length;h++)k[h]=g.charCodeAt(h);var p="blob"===l?new Blob([k.buffer],{type:c}):k.buffer;break;case "document":p=(new DOMParser).parseFromString(g,
+c);break;case "json":p=JSON.parse(g);break;default:p=g}setTimeout(function(){b&&b(p);e.manager.itemEnd(a)},0)}catch(t){setTimeout(function(){d&&d(t);e.manager.itemError(a);e.manager.itemEnd(a)},0)}}else{db[a]=[];db[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(b){var c=this.response,d=db[a];delete db[a];if(200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");tc.add(a,
+c);for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemError(a)}e.manager.itemEnd(a)},!1);n.addEventListener("progress",function(b){for(var c=db[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener("error",function(b){var c=db[a];delete db[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemError(a);e.manager.itemEnd(a)},!1);n.addEventListener("abort",
+function(b){var c=db[a];delete db[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemError(a);e.manager.itemEnd(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setResponseType:function(a){this.responseType=
+a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this}});rg.prototype=Object.assign(Object.create(V.prototype),{constructor:rg,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){for(var b=[],c=0;c<a.length;c++){var d=Sa.parse(a[c]);b.push(d)}return b}});sg.prototype=
+Object.assign(Object.create(V.prototype),{constructor:sg,load:function(a,b,c,d){function e(e){l.load(a[e],function(a){a=f.parse(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};k+=1;6===k&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Oc;h.image=g;var l=new Ta(this.manager);l.setPath(this.path);l.setResponseType("arraybuffer");if(Array.isArray(a))for(var k=0,p=0,n=a.length;p<n;++p)e(p);else l.load(a,function(a){a=
+f.parse(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h}});cf.prototype=Object.assign(Object.create(V.prototype),{constructor:cf,load:function(a,b,c,
+d){var e=this,f=new $b,g=new Ta(this.manager);g.setResponseType("arraybuffer");g.setPath(this.path);g.load(a,function(a){if(a=e.parse(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1006,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=
+a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps,f.minFilter=1008),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});dd.prototype=Object.assign(Object.create(V.prototype),{constructor:dd,load:function(a,b,c,d){function e(){l.removeEventListener("load",e,!1);l.removeEventListener("error",f,!1);tc.add(a,this);b&&b(this);g.manager.itemEnd(a)}function f(b){l.removeEventListener("load",e,!1);l.removeEventListener("error",f,!1);d&&d(b);
+g.manager.itemError(a);g.manager.itemEnd(a)}void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var g=this,h=tc.get(a);if(void 0!==h)return g.manager.itemStart(a),setTimeout(function(){b&&b(h);g.manager.itemEnd(a)},0),h;var l=document.createElementNS("http://www.w3.org/1999/xhtml","img");l.addEventListener("load",e,!1);l.addEventListener("error",f,!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(l.crossOrigin=this.crossOrigin);g.manager.itemStart(a);l.src=a;return l}});df.prototype=
+Object.assign(Object.create(V.prototype),{constructor:df,load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new qb,g=new dd(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f}});ef.prototype=Object.assign(Object.create(V.prototype),{constructor:ef,load:function(a,b,c,d){var e=new W,f=new dd(this.manager);f.setCrossOrigin(this.crossOrigin);f.setPath(this.path);
+f.load(a,function(c){e.image=c;c=0<a.search(/\.jpe?g($|\?)/i)||0===a.search(/^data:image\/jpeg/);e.format=c?1022:1023;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e}});Object.assign(H.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0===
+a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=
+!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a,b){var c=a-1E-4;a+=1E-4;0>c&&(c=0);1<a&&(a=1);c=this.getPoint(c);a=this.getPoint(a);b=b||(c.isVector2?new v:new p);b.copy(a).sub(c).normalize();return b},getTangentAt:function(a,b){a=this.getUtoTmapping(a);
+return this.getTangent(a,b)},computeFrenetFrames:function(a,b){var c=new p,d=[],e=[],f=[],g=new p,h=new N,l;for(l=0;l<=a;l++){var k=l/a;d[l]=this.getTangentAt(k,new p);d[l].normalize()}e[0]=new p;f[0]=new p;l=Number.MAX_VALUE;k=Math.abs(d[0].x);var v=Math.abs(d[0].y),n=Math.abs(d[0].z);k<=l&&(l=k,c.set(1,0,0));v<=l&&(l=v,c.set(0,1,0));n<=l&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(l=1;l<=a;l++)e[l]=e[l-1].clone(),f[l]=f[l-1].clone(),
+g.crossVectors(d[l-1],d[l]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(O.clamp(d[l-1].dot(d[l]),-1,1)),e[l].applyMatrix4(h.makeRotationAxis(g,c))),f[l].crossVectors(d[l],e[l]);if(!0===b)for(c=Math.acos(O.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),l=1;l<=a;l++)e[l].applyMatrix4(h.makeRotationAxis(d[l],c*l)),f[l].crossVectors(d[l],e[l]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=
+a.arcLengthDivisions;return this},toJSON:function(){var a={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};a.arcLengthDivisions=this.arcLengthDivisions;a.type=this.type;return a},fromJSON:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});Na.prototype=Object.create(H.prototype);Na.prototype.constructor=Na;Na.prototype.isEllipseCurve=!0;Na.prototype.getPoint=function(a,b){b=b||new v;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>
+d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!==this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,f)};Na.prototype.copy=function(a){H.prototype.copy.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;
+this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};Na.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.aX=this.aX;a.aY=this.aY;a.xRadius=this.xRadius;a.yRadius=this.yRadius;a.aStartAngle=this.aStartAngle;a.aEndAngle=this.aEndAngle;a.aClockwise=this.aClockwise;a.aRotation=this.aRotation;return a};Na.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=
+a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};ed.prototype=Object.create(Na.prototype);ed.prototype.constructor=ed;ed.prototype.isArcCurve=!0;var Qf=new p,hh=new tg,ih=new tg,jh=new tg;qa.prototype=Object.create(H.prototype);qa.prototype.constructor=qa;qa.prototype.isCatmullRomCurve3=!0;qa.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/
+d)+1)*d:0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Qf.subVectors(c[0],c[1]).add(c[0]),f=Qf;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Qf.subVectors(c[d-1],c[d-2]).add(c[d-1]),c=Qf);if("centripetal"===this.curveType||"chordal"===this.curveType){var l="chordal"===this.curveType?.5:.25;d=Math.pow(f.distanceToSquared(g),l);e=Math.pow(g.distanceToSquared(h),l);l=Math.pow(h.distanceToSquared(c),l);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>l&&(l=e);hh.initNonuniformCatmullRom(f.x,
+g.x,h.x,c.x,d,e,l);ih.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,l);jh.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,l)}else"catmullrom"===this.curveType&&(hh.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),ih.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),jh.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(hh.calc(a),ih.calc(a),jh.calc(a));return b};qa.prototype.copy=function(a){H.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());
+this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};qa.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());a.closed=this.closed;a.curveType=this.curveType;a.tension=this.tension;return a};qa.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new p).fromArray(d))}this.closed=
+a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};Ya.prototype=Object.create(H.prototype);Ya.prototype.constructor=Ya;Ya.prototype.isCubicBezierCurve=!0;Ya.prototype.getPoint=function(a,b){b=b||new v;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(le(a,c.x,d.x,e.x,f.x),le(a,c.y,d.y,e.y,f.y));return b};Ya.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Ya.prototype.toJSON=function(){var a=
+H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};Ya.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};jb.prototype=Object.create(H.prototype);jb.prototype.constructor=jb;jb.prototype.isCubicBezierCurve3=!0;jb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;
+b.set(le(a,c.x,d.x,e.x,f.x),le(a,c.y,d.y,e.y,f.y),le(a,c.z,d.z,e.z,f.z));return b};jb.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};jb.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};jb.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);
+this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};Ia.prototype=Object.create(H.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isLineCurve=!0;Ia.prototype.getPoint=function(a,b){b=b||new v;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};Ia.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ia.prototype.getTangent=function(a,b){a=b||new v;return a=a.copy(this.v2).sub(this.v1).normalize()};Ia.prototype.copy=function(a){H.prototype.copy.call(this,
+a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ia.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ia.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Za.prototype=Object.create(H.prototype);Za.prototype.constructor=Za;Za.prototype.isLineCurve3=!0;Za.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),
+b.multiplyScalar(a).add(this.v1));return b};Za.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Za.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Za.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Za.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};$a.prototype=Object.create(H.prototype);
+$a.prototype.constructor=$a;$a.prototype.isQuadraticBezierCurve=!0;$a.prototype.getPoint=function(a,b){b=b||new v;var c=this.v0,d=this.v1,e=this.v2;b.set(ke(a,c.x,d.x,e.x),ke(a,c.y,d.y,e.y));return b};$a.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};$a.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};$a.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,
+a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};kb.prototype=Object.create(H.prototype);kb.prototype.constructor=kb;kb.prototype.isQuadraticBezierCurve3=!0;kb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2;b.set(ke(a,c.x,d.x,e.x),ke(a,c.y,d.y,e.y),ke(a,c.z,d.z,e.z));return b};kb.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};kb.prototype.toJSON=function(){var a=
+H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};kb.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};ab.prototype=Object.create(H.prototype);ab.prototype.constructor=ab;ab.prototype.isSplineCurve=!0;ab.prototype.getPoint=function(a,b){b=b||new v;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-
+2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(fi(d,e.x,f.x,g.x,c.x),fi(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){H.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};ab.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());return a};ab.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,
+a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new v).fromArray(d))}return this};var kh=Object.freeze({__proto__:null,ArcCurve:ed,CatmullRomCurve3:qa,CubicBezierCurve:Ya,CubicBezierCurve3:jb,EllipseCurve:Na,LineCurve:Ia,LineCurve3:Za,QuadraticBezierCurve:$a,QuadraticBezierCurve3:kb,SplineCurve:ab});vb.prototype=Object.assign(Object.create(H.prototype),{constructor:vb,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),
+b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new Ia(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&
+this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++){var f=e[d];f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&(f.isLineCurve||f.isLineCurve3)?1:f&&f.isSplineCurve?
+a*f.points.length:a);for(var g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){H.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this},toJSON:function(){var a=H.prototype.toJSON.call(this);a.autoClose=this.autoClose;a.curves=[];for(var b=0,c=this.curves.length;b<c;b++)a.curves.push(this.curves[b].toJSON());
+return a},fromJSON:function(a){H.prototype.fromJSON.call(this,a);this.autoClose=a.autoClose;this.curves=[];for(var b=0,c=a.curves.length;b<c;b++){var d=a.curves[b];this.curves.push((new kh[d.type]).fromJSON(d))}return this}});bb.prototype=Object.assign(Object.create(vb.prototype),{constructor:bb,setFromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y);return this},moveTo:function(a,b){this.currentPoint.set(a,b);return this},lineTo:function(a,b){var c=
+new Ia(this.currentPoint.clone(),new v(a,b));this.curves.push(c);this.currentPoint.set(a,b);return this},quadraticCurveTo:function(a,b,c,d){a=new $a(this.currentPoint.clone(),new v(a,b),new v(c,d));this.curves.push(a);this.currentPoint.set(c,d);return this},bezierCurveTo:function(a,b,c,d,e,f){a=new Ya(this.currentPoint.clone(),new v(a,b),new v(c,d),new v(e,f));this.curves.push(a);this.currentPoint.set(e,f);return this},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a);b=new ab(b);
+this.curves.push(b);this.currentPoint.copy(a[a.length-1]);return this},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f);return this},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f);return this},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h);return this},absellipse:function(a,b,c,d,e,f,g,h){a=new Na(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,
+b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a);return this},copy:function(a){vb.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this},toJSON:function(){var a=vb.prototype.toJSON.call(this);a.currentPoint=this.currentPoint.toArray();return a},fromJSON:function(a){vb.prototype.fromJSON.call(this,a);this.currentPoint.fromArray(a.currentPoint);return this}});Nb.prototype=Object.assign(Object.create(bb.prototype),{constructor:Nb,getPointsHoles:function(a){for(var b=
+[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},copy:function(a){bb.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this},toJSON:function(){var a=bb.prototype.toJSON.call(this);a.uuid=this.uuid;a.holes=[];for(var b=0,c=this.holes.length;b<c;b++)a.holes.push(this.holes[b].toJSON());return a},fromJSON:function(a){bb.prototype.fromJSON.call(this,
+a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new bb).fromJSON(d))}return this}});S.prototype=Object.assign(Object.create(y.prototype),{constructor:S,isLight:!0,copy:function(a){y.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=
+this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});ff.prototype=Object.assign(Object.create(S.prototype),{constructor:ff,isHemisphereLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});
+Object.assign(lb.prototype,{_projScreenMatrix:new N,_lightPositionWorld:new p,_lookTarget:new p,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(a){var b=this.camera,c=this.matrix,d=this._projScreenMatrix,e=this._lookTarget,f=this._lightPositionWorld;f.setFromMatrixPosition(a.matrixWorld);b.position.copy(f);e.setFromMatrixPosition(a.target.matrixWorld);b.lookAt(e);b.updateMatrixWorld();d.multiplyMatrices(b.projectionMatrix,
+b.matrixWorldInverse);this._frustum.setFromProjectionMatrix(d);c.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);c.multiply(b.projectionMatrix);c.multiply(b.matrixWorldInverse)},getViewport:function(a){return this._viewports[a]},getFrameExtents:function(){return this._frameExtents},copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&
+(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});gf.prototype=Object.assign(Object.create(lb.prototype),{constructor:gf,isSpotLightShadow:!0,updateMatrices:function(a){var b=this.camera,c=2*O.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height,e=a.distance||b.far;if(c!==b.fov||d!==b.aspect||e!==b.far)b.fov=c,b.aspect=d,b.far=e,b.updateProjectionMatrix();
+lb.prototype.updateMatrices.call(this,a)}});hf.prototype=Object.assign(Object.create(S.prototype),{constructor:hf,isSpotLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});ug.prototype=Object.assign(Object.create(lb.prototype),{constructor:ug,isPointLightShadow:!0,updateMatrices:function(a,b){void 0===b&&(b=0);var c=this.camera,d=this.matrix,
+e=this._lightPositionWorld,f=this._lookTarget,g=this._projScreenMatrix;e.setFromMatrixPosition(a.matrixWorld);c.position.copy(e);f.copy(c.position);f.add(this._cubeDirections[b]);c.up.copy(this._cubeUps[b]);c.lookAt(f);c.updateMatrixWorld();d.makeTranslation(-e.x,-e.y,-e.z);g.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse);this._frustum.setFromProjectionMatrix(g)}});jf.prototype=Object.assign(Object.create(S.prototype),{constructor:jf,isPointLight:!0,copy:function(a){S.prototype.copy.call(this,
+a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});fd.prototype=Object.assign(Object.create(fb.prototype),{constructor:fd,isOrthographicCamera:!0,copy:function(a,b){fb.prototype.copy.call(this,a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,
+fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/
+2,e=c-a;c+=a;a=d+b;b=d-b;null!==this.view&&this.view.enabled&&(d=(this.right-this.left)/this.view.fullWidth/this.zoom,b=(this.top-this.bottom)/this.view.fullHeight/this.zoom,e+=d*this.view.offsetX,c=e+d*this.view.width,a-=b*this.view.offsetY,b=a-b*this.view.height);this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=
+this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});kf.prototype=Object.assign(Object.create(lb.prototype),{constructor:kf,isDirectionalLightShadow:!0,updateMatrices:function(a){lb.prototype.updateMatrices.call(this,a)}});lf.prototype=Object.assign(Object.create(S.prototype),{constructor:lf,isDirectionalLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.target=
+a.target.clone();this.shadow=a.shadow.clone();return this}});mf.prototype=Object.assign(Object.create(S.prototype),{constructor:mf,isAmbientLight:!0});nf.prototype=Object.assign(Object.create(S.prototype),{constructor:nf,isRectAreaLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=S.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});Object.assign(of.prototype,{isSphericalHarmonics3:!0,
+set:function(a){for(var b=0;9>b;b++)this.coefficients[b].copy(a[b]);return this},zero:function(){for(var a=0;9>a;a++)this.coefficients[a].set(0,0,0);return this},getAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.282095);b.addScaledVector(e[1],.488603*d);b.addScaledVector(e[2],.488603*a);b.addScaledVector(e[3],.488603*c);b.addScaledVector(e[4],1.092548*c*d);b.addScaledVector(e[5],1.092548*d*a);b.addScaledVector(e[6],.315392*(3*a*a-1));b.addScaledVector(e[7],
+1.092548*c*a);b.addScaledVector(e[8],.546274*(c*c-d*d));return b},getIrradianceAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.886227);b.addScaledVector(e[1],1.023328*d);b.addScaledVector(e[2],1.023328*a);b.addScaledVector(e[3],1.023328*c);b.addScaledVector(e[4],.858086*c*d);b.addScaledVector(e[5],.858086*d*a);b.addScaledVector(e[6],.743125*a*a-.247708);b.addScaledVector(e[7],.858086*c*a);b.addScaledVector(e[8],.429043*(c*c-d*d));return b},add:function(a){for(var b=
+0;9>b;b++)this.coefficients[b].add(a.coefficients[b]);return this},addScaledSH:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].addScaledVector(a.coefficients[c],b);return this},scale:function(a){for(var b=0;9>b;b++)this.coefficients[b].multiplyScalar(a);return this},lerp:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].lerp(a.coefficients[c],b);return this},equals:function(a){for(var b=0;9>b;b++)if(!this.coefficients[b].equals(a.coefficients[b]))return!1;return!0},copy:function(a){return this.set(a.coefficients)},
+clone:function(){return(new this.constructor).copy(this)},fromArray:function(a,b){void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].fromArray(a,b+3*d);return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].toArray(a,b+3*d);return a}});Object.assign(of,{getBasisAt:function(a,b){var c=a.x,d=a.y;a=a.z;b[0]=.282095;b[1]=.488603*d;b[2]=.488603*a;b[3]=.488603*c;b[4]=1.092548*c*d;b[5]=1.092548*d*a;b[6]=.315392*(3*a*a-1);b[7]=1.092548*
+c*a;b[8]=.546274*(c*c-d*d)}});Ua.prototype=Object.assign(Object.create(S.prototype),{constructor:Ua,isLightProbe:!0,copy:function(a){S.prototype.copy.call(this,a);this.sh.copy(a.sh);return this},fromJSON:function(a){this.intensity=a.intensity;this.sh.fromArray(a.sh);return this},toJSON:function(a){a=S.prototype.toJSON.call(this,a);a.object.sh=this.sh.toArray();return a}});pf.prototype=Object.assign(Object.create(V.prototype),{constructor:pf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);
+f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Sk[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.sheen&&(d.sheen=(new D).setHex(a.sheen));
+void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearcoat&&(d.clearcoat=a.clearcoat);void 0!==a.clearcoatRoughness&&(d.clearcoatRoughness=a.clearcoatRoughness);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.combine&&(d.combine=a.combine);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=
+a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.stencilWrite&&(d.stencilWrite=a.stencilWrite);void 0!==a.stencilWriteMask&&(d.stencilWriteMask=a.stencilWriteMask);void 0!==a.stencilFunc&&(d.stencilFunc=a.stencilFunc);void 0!==a.stencilRef&&(d.stencilRef=a.stencilRef);void 0!==
+a.stencilFuncMask&&(d.stencilFuncMask=a.stencilFuncMask);void 0!==a.stencilFail&&(d.stencilFail=a.stencilFail);void 0!==a.stencilZFail&&(d.stencilZFail=a.stencilZFail);void 0!==a.stencilZPass&&(d.stencilZPass=a.stencilZPass);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&
+(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.polygonOffset&&(d.polygonOffset=a.polygonOffset);void 0!==a.polygonOffsetFactor&&(d.polygonOffsetFactor=a.polygonOffsetFactor);void 0!==a.polygonOffsetUnits&&(d.polygonOffsetUnits=a.polygonOffsetUnits);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);
+void 0!==a.morphNormals&&(d.morphNormals=a.morphNormals);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.vertexTangents&&(d.vertexTangents=a.vertexTangents);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.toneMapped&&(d.toneMapped=a.toneMapped);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.vertexColors&&(d.vertexColors="number"===typeof a.vertexColors?0<a.vertexColors?!0:!1:a.vertexColors);if(void 0!==a.uniforms)for(var e in a.uniforms){var f=a.uniforms[e];d.uniforms[e]=
+{};switch(f.type){case "t":d.uniforms[e].value=b(f.value);break;case "c":d.uniforms[e].value=(new D).setHex(f.value);break;case "v2":d.uniforms[e].value=(new v).fromArray(f.value);break;case "v3":d.uniforms[e].value=(new p).fromArray(f.value);break;case "v4":d.uniforms[e].value=(new R).fromArray(f.value);break;case "m3":d.uniforms[e].value=(new ya).fromArray(f.value);case "m4":d.uniforms[e].value=(new N).fromArray(f.value);break;default:d.uniforms[e].value=f.value}}void 0!==a.defines&&(d.defines=
+a.defines);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);if(void 0!==a.extensions)for(var g in a.extensions)d.extensions[g]=a.extensions[g];void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.matcap&&(d.matcap=b(a.matcap));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap));void 0!==a.bumpMap&&
+(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));void 0!==a.normalMapType&&(d.normalMapType=a.normalMapType);void 0!==a.normalScale&&(e=a.normalScale,!1===Array.isArray(e)&&(e=[e,e]),d.normalScale=(new v).fromArray(e));void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);
+void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.envMapIntensity&&(d.envMapIntensity=a.envMapIntensity);void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.refractionRatio&&(d.refractionRatio=
+a.refractionRatio);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));void 0!==a.clearcoatMap&&(d.clearcoatMap=b(a.clearcoatMap));void 0!==a.clearcoatRoughnessMap&&(d.clearcoatRoughnessMap=b(a.clearcoatRoughnessMap));void 0!==a.clearcoatNormalMap&&(d.clearcoatNormalMap=b(a.clearcoatNormalMap));
+void 0!==a.clearcoatNormalScale&&(d.clearcoatNormalScale=(new v).fromArray(a.clearcoatNormalScale));return d},setTextures:function(a){this.textures=a;return this}});var lh={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;c<d;c++)b+=String.fromCharCode(a[c]);try{return decodeURIComponent(escape(b))}catch(e){return b}},extractUrlBase:function(a){var b=a.lastIndexOf("/");return-1===b?"./":a.substr(0,b+1)}};me.prototype=Object.assign(Object.create(F.prototype),
+{constructor:me,isInstancedBufferGeometry:!0,copy:function(a){F.prototype.copy.call(this,a);this.instanceCount=a.instanceCount;return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a=F.prototype.toJSON.call(this);a.instanceCount=this.instanceCount;a.isInstancedBufferGeometry=!0;return a}});qf.prototype=Object.assign(Object.create(G.prototype),{constructor:qf,isInstancedBufferAttribute:!0,copy:function(a){G.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
+return this},toJSON:function(){var a=G.prototype.toJSON.call(this);a.meshPerAttribute=this.meshPerAttribute;a.isInstancedBufferAttribute=!0;return a}});rf.prototype=Object.assign(Object.create(V.prototype),{constructor:rf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){var b=a.isInstancedBufferGeometry?new me:new F,c=a.data.index;if(void 0!==
+c){var d=new mh[c.type](c.array);b.setIndex(new G(d,1))}c=a.data.attributes;for(var e in c){var f=c[e];d=new mh[f.type](f.array);d=new (f.isInstancedBufferAttribute?qf:G)(d,f.itemSize,f.normalized);void 0!==f.name&&(d.name=f.name);b.setAttribute(e,d)}var g=a.data.morphAttributes;if(g)for(e in g){var h=g[e],l=[];c=0;for(var k=h.length;c<k;c++)f=h[c],d=new mh[f.type](f.array),d=new G(d,f.itemSize,f.normalized),void 0!==f.name&&(d.name=f.name),l.push(d);b.morphAttributes[e]=l}a.data.morphTargetsRelative&&
+(b.morphTargetsRelative=!0);e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,f=e.length;c!==f;++c)d=e[c],b.addGroup(d.start,d.count,d.materialIndex);c=a.data.boundingSphere;void 0!==c&&(e=new p,void 0!==c.center&&e.fromArray(c.center),b.boundingSphere=new eb(e,c.radius));a.name&&(b.name=a.name);a.userData&&(b.userData=a.userData);return b}});var mh={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,
+Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};sf.prototype=Object.assign(Object.create(V.prototype),{constructor:sf,load:function(a,b,c,d){var e=this,f=""===this.path?lh.extractUrlBase(a):this.path;this.resourcePath=this.resourcePath||f;f=new Ta(e.manager);f.setPath(this.path);f.load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(l){void 0!==d&&d(l);console.error("THREE:ObjectLoader: Can't parse "+
+a+".",l.message);return}c=f.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+a):e.parse(f,b)},c,d)},parse:function(a,b){var c=this.parseShape(a.shapes);c=this.parseGeometries(a.geometries,c);var d=this.parseImages(a.images,function(){void 0!==b&&b(e)});d=this.parseTextures(a.textures,d);d=this.parseMaterials(a.materials,d);var e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==
+a.images&&0!==a.images.length||void 0===b||b(e);return e},parseShape:function(a){var b={};if(void 0!==a)for(var c=0,d=a.length;c<d;c++){var e=(new Nb).fromJSON(a[c]);b[e.uuid]=e}return b},parseGeometries:function(a,b){var c={};if(void 0!==a)for(var d=new rf,e=0,f=a.length;e<f;e++){var g=a[e];switch(g.type){case "PlaneGeometry":case "PlaneBufferGeometry":var h=new ra[g.type](g.width,g.height,g.widthSegments,g.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":h=new ra[g.type](g.width,
+g.height,g.depth,g.widthSegments,g.heightSegments,g.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":h=new ra[g.type](g.radius,g.segments,g.thetaStart,g.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":h=new ra[g.type](g.radiusTop,g.radiusBottom,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":h=new ra[g.type](g.radius,g.height,g.radialSegments,g.heightSegments,g.openEnded,
+g.thetaStart,g.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":h=new ra[g.type](g.radius,g.widthSegments,g.heightSegments,g.phiStart,g.phiLength,g.thetaStart,g.thetaLength);break;case "DodecahedronGeometry":case "DodecahedronBufferGeometry":case "IcosahedronGeometry":case "IcosahedronBufferGeometry":case "OctahedronGeometry":case "OctahedronBufferGeometry":case "TetrahedronGeometry":case "TetrahedronBufferGeometry":h=new ra[g.type](g.radius,g.detail);break;case "RingGeometry":case "RingBufferGeometry":h=
+new ra[g.type](g.innerRadius,g.outerRadius,g.thetaSegments,g.phiSegments,g.thetaStart,g.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":h=new ra[g.type](g.radius,g.tube,g.radialSegments,g.tubularSegments,g.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":h=new ra[g.type](g.radius,g.tube,g.tubularSegments,g.radialSegments,g.p,g.q);break;case "TubeGeometry":case "TubeBufferGeometry":h=new ra[g.type]((new kh[g.path.type]).fromJSON(g.path),g.tubularSegments,g.radius,
+g.radialSegments,g.closed);break;case "LatheGeometry":case "LatheBufferGeometry":h=new ra[g.type](g.points,g.segments,g.phiStart,g.phiLength);break;case "PolyhedronGeometry":case "PolyhedronBufferGeometry":h=new ra[g.type](g.vertices,g.indices,g.radius,g.details);break;case "ShapeGeometry":case "ShapeBufferGeometry":h=[];for(var l=0,k=g.shapes.length;l<k;l++){var p=b[g.shapes[l]];h.push(p)}h=new ra[g.type](h,g.curveSegments);break;case "ExtrudeGeometry":case "ExtrudeBufferGeometry":h=[];l=0;for(k=
+g.shapes.length;l<k;l++)p=b[g.shapes[l]],h.push(p);l=g.options.extrudePath;void 0!==l&&(g.options.extrudePath=(new kh[l.type]).fromJSON(l));h=new ra[g.type](h,g.options);break;case "BufferGeometry":case "InstancedBufferGeometry":h=d.parse(g);break;case "Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+g.type+'"');continue}h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);!0===h.isBufferGeometry&&
+void 0!==g.userData&&(h.userData=g.userData);c[g.uuid]=h}return c},parseMaterials:function(a,b){var c={},d={};if(void 0!==a){var e=new pf;e.setTextures(b);b=0;for(var f=a.length;b<f;b++){var g=a[b];if("MultiMaterial"===g.type){for(var h=[],l=0;l<g.materials.length;l++){var k=g.materials[l];void 0===c[k.uuid]&&(c[k.uuid]=e.parse(k));h.push(c[k.uuid])}d[g.uuid]=h}else void 0===c[g.uuid]&&(c[g.uuid]=e.parse(g)),d[g.uuid]=c[g.uuid]}}return d},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=
+a[c],e=Sa.parse(d);void 0!==d.uuid&&(e.uuid=d.uuid);b.push(e)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a);d.manager.itemEnd(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new qg(b);var f=new dd(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],l=h.url;if(Array.isArray(l)){e[h.uuid]=[];for(var k=0,p=l.length;k<p;k++){var n=l[k];n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(n)?
+n:d.resourcePath+n;e[h.uuid].push(c(n))}}else n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?h.url:d.resourcePath+h.url,e[h.uuid]=c(n)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",
+g.image);var h=Array.isArray(b[g.image])?new qb(b[g.image]):new W(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Tk));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],Ni),h.wrapT=c(g.wrap[1],Ni));void 0!==g.format&&(h.format=g.format);void 0!==g.type&&
+(h.type=g.type);void 0!==g.encoding&&(h.encoding=g.encoding);void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,Oi));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,Oi));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);void 0!==g.premultiplyAlpha&&(h.premultiplyAlpha=g.premultiplyAlpha);void 0!==g.unpackAlignment&&(h.unpackAlignment=g.unpackAlignment);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",
+a);return b[a]}function e(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],d=0,e=a.length;d<e;d++){var f=a[d];void 0===c[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(c[f])}return b}void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return c[a]}}switch(a.type){case "Scene":var f=new zc;void 0!==a.background&&Number.isInteger(a.background)&&(f.background=new D(a.background));void 0!==a.fog&&("Fog"===a.fog.type?f.fog=new Oe(a.fog.color,a.fog.near,a.fog.far):
+"FogExp2"===a.fog.type&&(f.fog=new Ne(a.fog.color,a.fog.density)));break;case "PerspectiveCamera":f=new P(a.fov,a.aspect,a.near,a.far);void 0!==a.focus&&(f.focus=a.focus);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.filmGauge&&(f.filmGauge=a.filmGauge);void 0!==a.filmOffset&&(f.filmOffset=a.filmOffset);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "OrthographicCamera":f=new fd(a.left,a.right,a.top,a.bottom,a.near,a.far);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.view&&(f.view=Object.assign({},
+a.view));break;case "AmbientLight":f=new mf(a.color,a.intensity);break;case "DirectionalLight":f=new lf(a.color,a.intensity);break;case "PointLight":f=new jf(a.color,a.intensity,a.distance,a.decay);break;case "RectAreaLight":f=new nf(a.color,a.intensity,a.width,a.height);break;case "SpotLight":f=new hf(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);break;case "HemisphereLight":f=new ff(a.color,a.groundColor,a.intensity);break;case "LightProbe":f=(new Ua).fromJSON(a);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");
+case "Mesh":f=d(a.geometry);var g=e(a.material);f=new ea(f,g);break;case "InstancedMesh":f=d(a.geometry);g=e(a.material);var h=a.instanceMatrix;f=new Se(f,g,a.count);f.instanceMatrix=new G(new Float32Array(h.array),16);break;case "LOD":f=new Nd;break;case "Line":f=new La(d(a.geometry),e(a.material),a.mode);break;case "LineLoop":f=new Te(d(a.geometry),e(a.material));break;case "LineSegments":f=new ma(d(a.geometry),e(a.material));break;case "PointCloud":case "Points":f=new Nc(d(a.geometry),e(a.material));
+break;case "Sprite":f=new Ld(e(a.material));break;case "Group":f=new Kc;break;default:f=new y}f.uuid=a.uuid;void 0!==a.name&&(f.name=a.name);void 0!==a.matrix?(f.matrix.fromArray(a.matrix),void 0!==a.matrixAutoUpdate&&(f.matrixAutoUpdate=a.matrixAutoUpdate),f.matrixAutoUpdate&&f.matrix.decompose(f.position,f.quaternion,f.scale)):(void 0!==a.position&&f.position.fromArray(a.position),void 0!==a.rotation&&f.rotation.fromArray(a.rotation),void 0!==a.quaternion&&f.quaternion.fromArray(a.quaternion),void 0!==
+a.scale&&f.scale.fromArray(a.scale));void 0!==a.castShadow&&(f.castShadow=a.castShadow);void 0!==a.receiveShadow&&(f.receiveShadow=a.receiveShadow);a.shadow&&(void 0!==a.shadow.bias&&(f.shadow.bias=a.shadow.bias),void 0!==a.shadow.radius&&(f.shadow.radius=a.shadow.radius),void 0!==a.shadow.mapSize&&f.shadow.mapSize.fromArray(a.shadow.mapSize),void 0!==a.shadow.camera&&(f.shadow.camera=this.parseObject(a.shadow.camera)));void 0!==a.visible&&(f.visible=a.visible);void 0!==a.frustumCulled&&(f.frustumCulled=
+a.frustumCulled);void 0!==a.renderOrder&&(f.renderOrder=a.renderOrder);void 0!==a.userData&&(f.userData=a.userData);void 0!==a.layers&&(f.layers.mask=a.layers);if(void 0!==a.children)for(h=a.children,g=0;g<h.length;g++)f.add(this.parseObject(h[g],b,c));if("LOD"===a.type)for(void 0!==a.autoUpdate&&(f.autoUpdate=a.autoUpdate),a=a.levels,h=0;h<a.length;h++){g=a[h];var l=f.getObjectByProperty("uuid",g.object);void 0!==l&&f.addLevel(l,g.distance)}return f}});var Tk={UVMapping:300,CubeReflectionMapping:301,
+CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},Ni={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Oi={NearestFilter:1003,NearestMipmapNearestFilter:1004,NearestMipmapLinearFilter:1005,LinearFilter:1006,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:1008};vg.prototype=Object.assign(Object.create(V.prototype),{constructor:vg,
+setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=tc.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;fetch(a).then(function(a){return a.blob()}).then(function(a){return void 0===e.options?createImageBitmap(a):createImageBitmap(a,e.options)}).then(function(c){tc.add(a,c);b&&b(c);e.manager.itemEnd(a)}).catch(function(b){d&&
+d(b);e.manager.itemError(a);e.manager.itemEnd(a)});e.manager.itemStart(a)}});Object.assign(wg.prototype,{moveTo:function(a,b){this.currentPath=new bb;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b);return this},lineTo:function(a,b){this.currentPath.lineTo(a,b);return this},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d);return this},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f);return this},splineThru:function(a){this.currentPath.splineThru(a);
+return this},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Nb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],l=h.x-g.x,k=h.y-g.y;if(Math.abs(k)>Number.EPSILON){if(0>k&&(g=b[f],l=-l,h=b[e],k=-k),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=k*(a.x-g.x)-l*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}
+var e=sb.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Nb;h.curves=g.curves;b.push(h);return b}var l=!e(f[0].getPoints());l=a?!l:l;h=[];var k=[],p=[],n=0;k[n]=void 0;p[n]=[];for(var t=0,r=f.length;t<r;t++){g=f[t];var q=g.getPoints();var u=e(q);(u=a?!u:u)?(!l&&k[n]&&n++,k[n]={s:new Nb,p:q},k[n].s.curves=g.curves,l&&n++,p[n]=[]):p[n].push({h:g,p:q[0]})}if(!k[0])return c(f);if(1<k.length){t=!1;a=[];e=0;for(f=k.length;e<f;e++)h[e]=
+[];e=0;for(f=k.length;e<f;e++)for(g=p[e],u=0;u<g.length;u++){l=g[u];n=!0;for(q=0;q<k.length;q++)d(l.p,k[q].p)&&(e!==q&&a.push({froms:e,tos:q,hole:u}),n?(n=!1,h[q].push(l)):t=!0);n&&h[e].push(l)}0<a.length&&(t||(p=h))}t=0;for(e=k.length;t<e;t++)for(h=k[t].s,b.push(h),a=p[t],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(xg.prototype,{isFont:!0,generateShapes:function(a,b){void 0===b&&(b=100);var c=[],d=b;b=this.data;var e=Array.from?Array.from(a):String(a).split("");d/=b.resolution;
+var f=(b.boundingBox.yMax-b.boundingBox.yMin+b.underlineThickness)*d;a=[];for(var g=0,h=0,l=0;l<e.length;l++){var k=e[l];if("\n"===k)g=0,h-=f;else{var p=k;k=d;var n=g,t=h,r=b,q=r.glyphs[p]||r.glyphs["?"];if(q){p=new wg;if(q.o){r=q._cachedOutline||(q._cachedOutline=q.o.split(" "));for(var u=0,v=r.length;u<v;)switch(r[u++]){case "m":var x=r[u++]*k+n;var w=r[u++]*k+t;p.moveTo(x,w);break;case "l":x=r[u++]*k+n;w=r[u++]*k+t;p.lineTo(x,w);break;case "q":var y=r[u++]*k+n;var A=r[u++]*k+t;var B=r[u++]*k+n;
+var C=r[u++]*k+t;p.quadraticCurveTo(B,C,y,A);break;case "b":y=r[u++]*k+n,A=r[u++]*k+t,B=r[u++]*k+n,C=r[u++]*k+t,x=r[u++]*k+n,w=r[u++]*k+t,p.bezierCurveTo(B,C,x,w,y,A)}}k={offsetX:q.ha*k,path:p}}else console.error('THREE.Font: character "'+p+'" does not exists in font family '+r.familyName+"."),k=void 0;g+=k.offsetX;a.push(k.path)}}b=0;for(e=a.length;b<e;b++)Array.prototype.push.apply(c,a[b].toShapes());return c}});yg.prototype=Object.assign(Object.create(V.prototype),{constructor:yg,load:function(a,
+b,c,d){var e=this,f=new Ta(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(l){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new xg(a)}});var Rf,Dg={getContext:function(){void 0===Rf&&(Rf=new (window.AudioContext||window.webkitAudioContext));return Rf},setContext:function(a){Rf=a}};tf.prototype=Object.assign(Object.create(V.prototype),
+{constructor:tf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setResponseType("arraybuffer");f.setPath(e.path);f.load(a,function(c){try{var f=c.slice(0);Dg.getContext().decodeAudioData(f,function(a){b(a)})}catch(l){d?d(l):console.error(l),e.manager.itemError(a)}},c,d)}});zg.prototype=Object.assign(Object.create(Ua.prototype),{constructor:zg,isHemisphereLightProbe:!0,copy:function(a){Ua.prototype.copy.call(this,a);return this},toJSON:function(a){return Ua.prototype.toJSON.call(this,a)}});
+Ag.prototype=Object.assign(Object.create(Ua.prototype),{constructor:Ag,isAmbientLightProbe:!0,copy:function(a){Ua.prototype.copy.call(this,a);return this},toJSON:function(a){return Ua.prototype.toJSON.call(this,a)}});var Pi=new N,Qi=new N;Object.assign(gi.prototype,{update:function(a){var b=this._cache;if(b.focus!==a.focus||b.fov!==a.fov||b.aspect!==a.aspect*this.aspect||b.near!==a.near||b.far!==a.far||b.zoom!==a.zoom||b.eyeSep!==this.eyeSep){b.focus=a.focus;b.fov=a.fov;b.aspect=a.aspect*this.aspect;
+b.near=a.near;b.far=a.far;b.zoom=a.zoom;b.eyeSep=this.eyeSep;var c=a.projectionMatrix.clone(),d=b.eyeSep/2,e=d*b.near/b.focus,f=b.near*Math.tan(O.DEG2RAD*b.fov*.5)/b.zoom;Qi.elements[12]=-d;Pi.elements[12]=d;d=-f*b.aspect+e;var g=f*b.aspect+e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraL.projectionMatrix.copy(c);d=-f*b.aspect-e;g=f*b.aspect-e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraR.projectionMatrix.copy(c)}this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(Qi);
+this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(Pi)}});Object.assign(Bg.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?
+Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});var uc=new p,Ri=new va,Uk=new p,vc=new p;Cg.prototype=Object.assign(Object.create(y.prototype),{constructor:Cg,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null);return this},getFilter:function(){return this.filter},setFilter:function(a){null!==
+this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination);return this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);a=this.context.listener;
+var b=this.up;this.timeDelta=this._clock.getDelta();this.matrixWorld.decompose(uc,Ri,Uk);vc.set(0,0,-1).applyQuaternion(Ri);if(a.positionX){var c=this.context.currentTime+this.timeDelta;a.positionX.linearRampToValueAtTime(uc.x,c);a.positionY.linearRampToValueAtTime(uc.y,c);a.positionZ.linearRampToValueAtTime(uc.z,c);a.forwardX.linearRampToValueAtTime(vc.x,c);a.forwardY.linearRampToValueAtTime(vc.y,c);a.forwardZ.linearRampToValueAtTime(vc.z,c);a.upX.linearRampToValueAtTime(b.x,c);a.upY.linearRampToValueAtTime(b.y,
+c);a.upZ.linearRampToValueAtTime(b.z,c)}else a.setPosition(uc.x,uc.y,uc.z),a.setOrientation(vc.x,vc.y,vc.z,b.x,b.y,b.z)}});gd.prototype=Object.assign(Object.create(y.prototype),{constructor:gd,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setMediaElementSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaNode";this.source=this.context.createMediaElementSource(a);this.connect();
+return this},setMediaStreamSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaStreamNode";this.source=this.context.createMediaStreamSource(a);this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(a){void 0===a&&(a=0);if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else return this._startedAt=this.context.currentTime+a,a=this.context.createBufferSource(),a.buffer=this.buffer,a.loop=this.loop,a.loopStart=this.loopStart,a.loopEnd=this.loopEnd,a.onended=this.onEnded.bind(this),a.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=a,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress%=this.duration||this.buffer.duration),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);
+for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},
+getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},setDetune:function(a){this.detune=a;if(void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this},getDetune:function(){return this.detune},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===
+this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},setLoopStart:function(a){this.loopStart=a;return this},setLoopEnd:function(a){this.loopEnd=a;return this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this}});var wc=new p,Si=new va,Vk=new p,xc=new p;Eg.prototype=Object.assign(Object.create(gd.prototype),{constructor:Eg,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},
+setRefDistance:function(a){this.panner.refDistance=a;return this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a;return this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a;return this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a;return this},setDirectionalCone:function(a,b,c){this.panner.coneInnerAngle=
+a;this.panner.coneOuterAngle=b;this.panner.coneOuterGain=c;return this},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);if(!0!==this.hasPlaybackControl||!1!==this.isPlaying)if(this.matrixWorld.decompose(wc,Si,Vk),xc.set(0,0,1).applyQuaternion(Si),a=this.panner,a.positionX){var b=this.context.currentTime+this.listener.timeDelta;a.positionX.linearRampToValueAtTime(wc.x,b);a.positionY.linearRampToValueAtTime(wc.y,b);a.positionZ.linearRampToValueAtTime(wc.z,b);a.orientationX.linearRampToValueAtTime(xc.x,
+b);a.orientationY.linearRampToValueAtTime(xc.y,b);a.orientationZ.linearRampToValueAtTime(xc.z,b)}else a.setPosition(wc.x,wc.y,wc.z),a.setOrientation(xc.x,xc.y,xc.z)}});Object.assign(Fg.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(Gg.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize;a=a*d+d;
+var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},accumulateAdditive:function(a){var b=this.buffer,c=this.valueSize,d=c*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity();this._mixBufferRegionAdditive(b,d,0,a,c);this.cumulativeWeightAdditive+=a},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.cumulativeWeightAdditive,f=this.binding;this.cumulativeWeightAdditive=
+this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,b*this._origIndex,1-d,b);0<e&&this._mixBufferRegionAdditive(c,a,this._addIndex*b,1,b);d=b;for(e=b+b;d!==e;++d)if(c[d]!==c[d+b]){f.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=b*this._origIndex;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this._setIdentity();this.cumulativeWeightAdditive=this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},
+_setAdditiveIdentityNumeric:function(){for(var a=this._addIndex*this.valueSize,b=a+this.valueSize;a<b;a++)this.buffer[a]=0},_setAdditiveIdentityQuaternion:function(){this._setAdditiveIdentityNumeric();this.buffer[4*this._addIndex+3]=1},_setAdditiveIdentityOther:function(){for(var a=this._origIndex*this.valueSize,b=this._addIndex*this.valueSize,c=0;c<this.valueSize;c++)this.buffer[b+c]=this.buffer[a+c]},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){va.slerpFlat(a,
+b,a,b,a,c,d)},_slerpAdditive:function(a,b,c,d,e){e*=this._workIndex;va.multiplyQuaternionsFlat(a,e,a,b,a,c);va.slerpFlat(a,b,a,b,a,e,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}},_lerpAdditive:function(a,b,c,d,e){for(var f=0;f!==e;++f){var g=b+f;a[g]+=a[c+f]*d}}});var Wk=/[\[\]\.:\/]/g,Xk="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",Yk=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),Zk=/(WCOD+)?/.source.replace("WCOD",Xk),$k=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",
+"[^\\[\\]\\.:\\/]"),al=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),bl=new RegExp("^"+Yk+Zk+$k+al+"$"),cl=["material","materials","bones"];Object.assign(hi.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,
+c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(Aa,{Composite:hi,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new Aa.Composite(a,b,c):new Aa(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(Wk,"")},parseTrackName:function(a){var b=bl.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],
+propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==cl.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+a);return b},findNode:function(a,b){if(!b||""===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==
+c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(Aa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=
+this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,
+d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];
+this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=
+a=Aa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);return}a=a.material.materials;
+break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,a);return}a=
+a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;this.targetObject=a;void 0!==a.needsUpdate?b=this.Versioning.NeedsUpdate:void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
+this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}void 0!==a.morphTargetDictionary[e]&&(e=a.morphTargetDictionary[e])}else{console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);return}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=
+e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=
+this._setValue_unbound}});Object.assign(Aa.prototype,{_getValue_unbound:Aa.prototype.getValue,_setValue_unbound:Aa.prototype.setValue});Object.assign(ii.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=void 0,m=0,p=arguments.length;m!==p;++m){var n=arguments[m],t=n.uuid,r=d[t];if(void 0===r){r=b++;d[t]=r;a.push(n);t=0;for(var q=h;t!==q;++t)g[t].push(new Aa(n,
+e[t],f[t]))}else if(r<c){k=a[r];var u=--c;q=a[u];d[q.uuid]=r;a[r]=q;d[t]=u;a[u]=n;t=0;for(q=h;t!==q;++t){var v=g[t],x=v[r];v[r]=v[u];void 0===x&&(x=new Aa(n,e[t],f[t]));v[u]=x}}else a[r]!==k&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=
+arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,m=c[k];if(void 0!==m&&m>=b){var p=b++,n=a[p];c[n.uuid]=m;a[m]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var t=n[m];n[m]=n[p];n[p]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g].uuid,m=d[k];if(void 0!==m)if(delete d[k],m<c){k=--c;var p=a[k],n=--b,t=a[n];d[p.uuid]=m;a[m]=p;d[t.uuid]=
+k;a[k]=t;a.pop();p=0;for(t=f;p!==t;++p){var r=e[p],q=r[n];r[m]=r[k];r[k]=q;r.pop()}}else for(n=--b,t=a[n],d[t.uuid]=m,a[m]=t,a.pop(),p=0,t=f;p!==t;++p)r=e[p],r[m]=r[n],r.pop()}this.nCachedObjects_=c},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,m=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(m);c=k;for(d=h.length;c!==d;++c)m[c]=new Aa(h[c],a,b);
+return m},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(ji.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},
+isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,
+0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=
+this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());
+d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=
+null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a)switch(b=this._interpolants,e=this._propertyBindings,this.blendMode){case 2501:for(var f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulateAdditive(a);break;default:for(f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){b=this.weight;var c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&
+(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){b=this.timeScale;var c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a,c=this._clip.duration,d=this.loop,e=this._loopCount,f=2202===d;if(0===a)return-1===e?b:f&&1===(e&1)?c-b:b;if(2200===
+d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else{this.time=b;break a}this.clampWhenFinished?this.paused=!0:this.enabled=!1;this.time=b;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,f)):this._setEndings(0===this.repetitions,!0,f));if(b>=c||0>b){d=Math.floor(b/c);b-=c*d;e+=Math.abs(d);var g=this.repetitions-e;0>=g?(this.clampWhenFinished?this.paused=!0:this.enabled=
+!1,this.time=b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(1===g?(a=0>a,this._setEndings(a,!a,f)):this._setEndings(!1,!1,f),this._loopCount=e,this.time=b,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:d}))}else this.time=b;if(f&&1===(e&1))return c-b}return b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?
+2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Hg.prototype=Object.assign(Object.create(ua.prototype),{constructor:Hg,_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===
+k&&(k={},h[g]=k);for(h=0;h!==e;++h){var m=d[h],p=m.name,n=k[p];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,p));continue}n=new Gg(Aa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),m.ValueTypeName,m.getValueSize());++n.referenceCount;this._addInactiveBinding(n,g,p)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,
+d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=
+[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},
+_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;b=a._clip.uuid;
+c=this._actionsByClip;d=c[b];var e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,
+d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid;c=c.path;var e=this._bindingsByRootAndName,
+f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];0===Object.keys(f).length&&delete e[d]},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,
+c=a[b];void 0===c&&(c=new ie(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b,c){var d=b||this._root,e=d.uuid;d="string"===typeof a?Sa.findByName(d,a):a;a=null!==d?d.uuid:a;var f=
+this._actionsByClip[a],g=null;void 0===c&&(c=null!==d?d.blendMode:2500);if(void 0!==f){g=f.actionByRoot[e];if(void 0!==g&&g.blendMode===c)return g;g=f.knownActions[0];null===d&&(d=g._clip)}if(null===d)return null;b=new ji(this,d,b,c);this._bindAction(b,g);this._addInactiveAction(b,a,e);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?Sa.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=
+this._actions,b=this._nActiveActions-1;0<=b;--b)a[b].stop();return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},setTime:function(a){for(var b=this.time=0;b<this._actions.length;b++)this._actions[b].time=0;return this.update(a)},getRoot:function(){return this._root},uncacheClip:function(a){var b=
+this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){d=d.knownActions;for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];
+if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});uf.prototype.clone=function(){return new uf(void 0===this.value.clone?this.value:this.value.clone())};Ig.prototype=Object.assign(Object.create(rb.prototype),{constructor:Ig,isInstancedInterleavedBuffer:!0,copy:function(a){rb.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
+return this}});Object.assign(Jg.prototype,{set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize(),this.camera=b):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld),this.camera=b):console.error("THREE.Raycaster: Unsupported camera type.")},
+intersectObject:function(a,b,c){c=c||[];Kg(a,this,c,b);c.sort(ki);return c},intersectObjects:function(a,b,c){c=c||[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)Kg(a[d],this,c,b);c.sort(ki);return c}});Object.assign(li.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=
+a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+b*b+c*c);0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a,c),this.phi=Math.acos(O.clamp(b/this.radius,-1,1)));return this}});Object.assign(mi.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},
+clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+c*c);this.theta=Math.atan2(a,c);this.y=b;return this}});var Ti=new v;Object.assign(Lg.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<
+c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(a,b){b=Ti.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){void 0===
+a&&(console.warn("THREE.Box2: .getCenter() target is now required"),a=new v);return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box2: .getSize() target is now required"),a=new v);return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);
+this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new v);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<
+this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new v);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return Ti.copy(a).clamp(this.min,this.max).sub(a).length()},intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);
+this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Ui=new p,Sf=new p;Object.assign(Mg.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0===a&&(console.warn("THREE.Line3: .getCenter() target is now required"),a=new p);return a.addVectors(this.start,this.end).multiplyScalar(.5)},
+delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),a=new p);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b=new p);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(a,b){Ui.subVectors(a,this.start);Sf.subVectors(this.end,
+this.start);a=Sf.dot(Sf);a=Sf.dot(Ui)/a;b&&(a=O.clamp(a,0,1));return a},closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),c=new p);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});ne.prototype=Object.create(y.prototype);
+ne.prototype.constructor=ne;ne.prototype.isImmediateRenderObject=!0;var Vi=new p;hd.prototype=Object.create(y.prototype);hd.prototype.constructor=hd;hd.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};hd.prototype.update=function(){this.light.updateMatrixWorld();var a=this.light.distance?this.light.distance:1E3,b=a*Math.tan(this.light.angle);this.cone.scale.set(b,b,a);Vi.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(Vi);void 0!==this.color?
+this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Tb=new p,Tf=new N,nh=new N;pc.prototype=Object.create(ma.prototype);pc.prototype.constructor=pc;pc.prototype.isSkeletonHelper=!0;pc.prototype.updateMatrixWorld=function(a){var b=this.bones,c=this.geometry,d=c.getAttribute("position");nh.getInverse(this.root.matrixWorld);for(var e=0,f=0;e<b.length;e++){var g=b[e];g.parent&&g.parent.isBone&&(Tf.multiplyMatrices(nh,g.matrixWorld),Tb.setFromMatrixPosition(Tf),
+d.setXYZ(f,Tb.x,Tb.y,Tb.z),Tf.multiplyMatrices(nh,g.parent.matrixWorld),Tb.setFromMatrixPosition(Tf),d.setXYZ(f+1,Tb.x,Tb.y,Tb.z),f+=2)}c.getAttribute("position").needsUpdate=!0;y.prototype.updateMatrixWorld.call(this,a)};id.prototype=Object.create(ea.prototype);id.prototype.constructor=id;id.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};id.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};
+var dl=new p,Wi=new D,Xi=new D;jd.prototype=Object.create(y.prototype);jd.prototype.constructor=jd;jd.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};jd.prototype.update=function(){var a=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var b=a.geometry.getAttribute("color");Wi.copy(this.light.color);Xi.copy(this.light.groundColor);for(var c=0,d=b.count;c<d;c++){var e=c<d/2?Wi:Xi;b.setXYZ(c,e.r,e.g,e.b)}b.needsUpdate=
+!0}a.lookAt(dl.setFromMatrixPosition(this.light.matrixWorld).negate())};vf.prototype=Object.assign(Object.create(ma.prototype),{constructor:vf,copy:function(a){ma.prototype.copy.call(this,a);this.geometry.copy(a.geometry);this.material.copy(a.material);return this},clone:function(){return(new this.constructor).copy(this)}});wf.prototype=Object.create(ma.prototype);wf.prototype.constructor=wf;var Yi=new p,Uf=new p,Zi=new p;kd.prototype=Object.create(y.prototype);kd.prototype.constructor=kd;kd.prototype.dispose=
+function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};kd.prototype.update=function(){Yi.setFromMatrixPosition(this.light.matrixWorld);Uf.setFromMatrixPosition(this.light.target.matrixWorld);Zi.subVectors(Uf,Yi);this.lightPlane.lookAt(Uf);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),
+this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(Uf);this.targetLine.scale.z=Zi.length()};var xf=new p,la=new fb;oe.prototype=Object.create(ma.prototype);oe.prototype.constructor=oe;oe.prototype.update=function(){var a=this.geometry,b=this.pointMap;la.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);fa("c",b,a,la,0,0,-1);fa("t",b,a,la,0,0,1);fa("n1",b,a,la,-1,-1,-1);fa("n2",b,a,la,1,-1,-1);fa("n3",b,a,la,-1,1,-1);fa("n4",b,a,la,1,1,-1);fa("f1",b,a,la,
+-1,-1,1);fa("f2",b,a,la,1,-1,1);fa("f3",b,a,la,-1,1,1);fa("f4",b,a,la,1,1,1);fa("u1",b,a,la,.7,1.1,-1);fa("u2",b,a,la,-.7,1.1,-1);fa("u3",b,a,la,0,2,-1);fa("cf1",b,a,la,-1,0,1);fa("cf2",b,a,la,1,0,1);fa("cf3",b,a,la,0,-1,1);fa("cf4",b,a,la,0,1,1);fa("cn1",b,a,la,-1,0,-1);fa("cn2",b,a,la,1,0,-1);fa("cn3",b,a,la,0,-1,-1);fa("cn4",b,a,la,0,1,-1);a.getAttribute("position").needsUpdate=!0};var Vf=new Va;wb.prototype=Object.create(ma.prototype);wb.prototype.constructor=wb;wb.prototype.update=function(a){void 0!==
+a&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&Vf.setFromObject(this.object);if(!Vf.isEmpty()){a=Vf.min;var b=Vf.max,c=this.geometry.attributes.position,d=c.array;d[0]=b.x;d[1]=b.y;d[2]=b.z;d[3]=a.x;d[4]=b.y;d[5]=b.z;d[6]=a.x;d[7]=a.y;d[8]=b.z;d[9]=b.x;d[10]=a.y;d[11]=b.z;d[12]=b.x;d[13]=b.y;d[14]=a.z;d[15]=a.x;d[16]=b.y;d[17]=a.z;d[18]=a.x;d[19]=a.y;d[20]=a.z;d[21]=b.x;d[22]=a.y;d[23]=a.z;c.needsUpdate=!0;this.geometry.computeBoundingSphere()}};wb.prototype.setFromObject=
+function(a){this.object=a;this.update();return this};wb.prototype.copy=function(a){ma.prototype.copy.call(this,a);this.object=a.object;return this};wb.prototype.clone=function(){return(new this.constructor).copy(this)};pe.prototype=Object.create(ma.prototype);pe.prototype.constructor=pe;pe.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),y.prototype.updateMatrixWorld.call(this,a))};qe.prototype=Object.create(La.prototype);
+qe.prototype.constructor=qe;qe.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.children[0].material.side=0>b?1:0;this.lookAt(this.plane.normal);y.prototype.updateMatrixWorld.call(this,a)};var $i=new p,yf,Ng;xb.prototype=Object.create(y.prototype);xb.prototype.constructor=xb;xb.prototype.setDirection=function(a){.99999<a.y?this.quaternion.set(0,0,0,1):-.99999>a.y?this.quaternion.set(1,0,0,0):($i.set(a.z,
+0,-a.x).normalize(),this.quaternion.setFromAxisAngle($i,Math.acos(a.y)))};xb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(1E-4,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};xb.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};xb.prototype.copy=function(a){y.prototype.copy.call(this,a,!1);this.line.copy(a.line);this.cone.copy(a.cone);
+return this};xb.prototype.clone=function(){return(new this.constructor).copy(this)};re.prototype=Object.create(ma.prototype);re.prototype.constructor=re;var nb=Math.pow(2,8),aj=[.125,.215,.35,.446,.526,.582],bj=5+aj.length,mb={3E3:0,3001:1,3002:2,3004:3,3005:4,3006:5,3007:6},oh=new fd,ph=function(){for(var a=[],b=[],c=[],d=8,e=0;e<bj;e++){var f=Math.pow(2,d);b.push(f);var g=1/f;4<e?g=aj[e-8+4-1]:0==e&&(g=0);c.push(g);g=1/(f-1);f=-g/2;g=1+g/2;var h=[f,f,g,f,g,g,f,f,g,g,f,g];f=new Float32Array(108);
+g=new Float32Array(72);for(var k=new Float32Array(36),m=0;6>m;m++){var p=m%3*2/3-1,n=2<m?0:-1;f.set([p,n,0,p+2/3,n,0,p+2/3,n+1,0,p,n,0,p+2/3,n+1,0,p,n+1,0],18*m);g.set(h,12*m);k.set([m,m,m,m,m,m],6*m)}h=new F;h.setAttribute("position",new G(f,3));h.setAttribute("uv",new G(g,2));h.setAttribute("faceIndex",new G(k,1));a.push(h);4<d&&d--}return{_lodPlanes:a,_sizeLods:b,_sigmas:c}}(),Ce=ph._lodPlanes,cj=ph._sizeLods,Wf=ph._sigmas,qh=null,yc=(1+Math.sqrt(5))/2,xd=1/yc,dj=[new p(1,1,1),new p(-1,1,1),new p(1,
+1,-1),new p(-1,1,-1),new p(0,yc,xd),new p(0,yc,-xd),new p(xd,0,yc),new p(-xd,0,yc),new p(yc,xd,0),new p(-yc,xd,0)];Og.prototype={constructor:Og,fromScene:function(a,b,c,d){void 0===b&&(b=0);void 0===c&&(c=.1);void 0===d&&(d=100);qh=this._renderer.getRenderTarget();var e=this._allocateTargets();this._sceneToCubeUV(a,c,d,e);0<b&&this._blur(e,0,0,b);this._applyPMREM(e);this._cleanup(e);return e},fromEquirectangular:function(a){a.magFilter=1003;a.minFilter=1003;a.generateMipmaps=!1;return this.fromCubemap(a)},
+fromCubemap:function(a){qh=this._renderer.getRenderTarget();var b=this._allocateTargets(a);this._textureToCubeUV(a,b);this._applyPMREM(b);this._cleanup(b);return b},compileCubemapShader:function(){null===this._cubemapShader&&(this._cubemapShader=qi(),this._compileMaterial(this._cubemapShader))},compileEquirectangularShader:function(){null===this._equirectShader&&(this._equirectShader=pi(),this._compileMaterial(this._equirectShader))},dispose:function(){this._blurMaterial.dispose();null!==this._cubemapShader&&
+this._cubemapShader.dispose();null!==this._equirectShader&&this._equirectShader.dispose();for(var a=0;a<Ce.length;a++)Ce[a].dispose()},_cleanup:function(a){this._pingPongRenderTarget.dispose();this._renderer.setRenderTarget(qh);a.scissorTest=!1;a.setSize(a.width,a.height)},_allocateTargets:function(a){var b=void 0===a||1009!==a.type?!1:3E3===a.encoding||3001===a.encoding||3007===a.encoding;b={magFilter:1003,minFilter:1003,generateMipmaps:!1,type:1009,format:1023,encoding:b?a.encoding:3002,depthBuffer:!1,
+stencilBuffer:!1};var c=oi(b);c.depthBuffer=a?!1:!0;this._pingPongRenderTarget=oi(b);return c},_compileMaterial:function(a){a=new ea(Ce[0],a);this._renderer.compile(a,oh)},_sceneToCubeUV:function(a,b,c,d){b=new P(90,1,b,c);c=[1,-1,1,1,1,1];var e=[1,1,1,-1,-1,-1],f=this._renderer,g=f.outputEncoding,h=f.toneMapping,k=f.toneMappingExposure,m=f.getClearColor(),p=f.getClearAlpha();f.toneMapping=1;f.toneMappingExposure=1;f.outputEncoding=3E3;var n=a.background;if(n&&n.isColor){n.convertSRGBToLinear();var t=
+Math.min(Math.max(Math.ceil(Math.log2(Math.max(n.r,n.g,n.b))),-128),127);n=n.multiplyScalar(Math.pow(2,-t));f.setClearColor(n,(t+128)/255);a.background=null}for(n=0;6>n;n++)t=n%3,0==t?(b.up.set(0,c[n],0),b.lookAt(e[n],0,0)):1==t?(b.up.set(0,0,c[n]),b.lookAt(0,e[n],0)):(b.up.set(0,c[n],0),b.lookAt(0,0,e[n])),Rg(d,t*nb,2<n?nb:0,nb,nb),f.setRenderTarget(d),f.render(a,b);f.toneMapping=h;f.toneMappingExposure=k;f.outputEncoding=g;f.setClearColor(m,p)},_textureToCubeUV:function(a,b){var c=this._renderer;
+a.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=qi()):null==this._equirectShader&&(this._equirectShader=pi());var d=a.isCubeTexture?this._cubemapShader:this._equirectShader,e=new ea(Ce[0],d);d=d.uniforms;d.envMap.value=a;a.isCubeTexture||d.texelSize.value.set(1/a.image.width,1/a.image.height);d.inputEncoding.value=mb[a.encoding];d.outputEncoding.value=mb[b.texture.encoding];Rg(b,0,0,3*nb,2*nb);c.setRenderTarget(b);c.render(e,oh)},_applyPMREM:function(a){var b=this._renderer,c=b.autoClear;
+b.autoClear=!1;for(var d=1;d<bj;d++)this._blur(a,d-1,d,Math.sqrt(Wf[d]*Wf[d]-Wf[d-1]*Wf[d-1]),dj[(d-1)%dj.length]);b.autoClear=c},_blur:function(a,b,c,d,e){var f=this._pingPongRenderTarget;this._halfBlur(a,f,b,c,d,"latitudinal",e);this._halfBlur(f,a,c,c,d,"longitudinal",e)},_halfBlur:function(a,b,c,d,e,f,g){var h=this._renderer,k=this._blurMaterial;"latitudinal"!==f&&"longitudinal"!==f&&console.error("blur direction must be either latitudinal or longitudinal!");var m=new ea(Ce[d],k);k=k.uniforms;
+var p=cj[c]-1;p=isFinite(e)?Math.PI/(2*p):2*Math.PI/39;var n=e/p,t=isFinite(e)?1+Math.floor(3*n):20;20<t&&console.warn("sigmaRadians, "+e+", is too large and will clip, as it requested "+t+" samples when the maximum is set to 20");e=[];for(var r=0,q=0;20>q;++q){var u=q/n;u=Math.exp(-u*u/2);e.push(u);0==q?r+=u:q<t&&(r+=2*u)}for(q=0;q<e.length;q++)e[q]/=r;k.envMap.value=a.texture;k.samples.value=t;k.weights.value=e;k.latitudinal.value="latitudinal"===f;g&&(k.poleAxis.value=g);k.dTheta.value=p;k.mipInt.value=
+8-c;k.inputEncoding.value=mb[a.texture.encoding];k.outputEncoding.value=mb[a.texture.encoding];a=cj[d];u=3*Math.max(0,nb-2*a);Rg(b,u,(0===d?0:2*nb)+2*a*(4<d?d-8+4:0),3*a,2*a);h.setRenderTarget(b);h.render(m,oh)}};H.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(H.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(vb.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
+a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new L,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x,
+e.y,e.z||0))}return b}});Object.assign(bb.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");return this.setFromPoints(a)}});ri.prototype=Object.create(qa.prototype);si.prototype=Object.create(qa.prototype);Sg.prototype=Object.create(qa.prototype);Object.assign(Sg.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},
+reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});vf.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};pc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(V.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");
+return lh.extractUrlBase(a)}});V.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};Object.assign(sf.prototype,{setTexturePath:function(a){console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().");return this.setResourcePath(a)}});Object.assign(Lg.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");
+return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Va.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");
+return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");
+return this.getSize(a)}});Object.assign(eb.prototype,{empty:function(){console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty().");return this.isEmpty()}});Gc.prototype.setFromMatrix=function(a){console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().");return this.setFromProjectionMatrix(a)};Mg.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(O,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");
+return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return O.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");return O.ceilPowerOfTwo(a)}});Object.assign(ya.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},
+multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBufferAttribute:function(a){console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});
+Object.assign(N.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return(new p).setFromMatrixColumn(this,
+3)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
+return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},
+rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBufferAttribute:function(a){console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},
+applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Wa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};va.prototype.multiplyVector3=
+function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(Wb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
+return this.intersectsSphere(a)}});Object.assign(pa.prototype,{area:function(){console.warn("THREE.Triangle: .area() has been renamed to .getArea().");return this.getArea()},barycoordFromPoint:function(a,b){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return this.getBarycoord(a,b)},midpoint:function(a){console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");return this.getMidpoint(a)},normal:function(a){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
+return this.getNormal(a)},plane:function(a){console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");return this.getPlane(a)}});Object.assign(pa,{barycoordFromPoint:function(a,b,c,d,e){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return pa.getBarycoord(a,b,c,d,e)},normal:function(a,b,c,d){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");return pa.getNormal(a,b,c,d)}});Object.assign(Nb.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");
+return this.extractPoints(a)},extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new dc(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new fc(this,a)}});Object.assign(v.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");
+return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(p.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},
+getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,
+a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");
+return this.manhattanLength()}});Object.assign(R.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(L.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")},
+applyMatrix:function(a){console.warn("THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});Object.assign(y.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");
+return this.translateOnAxis(b,a)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},applyMatrix:function(a){console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});Object.defineProperties(y.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
+this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.assign(ea.prototype,{setDrawMode:function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}});
+Object.defineProperties(ea.prototype,{drawMode:{get:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.");return 0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}});Object.defineProperties(Nd.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");
+return this.levels}}});Object.defineProperty(Re.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Qe.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")};Object.defineProperty(H.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},
+set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});P.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(S.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");
+this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");
+this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");
+this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(G.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");
+return this.array.length}},dynamic:{get:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");return 35048===this.usage},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");this.setUsage(35048)}}});Object.assign(G.prototype,{setDynamic:function(a){console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.");this.setUsage(!0===a?35048:35044);return this},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},
+setArray:function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}});Object.assign(F.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addAttribute:function(a,b,c){console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().");return b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute?"index"===
+a?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b),this):this.setAttribute(a,b):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(a,new G(b,c)))},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");
+this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},removeAttribute:function(a){console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().");return this.deleteAttribute(a)},applyMatrix:function(a){console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});
+Object.defineProperties(F.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(me.prototype,{maxInstancedCount:{get:function(){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.");return this.instanceCount},set:function(a){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.");
+this.instanceCount=a}}});Object.defineProperties(Jg.prototype,{linePrecision:{get:function(){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.");return this.params.Line.threshold},set:function(a){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.");this.params.Line.threshold=a}}});Object.defineProperties(rb.prototype,{dynamic:{get:function(){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");
+return 35048===this.usage},set:function(a){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");this.setUsage(a)}}});Object.assign(rb.prototype,{setDynamic:function(a){console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.");this.setUsage(!0===a?35048:35044);return this},setArray:function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}});
+Object.assign(hb.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}});Object.defineProperties(uf.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
+return this}}});Object.defineProperties(K.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new D}},shading:{get:function(){console.error("THREE."+
+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.");this.flatShading=1===a}},stencilMask:{get:function(){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead.");return this.stencilFuncMask},set:function(a){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead.");this.stencilFuncMask=
+a}}});Object.defineProperties(Mb.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});Object.defineProperties(Ca.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},
+set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(jg.prototype,{clearTarget:function(a,b,c,d){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.");this.setRenderTarget(a);this.clear(b,c,d)},animate:function(a){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop().");this.setAnimationLoop(a)},getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");
+return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");
+return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");
+return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");
+return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},
+addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},
+setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().");return this.getActiveMipmapLevel()}});Object.defineProperties(jg.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},
+set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.");return this.getContext()}},
+vr:{get:function(){console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr");return this.xr}},gammaInput:{get:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.");return!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.");
+return!1},set:function(a){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.");this.outputEncoding=!0===a?3001:3E3}}});Object.defineProperties(Rh.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},
+set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});Object.defineProperties(Ba.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
+return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},
+set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},
+set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");
+this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");
+return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.defineProperties(gd.prototype,{load:{value:function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new tf).load(a,function(a){b.setBuffer(a)});return this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}});Fg.prototype.getData=
+function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};Fc.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};Ob.crossOrigin=void 0;Ob.loadTexture=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new ef;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};
+Ob.loadTextureCube=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new df;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};Ob.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};Ob.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};
+"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"117"}}));k.ACESFilmicToneMapping=5;k.AddEquation=100;k.AddOperation=2;k.AdditiveAnimationBlendMode=2501;k.AdditiveBlending=2;k.AlphaFormat=1021;k.AlwaysDepth=1;k.AlwaysStencilFunc=519;k.AmbientLight=mf;k.AmbientLightProbe=Ag;k.AnimationClip=Sa;k.AnimationLoader=rg;k.AnimationMixer=Hg;k.AnimationObjectGroup=ii;k.AnimationUtils=ka;k.ArcCurve=ed;k.ArrayCamera=Le;k.ArrowHelper=xb;k.Audio=
+gd;k.AudioAnalyser=Fg;k.AudioContext=Dg;k.AudioListener=Cg;k.AudioLoader=tf;k.AxesHelper=re;k.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new re(a)};k.BackSide=1;k.BasicDepthPacking=3200;k.BasicShadowMap=0;k.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new cf(a)};k.Bone=kg;k.BooleanKeyframeTrack=Ze;k.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");
+return new wb(a,b)};k.Box2=Lg;k.Box3=Va;k.Box3Helper=pe;k.BoxBufferGeometry=Gd;k.BoxGeometry=fh;k.BoxHelper=wb;k.BufferAttribute=G;k.BufferGeometry=F;k.BufferGeometryLoader=rf;k.ByteType=1010;k.Cache=tc;k.Camera=fb;k.CameraHelper=oe;k.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")};k.CanvasTexture=Od;k.CatmullRomCurve3=qa;k.CineonToneMapping=4;k.CircleBufferGeometry=ad;k.CircleGeometry=he;k.ClampToEdgeWrapping=1001;k.Clock=Bg;k.ClosedSplineCurve3=ri;k.Color=D;k.ColorKeyframeTrack=
+$e;k.CompressedTexture=Oc;k.CompressedTextureLoader=sg;k.ConeBufferGeometry=ge;k.ConeGeometry=fe;k.CubeCamera=Fc;k.CubeGeometry=fh;k.CubeReflectionMapping=301;k.CubeRefractionMapping=302;k.CubeTexture=qb;k.CubeTextureLoader=df;k.CubeUVReflectionMapping=306;k.CubeUVRefractionMapping=307;k.CubicBezierCurve=Ya;k.CubicBezierCurve3=jb;k.CubicInterpolant=Xe;k.CullFaceBack=1;k.CullFaceFront=2;k.CullFaceFrontBack=3;k.CullFaceNone=0;k.Curve=H;k.CurvePath=vb;k.CustomBlending=5;k.CylinderBufferGeometry=tb;k.CylinderGeometry=
+hc;k.Cylindrical=mi;k.DataTexture=$b;k.DataTexture2DArray=Hc;k.DataTexture3D=Ic;k.DataTextureLoader=cf;k.DecrementStencilOp=7683;k.DecrementWrapStencilOp=34056;k.DefaultLoadingManager=ei;k.DepthFormat=1026;k.DepthStencilFormat=1027;k.DepthTexture=Pd;k.DirectionalLight=lf;k.DirectionalLightHelper=kd;k.DirectionalLightShadow=kf;k.DiscreteInterpolant=Ye;k.DodecahedronBufferGeometry=Tc;k.DodecahedronGeometry=Vd;k.DoubleSide=2;k.DstAlphaFactor=206;k.DstColorFactor=208;k.DynamicBufferAttribute=function(a,
+b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.");return(new G(a,b)).setUsage(35048)};k.DynamicCopyUsage=35050;k.DynamicDrawUsage=35048;k.DynamicReadUsage=35049;k.EdgesGeometry=$c;k.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new ma(new $c(a.geometry),new da({color:void 0!==b?b:16777215}))};k.EllipseCurve=Na;k.EqualDepth=4;k.EqualStencilFunc=
+514;k.EquirectangularReflectionMapping=303;k.EquirectangularRefractionMapping=304;k.Euler=Ub;k.EventDispatcher=ua;k.ExtrudeBufferGeometry=hb;k.ExtrudeGeometry=dc;k.Face3=Ac;k.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Ac(a,b,c,e,f,g)};k.FaceColors=1;k.FileLoader=Ta;k.FlatShading=1;k.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");
+return new B(a,b)};k.Float32BufferAttribute=B;k.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new Dd(a,b)};k.Float64BufferAttribute=Dd;k.FloatType=1015;k.Fog=Oe;k.FogExp2=Ne;k.Font=xg;k.FontLoader=yg;k.FrontFaceDirectionCCW=1;k.FrontFaceDirectionCW=0;k.FrontSide=0;k.Frustum=Gc;k.GammaEncoding=3007;k.Geometry=L;k.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
+if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};k.GreaterDepth=6;k.GreaterEqualDepth=5;k.GreaterEqualStencilFunc=518;k.GreaterStencilFunc=516;k.GridHelper=vf;k.Group=Kc;k.HalfFloatType=1016;k.HemisphereLight=ff;k.HemisphereLightHelper=jd;k.HemisphereLightProbe=zg;k.IcosahedronBufferGeometry=Sc;k.IcosahedronGeometry=
+Ud;k.ImageBitmapLoader=vg;k.ImageLoader=dd;k.ImageUtils=Ob;k.ImmediateRenderObject=ne;k.IncrementStencilOp=7682;k.IncrementWrapStencilOp=34055;k.InstancedBufferAttribute=qf;k.InstancedBufferGeometry=me;k.InstancedInterleavedBuffer=Ig;k.InstancedMesh=Se;k.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new Bd(a,b)};k.Int16BufferAttribute=Bd;k.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");
+return new Cd(a,b)};k.Int32BufferAttribute=Cd;k.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new yd(a,b)};k.Int8BufferAttribute=yd;k.IntType=1013;k.InterleavedBuffer=rb;k.InterleavedBufferAttribute=Kd;k.Interpolant=Ma;k.InterpolateDiscrete=2300;k.InterpolateLinear=2301;k.InterpolateSmooth=2302;k.InvertStencilOp=5386;k.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")};k.KeepStencilOp=7680;
+k.KeyframeTrack=ta;k.LOD=Nd;k.LatheBufferGeometry=Zc;k.LatheGeometry=ee;k.Layers=De;k.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")};k.LessDepth=2;k.LessEqualDepth=3;k.LessEqualStencilFunc=515;k.LessStencilFunc=513;k.Light=S;k.LightProbe=Ua;k.LightShadow=lb;k.Line=La;k.Line3=Mg;k.LineBasicMaterial=da;k.LineCurve=Ia;k.LineCurve3=Za;k.LineDashedMaterial=oc;k.LineLoop=Te;k.LinePieces=1;k.LineSegments=ma;k.LineStrip=0;k.LinearEncoding=3E3;k.LinearFilter=
+1006;k.LinearInterpolant=ie;k.LinearMipMapLinearFilter=1008;k.LinearMipMapNearestFilter=1007;k.LinearMipmapLinearFilter=1008;k.LinearMipmapNearestFilter=1007;k.LinearToneMapping=1;k.Loader=V;k.LoaderUtils=lh;k.LoadingManager=qg;k.LogLuvEncoding=3003;k.LoopOnce=2200;k.LoopPingPong=2202;k.LoopRepeat=2201;k.LuminanceAlphaFormat=1025;k.LuminanceFormat=1024;k.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2};k.Material=K;k.MaterialLoader=pf;k.Math=O;k.MathUtils=O;k.Matrix3=ya;k.Matrix4=N;k.MaxEquation=
+104;k.Mesh=ea;k.MeshBasicMaterial=Pa;k.MeshDepthMaterial=Hb;k.MeshDistanceMaterial=Ib;k.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};k.MeshLambertMaterial=mc;k.MeshMatcapMaterial=nc;k.MeshNormalMaterial=lc;k.MeshPhongMaterial=Mb;k.MeshPhysicalMaterial=jc;k.MeshStandardMaterial=ib;k.MeshToonMaterial=kc;k.MinEquation=103;k.MirroredRepeatWrapping=1002;k.MixOperation=1;k.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");
+a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};k.MultiplyBlending=4;k.MultiplyOperation=0;k.NearestFilter=1003;k.NearestMipMapLinearFilter=1005;k.NearestMipMapNearestFilter=1004;k.NearestMipmapLinearFilter=1005;k.NearestMipmapNearestFilter=1004;k.NeverDepth=0;k.NeverStencilFunc=512;k.NoBlending=0;k.NoColors=0;k.NoToneMapping=0;k.NormalAnimationBlendMode=2500;k.NormalBlending=1;k.NotEqualDepth=7;k.NotEqualStencilFunc=517;k.NumberKeyframeTrack=bd;k.Object3D=y;k.ObjectLoader=
+sf;k.ObjectSpaceNormalMap=1;k.OctahedronBufferGeometry=bc;k.OctahedronGeometry=Td;k.OneFactor=201;k.OneMinusDstAlphaFactor=207;k.OneMinusDstColorFactor=209;k.OneMinusSrcAlphaFactor=205;k.OneMinusSrcColorFactor=203;k.OrthographicCamera=fd;k.PCFShadowMap=1;k.PCFSoftShadowMap=2;k.PMREMGenerator=Og;k.ParametricBufferGeometry=Qc;k.ParametricGeometry=Qd;k.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new Ld(a)};k.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");
+return new Xa(a)};k.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Nc(a,b)};k.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Xa(a)};k.Path=bb;k.PerspectiveCamera=P;k.Plane=Wa;k.PlaneBufferGeometry=ac;k.PlaneGeometry=Fd;k.PlaneHelper=qe;k.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Nc(a,b)};k.PointCloudMaterial=
+function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Xa(a)};k.PointLight=jf;k.PointLightHelper=id;k.Points=Nc;k.PointsMaterial=Xa;k.PolarGridHelper=wf;k.PolyhedronBufferGeometry=Ga;k.PolyhedronGeometry=Rd;k.PositionalAudio=Eg;k.PropertyBinding=Aa;k.PropertyMixer=Gg;k.QuadraticBezierCurve=$a;k.QuadraticBezierCurve3=kb;k.Quaternion=va;k.QuaternionKeyframeTrack=je;k.QuaternionLinearInterpolant=af;k.REVISION="117";k.RGBADepthPacking=3201;k.RGBAFormat=
+1023;k.RGBAIntegerFormat=1033;k.RGBA_ASTC_10x10_Format=37819;k.RGBA_ASTC_10x5_Format=37816;k.RGBA_ASTC_10x6_Format=37817;k.RGBA_ASTC_10x8_Format=37818;k.RGBA_ASTC_12x10_Format=37820;k.RGBA_ASTC_12x12_Format=37821;k.RGBA_ASTC_4x4_Format=37808;k.RGBA_ASTC_5x4_Format=37809;k.RGBA_ASTC_5x5_Format=37810;k.RGBA_ASTC_6x5_Format=37811;k.RGBA_ASTC_6x6_Format=37812;k.RGBA_ASTC_8x5_Format=37813;k.RGBA_ASTC_8x6_Format=37814;k.RGBA_ASTC_8x8_Format=37815;k.RGBA_BPTC_Format=36492;k.RGBA_ETC2_EAC_Format=37496;k.RGBA_PVRTC_2BPPV1_Format=
+35843;k.RGBA_PVRTC_4BPPV1_Format=35842;k.RGBA_S3TC_DXT1_Format=33777;k.RGBA_S3TC_DXT3_Format=33778;k.RGBA_S3TC_DXT5_Format=33779;k.RGBDEncoding=3006;k.RGBEEncoding=3002;k.RGBEFormat=1023;k.RGBFormat=1022;k.RGBIntegerFormat=1032;k.RGBM16Encoding=3005;k.RGBM7Encoding=3004;k.RGB_ETC1_Format=36196;k.RGB_ETC2_Format=37492;k.RGB_PVRTC_2BPPV1_Format=35841;k.RGB_PVRTC_4BPPV1_Format=35840;k.RGB_S3TC_DXT1_Format=33776;k.RGFormat=1030;k.RGIntegerFormat=1031;k.RawShaderMaterial=ub;k.Ray=Wb;k.Raycaster=Jg;k.RectAreaLight=
+nf;k.RedFormat=1028;k.RedIntegerFormat=1029;k.ReinhardToneMapping=2;k.RepeatWrapping=1E3;k.ReplaceStencilOp=7681;k.ReverseSubtractEquation=102;k.RingBufferGeometry=Yc;k.RingGeometry=de;k.SRGB8_ALPHA8_ASTC_10x10_Format=37851;k.SRGB8_ALPHA8_ASTC_10x5_Format=37848;k.SRGB8_ALPHA8_ASTC_10x6_Format=37849;k.SRGB8_ALPHA8_ASTC_10x8_Format=37850;k.SRGB8_ALPHA8_ASTC_12x10_Format=37852;k.SRGB8_ALPHA8_ASTC_12x12_Format=37853;k.SRGB8_ALPHA8_ASTC_4x4_Format=37840;k.SRGB8_ALPHA8_ASTC_5x4_Format=37841;k.SRGB8_ALPHA8_ASTC_5x5_Format=
+37842;k.SRGB8_ALPHA8_ASTC_6x5_Format=37843;k.SRGB8_ALPHA8_ASTC_6x6_Format=37844;k.SRGB8_ALPHA8_ASTC_8x5_Format=37845;k.SRGB8_ALPHA8_ASTC_8x6_Format=37846;k.SRGB8_ALPHA8_ASTC_8x8_Format=37847;k.Scene=zc;k.SceneUtils={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};
+k.ShaderChunk=M;k.ShaderLib=gb;k.ShaderMaterial=Ca;k.ShadowMaterial=ic;k.Shape=Nb;k.ShapeBufferGeometry=gc;k.ShapeGeometry=fc;k.ShapePath=wg;k.ShapeUtils=sb;k.ShortType=1011;k.Skeleton=Re;k.SkeletonHelper=pc;k.SkinnedMesh=Qe;k.SmoothShading=2;k.Sphere=eb;k.SphereBufferGeometry=ec;k.SphereGeometry=ce;k.Spherical=li;k.SphericalHarmonics3=of;k.SphericalReflectionMapping=305;k.Spline=Sg;k.SplineCurve=ab;k.SplineCurve3=si;k.SpotLight=hf;k.SpotLightHelper=hd;k.SpotLightShadow=gf;k.Sprite=Ld;k.SpriteMaterial=
+Kb;k.SrcAlphaFactor=204;k.SrcAlphaSaturateFactor=210;k.SrcColorFactor=202;k.StaticCopyUsage=35046;k.StaticDrawUsage=35044;k.StaticReadUsage=35045;k.StereoCamera=gi;k.StreamCopyUsage=35042;k.StreamDrawUsage=35040;k.StreamReadUsage=35041;k.StringKeyframeTrack=bf;k.SubtractEquation=101;k.SubtractiveBlending=3;k.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3};k.TangentSpaceNormalMap=0;k.TetrahedronBufferGeometry=Rc;k.TetrahedronGeometry=Sd;k.TextBufferGeometry=Xc;k.TextGeometry=be;k.Texture=W;k.TextureLoader=
+ef;k.TorusBufferGeometry=Vc;k.TorusGeometry=Yd;k.TorusKnotBufferGeometry=Uc;k.TorusKnotGeometry=Xd;k.Triangle=pa;k.TriangleFanDrawMode=2;k.TriangleStripDrawMode=1;k.TrianglesDrawMode=0;k.TubeBufferGeometry=cc;k.TubeGeometry=Wd;k.UVMapping=300;k.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new Xb(a,b)};k.Uint16BufferAttribute=Xb;k.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");
+return new Yb(a,b)};k.Uint32BufferAttribute=Yb;k.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new zd(a,b)};k.Uint8BufferAttribute=zd;k.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new Ad(a,b)};k.Uint8ClampedBufferAttribute=Ad;k.Uncharted2ToneMapping=3;k.Uniform=uf;k.UniformsLib=A;k.UniformsUtils=
+Oh;k.UnsignedByteType=1009;k.UnsignedInt248Type=1020;k.UnsignedIntType=1014;k.UnsignedShort4444Type=1017;k.UnsignedShort5551Type=1018;k.UnsignedShort565Type=1019;k.UnsignedShortType=1012;k.VSMShadowMap=3;k.Vector2=v;k.Vector3=p;k.Vector4=R;k.VectorKeyframeTrack=cd;k.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new p(a,b,c)};k.VertexColors=2;k.VideoTexture=ng;k.WebGLCubeRenderTarget=Zb;k.WebGLMultisampleRenderTarget=Xf;k.WebGLRenderTarget=
+Ba;k.WebGLRenderTargetCube=function(a,b,c){console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).");return new Zb(a,c)};k.WebGLRenderer=jg;k.WebGLUtils=Th;k.WireframeGeometry=Pc;k.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new ma(new Pc(a.geometry),new da({color:void 0!==b?b:16777215}))};k.WrapAroundEnding=2402;k.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");
+return new Ta(a)};k.ZeroCurvatureEnding=2400;k.ZeroFactor=200;k.ZeroSlopeEnding=2401;k.ZeroStencilOp=0;k.sRGBEncoding=3001;Object.defineProperty(k,"__esModule",{value:!0})});
 
-       return {
-               setTimer: setTimer,
-               clearTimer: clearTimer,
-               asap: asap
-       };
+},{}],243:[function(require,module,exports){
+'use strict';
 
-       function isNode () {
-               return typeof process !== 'undefined' &&
-                       Object.prototype.toString.call(process) === '[object process]';
-       }
+module.exports = TinyQueue;
 
-       function hasMutationObserver () {
-               return (typeof MutationObserver === 'function' && MutationObserver) ||
-                       (typeof WebKitMutationObserver === 'function' && WebKitMutationObserver);
-       }
+function TinyQueue(data, compare) {
+    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);
 
-       function initMutationObserver(MutationObserver) {
-               var scheduled;
-               var node = document.createTextNode('');
-               var o = new MutationObserver(run);
-               o.observe(node, { characterData: true });
+    this.data = data || [];
+    this.length = this.data.length;
+    this.compare = compare || defaultCompare;
 
-               function run() {
-                       var f = scheduled;
-                       scheduled = void 0;
-                       f();
-               }
+    if (this.length > 0) {
+        for (var i = (this.length >> 1); i >= 0; i--) this._down(i);
+    }
+}
 
-               var i = 0;
-               return function (f) {
-                       scheduled = f;
-                       node.data = (i ^= 1);
-               };
-       }
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+function defaultCompare(a, b) {
+    return a < b ? -1 : a > b ? 1 : 0;
+}
 
-}).call(this,require('_process'))
+TinyQueue.prototype = {
 
-},{"_process":4}],201:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+    push: function (item) {
+        this.data.push(item);
+        this.length++;
+        this._up(this.length - 1);
+    },
 
-(function(define) { 'use strict';
-define(function() {
+    pop: function () {
+        if (this.length === 0) return undefined;
+        var top = this.data[0];
+        this.length--;
+        if (this.length > 0) {
+            this.data[0] = this.data[this.length];
+            this._down(0);
+        }
+        this.data.pop();
+        return top;
+    },
 
-       return {
-               formatError: formatError,
-               formatObject: formatObject,
-               tryStringify: tryStringify
-       };
+    peek: function () {
+        return this.data[0];
+    },
 
-       /**
-        * Format an error into a string.  If e is an Error and has a stack property,
-        * it's returned.  Otherwise, e is formatted using formatObject, with a
-        * warning added about e not being a proper Error.
-        * @param {*} e
-        * @returns {String} formatted string, suitable for output to developers
-        */
-       function formatError(e) {
-               var s = typeof e === 'object' && e !== null && (e.stack || e.message) ? e.stack || e.message : formatObject(e);
-               return e instanceof Error ? s : s + ' (WARNING: non-Error used)';
-       }
+    _up: function (pos) {
+        var data = this.data;
+        var compare = this.compare;
+        var item = data[pos];
 
-       /**
-        * Format an object, detecting "plain" objects and running them through
-        * JSON.stringify if possible.
-        * @param {Object} o
-        * @returns {string}
-        */
-       function formatObject(o) {
-               var s = String(o);
-               if(s === '[object Object]' && typeof JSON !== 'undefined') {
-                       s = tryStringify(o, s);
-               }
-               return s;
-       }
+        while (pos > 0) {
+            var parent = (pos - 1) >> 1;
+            var current = data[parent];
+            if (compare(item, current) >= 0) break;
+            data[pos] = current;
+            pos = parent;
+        }
 
-       /**
-        * Try to return the result of JSON.stringify(x).  If that fails, return
-        * defaultValue
-        * @param {*} x
-        * @param {*} defaultValue
-        * @returns {String|*} JSON.stringify(x) or defaultValue
-        */
-       function tryStringify(x, defaultValue) {
-               try {
-                       return JSON.stringify(x);
-               } catch(e) {
-                       return defaultValue;
-               }
-       }
+        data[pos] = item;
+    },
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+    _down: function (pos) {
+        var data = this.data;
+        var compare = this.compare;
+        var len = this.length;
+        var halfLen = len >> 1;
+        var item = data[pos];
 
-},{}],202:[function(require,module,exports){
-(function (process){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+        while (pos < halfLen) {
+            var left = (pos << 1) + 1;
+            var right = left + 1;
+            var best = data[left];
 
-(function(define) { 'use strict';
-define(function() {
+            if (right < len && compare(data[right], best) < 0) {
+                left = right;
+                best = data[right];
+            }
+            if (compare(best, item) >= 0) break;
 
-       return function makePromise(environment) {
+            data[pos] = best;
+            pos = left;
+        }
 
-               var tasks = environment.scheduler;
-               var emitRejection = initEmitRejection();
+        data[pos] = item;
+    }
+};
 
-               var objectCreate = Object.create ||
-                       function(proto) {
-                               function Child() {}
-                               Child.prototype = proto;
-                               return new Child();
-                       };
+},{}],244:[function(require,module,exports){
+var createElement = require("./vdom/create-element.js")
 
-               /**
-                * Create a promise whose fate is determined by resolver
-                * @constructor
-                * @returns {Promise} promise
-                * @name Promise
-                */
-               function Promise(resolver, handler) {
-                       this._handler = resolver === Handler ? handler : init(resolver);
-               }
+module.exports = createElement
 
-               /**
-                * Run the supplied resolver
-                * @param resolver
-                * @returns {Pending}
-                */
-               function init(resolver) {
-                       var handler = new Pending();
+},{"./vdom/create-element.js":250}],245:[function(require,module,exports){
+var diff = require("./vtree/diff.js")
 
-                       try {
-                               resolver(promiseResolve, promiseReject, promiseNotify);
-                       } catch (e) {
-                               promiseReject(e);
-                       }
+module.exports = diff
 
-                       return handler;
+},{"./vtree/diff.js":270}],246:[function(require,module,exports){
+var h = require("./virtual-hyperscript/index.js")
 
-                       /**
-                        * Transition from pre-resolution state to post-resolution state, notifying
-                        * all listeners of the ultimate fulfillment or rejection
-                        * @param {*} x resolution value
-                        */
-                       function promiseResolve (x) {
-                               handler.resolve(x);
-                       }
-                       /**
-                        * Reject this promise with reason, which will be used verbatim
-                        * @param {Error|*} reason rejection reason, strongly suggested
-                        *   to be an Error type
-                        */
-                       function promiseReject (reason) {
-                               handler.reject(reason);
-                       }
+module.exports = h
 
-                       /**
-                        * @deprecated
-                        * Issue a progress event, notifying all progress listeners
-                        * @param {*} x progress event payload to pass to all listeners
-                        */
-                       function promiseNotify (x) {
-                               handler.notify(x);
-                       }
-               }
+},{"./virtual-hyperscript/index.js":257}],247:[function(require,module,exports){
+var diff = require("./diff.js")
+var patch = require("./patch.js")
+var h = require("./h.js")
+var create = require("./create-element.js")
+var VNode = require('./vnode/vnode.js')
+var VText = require('./vnode/vtext.js')
 
-               // Creation
+module.exports = {
+    diff: diff,
+    patch: patch,
+    h: h,
+    create: create,
+    VNode: VNode,
+    VText: VText
+}
 
-               Promise.resolve = resolve;
-               Promise.reject = reject;
-               Promise.never = never;
+},{"./create-element.js":244,"./diff.js":245,"./h.js":246,"./patch.js":248,"./vnode/vnode.js":266,"./vnode/vtext.js":268}],248:[function(require,module,exports){
+var patch = require("./vdom/patch.js")
 
-               Promise._defer = defer;
-               Promise._handler = getHandler;
+module.exports = patch
 
-               /**
-                * Returns a trusted promise. If x is already a trusted promise, it is
-                * returned, otherwise returns a new trusted Promise which follows x.
-                * @param  {*} x
-                * @return {Promise} promise
-                */
-               function resolve(x) {
-                       return isPromise(x) ? x
-                               : new Promise(Handler, new Async(getHandler(x)));
-               }
+},{"./vdom/patch.js":253}],249:[function(require,module,exports){
+var isObject = require("is-object")
+var isHook = require("../vnode/is-vhook.js")
 
-               /**
-                * Return a reject promise with x as its reason (x is used verbatim)
-                * @param {*} x
-                * @returns {Promise} rejected promise
-                */
-               function reject(x) {
-                       return new Promise(Handler, new Async(new Rejected(x)));
-               }
+module.exports = applyProperties
 
-               /**
-                * Return a promise that remains pending forever
-                * @returns {Promise} forever-pending promise.
-                */
-               function never() {
-                       return foreverPendingPromise; // Should be frozen
-               }
+function applyProperties(node, props, previous) {
+    for (var propName in props) {
+        var propValue = props[propName]
 
-               /**
-                * Creates an internal {promise, resolver} pair
-                * @private
-                * @returns {Promise}
-                */
-               function defer() {
-                       return new Promise(Handler, new Pending());
-               }
+        if (propValue === undefined) {
+            removeProperty(node, propName, propValue, previous);
+        } else if (isHook(propValue)) {
+            removeProperty(node, propName, propValue, previous)
+            if (propValue.hook) {
+                propValue.hook(node,
+                    propName,
+                    previous ? previous[propName] : undefined)
+            }
+        } else {
+            if (isObject(propValue)) {
+                patchObject(node, props, previous, propName, propValue);
+            } else {
+                node[propName] = propValue
+            }
+        }
+    }
+}
 
-               // Transformation and flow control
+function removeProperty(node, propName, propValue, previous) {
+    if (previous) {
+        var previousValue = previous[propName]
 
-               /**
-                * Transform this promise's fulfillment value, returning a new Promise
-                * for the transformed result.  If the promise cannot be fulfilled, onRejected
-                * is called with the reason.  onProgress *may* be called with updates toward
-                * this promise's fulfillment.
-                * @param {function=} onFulfilled fulfillment handler
-                * @param {function=} onRejected rejection handler
-                * @param {function=} onProgress @deprecated progress handler
-                * @return {Promise} new promise
-                */
-               Promise.prototype.then = function(onFulfilled, onRejected, onProgress) {
-                       var parent = this._handler;
-                       var state = parent.join().state();
+        if (!isHook(previousValue)) {
+            if (propName === "attributes") {
+                for (var attrName in previousValue) {
+                    node.removeAttribute(attrName)
+                }
+            } else if (propName === "style") {
+                for (var i in previousValue) {
+                    node.style[i] = ""
+                }
+            } else if (typeof previousValue === "string") {
+                node[propName] = ""
+            } else {
+                node[propName] = null
+            }
+        } else if (previousValue.unhook) {
+            previousValue.unhook(node, propName, propValue)
+        }
+    }
+}
 
-                       if ((typeof onFulfilled !== 'function' && state > 0) ||
-                               (typeof onRejected !== 'function' && state < 0)) {
-                               // Short circuit: value will not change, simply share handler
-                               return new this.constructor(Handler, parent);
-                       }
+function patchObject(node, props, previous, propName, propValue) {
+    var previousValue = previous ? previous[propName] : undefined
 
-                       var p = this._beget();
-                       var child = p._handler;
+    // Set attributes
+    if (propName === "attributes") {
+        for (var attrName in propValue) {
+            var attrValue = propValue[attrName]
 
-                       parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress);
+            if (attrValue === undefined) {
+                node.removeAttribute(attrName)
+            } else {
+                node.setAttribute(attrName, attrValue)
+            }
+        }
 
-                       return p;
-               };
+        return
+    }
 
-               /**
-                * If this promise cannot be fulfilled due to an error, call onRejected to
-                * handle the error. Shortcut for .then(undefined, onRejected)
-                * @param {function?} onRejected
-                * @return {Promise}
-                */
-               Promise.prototype['catch'] = function(onRejected) {
-                       return this.then(void 0, onRejected);
-               };
+    if(previousValue && isObject(previousValue) &&
+        getPrototype(previousValue) !== getPrototype(propValue)) {
+        node[propName] = propValue
+        return
+    }
 
-               /**
-                * Creates a new, pending promise of the same type as this promise
-                * @private
-                * @returns {Promise}
-                */
-               Promise.prototype._beget = function() {
-                       return begetFrom(this._handler, this.constructor);
-               };
+    if (!isObject(node[propName])) {
+        node[propName] = {}
+    }
 
-               function begetFrom(parent, Promise) {
-                       var child = new Pending(parent.receiver, parent.join().context);
-                       return new Promise(Handler, child);
-               }
+    var replacer = propName === "style" ? "" : undefined
 
-               // Array combinators
+    for (var k in propValue) {
+        var value = propValue[k]
+        node[propName][k] = (value === undefined) ? replacer : value
+    }
+}
 
-               Promise.all = all;
-               Promise.race = race;
-               Promise._traverse = traverse;
+function getPrototype(value) {
+    if (Object.getPrototypeOf) {
+        return Object.getPrototypeOf(value)
+    } else if (value.__proto__) {
+        return value.__proto__
+    } else if (value.constructor) {
+        return value.constructor.prototype
+    }
+}
 
-               /**
-                * Return a promise that will fulfill when all promises in the
-                * input array have fulfilled, or will reject when one of the
-                * promises rejects.
-                * @param {array} promises array of promises
-                * @returns {Promise} promise for array of fulfillment values
-                */
-               function all(promises) {
-                       return traverseWith(snd, null, promises);
-               }
+},{"../vnode/is-vhook.js":261,"is-object":20}],250:[function(require,module,exports){
+var document = require("global/document")
 
-               /**
-                * Array<Promise<X>> -> Promise<Array<f(X)>>
-                * @private
-                * @param {function} f function to apply to each promise's value
-                * @param {Array} promises array of promises
-                * @returns {Promise} promise for transformed values
-                */
-               function traverse(f, promises) {
-                       return traverseWith(tryCatch2, f, promises);
-               }
+var applyProperties = require("./apply-properties")
 
-               function traverseWith(tryMap, f, promises) {
-                       var handler = typeof f === 'function' ? mapAt : settleAt;
+var isVNode = require("../vnode/is-vnode.js")
+var isVText = require("../vnode/is-vtext.js")
+var isWidget = require("../vnode/is-widget.js")
+var handleThunk = require("../vnode/handle-thunk.js")
 
-                       var resolver = new Pending();
-                       var pending = promises.length >>> 0;
-                       var results = new Array(pending);
+module.exports = createElement
 
-                       for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) {
-                               x = promises[i];
+function createElement(vnode, opts) {
+    var doc = opts ? opts.document || document : document
+    var warn = opts ? opts.warn : null
 
-                               if (x === void 0 && !(i in promises)) {
-                                       --pending;
-                                       continue;
-                               }
+    vnode = handleThunk(vnode).a
 
-                               traverseAt(promises, handler, i, x, resolver);
-                       }
+    if (isWidget(vnode)) {
+        return vnode.init()
+    } else if (isVText(vnode)) {
+        return doc.createTextNode(vnode.text)
+    } else if (!isVNode(vnode)) {
+        if (warn) {
+            warn("Item is not a valid virtual dom node", vnode)
+        }
+        return null
+    }
 
-                       if(pending === 0) {
-                               resolver.become(new Fulfilled(results));
-                       }
+    var node = (vnode.namespace === null) ?
+        doc.createElement(vnode.tagName) :
+        doc.createElementNS(vnode.namespace, vnode.tagName)
 
-                       return new Promise(Handler, resolver);
+    var props = vnode.properties
+    applyProperties(node, props)
 
-                       function mapAt(i, x, resolver) {
-                               if(!resolver.resolved) {
-                                       traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver);
-                               }
-                       }
+    var children = vnode.children
 
-                       function settleAt(i, x, resolver) {
-                               results[i] = x;
-                               if(--pending === 0) {
-                                       resolver.become(new Fulfilled(results));
-                               }
-                       }
-               }
+    for (var i = 0; i < children.length; i++) {
+        var childNode = createElement(children[i], opts)
+        if (childNode) {
+            node.appendChild(childNode)
+        }
+    }
 
-               function traverseAt(promises, handler, i, x, resolver) {
-                       if (maybeThenable(x)) {
-                               var h = getHandlerMaybeThenable(x);
-                               var s = h.state();
+    return node
+}
 
-                               if (s === 0) {
-                                       h.fold(handler, i, void 0, resolver);
-                               } else if (s > 0) {
-                                       handler(i, h.value, resolver);
-                               } else {
-                                       resolver.become(h);
-                                       visitRemaining(promises, i+1, h);
-                               }
-                       } else {
-                               handler(i, x, resolver);
-                       }
-               }
+},{"../vnode/handle-thunk.js":259,"../vnode/is-vnode.js":262,"../vnode/is-vtext.js":263,"../vnode/is-widget.js":264,"./apply-properties":249,"global/document":16}],251:[function(require,module,exports){
+// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
+// We don't want to read all of the DOM nodes in the tree so we use
+// the in-order tree indexing to eliminate recursion down certain branches.
+// We only recurse into a DOM node if we know that it contains a child of
+// interest.
 
-               Promise._visitRemaining = visitRemaining;
-               function visitRemaining(promises, start, handler) {
-                       for(var i=start; i<promises.length; ++i) {
-                               markAsHandled(getHandler(promises[i]), handler);
-                       }
-               }
+var noChild = {}
 
-               function markAsHandled(h, handler) {
-                       if(h === handler) {
-                               return;
-                       }
+module.exports = domIndex
 
-                       var s = h.state();
-                       if(s === 0) {
-                               h.visit(h, void 0, h._unreport);
-                       } else if(s < 0) {
-                               h._unreport();
-                       }
-               }
+function domIndex(rootNode, tree, indices, nodes) {
+    if (!indices || indices.length === 0) {
+        return {}
+    } else {
+        indices.sort(ascending)
+        return recurse(rootNode, tree, indices, nodes, 0)
+    }
+}
 
-               /**
-                * Fulfill-reject competitive race. Return a promise that will settle
-                * to the same state as the earliest input promise to settle.
-                *
-                * WARNING: The ES6 Promise spec requires that race()ing an empty array
-                * must return a promise that is pending forever.  This implementation
-                * returns a singleton forever-pending promise, the same singleton that is
-                * returned by Promise.never(), thus can be checked with ===
-                *
-                * @param {array} promises array of promises to race
-                * @returns {Promise} if input is non-empty, a promise that will settle
-                * to the same outcome as the earliest input promise to settle. if empty
-                * is empty, returns a promise that will never settle.
-                */
-               function race(promises) {
-                       if(typeof promises !== 'object' || promises === null) {
-                               return reject(new TypeError('non-iterable passed to race()'));
-                       }
+function recurse(rootNode, tree, indices, nodes, rootIndex) {
+    nodes = nodes || {}
 
-                       // Sigh, race([]) is untestable unless we return *something*
-                       // that is recognizable without calling .then() on it.
-                       return promises.length === 0 ? never()
-                                : promises.length === 1 ? resolve(promises[0])
-                                : runRace(promises);
-               }
 
-               function runRace(promises) {
-                       var resolver = new Pending();
-                       var i, x, h;
-                       for(i=0; i<promises.length; ++i) {
-                               x = promises[i];
-                               if (x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
+    if (rootNode) {
+        if (indexInRange(indices, rootIndex, rootIndex)) {
+            nodes[rootIndex] = rootNode
+        }
 
-                               h = getHandler(x);
-                               if(h.state() !== 0) {
-                                       resolver.become(h);
-                                       visitRemaining(promises, i+1, h);
-                                       break;
-                               } else {
-                                       h.visit(resolver, resolver.resolve, resolver.reject);
-                               }
-                       }
-                       return new Promise(Handler, resolver);
-               }
+        var vChildren = tree.children
 
-               // Promise internals
-               // Below this, everything is @private
+        if (vChildren) {
 
-               /**
-                * Get an appropriate handler for x, without checking for cycles
-                * @param {*} x
-                * @returns {object} handler
-                */
-               function getHandler(x) {
-                       if(isPromise(x)) {
-                               return x._handler.join();
-                       }
-                       return maybeThenable(x) ? getHandlerUntrusted(x) : new Fulfilled(x);
-               }
+            var childNodes = rootNode.childNodes
 
-               /**
-                * Get a handler for thenable x.
-                * NOTE: You must only call this if maybeThenable(x) == true
-                * @param {object|function|Promise} x
-                * @returns {object} handler
-                */
-               function getHandlerMaybeThenable(x) {
-                       return isPromise(x) ? x._handler.join() : getHandlerUntrusted(x);
-               }
+            for (var i = 0; i < tree.children.length; i++) {
+                rootIndex += 1
 
-               /**
-                * Get a handler for potentially untrusted thenable x
-                * @param {*} x
-                * @returns {object} handler
-                */
-               function getHandlerUntrusted(x) {
-                       try {
-                               var untrustedThen = x.then;
-                               return typeof untrustedThen === 'function'
-                                       ? new Thenable(untrustedThen, x)
-                                       : new Fulfilled(x);
-                       } catch(e) {
-                               return new Rejected(e);
-                       }
-               }
+                var vChild = vChildren[i] || noChild
+                var nextIndex = rootIndex + (vChild.count || 0)
 
-               /**
-                * Handler for a promise that is pending forever
-                * @constructor
-                */
-               function Handler() {}
+                // skip recursion down the tree if there are no nodes down here
+                if (indexInRange(indices, rootIndex, nextIndex)) {
+                    recurse(childNodes[i], vChild, indices, nodes, rootIndex)
+                }
 
-               Handler.prototype.when
-                       = Handler.prototype.become
-                       = Handler.prototype.notify // deprecated
-                       = Handler.prototype.fail
-                       = Handler.prototype._unreport
-                       = Handler.prototype._report
-                       = noop;
+                rootIndex = nextIndex
+            }
+        }
+    }
 
-               Handler.prototype._state = 0;
+    return nodes
+}
 
-               Handler.prototype.state = function() {
-                       return this._state;
-               };
+// Binary search for an index in the interval [left, right]
+function indexInRange(indices, left, right) {
+    if (indices.length === 0) {
+        return false
+    }
 
-               /**
-                * Recursively collapse handler chain to find the handler
-                * nearest to the fully resolved value.
-                * @returns {object} handler nearest the fully resolved value
-                */
-               Handler.prototype.join = function() {
-                       var h = this;
-                       while(h.handler !== void 0) {
-                               h = h.handler;
-                       }
-                       return h;
-               };
+    var minIndex = 0
+    var maxIndex = indices.length - 1
+    var currentIndex
+    var currentItem
 
-               Handler.prototype.chain = function(to, receiver, fulfilled, rejected, progress) {
-                       this.when({
-                               resolver: to,
-                               receiver: receiver,
-                               fulfilled: fulfilled,
-                               rejected: rejected,
-                               progress: progress
-                       });
-               };
+    while (minIndex <= maxIndex) {
+        currentIndex = ((maxIndex + minIndex) / 2) >> 0
+        currentItem = indices[currentIndex]
 
-               Handler.prototype.visit = function(receiver, fulfilled, rejected, progress) {
-                       this.chain(failIfRejected, receiver, fulfilled, rejected, progress);
-               };
+        if (minIndex === maxIndex) {
+            return currentItem >= left && currentItem <= right
+        } else if (currentItem < left) {
+            minIndex = currentIndex + 1
+        } else  if (currentItem > right) {
+            maxIndex = currentIndex - 1
+        } else {
+            return true
+        }
+    }
 
-               Handler.prototype.fold = function(f, z, c, to) {
-                       this.when(new Fold(f, z, c, to));
-               };
+    return false;
+}
 
-               /**
-                * Handler that invokes fail() on any handler it becomes
-                * @constructor
-                */
-               function FailIfRejected() {}
+function ascending(a, b) {
+    return a > b ? 1 : -1
+}
 
-               inherit(Handler, FailIfRejected);
+},{}],252:[function(require,module,exports){
+var applyProperties = require("./apply-properties")
 
-               FailIfRejected.prototype.become = function(h) {
-                       h.fail();
-               };
+var isWidget = require("../vnode/is-widget.js")
+var VPatch = require("../vnode/vpatch.js")
 
-               var failIfRejected = new FailIfRejected();
+var updateWidget = require("./update-widget")
 
-               /**
-                * Handler that manages a queue of consumers waiting on a pending promise
-                * @constructor
-                */
-               function Pending(receiver, inheritedContext) {
-                       Promise.createContext(this, inheritedContext);
+module.exports = applyPatch
 
-                       this.consumers = void 0;
-                       this.receiver = receiver;
-                       this.handler = void 0;
-                       this.resolved = false;
-               }
+function applyPatch(vpatch, domNode, renderOptions) {
+    var type = vpatch.type
+    var vNode = vpatch.vNode
+    var patch = vpatch.patch
 
-               inherit(Handler, Pending);
+    switch (type) {
+        case VPatch.REMOVE:
+            return removeNode(domNode, vNode)
+        case VPatch.INSERT:
+            return insertNode(domNode, patch, renderOptions)
+        case VPatch.VTEXT:
+            return stringPatch(domNode, vNode, patch, renderOptions)
+        case VPatch.WIDGET:
+            return widgetPatch(domNode, vNode, patch, renderOptions)
+        case VPatch.VNODE:
+            return vNodePatch(domNode, vNode, patch, renderOptions)
+        case VPatch.ORDER:
+            reorderChildren(domNode, patch)
+            return domNode
+        case VPatch.PROPS:
+            applyProperties(domNode, patch, vNode.properties)
+            return domNode
+        case VPatch.THUNK:
+            return replaceRoot(domNode,
+                renderOptions.patch(domNode, patch, renderOptions))
+        default:
+            return domNode
+    }
+}
 
-               Pending.prototype._state = 0;
+function removeNode(domNode, vNode) {
+    var parentNode = domNode.parentNode
 
-               Pending.prototype.resolve = function(x) {
-                       this.become(getHandler(x));
-               };
+    if (parentNode) {
+        parentNode.removeChild(domNode)
+    }
 
-               Pending.prototype.reject = function(x) {
-                       if(this.resolved) {
-                               return;
-                       }
+    destroyWidget(domNode, vNode);
 
-                       this.become(new Rejected(x));
-               };
+    return null
+}
 
-               Pending.prototype.join = function() {
-                       if (!this.resolved) {
-                               return this;
-                       }
+function insertNode(parentNode, vNode, renderOptions) {
+    var newNode = renderOptions.render(vNode, renderOptions)
 
-                       var h = this;
+    if (parentNode) {
+        parentNode.appendChild(newNode)
+    }
 
-                       while (h.handler !== void 0) {
-                               h = h.handler;
-                               if (h === this) {
-                                       return this.handler = cycle();
-                               }
-                       }
+    return parentNode
+}
 
-                       return h;
-               };
+function stringPatch(domNode, leftVNode, vText, renderOptions) {
+    var newNode
 
-               Pending.prototype.run = function() {
-                       var q = this.consumers;
-                       var handler = this.handler;
-                       this.handler = this.handler.join();
-                       this.consumers = void 0;
+    if (domNode.nodeType === 3) {
+        domNode.replaceData(0, domNode.length, vText.text)
+        newNode = domNode
+    } else {
+        var parentNode = domNode.parentNode
+        newNode = renderOptions.render(vText, renderOptions)
 
-                       for (var i = 0; i < q.length; ++i) {
-                               handler.when(q[i]);
-                       }
-               };
+        if (parentNode && newNode !== domNode) {
+            parentNode.replaceChild(newNode, domNode)
+        }
+    }
 
-               Pending.prototype.become = function(handler) {
-                       if(this.resolved) {
-                               return;
-                       }
+    return newNode
+}
 
-                       this.resolved = true;
-                       this.handler = handler;
-                       if(this.consumers !== void 0) {
-                               tasks.enqueue(this);
-                       }
+function widgetPatch(domNode, leftVNode, widget, renderOptions) {
+    var updating = updateWidget(leftVNode, widget)
+    var newNode
 
-                       if(this.context !== void 0) {
-                               handler._report(this.context);
-                       }
-               };
+    if (updating) {
+        newNode = widget.update(leftVNode, domNode) || domNode
+    } else {
+        newNode = renderOptions.render(widget, renderOptions)
+    }
 
-               Pending.prototype.when = function(continuation) {
-                       if(this.resolved) {
-                               tasks.enqueue(new ContinuationTask(continuation, this.handler));
-                       } else {
-                               if(this.consumers === void 0) {
-                                       this.consumers = [continuation];
-                               } else {
-                                       this.consumers.push(continuation);
-                               }
-                       }
-               };
+    var parentNode = domNode.parentNode
 
-               /**
-                * @deprecated
-                */
-               Pending.prototype.notify = function(x) {
-                       if(!this.resolved) {
-                               tasks.enqueue(new ProgressTask(x, this));
-                       }
-               };
+    if (parentNode && newNode !== domNode) {
+        parentNode.replaceChild(newNode, domNode)
+    }
 
-               Pending.prototype.fail = function(context) {
-                       var c = typeof context === 'undefined' ? this.context : context;
-                       this.resolved && this.handler.join().fail(c);
-               };
+    if (!updating) {
+        destroyWidget(domNode, leftVNode)
+    }
 
-               Pending.prototype._report = function(context) {
-                       this.resolved && this.handler.join()._report(context);
-               };
+    return newNode
+}
 
-               Pending.prototype._unreport = function() {
-                       this.resolved && this.handler.join()._unreport();
-               };
+function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
+    var parentNode = domNode.parentNode
+    var newNode = renderOptions.render(vNode, renderOptions)
 
-               /**
-                * Wrap another handler and force it into a future stack
-                * @param {object} handler
-                * @constructor
-                */
-               function Async(handler) {
-                       this.handler = handler;
-               }
+    if (parentNode && newNode !== domNode) {
+        parentNode.replaceChild(newNode, domNode)
+    }
 
-               inherit(Handler, Async);
+    return newNode
+}
 
-               Async.prototype.when = function(continuation) {
-                       tasks.enqueue(new ContinuationTask(continuation, this));
-               };
+function destroyWidget(domNode, w) {
+    if (typeof w.destroy === "function" && isWidget(w)) {
+        w.destroy(domNode)
+    }
+}
 
-               Async.prototype._report = function(context) {
-                       this.join()._report(context);
-               };
+function reorderChildren(domNode, moves) {
+    var childNodes = domNode.childNodes
+    var keyMap = {}
+    var node
+    var remove
+    var insert
 
-               Async.prototype._unreport = function() {
-                       this.join()._unreport();
-               };
+    for (var i = 0; i < moves.removes.length; i++) {
+        remove = moves.removes[i]
+        node = childNodes[remove.from]
+        if (remove.key) {
+            keyMap[remove.key] = node
+        }
+        domNode.removeChild(node)
+    }
 
-               /**
-                * Handler that wraps an untrusted thenable and assimilates it in a future stack
-                * @param {function} then
-                * @param {{then: function}} thenable
-                * @constructor
-                */
-               function Thenable(then, thenable) {
-                       Pending.call(this);
-                       tasks.enqueue(new AssimilateTask(then, thenable, this));
-               }
+    var length = childNodes.length
+    for (var j = 0; j < moves.inserts.length; j++) {
+        insert = moves.inserts[j]
+        node = keyMap[insert.key]
+        // this is the weirdest bug i've ever seen in webkit
+        domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to])
+    }
+}
 
-               inherit(Pending, Thenable);
+function replaceRoot(oldRoot, newRoot) {
+    if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) {
+        oldRoot.parentNode.replaceChild(newRoot, oldRoot)
+    }
 
-               /**
-                * Handler for a fulfilled promise
-                * @param {*} x fulfillment value
-                * @constructor
-                */
-               function Fulfilled(x) {
-                       Promise.createContext(this);
-                       this.value = x;
-               }
+    return newRoot;
+}
 
-               inherit(Handler, Fulfilled);
+},{"../vnode/is-widget.js":264,"../vnode/vpatch.js":267,"./apply-properties":249,"./update-widget":254}],253:[function(require,module,exports){
+var document = require("global/document")
+var isArray = require("x-is-array")
 
-               Fulfilled.prototype._state = 1;
+var render = require("./create-element")
+var domIndex = require("./dom-index")
+var patchOp = require("./patch-op")
+module.exports = patch
 
-               Fulfilled.prototype.fold = function(f, z, c, to) {
-                       runContinuation3(f, z, this, c, to);
-               };
+function patch(rootNode, patches, renderOptions) {
+    renderOptions = renderOptions || {}
+    renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
+        ? renderOptions.patch
+        : patchRecursive
+    renderOptions.render = renderOptions.render || render
 
-               Fulfilled.prototype.when = function(cont) {
-                       runContinuation1(cont.fulfilled, this, cont.receiver, cont.resolver);
-               };
+    return renderOptions.patch(rootNode, patches, renderOptions)
+}
 
-               var errorId = 0;
+function patchRecursive(rootNode, patches, renderOptions) {
+    var indices = patchIndices(patches)
 
-               /**
-                * Handler for a rejected promise
-                * @param {*} x rejection reason
-                * @constructor
-                */
-               function Rejected(x) {
-                       Promise.createContext(this);
+    if (indices.length === 0) {
+        return rootNode
+    }
 
-                       this.id = ++errorId;
-                       this.value = x;
-                       this.handled = false;
-                       this.reported = false;
+    var index = domIndex(rootNode, patches.a, indices)
+    var ownerDocument = rootNode.ownerDocument
 
-                       this._report();
-               }
+    if (!renderOptions.document && ownerDocument !== document) {
+        renderOptions.document = ownerDocument
+    }
 
-               inherit(Handler, Rejected);
+    for (var i = 0; i < indices.length; i++) {
+        var nodeIndex = indices[i]
+        rootNode = applyPatch(rootNode,
+            index[nodeIndex],
+            patches[nodeIndex],
+            renderOptions)
+    }
 
-               Rejected.prototype._state = -1;
+    return rootNode
+}
 
-               Rejected.prototype.fold = function(f, z, c, to) {
-                       to.become(this);
-               };
+function applyPatch(rootNode, domNode, patchList, renderOptions) {
+    if (!domNode) {
+        return rootNode
+    }
 
-               Rejected.prototype.when = function(cont) {
-                       if(typeof cont.rejected === 'function') {
-                               this._unreport();
-                       }
-                       runContinuation1(cont.rejected, this, cont.receiver, cont.resolver);
-               };
+    var newNode
 
-               Rejected.prototype._report = function(context) {
-                       tasks.afterQueue(new ReportTask(this, context));
-               };
+    if (isArray(patchList)) {
+        for (var i = 0; i < patchList.length; i++) {
+            newNode = patchOp(patchList[i], domNode, renderOptions)
 
-               Rejected.prototype._unreport = function() {
-                       if(this.handled) {
-                               return;
-                       }
-                       this.handled = true;
-                       tasks.afterQueue(new UnreportTask(this));
-               };
+            if (domNode === rootNode) {
+                rootNode = newNode
+            }
+        }
+    } else {
+        newNode = patchOp(patchList, domNode, renderOptions)
 
-               Rejected.prototype.fail = function(context) {
-                       this.reported = true;
-                       emitRejection('unhandledRejection', this);
-                       Promise.onFatalRejection(this, context === void 0 ? this.context : context);
-               };
+        if (domNode === rootNode) {
+            rootNode = newNode
+        }
+    }
 
-               function ReportTask(rejection, context) {
-                       this.rejection = rejection;
-                       this.context = context;
-               }
+    return rootNode
+}
 
-               ReportTask.prototype.run = function() {
-                       if(!this.rejection.handled && !this.rejection.reported) {
-                               this.rejection.reported = true;
-                               emitRejection('unhandledRejection', this.rejection) ||
-                                       Promise.onPotentiallyUnhandledRejection(this.rejection, this.context);
-                       }
-               };
+function patchIndices(patches) {
+    var indices = []
 
-               function UnreportTask(rejection) {
-                       this.rejection = rejection;
-               }
+    for (var key in patches) {
+        if (key !== "a") {
+            indices.push(Number(key))
+        }
+    }
 
-               UnreportTask.prototype.run = function() {
-                       if(this.rejection.reported) {
-                               emitRejection('rejectionHandled', this.rejection) ||
-                                       Promise.onPotentiallyUnhandledRejectionHandled(this.rejection);
-                       }
-               };
+    return indices
+}
 
-               // Unhandled rejection hooks
-               // By default, everything is a noop
+},{"./create-element":250,"./dom-index":251,"./patch-op":252,"global/document":16,"x-is-array":289}],254:[function(require,module,exports){
+var isWidget = require("../vnode/is-widget.js")
 
-               Promise.createContext
-                       = Promise.enterContext
-                       = Promise.exitContext
-                       = Promise.onPotentiallyUnhandledRejection
-                       = Promise.onPotentiallyUnhandledRejectionHandled
-                       = Promise.onFatalRejection
-                       = noop;
-
-               // Errors and singletons
+module.exports = updateWidget
 
-               var foreverPendingHandler = new Handler();
-               var foreverPendingPromise = new Promise(Handler, foreverPendingHandler);
+function updateWidget(a, b) {
+    if (isWidget(a) && isWidget(b)) {
+        if ("name" in a && "name" in b) {
+            return a.id === b.id
+        } else {
+            return a.init === b.init
+        }
+    }
 
-               function cycle() {
-                       return new Rejected(new TypeError('Promise cycle'));
-               }
+    return false
+}
 
-               // Task runners
+},{"../vnode/is-widget.js":264}],255:[function(require,module,exports){
+'use strict';
 
-               /**
-                * Run a single consumer
-                * @constructor
-                */
-               function ContinuationTask(continuation, handler) {
-                       this.continuation = continuation;
-                       this.handler = handler;
-               }
+var EvStore = require('ev-store');
 
-               ContinuationTask.prototype.run = function() {
-                       this.handler.join().when(this.continuation);
-               };
+module.exports = EvHook;
 
-               /**
-                * Run a queue of progress handlers
-                * @constructor
-                */
-               function ProgressTask(value, handler) {
-                       this.handler = handler;
-                       this.value = value;
-               }
+function EvHook(value) {
+    if (!(this instanceof EvHook)) {
+        return new EvHook(value);
+    }
 
-               ProgressTask.prototype.run = function() {
-                       var q = this.handler.consumers;
-                       if(q === void 0) {
-                               return;
-                       }
+    this.value = value;
+}
 
-                       for (var c, i = 0; i < q.length; ++i) {
-                               c = q[i];
-                               runNotify(c.progress, this.value, this.handler, c.receiver, c.resolver);
-                       }
-               };
+EvHook.prototype.hook = function (node, propertyName) {
+    var es = EvStore(node);
+    var propName = propertyName.substr(3);
 
-               /**
-                * Assimilate a thenable, sending it's value to resolver
-                * @param {function} then
-                * @param {object|function} thenable
-                * @param {object} resolver
-                * @constructor
-                */
-               function AssimilateTask(then, thenable, resolver) {
-                       this._then = then;
-                       this.thenable = thenable;
-                       this.resolver = resolver;
-               }
+    es[propName] = this.value;
+};
 
-               AssimilateTask.prototype.run = function() {
-                       var h = this.resolver;
-                       tryAssimilate(this._then, this.thenable, _resolve, _reject, _notify);
+EvHook.prototype.unhook = function(node, propertyName) {
+    var es = EvStore(node);
+    var propName = propertyName.substr(3);
 
-                       function _resolve(x) { h.resolve(x); }
-                       function _reject(x)  { h.reject(x); }
-                       function _notify(x)  { h.notify(x); }
-               };
+    es[propName] = undefined;
+};
 
-               function tryAssimilate(then, thenable, resolve, reject, notify) {
-                       try {
-                               then.call(thenable, resolve, reject, notify);
-                       } catch (e) {
-                               reject(e);
-                       }
-               }
+},{"ev-store":9}],256:[function(require,module,exports){
+'use strict';
 
-               /**
-                * Fold a handler value with z
-                * @constructor
-                */
-               function Fold(f, z, c, to) {
-                       this.f = f; this.z = z; this.c = c; this.to = to;
-                       this.resolver = failIfRejected;
-                       this.receiver = this;
-               }
+module.exports = SoftSetHook;
 
-               Fold.prototype.fulfilled = function(x) {
-                       this.f.call(this.c, this.z, x, this.to);
-               };
+function SoftSetHook(value) {
+    if (!(this instanceof SoftSetHook)) {
+        return new SoftSetHook(value);
+    }
 
-               Fold.prototype.rejected = function(x) {
-                       this.to.reject(x);
-               };
+    this.value = value;
+}
 
-               Fold.prototype.progress = function(x) {
-                       this.to.notify(x);
-               };
+SoftSetHook.prototype.hook = function (node, propertyName) {
+    if (node[propertyName] !== this.value) {
+        node[propertyName] = this.value;
+    }
+};
 
-               // Other helpers
+},{}],257:[function(require,module,exports){
+'use strict';
 
-               /**
-                * @param {*} x
-                * @returns {boolean} true iff x is a trusted Promise
-                */
-               function isPromise(x) {
-                       return x instanceof Promise;
-               }
+var isArray = require('x-is-array');
 
-               /**
-                * Test just enough to rule out primitives, in order to take faster
-                * paths in some code
-                * @param {*} x
-                * @returns {boolean} false iff x is guaranteed *not* to be a thenable
-                */
-               function maybeThenable(x) {
-                       return (typeof x === 'object' || typeof x === 'function') && x !== null;
-               }
+var VNode = require('../vnode/vnode.js');
+var VText = require('../vnode/vtext.js');
+var isVNode = require('../vnode/is-vnode');
+var isVText = require('../vnode/is-vtext');
+var isWidget = require('../vnode/is-widget');
+var isHook = require('../vnode/is-vhook');
+var isVThunk = require('../vnode/is-thunk');
 
-               function runContinuation1(f, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.become(h);
-                       }
+var parseTag = require('./parse-tag.js');
+var softSetHook = require('./hooks/soft-set-hook.js');
+var evHook = require('./hooks/ev-hook.js');
 
-                       Promise.enterContext(h);
-                       tryCatchReject(f, h.value, receiver, next);
-                       Promise.exitContext();
-               }
+module.exports = h;
 
-               function runContinuation3(f, x, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.become(h);
-                       }
+function h(tagName, properties, children) {
+    var childNodes = [];
+    var tag, props, key, namespace;
 
-                       Promise.enterContext(h);
-                       tryCatchReject3(f, x, h.value, receiver, next);
-                       Promise.exitContext();
-               }
+    if (!children && isChildren(properties)) {
+        children = properties;
+        props = {};
+    }
 
-               /**
-                * @deprecated
-                */
-               function runNotify(f, x, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.notify(x);
-                       }
+    props = props || properties || {};
+    tag = parseTag(tagName, props);
 
-                       Promise.enterContext(h);
-                       tryCatchReturn(f, x, receiver, next);
-                       Promise.exitContext();
-               }
+    // support keys
+    if (props.hasOwnProperty('key')) {
+        key = props.key;
+        props.key = undefined;
+    }
 
-               function tryCatch2(f, a, b) {
-                       try {
-                               return f(a, b);
-                       } catch(e) {
-                               return reject(e);
-                       }
-               }
+    // support namespace
+    if (props.hasOwnProperty('namespace')) {
+        namespace = props.namespace;
+        props.namespace = undefined;
+    }
 
-               /**
-                * Return f.call(thisArg, x), or if it throws return a rejected promise for
-                * the thrown exception
-                */
-               function tryCatchReject(f, x, thisArg, next) {
-                       try {
-                               next.become(getHandler(f.call(thisArg, x)));
-                       } catch(e) {
-                               next.become(new Rejected(e));
-                       }
-               }
+    // fix cursor bug
+    if (tag === 'INPUT' &&
+        !namespace &&
+        props.hasOwnProperty('value') &&
+        props.value !== undefined &&
+        !isHook(props.value)
+    ) {
+        props.value = softSetHook(props.value);
+    }
 
-               /**
-                * Same as above, but includes the extra argument parameter.
-                */
-               function tryCatchReject3(f, x, y, thisArg, next) {
-                       try {
-                               f.call(thisArg, x, y, next);
-                       } catch(e) {
-                               next.become(new Rejected(e));
-                       }
-               }
+    transformProperties(props);
 
-               /**
-                * @deprecated
-                * Return f.call(thisArg, x), or if it throws, *return* the exception
-                */
-               function tryCatchReturn(f, x, thisArg, next) {
-                       try {
-                               next.notify(f.call(thisArg, x));
-                       } catch(e) {
-                               next.notify(e);
-                       }
-               }
+    if (children !== undefined && children !== null) {
+        addChild(children, childNodes, tag, props);
+    }
 
-               function inherit(Parent, Child) {
-                       Child.prototype = objectCreate(Parent.prototype);
-                       Child.prototype.constructor = Child;
-               }
 
-               function snd(x, y) {
-                       return y;
-               }
-
-               function noop() {}
+    return new VNode(tag, props, childNodes, key, namespace);
+}
 
-               function initEmitRejection() {
-                       /*global process, self, CustomEvent*/
-                       if(typeof process !== 'undefined' && process !== null
-                               && typeof process.emit === 'function') {
-                               // Returning falsy here means to call the default
-                               // onPotentiallyUnhandledRejection API.  This is safe even in
-                               // browserify since process.emit always returns falsy in browserify:
-                               // https://github.com/defunctzombie/node-process/blob/master/browser.js#L40-L46
-                               return function(type, rejection) {
-                                       return type === 'unhandledRejection'
-                                               ? process.emit(type, rejection.value, rejection)
-                                               : process.emit(type, rejection);
-                               };
-                       } else if(typeof self !== 'undefined' && typeof CustomEvent === 'function') {
-                               return (function(noop, self, CustomEvent) {
-                                       var hasCustomEvent = false;
-                                       try {
-                                               var ev = new CustomEvent('unhandledRejection');
-                                               hasCustomEvent = ev instanceof CustomEvent;
-                                       } catch (e) {}
-
-                                       return !hasCustomEvent ? noop : function(type, rejection) {
-                                               var ev = new CustomEvent(type, {
-                                                       detail: {
-                                                               reason: rejection.value,
-                                                               key: rejection
-                                                       },
-                                                       bubbles: false,
-                                                       cancelable: true
-                                               });
+function addChild(c, childNodes, tag, props) {
+    if (typeof c === 'string') {
+        childNodes.push(new VText(c));
+    } else if (typeof c === 'number') {
+        childNodes.push(new VText(String(c)));
+    } else if (isChild(c)) {
+        childNodes.push(c);
+    } else if (isArray(c)) {
+        for (var i = 0; i < c.length; i++) {
+            addChild(c[i], childNodes, tag, props);
+        }
+    } else if (c === null || c === undefined) {
+        return;
+    } else {
+        throw UnexpectedVirtualElement({
+            foreignObject: c,
+            parentVnode: {
+                tagName: tag,
+                properties: props
+            }
+        });
+    }
+}
 
-                                               return !self.dispatchEvent(ev);
-                                       };
-                               }(noop, self, CustomEvent));
-                       }
+function transformProperties(props) {
+    for (var propName in props) {
+        if (props.hasOwnProperty(propName)) {
+            var value = props[propName];
 
-                       return noop;
-               }
+            if (isHook(value)) {
+                continue;
+            }
 
-               return Promise;
-       };
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+            if (propName.substr(0, 3) === 'ev-') {
+                // add ev-foo support
+                props[propName] = evHook(value);
+            }
+        }
+    }
+}
 
-}).call(this,require('_process'))
+function isChild(x) {
+    return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x);
+}
 
-},{"_process":4}],203:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
+function isChildren(x) {
+    return typeof x === 'string' || isArray(x) || isChild(x);
+}
 
-(function(define) { 'use strict';
-define(function() {
+function UnexpectedVirtualElement(data) {
+    var err = new Error();
 
-       return {
-               pending: toPendingState,
-               fulfilled: toFulfilledState,
-               rejected: toRejectedState,
-               inspect: inspect
-       };
+    err.type = 'virtual-hyperscript.unexpected.virtual-element';
+    err.message = 'Unexpected virtual child passed to h().\n' +
+        'Expected a VNode / Vthunk / VWidget / string but:\n' +
+        'got:\n' +
+        errorString(data.foreignObject) +
+        '.\n' +
+        'The parent vnode is:\n' +
+        errorString(data.parentVnode)
+        '\n' +
+        'Suggested fix: change your `h(..., [ ... ])` callsite.';
+    err.foreignObject = data.foreignObject;
+    err.parentVnode = data.parentVnode;
 
-       function toPendingState() {
-               return { state: 'pending' };
-       }
+    return err;
+}
 
-       function toRejectedState(e) {
-               return { state: 'rejected', reason: e };
-       }
+function errorString(obj) {
+    try {
+        return JSON.stringify(obj, null, '    ');
+    } catch (e) {
+        return String(obj);
+    }
+}
 
-       function toFulfilledState(x) {
-               return { state: 'fulfilled', value: x };
-       }
+},{"../vnode/is-thunk":260,"../vnode/is-vhook":261,"../vnode/is-vnode":262,"../vnode/is-vtext":263,"../vnode/is-widget":264,"../vnode/vnode.js":266,"../vnode/vtext.js":268,"./hooks/ev-hook.js":255,"./hooks/soft-set-hook.js":256,"./parse-tag.js":258,"x-is-array":289}],258:[function(require,module,exports){
+'use strict';
 
-       function inspect(handler) {
-               var state = handler.state();
-               return state === 0 ? toPendingState()
-                        : state > 0   ? toFulfilledState(handler.value)
-                                      : toRejectedState(handler.value);
-       }
+var split = require('browser-split');
 
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
+var notClassId = /^\.|#/;
 
-},{}],204:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
+module.exports = parseTag;
 
-/**
- * Promises/A+ and when() implementation
- * when is part of the cujoJS family of libraries (http://cujojs.com/)
- * @author Brian Cavalier
- * @author John Hann
- */
-(function(define) { 'use strict';
-define(function (require) {
+function parseTag(tag, props) {
+    if (!tag) {
+        return 'DIV';
+    }
 
-       var timed = require('./lib/decorators/timed');
-       var array = require('./lib/decorators/array');
-       var flow = require('./lib/decorators/flow');
-       var fold = require('./lib/decorators/fold');
-       var inspect = require('./lib/decorators/inspect');
-       var generate = require('./lib/decorators/iterate');
-       var progress = require('./lib/decorators/progress');
-       var withThis = require('./lib/decorators/with');
-       var unhandledRejection = require('./lib/decorators/unhandledRejection');
-       var TimeoutError = require('./lib/TimeoutError');
+    var noId = !(props.hasOwnProperty('id'));
 
-       var Promise = [array, flow, fold, generate, progress,
-               inspect, withThis, timed, unhandledRejection]
-               .reduce(function(Promise, feature) {
-                       return feature(Promise);
-               }, require('./lib/Promise'));
+    var tagParts = split(tag, classIdSplit);
+    var tagName = null;
 
-       var apply = require('./lib/apply')(Promise);
+    if (notClassId.test(tagParts[1])) {
+        tagName = 'DIV';
+    }
 
-       // Public API
+    var classes, part, type, i;
 
-       when.promise     = promise;              // Create a pending promise
-       when.resolve     = Promise.resolve;      // Create a resolved promise
-       when.reject      = Promise.reject;       // Create a rejected promise
+    for (i = 0; i < tagParts.length; i++) {
+        part = tagParts[i];
 
-       when.lift        = lift;                 // lift a function to return promises
-       when['try']      = attempt;              // call a function and return a promise
-       when.attempt     = attempt;              // alias for when.try
+        if (!part) {
+            continue;
+        }
 
-       when.iterate     = Promise.iterate;      // DEPRECATED (use cujojs/most streams) Generate a stream of promises
-       when.unfold      = Promise.unfold;       // DEPRECATED (use cujojs/most streams) Generate a stream of promises
+        type = part.charAt(0);
 
-       when.join        = join;                 // Join 2 or more promises
+        if (!tagName) {
+            tagName = part;
+        } else if (type === '.') {
+            classes = classes || [];
+            classes.push(part.substring(1, part.length));
+        } else if (type === '#' && noId) {
+            props.id = part.substring(1, part.length);
+        }
+    }
 
-       when.all         = all;                  // Resolve a list of promises
-       when.settle      = settle;               // Settle a list of promises
+    if (classes) {
+        if (props.className) {
+            classes.push(props.className);
+        }
 
-       when.any         = lift(Promise.any);    // One-winner race
-       when.some        = lift(Promise.some);   // Multi-winner race
-       when.race        = lift(Promise.race);   // First-to-settle race
+        props.className = classes.join(' ');
+    }
 
-       when.map         = map;                  // Array.map() for promises
-       when.filter      = filter;               // Array.filter() for promises
-       when.reduce      = lift(Promise.reduce);       // Array.reduce() for promises
-       when.reduceRight = lift(Promise.reduceRight);  // Array.reduceRight() for promises
+    return props.namespace ? tagName : tagName.toUpperCase();
+}
 
-       when.isPromiseLike = isPromiseLike;      // Is something promise-like, aka thenable
+},{"browser-split":5}],259:[function(require,module,exports){
+var isVNode = require("./is-vnode")
+var isVText = require("./is-vtext")
+var isWidget = require("./is-widget")
+var isThunk = require("./is-thunk")
 
-       when.Promise     = Promise;              // Promise constructor
-       when.defer       = defer;                // Create a {promise, resolve, reject} tuple
+module.exports = handleThunk
 
-       // Error types
+function handleThunk(a, b) {
+    var renderedA = a
+    var renderedB = b
 
-       when.TimeoutError = TimeoutError;
+    if (isThunk(b)) {
+        renderedB = renderThunk(b, a)
+    }
 
-       /**
-        * Get a trusted promise for x, or by transforming x with onFulfilled
-        *
-        * @param {*} x
-        * @param {function?} onFulfilled callback to be called when x is
-        *   successfully fulfilled.  If promiseOrValue is an immediate value, callback
-        *   will be invoked immediately.
-        * @param {function?} onRejected callback to be called when x is
-        *   rejected.
-        * @param {function?} onProgress callback to be called when progress updates
-        *   are issued for x. @deprecated
-        * @returns {Promise} a new promise that will fulfill with the return
-        *   value of callback or errback or the completion value of promiseOrValue if
-        *   callback and/or errback is not supplied.
-        */
-       function when(x, onFulfilled, onRejected, onProgress) {
-               var p = Promise.resolve(x);
-               if (arguments.length < 2) {
-                       return p;
-               }
+    if (isThunk(a)) {
+        renderedA = renderThunk(a, null)
+    }
 
-               return p.then(onFulfilled, onRejected, onProgress);
-       }
-
-       /**
-        * Creates a new promise whose fate is determined by resolver.
-        * @param {function} resolver function(resolve, reject, notify)
-        * @returns {Promise} promise whose fate is determine by resolver
-        */
-       function promise(resolver) {
-               return new Promise(resolver);
-       }
+    return {
+        a: renderedA,
+        b: renderedB
+    }
+}
 
-       /**
-        * Lift the supplied function, creating a version of f that returns
-        * promises, and accepts promises as arguments.
-        * @param {function} f
-        * @returns {Function} version of f that returns promises
-        */
-       function lift(f) {
-               return function() {
-                       for(var i=0, l=arguments.length, a=new Array(l); i<l; ++i) {
-                               a[i] = arguments[i];
-                       }
-                       return apply(f, this, a);
-               };
-       }
+function renderThunk(thunk, previous) {
+    var renderedThunk = thunk.vnode
 
-       /**
-        * Call f in a future turn, with the supplied args, and return a promise
-        * for the result.
-        * @param {function} f
-        * @returns {Promise}
-        */
-       function attempt(f /*, args... */) {
-               /*jshint validthis:true */
-               for(var i=0, l=arguments.length-1, a=new Array(l); i<l; ++i) {
-                       a[i] = arguments[i+1];
-               }
-               return apply(f, this, a);
-       }
+    if (!renderedThunk) {
+        renderedThunk = thunk.vnode = thunk.render(previous)
+    }
 
-       /**
-        * Creates a {promise, resolver} pair, either or both of which
-        * may be given out safely to consumers.
-        * @return {{promise: Promise, resolve: function, reject: function, notify: function}}
-        */
-       function defer() {
-               return new Deferred();
-       }
+    if (!(isVNode(renderedThunk) ||
+            isVText(renderedThunk) ||
+            isWidget(renderedThunk))) {
+        throw new Error("thunk did not return a valid node");
+    }
 
-       function Deferred() {
-               var p = Promise._defer();
+    return renderedThunk
+}
 
-               function resolve(x) { p._handler.resolve(x); }
-               function reject(x) { p._handler.reject(x); }
-               function notify(x) { p._handler.notify(x); }
+},{"./is-thunk":260,"./is-vnode":262,"./is-vtext":263,"./is-widget":264}],260:[function(require,module,exports){
+module.exports = isThunk
 
-               this.promise = p;
-               this.resolve = resolve;
-               this.reject = reject;
-               this.notify = notify;
-               this.resolver = { resolve: resolve, reject: reject, notify: notify };
-       }
+function isThunk(t) {
+    return t && t.type === "Thunk"
+}
 
-       /**
-        * Determines if x is promise-like, i.e. a thenable object
-        * NOTE: Will return true for *any thenable object*, and isn't truly
-        * safe, since it may attempt to access the `then` property of x (i.e.
-        *  clever/malicious getters may do weird things)
-        * @param {*} x anything
-        * @returns {boolean} true if x is promise-like
-        */
-       function isPromiseLike(x) {
-               return x && typeof x.then === 'function';
-       }
+},{}],261:[function(require,module,exports){
+module.exports = isHook
 
-       /**
-        * Return a promise that will resolve only once all the supplied arguments
-        * have resolved. The resolution value of the returned promise will be an array
-        * containing the resolution values of each of the arguments.
-        * @param {...*} arguments may be a mix of promises and values
-        * @returns {Promise}
-        */
-       function join(/* ...promises */) {
-               return Promise.all(arguments);
-       }
+function isHook(hook) {
+    return hook &&
+      (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") ||
+       typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
+}
 
-       /**
-        * Return a promise that will fulfill once all input promises have
-        * fulfilled, or reject when any one input promise rejects.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise}
-        */
-       function all(promises) {
-               return when(promises, Promise.all);
-       }
+},{}],262:[function(require,module,exports){
+var version = require("./version")
 
-       /**
-        * Return a promise that will always fulfill with an array containing
-        * the outcome states of all input promises.  The returned promise
-        * will only reject if `promises` itself is a rejected promise.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise} promise for array of settled state descriptors
-        */
-       function settle(promises) {
-               return when(promises, Promise.settle);
-       }
+module.exports = isVirtualNode
 
-       /**
-        * Promise-aware array map function, similar to `Array.prototype.map()`,
-        * but input array may contain promises or values.
-        * @param {Array|Promise} promises array of anything, may contain promises and values
-        * @param {function(x:*, index:Number):*} mapFunc map function which may
-        *  return a promise or value
-        * @returns {Promise} promise that will fulfill with an array of mapped values
-        *  or reject if any input promise rejects.
-        */
-       function map(promises, mapFunc) {
-               return when(promises, function(promises) {
-                       return Promise.map(promises, mapFunc);
-               });
-       }
+function isVirtualNode(x) {
+    return x && x.type === "VirtualNode" && x.version === version
+}
 
-       /**
-        * Filter the provided array of promises using the provided predicate.  Input may
-        * contain promises and values
-        * @param {Array|Promise} promises array of promises and values
-        * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-        *  Must return truthy (or promise for truthy) for items to retain.
-        * @returns {Promise} promise that will fulfill with an array containing all items
-        *  for which predicate returned truthy.
-        */
-       function filter(promises, predicate) {
-               return when(promises, function(promises) {
-                       return Promise.filter(promises, predicate);
-               });
-       }
+},{"./version":265}],263:[function(require,module,exports){
+var version = require("./version")
 
-       return when;
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
+module.exports = isVirtualText
 
-},{"./lib/Promise":187,"./lib/TimeoutError":189,"./lib/apply":190,"./lib/decorators/array":191,"./lib/decorators/flow":192,"./lib/decorators/fold":193,"./lib/decorators/inspect":194,"./lib/decorators/iterate":195,"./lib/decorators/progress":196,"./lib/decorators/timed":197,"./lib/decorators/unhandledRejection":198,"./lib/decorators/with":199}],205:[function(require,module,exports){
-var nativeIsArray = Array.isArray
-var toString = Object.prototype.toString
+function isVirtualText(x) {
+    return x && x.type === "VirtualText" && x.version === version
+}
 
-module.exports = nativeIsArray || isArray
+},{"./version":265}],264:[function(require,module,exports){
+module.exports = isWidget
 
-function isArray(obj) {
-    return toString.call(obj) === "[object Array]"
+function isWidget(w) {
+    return w && w.type === "Widget"
 }
 
-},{}],206:[function(require,module,exports){
-"use strict";
-var APIv3_1 = require("./api/APIv3");
-exports.APIv3 = APIv3_1.APIv3;
+},{}],265:[function(require,module,exports){
+module.exports = "2"
 
-},{"./api/APIv3":217}],207:[function(require,module,exports){
-"use strict";
-var Component_1 = require("./component/Component");
-exports.Component = Component_1.Component;
-var ComponentService_1 = require("./component/ComponentService");
-exports.ComponentService = ComponentService_1.ComponentService;
-var AttributionComponent_1 = require("./component/AttributionComponent");
-exports.AttributionComponent = AttributionComponent_1.AttributionComponent;
-var BackgroundComponent_1 = require("./component/BackgroundComponent");
-exports.BackgroundComponent = BackgroundComponent_1.BackgroundComponent;
-var BearingComponent_1 = require("./component/BearingComponent");
-exports.BearingComponent = BearingComponent_1.BearingComponent;
-var CacheComponent_1 = require("./component/CacheComponent");
-exports.CacheComponent = CacheComponent_1.CacheComponent;
-var CoverComponent_1 = require("./component/CoverComponent");
-exports.CoverComponent = CoverComponent_1.CoverComponent;
-var DebugComponent_1 = require("./component/DebugComponent");
-exports.DebugComponent = DebugComponent_1.DebugComponent;
-var DirectionComponent_1 = require("./component/direction/DirectionComponent");
-exports.DirectionComponent = DirectionComponent_1.DirectionComponent;
-var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
-exports.DirectionDOMCalculator = DirectionDOMCalculator_1.DirectionDOMCalculator;
-var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
-exports.DirectionDOMRenderer = DirectionDOMRenderer_1.DirectionDOMRenderer;
-var ImageComponent_1 = require("./component/ImageComponent");
-exports.ImageComponent = ImageComponent_1.ImageComponent;
-var KeyboardComponent_1 = require("./component/KeyboardComponent");
-exports.KeyboardComponent = KeyboardComponent_1.KeyboardComponent;
-var LoadingComponent_1 = require("./component/LoadingComponent");
-exports.LoadingComponent = LoadingComponent_1.LoadingComponent;
-var Marker_1 = require("./component/marker/Marker");
-exports.Marker = Marker_1.Marker;
-var MarkerComponent_1 = require("./component/marker/MarkerComponent");
-exports.MarkerComponent = MarkerComponent_1.MarkerComponent;
-var MouseComponent_1 = require("./component/MouseComponent");
-exports.MouseComponent = MouseComponent_1.MouseComponent;
-var NavigationComponent_1 = require("./component/NavigationComponent");
-exports.NavigationComponent = NavigationComponent_1.NavigationComponent;
-var RouteComponent_1 = require("./component/RouteComponent");
-exports.RouteComponent = RouteComponent_1.RouteComponent;
-var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
-exports.SequenceComponent = SequenceComponent_1.SequenceComponent;
-var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
-exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer;
-var SequenceDOMInteraction_1 = require("./component/sequence/SequenceDOMInteraction");
-exports.SequenceDOMInteraction = SequenceDOMInteraction_1.SequenceDOMInteraction;
-var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
-exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent;
-var ImagePlaneFactory_1 = require("./component/imageplane/ImagePlaneFactory");
-exports.ImagePlaneFactory = ImagePlaneFactory_1.ImagePlaneFactory;
-var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer_1.ImagePlaneGLRenderer;
-var ImagePlaneScene_1 = require("./component/imageplane/ImagePlaneScene");
-exports.ImagePlaneScene = ImagePlaneScene_1.ImagePlaneScene;
-var ImagePlaneShaders_1 = require("./component/imageplane/ImagePlaneShaders");
-exports.ImagePlaneShaders = ImagePlaneShaders_1.ImagePlaneShaders;
-var SimpleMarker_1 = require("./component/marker/SimpleMarker");
-exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
-var SliderComponent_1 = require("./component/imageplane/SliderComponent");
-exports.SliderComponent = SliderComponent_1.SliderComponent;
-var StatsComponent_1 = require("./component/StatsComponent");
-exports.StatsComponent = StatsComponent_1.StatsComponent;
-var Tag_1 = require("./component/tag/tag/Tag");
-exports.Tag = Tag_1.Tag;
-var Alignment_1 = require("./component/tag/tag/Alignment");
-exports.Alignment = Alignment_1.Alignment;
-var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var RenderTag_1 = require("./component/tag/tag/RenderTag");
-exports.RenderTag = RenderTag_1.RenderTag;
-var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
-exports.OutlineRenderTag = OutlineRenderTag_1.OutlineRenderTag;
-var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
-exports.OutlineCreateTag = OutlineCreateTag_1.OutlineCreateTag;
-var SpotTag_1 = require("./component/tag/tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
-exports.SpotRenderTag = SpotRenderTag_1.SpotRenderTag;
-var TagComponent_1 = require("./component/tag/TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-var TagCreator_1 = require("./component/tag/TagCreator");
-exports.TagCreator = TagCreator_1.TagCreator;
-var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
-exports.TagDOMRenderer = TagDOMRenderer_1.TagDOMRenderer;
-var TagGLRenderer_1 = require("./component/tag/TagGLRenderer");
-exports.TagGLRenderer = TagGLRenderer_1.TagGLRenderer;
-var TagOperation_1 = require("./component/tag/TagOperation");
-exports.TagOperation = TagOperation_1.TagOperation;
-var TagSet_1 = require("./component/tag/TagSet");
-exports.TagSet = TagSet_1.TagSet;
-var Geometry_1 = require("./component/tag/geometry/Geometry");
-exports.Geometry = Geometry_1.Geometry;
-var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
-exports.VertexGeometry = VertexGeometry_1.VertexGeometry;
-var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
+},{}],266:[function(require,module,exports){
+var version = require("./version")
+var isVNode = require("./is-vnode")
+var isWidget = require("./is-widget")
+var isThunk = require("./is-thunk")
+var isVHook = require("./is-vhook")
 
-},{"./component/AttributionComponent":218,"./component/BackgroundComponent":219,"./component/BearingComponent":220,"./component/CacheComponent":221,"./component/Component":222,"./component/ComponentService":223,"./component/CoverComponent":224,"./component/DebugComponent":225,"./component/ImageComponent":226,"./component/KeyboardComponent":227,"./component/LoadingComponent":228,"./component/MouseComponent":229,"./component/NavigationComponent":230,"./component/RouteComponent":231,"./component/StatsComponent":232,"./component/direction/DirectionComponent":233,"./component/direction/DirectionDOMCalculator":234,"./component/direction/DirectionDOMRenderer":235,"./component/imageplane/ImagePlaneComponent":236,"./component/imageplane/ImagePlaneFactory":237,"./component/imageplane/ImagePlaneGLRenderer":238,"./component/imageplane/ImagePlaneScene":239,"./component/imageplane/ImagePlaneShaders":240,"./component/imageplane/SliderComponent":241,"./component/marker/Marker":242,"./component/marker/MarkerComponent":243,"./component/marker/SimpleMarker":244,"./component/sequence/SequenceComponent":245,"./component/sequence/SequenceDOMInteraction":246,"./component/sequence/SequenceDOMRenderer":247,"./component/tag/TagComponent":249,"./component/tag/TagCreator":250,"./component/tag/TagDOMRenderer":251,"./component/tag/TagGLRenderer":252,"./component/tag/TagOperation":253,"./component/tag/TagSet":254,"./component/tag/error/GeometryTagError":255,"./component/tag/geometry/Geometry":256,"./component/tag/geometry/PointGeometry":257,"./component/tag/geometry/PolygonGeometry":258,"./component/tag/geometry/RectGeometry":259,"./component/tag/geometry/VertexGeometry":260,"./component/tag/tag/Alignment":261,"./component/tag/tag/OutlineCreateTag":262,"./component/tag/tag/OutlineRenderTag":263,"./component/tag/tag/OutlineTag":264,"./component/tag/tag/RenderTag":265,"./component/tag/tag/SpotRenderTag":266,"./component/tag/tag/SpotTag":267,"./component/tag/tag/Tag":268}],208:[function(require,module,exports){
-"use strict";
-var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
-exports.EdgeDirection = EdgeDirection_1.EdgeDirection;
-var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings_1.EdgeCalculatorSettings;
-var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections_1.EdgeCalculatorDirections;
-var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients;
-var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
-exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator;
+module.exports = VirtualNode
 
-},{"./graph/edge/EdgeCalculator":289,"./graph/edge/EdgeCalculatorCoefficients":290,"./graph/edge/EdgeCalculatorDirections":291,"./graph/edge/EdgeCalculatorSettings":292,"./graph/edge/EdgeDirection":293}],209:[function(require,module,exports){
-"use strict";
-var MapillaryError_1 = require("./error/MapillaryError");
-exports.MapillaryError = MapillaryError_1.MapillaryError;
-var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
-exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError;
-var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
-exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError;
-var MoveTypeMapillaryError_1 = require("./error/MoveTypeMapillaryError");
-exports.MoveTypeMapillaryError = MoveTypeMapillaryError_1.MoveTypeMapillaryError;
-var NotImplementedMapillaryError_1 = require("./error/NotImplementedMapillaryError");
-exports.NotImplementedMapillaryError = NotImplementedMapillaryError_1.NotImplementedMapillaryError;
-var ParameterMapillaryError_1 = require("./error/ParameterMapillaryError");
-exports.ParameterMapillaryError = ParameterMapillaryError_1.ParameterMapillaryError;
-var InitializationMapillaryError_1 = require("./error/InitializationMapillaryError");
-exports.InitializationMapillaryError = InitializationMapillaryError_1.InitializationMapillaryError;
-
-},{"./error/ArgumentMapillaryError":269,"./error/GraphMapillaryError":270,"./error/InitializationMapillaryError":271,"./error/MapillaryError":272,"./error/MoveTypeMapillaryError":273,"./error/NotImplementedMapillaryError":274,"./error/ParameterMapillaryError":275}],210:[function(require,module,exports){
-"use strict";
-var Camera_1 = require("./geo/Camera");
-exports.Camera = Camera_1.Camera;
-var GeoCoords_1 = require("./geo/GeoCoords");
-exports.GeoCoords = GeoCoords_1.GeoCoords;
-var Spatial_1 = require("./geo/Spatial");
-exports.Spatial = Spatial_1.Spatial;
-var Transform_1 = require("./geo/Transform");
-exports.Transform = Transform_1.Transform;
+var noProperties = {}
+var noChildren = []
 
-},{"./geo/Camera":276,"./geo/GeoCoords":277,"./geo/Spatial":278,"./geo/Transform":279}],211:[function(require,module,exports){
-"use strict";
-var Graph_1 = require("./graph/Graph");
-exports.Graph = Graph_1.Graph;
-var GraphCalculator_1 = require("./graph/GraphCalculator");
-exports.GraphCalculator = GraphCalculator_1.GraphCalculator;
-var GraphService_1 = require("./graph/GraphService");
-exports.GraphService = GraphService_1.GraphService;
-var ImageLoader_1 = require("./graph/ImageLoader");
-exports.ImageLoader = ImageLoader_1.ImageLoader;
-var ImageLoadingService_1 = require("./graph/ImageLoadingService");
-exports.ImageLoadingService = ImageLoadingService_1.ImageLoadingService;
-var MeshReader_1 = require("./graph/MeshReader");
-exports.MeshReader = MeshReader_1.MeshReader;
-var Node_1 = require("./graph/Node");
-exports.Node = Node_1.Node;
-var NodeCache_1 = require("./graph/NodeCache");
-exports.NodeCache = NodeCache_1.NodeCache;
-var Sequence_1 = require("./graph/Sequence");
-exports.Sequence = Sequence_1.Sequence;
+function VirtualNode(tagName, properties, children, key, namespace) {
+    this.tagName = tagName
+    this.properties = properties || noProperties
+    this.children = children || noChildren
+    this.key = key != null ? String(key) : undefined
+    this.namespace = (typeof namespace === "string") ? namespace : null
 
-},{"./graph/Graph":280,"./graph/GraphCalculator":281,"./graph/GraphService":282,"./graph/ImageLoader":283,"./graph/ImageLoadingService":284,"./graph/MeshReader":285,"./graph/Node":286,"./graph/NodeCache":287,"./graph/Sequence":288}],212:[function(require,module,exports){
-/**
- * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
- * @name Mapillary
- */
-"use strict";
-var Edge_1 = require("./Edge");
-exports.EdgeDirection = Edge_1.EdgeDirection;
-var Render_1 = require("./Render");
-exports.RenderMode = Render_1.RenderMode;
-var Viewer_1 = require("./Viewer");
-exports.ImageSize = Viewer_1.ImageSize;
-exports.Viewer = Viewer_1.Viewer;
-var TagComponent = require("./component/tag/Tag");
-exports.TagComponent = TagComponent;
-
-},{"./Edge":208,"./Render":213,"./Viewer":216,"./component/tag/Tag":248}],213:[function(require,module,exports){
-"use strict";
-var DOMRenderer_1 = require("./render/DOMRenderer");
-exports.DOMRenderer = DOMRenderer_1.DOMRenderer;
-var GLRenderer_1 = require("./render/GLRenderer");
-exports.GLRenderer = GLRenderer_1.GLRenderer;
-var GLRenderStage_1 = require("./render/GLRenderStage");
-exports.GLRenderStage = GLRenderStage_1.GLRenderStage;
-var RenderCamera_1 = require("./render/RenderCamera");
-exports.RenderCamera = RenderCamera_1.RenderCamera;
-var RenderMode_1 = require("./render/RenderMode");
-exports.RenderMode = RenderMode_1.RenderMode;
-var RenderService_1 = require("./render/RenderService");
-exports.RenderService = RenderService_1.RenderService;
+    var count = (children && children.length) || 0
+    var descendants = 0
+    var hasWidgets = false
+    var hasThunks = false
+    var descendantHooks = false
+    var hooks
 
-},{"./render/DOMRenderer":294,"./render/GLRenderStage":295,"./render/GLRenderer":296,"./render/RenderCamera":297,"./render/RenderMode":298,"./render/RenderService":299}],214:[function(require,module,exports){
-"use strict";
-var FrameGenerator_1 = require("./state/FrameGenerator");
-exports.FrameGenerator = FrameGenerator_1.FrameGenerator;
-var StateService_1 = require("./state/StateService");
-exports.StateService = StateService_1.StateService;
-var StateContext_1 = require("./state/StateContext");
-exports.StateContext = StateContext_1.StateContext;
-var State_1 = require("./state/State");
-exports.State = State_1.State;
-var StateBase_1 = require("./state/states/StateBase");
-exports.StateBase = StateBase_1.StateBase;
-var TraversingState_1 = require("./state/states/TraversingState");
-exports.TraversingState = TraversingState_1.TraversingState;
-var WaitingState_1 = require("./state/states/WaitingState");
-exports.WaitingState = WaitingState_1.WaitingState;
+    for (var propName in properties) {
+        if (properties.hasOwnProperty(propName)) {
+            var property = properties[propName]
+            if (isVHook(property) && property.unhook) {
+                if (!hooks) {
+                    hooks = {}
+                }
 
-},{"./state/FrameGenerator":300,"./state/State":301,"./state/StateContext":302,"./state/StateService":303,"./state/states/StateBase":304,"./state/states/TraversingState":305,"./state/states/WaitingState":306}],215:[function(require,module,exports){
-"use strict";
-var EventEmitter_1 = require("./utils/EventEmitter");
-exports.EventEmitter = EventEmitter_1.EventEmitter;
-var Settings_1 = require("./utils/Settings");
-exports.Settings = Settings_1.Settings;
-var Urls_1 = require("./utils/Urls");
-exports.Urls = Urls_1.Urls;
+                hooks[propName] = property
+            }
+        }
+    }
 
-},{"./utils/EventEmitter":307,"./utils/Settings":308,"./utils/Urls":309}],216:[function(require,module,exports){
-"use strict";
-var Container_1 = require("./viewer/Container");
-exports.Container = Container_1.Container;
-var EventLauncher_1 = require("./viewer/EventLauncher");
-exports.EventLauncher = EventLauncher_1.EventLauncher;
-var ImageSize_1 = require("./viewer/ImageSize");
-exports.ImageSize = ImageSize_1.ImageSize;
-var LoadingService_1 = require("./viewer/LoadingService");
-exports.LoadingService = LoadingService_1.LoadingService;
-var MouseService_1 = require("./viewer/MouseService");
-exports.MouseService = MouseService_1.MouseService;
-var Navigator_1 = require("./viewer/Navigator");
-exports.Navigator = Navigator_1.Navigator;
-var ComponentController_1 = require("./viewer/ComponentController");
-exports.ComponentController = ComponentController_1.ComponentController;
-var SpriteAlignment_1 = require("./viewer/SpriteAlignment");
-exports.SpriteAlignment = SpriteAlignment_1.SpriteAlignment;
-var SpriteService_1 = require("./viewer/SpriteService");
-exports.SpriteService = SpriteService_1.SpriteService;
-var TouchService_1 = require("./viewer/TouchService");
-exports.TouchService = TouchService_1.TouchService;
-exports.TouchMove = TouchService_1.TouchMove;
-var Viewer_1 = require("./viewer/Viewer");
-exports.Viewer = Viewer_1.Viewer;
+    for (var i = 0; i < count; i++) {
+        var child = children[i]
+        if (isVNode(child)) {
+            descendants += child.count || 0
 
-},{"./viewer/ComponentController":310,"./viewer/Container":311,"./viewer/EventLauncher":312,"./viewer/ImageSize":313,"./viewer/LoadingService":314,"./viewer/MouseService":315,"./viewer/Navigator":316,"./viewer/SpriteAlignment":317,"./viewer/SpriteService":318,"./viewer/TouchService":319,"./viewer/Viewer":320}],217:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var falcor = require("falcor");
-var HttpDataSource = require("falcor-http-datasource");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/defer");
-require("rxjs/add/observable/fromPromise");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/map");
-var Utils_1 = require("../Utils");
-var APIv3 = (function () {
-    function APIv3(clientId, model) {
-        this._clientId = clientId;
-        this._model = model != null ?
-            model :
-            new falcor.Model({
-                source: new HttpDataSource(Utils_1.Urls.falcorModel(clientId), {
-                    crossDomain: true,
-                    withCredentials: false,
-                }),
-            });
-        this._pageCount = 999;
-        this._pathImageByKey = "imageByKey";
-        this._pathImageCloseTo = "imageCloseTo";
-        this._pathImagesByH = "imagesByH";
-        this._pathImageViewAdd = "imageViewAdd";
-        this._pathSequenceByKey = "sequenceByKey";
-        this._pathSequenceViewAdd = "sequenceViewAdd";
-        this._propertiesCore = [
-            "cl",
-            "l",
-            "sequence",
-        ];
-        this._propertiesFill = [
-            "captured_at",
-            "user",
-        ];
-        this._propertiesKey = [
-            "key",
-        ];
-        this._propertiesSequence = [
-            "keys",
-        ];
-        this._propertiesSpatial = [
-            "atomic_scale",
-            "ca",
-            "calt",
-            "cca",
-            "cfocal",
-            "gpano",
-            "height",
-            "merge_cc",
-            "merge_version",
-            "c_rotation",
-            "orientation",
-            "width",
-        ];
-        this._propertiesUser = [
-            "username",
-        ];
-    }
-    ;
-    APIv3.prototype.imageByKeyFill$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey.concat(this._propertiesFill).concat(this._propertiesSpatial),
-            this._propertiesKey.concat(this._propertiesUser)]))
-            .map(function (value) {
-            return value.json.imageByKey;
-        }), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageByKeyFull$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial),
-            this._propertiesKey.concat(this._propertiesUser)]))
-            .map(function (value) {
-            return value.json.imageByKey;
-        }), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
-        var lonLat = lon + ":" + lat;
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageCloseTo,
-            [lonLat],
-            this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial),
-            this._propertiesKey.concat(this._propertiesUser)]))
-            .map(function (value) {
-            return value != null ? value.json.imageCloseTo[lonLat] : null;
-        }), this._pathImageCloseTo, [lonLat]);
-    };
-    APIv3.prototype.imagesByH$ = function (hs) {
-        var _this = this;
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImagesByH,
-            hs,
-            { from: 0, to: this._pageCount },
-            this._propertiesKey.concat(this._propertiesCore),
-            this._propertiesKey]))
-            .map(function (value) {
-            if (value == null) {
-                value = { json: { imagesByH: {} } };
-                for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) {
-                    var h = hs_1[_i];
-                    value.json.imagesByH[h] = {};
-                    for (var i = 0; i <= _this._pageCount; i++) {
-                        value.json.imagesByH[h][i] = null;
-                    }
-                }
+            if (!hasWidgets && child.hasWidgets) {
+                hasWidgets = true
             }
-            return value.json.imagesByH;
-        }), this._pathImagesByH, hs);
-    };
-    APIv3.prototype.imageViewAdd$ = function (keys) {
-        return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, keys);
-    };
-    APIv3.prototype.invalidateImageByKey = function (keys) {
-        this._invalidateGet(this._pathImageByKey, keys);
-    };
-    APIv3.prototype.invalidateImagesByH = function (hs) {
-        this._invalidateGet(this._pathImagesByH, hs);
-    };
-    APIv3.prototype.invalidateSequenceByKey = function (sKeys) {
-        this._invalidateGet(this._pathSequenceByKey, sKeys);
-    };
-    APIv3.prototype.sequenceByKey$ = function (sequenceKeys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathSequenceByKey,
-            sequenceKeys,
-            this._propertiesKey.concat(this._propertiesSequence)]))
-            .map(function (value) {
-            return value.json.sequenceByKey;
-        }), this._pathSequenceByKey, sequenceKeys);
-    };
-    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
-        return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
-    };
-    Object.defineProperty(APIv3.prototype, "clientId", {
-        get: function () {
-            return this._clientId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
-        var _this = this;
-        return observable
-            .catch(function (error) {
-            _this._invalidateGet(path, paths);
-            throw error;
-        });
-    };
-    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
-        var _this = this;
-        return observable
-            .catch(function (error) {
-            _this._invalidateCall(path, paths);
-            throw error;
-        });
-    };
-    APIv3.prototype._invalidateGet = function (path, paths) {
-        this._model.invalidate([path, paths]);
-    };
-    APIv3.prototype._invalidateCall = function (path, paths) {
-        this._model.invalidate([path], [paths]);
-    };
-    APIv3.prototype._wrapPromise$ = function (promise) {
-        return Observable_1.Observable.defer(function () { return Observable_1.Observable.fromPromise(promise); });
-    };
-    return APIv3;
-}());
-exports.APIv3 = APIv3;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = APIv3;
 
-},{"../Utils":215,"falcor":13,"falcor-http-datasource":8,"rxjs/Observable":28,"rxjs/add/observable/defer":38,"rxjs/add/observable/fromPromise":42,"rxjs/add/operator/catch":48,"rxjs/add/operator/map":60}],218:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var AttributionComponent = (function (_super) {
-    __extends(AttributionComponent, _super);
-    function AttributionComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-    }
-    AttributionComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return { name: _this._name, vnode: _this._getAttributionNode(node.username, node.key) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    AttributionComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    AttributionComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    AttributionComponent.prototype._getAttributionNode = function (username, photoId) {
-        return vd.h("div.Attribution", {}, [
-            vd.h("a", { href: "https://www.mapillary.com/app/user/" + username,
-                target: "_blank",
-                textContent: "@" + username,
-            }, []),
-            vd.h("span", { textContent: "|" }, []),
-            vd.h("a", { href: "https://www.mapillary.com/app/?pKey=" + photoId + "&focus=photo",
-                target: "_blank",
-                textContent: "mapillary.com",
-            }, []),
-        ]);
-    };
-    AttributionComponent.componentName = "attribution";
-    return AttributionComponent;
-}(Component_1.Component));
-exports.AttributionComponent = AttributionComponent;
-Component_1.ComponentService.register(AttributionComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = AttributionComponent;
+            if (!hasThunks && child.hasThunks) {
+                hasThunks = true
+            }
 
-},{"../Component":207,"virtual-dom":163}],219:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var BackgroundComponent = (function (_super) {
-    __extends(BackgroundComponent, _super);
-    function BackgroundComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
+            if (!descendantHooks && (child.hooks || child.descendantHooks)) {
+                descendantHooks = true
+            }
+        } else if (!hasWidgets && isWidget(child)) {
+            if (typeof child.destroy === "function") {
+                hasWidgets = true
+            }
+        } else if (!hasThunks && isThunk(child)) {
+            hasThunks = true;
+        }
     }
-    BackgroundComponent.prototype._activate = function () {
-        this._container.domRenderer.render$
-            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given photo.") });
-    };
-    BackgroundComponent.prototype._deactivate = function () {
-        return;
-    };
-    BackgroundComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BackgroundComponent.prototype._getBackgroundNode = function (notice) {
-        // todo: add condition for when to display the DOM node
-        return vd.h("div.BackgroundWrapper", {}, [
-            vd.h("p", { textContent: notice }, []),
-        ]);
-    };
-    BackgroundComponent.componentName = "background";
-    return BackgroundComponent;
-}(Component_1.Component));
-exports.BackgroundComponent = BackgroundComponent;
-Component_1.ComponentService.register(BackgroundComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = BackgroundComponent;
 
-},{"../Component":207,"virtual-dom":163}],220:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var BearingComponent = (function (_super) {
-    __extends(BearingComponent, _super);
-    function BearingComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-    }
-    BearingComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return node.fullPano;
-        })
-            .map(function (pano) {
-            return {
-                name: _this._name,
-                vnode: pano ? vd.h("div.BearingIndicator", {}, []) : vd.h("div", {}, []),
-            };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    BearingComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    BearingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BearingComponent.componentName = "bearing";
-    return BearingComponent;
-}(Component_1.Component));
-exports.BearingComponent = BearingComponent;
-Component_1.ComponentService.register(BearingComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = BearingComponent;
+    this.count = count + descendants
+    this.hasWidgets = hasWidgets
+    this.hasThunks = hasThunks
+    this.hooks = hooks
+    this.descendantHooks = descendantHooks
+}
 
-},{"../Component":207,"virtual-dom":163}],221:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/merge");
-require("rxjs/add/observable/of");
-require("rxjs/add/observable/zip");
-require("rxjs/add/operator/distinct");
-require("rxjs/add/operator/expand");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeAll");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/switchMap");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var CacheComponent = (function (_super) {
-    __extends(CacheComponent, _super);
-    function CacheComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-    }
-    /**
-     * Set the cache depth.
-     *
-     * Configures the cache depth. The cache depth can be different for
-     * different edge direction types.
-     *
-     * @param {ICacheDepth} depth - Cache depth structure.
-     */
-    CacheComponent.prototype.setDepth = function (depth) {
-        this.configure({ depth: depth });
-    };
-    CacheComponent.prototype._activate = function () {
-        var _this = this;
-        this._cacheSubscription = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.currentNode$, this._configuration$)
-            .switchMap(function (nc) {
-            var node = nc[0];
-            var configuration = nc[1];
-            var depth = configuration.depth;
-            var sequenceDepth = Math.max(0, Math.min(4, depth.sequence));
-            var panoDepth = Math.max(0, Math.min(2, depth.pano));
-            var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));
-            var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));
-            var next$ = _this._cache$(node, Edge_1.EdgeDirection.Next, sequenceDepth);
-            var prev$ = _this._cache$(node, Edge_1.EdgeDirection.Prev, sequenceDepth);
-            var pano$ = _this._cache$(node, Edge_1.EdgeDirection.Pano, panoDepth);
-            var forward$ = _this._cache$(node, Edge_1.EdgeDirection.StepForward, stepDepth);
-            var backward$ = _this._cache$(node, Edge_1.EdgeDirection.StepBackward, stepDepth);
-            var left$ = _this._cache$(node, Edge_1.EdgeDirection.StepLeft, stepDepth);
-            var right$ = _this._cache$(node, Edge_1.EdgeDirection.StepRight, stepDepth);
-            var turnLeft$ = _this._cache$(node, Edge_1.EdgeDirection.TurnLeft, turnDepth);
-            var turnRight$ = _this._cache$(node, Edge_1.EdgeDirection.TurnRight, turnDepth);
-            var turnU$ = _this._cache$(node, Edge_1.EdgeDirection.TurnU, turnDepth);
-            return Observable_1.Observable
-                .merge(next$, prev$, forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$);
-        })
-            .subscribe(function (n) { return; }, function (e) { console.error(e); });
-    };
-    CacheComponent.prototype._deactivate = function () {
-        this._cacheSubscription.unsubscribe();
-    };
-    CacheComponent.prototype._getDefaultConfiguration = function () {
-        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };
-    };
-    CacheComponent.prototype._cache$ = function (node, direction, depth) {
-        var _this = this;
-        return Observable_1.Observable
-            .zip(this._nodeToEdges$(node, direction), Observable_1.Observable.of(depth))
-            .expand(function (ed) {
-            var es = ed[0];
-            var d = ed[1];
-            var edgesDepths$ = [];
-            if (d > 0) {
-                for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
-                    var edge = es_1[_i];
-                    if (edge.data.direction === direction) {
-                        edgesDepths$.push(Observable_1.Observable
-                            .zip(_this._navigator.graphService.cacheNode$(edge.to)
-                            .mergeMap(function (n) {
-                            return _this._nodeToEdges$(n, direction);
-                        }), Observable_1.Observable.of(d - 1)));
-                    }
-                }
-            }
-            return Observable_1.Observable
-                .from(edgesDepths$)
-                .mergeAll();
-        })
-            .skip(1);
-    };
-    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
-        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-            node.sequenceEdges$ :
-            node.spatialEdges$)
-            .first(function (status) {
-            return status.cached;
-        })
-            .map(function (status) {
-            return status.edges;
-        });
-    };
-    CacheComponent.componentName = "cache";
-    return CacheComponent;
-}(Component_1.Component));
-exports.CacheComponent = CacheComponent;
-Component_1.ComponentService.register(CacheComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = CacheComponent;
+VirtualNode.prototype.version = version
+VirtualNode.prototype.type = "VirtualNode"
 
-},{"../Component":207,"../Edge":208,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/distinct":52,"rxjs/add/operator/expand":55,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeAll":62,"rxjs/add/operator/skip":70,"rxjs/add/operator/switchMap":73}],222:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var Utils_1 = require("../Utils");
-var Component = (function (_super) {
-    __extends(Component, _super);
-    function Component(name, container, navigator) {
-        _super.call(this);
-        this._activated$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._configurationSubject$ = new Subject_1.Subject();
-        this._activated = false;
-        this._container = container;
-        this._name = name;
-        this._navigator = navigator;
-        this._configuration$ =
-            this._configurationSubject$
-                .startWith(this.defaultConfiguration)
-                .scan(function (conf, newConf) {
-                for (var key in newConf) {
-                    if (newConf.hasOwnProperty(key)) {
-                        conf[key] = newConf[key];
-                    }
-                }
-                return conf;
-            })
-                .publishReplay(1)
-                .refCount();
-        this._configuration$.subscribe();
-    }
-    Object.defineProperty(Component.prototype, "activated", {
-        get: function () {
-            return this._activated;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "activated$", {
-        get: function () {
-            return this._activated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "defaultConfiguration", {
-        /**
-         * Get default configuration.
-         *
-         * @returns {TConfiguration} Default configuration for component.
-         */
-        get: function () {
-            return this._getDefaultConfiguration();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "configuration$", {
-        get: function () {
-            return this._configuration$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Component.prototype.activate = function (conf) {
-        if (this._activated) {
-            return;
+},{"./is-thunk":260,"./is-vhook":261,"./is-vnode":262,"./is-widget":264,"./version":265}],267:[function(require,module,exports){
+var version = require("./version")
+
+VirtualPatch.NONE = 0
+VirtualPatch.VTEXT = 1
+VirtualPatch.VNODE = 2
+VirtualPatch.WIDGET = 3
+VirtualPatch.PROPS = 4
+VirtualPatch.ORDER = 5
+VirtualPatch.INSERT = 6
+VirtualPatch.REMOVE = 7
+VirtualPatch.THUNK = 8
+
+module.exports = VirtualPatch
+
+function VirtualPatch(type, vNode, patch) {
+    this.type = Number(type)
+    this.vNode = vNode
+    this.patch = patch
+}
+
+VirtualPatch.prototype.version = version
+VirtualPatch.prototype.type = "VirtualPatch"
+
+},{"./version":265}],268:[function(require,module,exports){
+var version = require("./version")
+
+module.exports = VirtualText
+
+function VirtualText(text) {
+    this.text = String(text)
+}
+
+VirtualText.prototype.version = version
+VirtualText.prototype.type = "VirtualText"
+
+},{"./version":265}],269:[function(require,module,exports){
+var isObject = require("is-object")
+var isHook = require("../vnode/is-vhook")
+
+module.exports = diffProps
+
+function diffProps(a, b) {
+    var diff
+
+    for (var aKey in a) {
+        if (!(aKey in b)) {
+            diff = diff || {}
+            diff[aKey] = undefined
         }
-        if (conf !== undefined) {
-            this._configurationSubject$.next(conf);
+
+        var aValue = a[aKey]
+        var bValue = b[aKey]
+
+        if (aValue === bValue) {
+            continue
+        } else if (isObject(aValue) && isObject(bValue)) {
+            if (getPrototype(bValue) !== getPrototype(aValue)) {
+                diff = diff || {}
+                diff[aKey] = bValue
+            } else if (isHook(bValue)) {
+                 diff = diff || {}
+                 diff[aKey] = bValue
+            } else {
+                var objectDiff = diffProps(aValue, bValue)
+                if (objectDiff) {
+                    diff = diff || {}
+                    diff[aKey] = objectDiff
+                }
+            }
+        } else {
+            diff = diff || {}
+            diff[aKey] = bValue
         }
-        this._activate();
-        this._activated = true;
-        this._activated$.next(true);
-    };
-    ;
-    Component.prototype.configure = function (conf) {
-        this._configurationSubject$.next(conf);
-    };
-    Component.prototype.deactivate = function () {
-        if (!this._activated) {
-            return;
+    }
+
+    for (var bKey in b) {
+        if (!(bKey in a)) {
+            diff = diff || {}
+            diff[bKey] = b[bKey]
         }
-        this._deactivate();
-        this._container.domRenderer.clear(this._name);
-        this._container.glRenderer.clear(this._name);
-        this._activated = false;
-        this._activated$.next(false);
-    };
-    ;
-    /**
-     * Detect the viewer's new width and height and resize the component's
-     * rendered elements accordingly if applicable.
-     */
-    Component.prototype.resize = function () { return; };
-    /**
-     * Component name. Used when interacting with component through the Viewer's API.
-     */
-    Component.componentName = "not_worthy";
-    return Component;
-}(Utils_1.EventEmitter));
-exports.Component = Component;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Component;
+    }
 
-},{"../Utils":215,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72}],223:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var _ = require("underscore");
-var Error_1 = require("../Error");
-var ComponentService = (function () {
-    function ComponentService(container, navigator) {
-        this._components = {};
-        this._container = container;
-        this._navigator = navigator;
-        for (var _i = 0, _a = _.values(ComponentService.registeredComponents); _i < _a.length; _i++) {
-            var component = _a[_i];
-            this._components[component.componentName] = {
-                active: false,
-                component: new component(component.componentName, container, navigator),
-            };
-        }
-        this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
-        this._coverComponent.activate();
-        this._coverActivated = true;
+    return diff
+}
+
+function getPrototype(value) {
+  if (Object.getPrototypeOf) {
+    return Object.getPrototypeOf(value)
+  } else if (value.__proto__) {
+    return value.__proto__
+  } else if (value.constructor) {
+    return value.constructor.prototype
+  }
+}
+
+},{"../vnode/is-vhook":261,"is-object":20}],270:[function(require,module,exports){
+var isArray = require("x-is-array")
+
+var VPatch = require("../vnode/vpatch")
+var isVNode = require("../vnode/is-vnode")
+var isVText = require("../vnode/is-vtext")
+var isWidget = require("../vnode/is-widget")
+var isThunk = require("../vnode/is-thunk")
+var handleThunk = require("../vnode/handle-thunk")
+
+var diffProps = require("./diff-props")
+
+module.exports = diff
+
+function diff(a, b) {
+    var patch = { a: a }
+    walk(a, b, patch, 0)
+    return patch
+}
+
+function walk(a, b, patch, index) {
+    if (a === b) {
+        return
     }
-    ComponentService.register = function (component) {
-        if (ComponentService.registeredComponents[component.componentName] === undefined) {
-            ComponentService.registeredComponents[component.componentName] = component;
-        }
-    };
-    ComponentService.registerCover = function (coverComponent) {
-        ComponentService.registeredCoverComponent = coverComponent;
-    };
-    ComponentService.prototype.activateCover = function () {
-        if (this._coverActivated) {
-            return;
-        }
-        this._coverActivated = true;
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            if (component.active) {
-                component.component.deactivate();
-            }
-        }
-        return;
-    };
-    ComponentService.prototype.deactivateCover = function () {
-        if (!this._coverActivated) {
-            return;
+
+    var apply = patch[index]
+    var applyClear = false
+
+    if (isThunk(a) || isThunk(b)) {
+        thunks(a, b, patch, index)
+    } else if (b == null) {
+
+        // If a is a widget we will add a remove patch for it
+        // Otherwise any child widgets/hooks must be destroyed.
+        // This prevents adding two remove patches for a widget.
+        if (!isWidget(a)) {
+            clearState(a, patch, index)
+            apply = patch[index]
         }
-        this._coverActivated = false;
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            if (component.active) {
-                component.component.activate();
+
+        apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b))
+    } else if (isVNode(b)) {
+        if (isVNode(a)) {
+            if (a.tagName === b.tagName &&
+                a.namespace === b.namespace &&
+                a.key === b.key) {
+                var propsPatch = diffProps(a.properties, b.properties)
+                if (propsPatch) {
+                    apply = appendPatch(apply,
+                        new VPatch(VPatch.PROPS, a, propsPatch))
+                }
+                apply = diffChildren(a, b, patch, apply, index)
+            } else {
+                apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
+                applyClear = true
             }
+        } else {
+            apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
+            applyClear = true
         }
-        return;
-    };
-    ComponentService.prototype.activate = function (name) {
-        this._checkName(name);
-        this._components[name].active = true;
-        if (!this._coverActivated) {
-            this.get(name).activate();
-        }
-    };
-    ComponentService.prototype.configure = function (name, conf) {
-        this._checkName(name);
-        this.get(name).configure(conf);
-    };
-    ComponentService.prototype.deactivate = function (name) {
-        this._checkName(name);
-        this._components[name].active = false;
-        if (!this._coverActivated) {
-            this.get(name).deactivate();
-        }
-    };
-    ComponentService.prototype.resize = function () {
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            component.component.resize();
+    } else if (isVText(b)) {
+        if (!isVText(a)) {
+            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
+            applyClear = true
+        } else if (a.text !== b.text) {
+            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
         }
-    };
-    ComponentService.prototype.get = function (name) {
-        return this._components[name].component;
-    };
-    ComponentService.prototype.getCover = function () {
-        return this._coverComponent;
-    };
-    ComponentService.prototype._checkName = function (name) {
-        if (!(name in this._components)) {
-            throw new Error_1.ParameterMapillaryError("Component does not exist: " + name);
+    } else if (isWidget(b)) {
+        if (!isWidget(a)) {
+            applyClear = true
         }
-    };
-    ComponentService.registeredComponents = {};
-    return ComponentService;
-}());
-exports.ComponentService = ComponentService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ComponentService;
 
-},{"../Error":209,"underscore":158}],224:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../Component");
-var CoverComponent = (function (_super) {
-    __extends(CoverComponent, _super);
-    function CoverComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
+        apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b))
     }
-    CoverComponent.prototype._activate = function () {
-        var _this = this;
-        this._keyDisposable = this._navigator.stateService.currentNode$
-            .withLatestFrom(this._configuration$, function (node, configuration) {
-            return [node, configuration];
-        })
-            .filter(function (nc) {
-            return nc[0].key !== nc[1].key;
-        })
-            .map(function (nc) { return nc[0]; })
-            .map(function (node) {
-            return { key: node.key, src: node.image.src };
-        })
-            .subscribe(this._configurationSubject$);
-        this._disposable = this._configuration$
-            .map(function (conf) {
-            if (!conf.key) {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-            if (!conf.visible) {
-                return { name: _this._name, vnode: vd.h("div.Cover.CoverDone", [_this._getCoverBackgroundVNode(conf)]) };
-            }
-            return { name: _this._name, vnode: _this._getCoverButtonVNode(conf) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    CoverComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._keyDisposable.unsubscribe();
-    };
-    CoverComponent.prototype._getDefaultConfiguration = function () {
-        return { "loading": false, "visible": true };
-    };
-    CoverComponent.prototype._getCoverButtonVNode = function (conf) {
-        var _this = this;
-        var cover = conf.loading ? "div.Cover.CoverLoading" : "div.Cover";
-        return vd.h(cover, [
-            this._getCoverBackgroundVNode(conf),
-            vd.h("button.CoverButton", { onclick: function () { _this.configure({ loading: true }); } }, ["Explore"]),
-            vd.h("a.CoverLogo", { href: "https://www.mapillary.com", target: "_blank" }, []),
-        ]);
-    };
-    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
-        var url = conf.src != null ?
-            "url(" + conf.src + ")" :
-            "url(https://d1cuyjsrcm0gby.cloudfront.net/" + conf.key + "/thumb-640.jpg)";
-        var properties = { style: { backgroundImage: url } };
-        var children = [];
-        if (conf.loading) {
-            children.push(vd.h("div.Spinner", {}, []));
-        }
-        children.push(vd.h("div.CoverBackgroundGradient", {}, []));
-        return vd.h("div.CoverBackground", properties, children);
-    };
-    CoverComponent.componentName = "cover";
-    return CoverComponent;
-}(Component_1.Component));
-exports.CoverComponent = CoverComponent;
-Component_1.ComponentService.registerCover(CoverComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = CoverComponent;
 
-},{"../Component":207,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/withLatestFrom":76,"virtual-dom":163}],225:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var DebugComponent = (function (_super) {
-    __extends(DebugComponent, _super);
-    function DebugComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._open$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._displaying = false;
+    if (apply) {
+        patch[index] = apply
     }
-    DebugComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = this._navigator.stateService.currentState$
-            .combineLatest(this._open$, this._navigator.imageLoadingService.loadstatus$, function (frame, open, loadStatus) {
-            return { name: _this._name, vnode: _this._getDebugVNode(open, _this._getDebugInfo(frame, loadStatus)) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    DebugComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    DebugComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    DebugComponent.prototype._getDebugInfo = function (frame, loadStatus) {
-        var ret = [];
-        ret.push(vd.h("h2", "Node"));
-        if (frame.state.currentNode) {
-            ret.push(vd.h("p", "currentNode: " + frame.state.currentNode.key));
-        }
-        if (frame.state.previousNode) {
-            ret.push(vd.h("p", "previousNode: " + frame.state.previousNode.key));
-        }
-        ret.push(vd.h("h2", "Loading"));
-        var total = 0;
-        var loaded = 0;
-        var loading = 0;
-        for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
-            var loadStat = _a[_i];
-            total += loadStat.loaded;
-            if (loadStat.loaded !== loadStat.total) {
-                loading++;
-            }
-            else {
-                loaded++;
+
+    if (applyClear) {
+        clearState(a, patch, index)
+    }
+}
+
+function diffChildren(a, b, patch, apply, index) {
+    var aChildren = a.children
+    var orderedSet = reorder(aChildren, b.children)
+    var bChildren = orderedSet.children
+
+    var aLen = aChildren.length
+    var bLen = bChildren.length
+    var len = aLen > bLen ? aLen : bLen
+
+    for (var i = 0; i < len; i++) {
+        var leftNode = aChildren[i]
+        var rightNode = bChildren[i]
+        index += 1
+
+        if (!leftNode) {
+            if (rightNode) {
+                // Excess nodes in b need to be added
+                apply = appendPatch(apply,
+                    new VPatch(VPatch.INSERT, null, rightNode))
             }
+        } else {
+            walk(leftNode, rightNode, patch, index)
         }
-        ret.push(vd.h("p", "Loaded Images: " + loaded));
-        ret.push(vd.h("p", "Loading Images: " + loading));
-        ret.push(vd.h("p", "Total bytes loaded: " + total));
-        ret.push(vd.h("h2", "Camera"));
-        ret.push(vd.h("p", "camera.position.x: " + frame.state.camera.position.x));
-        ret.push(vd.h("p", "camera.position.y: " + frame.state.camera.position.y));
-        ret.push(vd.h("p", "camera.position.z: " + frame.state.camera.position.z));
-        ret.push(vd.h("p", "camera.lookat.x: " + frame.state.camera.lookat.x));
-        ret.push(vd.h("p", "camera.lookat.y: " + frame.state.camera.lookat.y));
-        ret.push(vd.h("p", "camera.lookat.z: " + frame.state.camera.lookat.z));
-        ret.push(vd.h("p", "camera.up.x: " + frame.state.camera.up.x));
-        ret.push(vd.h("p", "camera.up.y: " + frame.state.camera.up.y));
-        ret.push(vd.h("p", "camera.up.z: " + frame.state.camera.up.z));
-        return ret;
-    };
-    DebugComponent.prototype._getDebugVNode = function (open, info) {
-        if (open) {
-            return vd.h("div.Debug", {}, [
-                vd.h("h2", {}, ["Debug"]),
-                this._getDebugVNodeButton(open),
-                vd.h("pre", {}, info),
-            ]);
-        }
-        else {
-            return this._getDebugVNodeButton(open);
-        }
-    };
-    DebugComponent.prototype._getDebugVNodeButton = function (open) {
-        var buttonText = open ? "Disable Debug" : "D";
-        var buttonCssClass = open ? "" : ".DebugButtonFixed";
-        if (open) {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._closeDebugElement.bind(this) }, [buttonText]);
-        }
-        else {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._openDebugElement.bind(this) }, [buttonText]);
-        }
-    };
-    DebugComponent.prototype._closeDebugElement = function (open) {
-        this._open$.next(false);
-    };
-    DebugComponent.prototype._openDebugElement = function () {
-        this._open$.next(true);
-    };
-    DebugComponent.componentName = "debug";
-    return DebugComponent;
-}(Component_1.Component));
-exports.DebugComponent = DebugComponent;
-Component_1.ComponentService.register(DebugComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DebugComponent;
 
-},{"../Component":207,"rxjs/BehaviorSubject":25,"rxjs/add/operator/combineLatest":49,"underscore":158,"virtual-dom":163}],226:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var ImageComponent = (function (_super) {
-    __extends(ImageComponent, _super);
-    function ImageComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._canvasId = container.id + "-" + this._name;
+        if (isVNode(leftNode) && leftNode.count) {
+            index += leftNode.count
+        }
     }
-    ImageComponent.prototype._activate = function () {
-        var _this = this;
-        this.drawSubscription = this._container.domRenderer.element$
-            .combineLatest(this._navigator.stateService.currentNode$, function (element, node) {
-            var canvas = document.getElementById(_this._canvasId);
-            return { canvas: canvas, node: node };
-        })
-            .subscribe(function (canvasNode) {
-            var canvas = canvasNode.canvas;
-            var node = canvasNode.node;
-            if (!node || !canvas) {
-                return null;
-            }
-            var adaptableDomRenderer = canvas.parentElement;
-            var width = adaptableDomRenderer.offsetWidth;
-            var height = adaptableDomRenderer.offsetHeight;
-            canvas.width = width;
-            canvas.height = height;
-            var ctx = canvas.getContext("2d");
-            ctx.drawImage(node.image, 0, 0, width, height);
-        });
-        this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) });
-    };
-    ImageComponent.prototype._deactivate = function () {
-        this.drawSubscription.unsubscribe();
-    };
-    ImageComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    ImageComponent.componentName = "image";
-    return ImageComponent;
-}(Component_1.Component));
-exports.ImageComponent = ImageComponent;
-Component_1.ComponentService.register(ImageComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImageComponent;
 
-},{"../Component":207,"rxjs/add/operator/combineLatest":49,"virtual-dom":163}],227:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/operator/withLatestFrom");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var KeyboardComponent = (function (_super) {
-    __extends(KeyboardComponent, _super);
-    function KeyboardComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._spatial = new Geo_1.Spatial();
-        this._perspectiveDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
+    if (orderedSet.moves) {
+        // Reorder nodes last
+        apply = appendPatch(apply, new VPatch(
+            VPatch.ORDER,
+            a,
+            orderedSet.moves
+        ))
     }
-    KeyboardComponent.prototype._activate = function () {
-        var _this = this;
-        var sequenceEdges$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        });
-        var spatialEdges$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.spatialEdges$;
-        });
-        this._disposable = Observable_1.Observable
-            .fromEvent(document, "keydown")
-            .withLatestFrom(this._navigator.stateService.currentState$, sequenceEdges$, spatialEdges$, function (event, frame, sequenceEdges, spatialEdges) {
-            return { event: event, frame: frame, sequenceEdges: sequenceEdges, spatialEdges: spatialEdges };
-        })
-            .subscribe(function (kf) {
-            if (!kf.frame.state.currentNode.pano) {
-                _this._navigatePerspective(kf.event, kf.sequenceEdges, kf.spatialEdges);
-            }
-            else {
-                _this._navigatePanorama(kf.event, kf.sequenceEdges, kf.spatialEdges, kf.frame.state.camera);
-            }
-        });
-    };
-    KeyboardComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    KeyboardComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    KeyboardComponent.prototype._navigatePanorama = function (event, sequenceEdges, spatialEdges, camera) {
-        var navigationAngle = 0;
-        var stepDirection = null;
-        var sequenceDirection = null;
-        var phi = this._rotationFromCamera(camera).phi;
-        switch (event.keyCode) {
-            case 37:
-                if (event.shiftKey || event.altKey) {
-                    break;
-                }
-                navigationAngle = Math.PI / 2 + phi;
-                stepDirection = Edge_1.EdgeDirection.StepLeft;
-                break;
-            case 38:
-                if (event.shiftKey) {
-                    break;
-                }
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Next;
-                    break;
-                }
-                navigationAngle = phi;
-                stepDirection = Edge_1.EdgeDirection.StepForward;
-                break;
-            case 39:
-                if (event.shiftKey || event.altKey) {
-                    break;
-                }
-                navigationAngle = -Math.PI / 2 + phi;
-                stepDirection = Edge_1.EdgeDirection.StepRight;
-                break;
-            case 40:
-                if (event.shiftKey) {
-                    break;
-                }
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Prev;
-                    break;
-                }
-                navigationAngle = Math.PI + phi;
-                stepDirection = Edge_1.EdgeDirection.StepBackward;
-                break;
-            default:
-                return;
-        }
-        event.preventDefault();
-        if (sequenceDirection != null) {
-            this._moveInDir(sequenceDirection, sequenceEdges);
-            return;
-        }
-        if (stepDirection == null || !spatialEdges.cached) {
-            return;
+
+    return apply
+}
+
+function clearState(vNode, patch, index) {
+    // TODO: Make this a single walk, not two
+    unhook(vNode, patch, index)
+    destroyWidgets(vNode, patch, index)
+}
+
+// Patch records for all destroyed widgets must be added because we need
+// a DOM node reference for the destroy function
+function destroyWidgets(vNode, patch, index) {
+    if (isWidget(vNode)) {
+        if (typeof vNode.destroy === "function") {
+            patch[index] = appendPatch(
+                patch[index],
+                new VPatch(VPatch.REMOVE, vNode, null)
+            )
         }
-        navigationAngle = this._spatial.wrapAngle(navigationAngle);
-        var threshold = Math.PI / 4;
-        var edges = spatialEdges.edges.filter(function (e) {
-            return e.data.direction === Edge_1.EdgeDirection.Pano ||
-                e.data.direction === stepDirection;
-        });
-        var smallestAngle = Number.MAX_VALUE;
-        var toKey = null;
-        for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-            var edge = edges_1[_i];
-            var angle = Math.abs(this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));
-            if (angle < Math.min(smallestAngle, threshold)) {
-                smallestAngle = angle;
-                toKey = edge.to;
+    } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) {
+        var children = vNode.children
+        var len = children.length
+        for (var i = 0; i < len; i++) {
+            var child = children[i]
+            index += 1
+
+            destroyWidgets(child, patch, index)
+
+            if (isVNode(child) && child.count) {
+                index += child.count
             }
         }
-        if (toKey == null) {
-            return;
-        }
-        this._navigator.moveToKey$(toKey)
-            .subscribe(function (n) { return; }, function (e) { console.error(e); });
-    };
-    KeyboardComponent.prototype._rotationFromCamera = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var upProjection = direction.clone().dot(camera.up);
-        var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));
-        var phi = Math.atan2(planeProjection.y, planeProjection.x);
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
-    };
-    KeyboardComponent.prototype._navigatePerspective = function (event, sequenceEdges, spatialEdges) {
-        var direction = null;
-        var sequenceDirection = null;
-        switch (event.keyCode) {
-            case 37:
-                if (event.altKey) {
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
-                break;
-            case 38:
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Next;
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
-                break;
-            case 39:
-                if (event.altKey) {
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
-                break;
-            case 40:
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Prev;
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
-                break;
-            default:
-                return;
-        }
-        event.preventDefault();
-        if (sequenceDirection != null) {
-            this._moveInDir(sequenceDirection, sequenceEdges);
-            return;
+    } else if (isThunk(vNode)) {
+        thunks(vNode, null, patch, index)
+    }
+}
+
+// Create a sub-patch for thunks
+function thunks(a, b, patch, index) {
+    var nodes = handleThunk(a, b)
+    var thunkPatch = diff(nodes.a, nodes.b)
+    if (hasPatches(thunkPatch)) {
+        patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch)
+    }
+}
+
+function hasPatches(patch) {
+    for (var index in patch) {
+        if (index !== "a") {
+            return true
         }
-        this._moveInDir(direction, spatialEdges);
-    };
-    KeyboardComponent.prototype._moveInDir = function (direction, edgeStatus) {
-        if (!edgeStatus.cached) {
-            return;
+    }
+
+    return false
+}
+
+// Execute hooks when two nodes are identical
+function unhook(vNode, patch, index) {
+    if (isVNode(vNode)) {
+        if (vNode.hooks) {
+            patch[index] = appendPatch(
+                patch[index],
+                new VPatch(
+                    VPatch.PROPS,
+                    vNode,
+                    undefinedKeys(vNode.hooks)
+                )
+            )
         }
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === direction) {
-                this._navigator.moveToKey$(edge.to)
-                    .subscribe(function (n) { return; }, function (e) { console.error(e); });
-                return;
+
+        if (vNode.descendantHooks || vNode.hasThunks) {
+            var children = vNode.children
+            var len = children.length
+            for (var i = 0; i < len; i++) {
+                var child = children[i]
+                index += 1
+
+                unhook(child, patch, index)
+
+                if (isVNode(child) && child.count) {
+                    index += child.count
+                }
             }
         }
-    };
-    KeyboardComponent.componentName = "keyboard";
-    return KeyboardComponent;
-}(Component_1.Component));
-exports.KeyboardComponent = KeyboardComponent;
-Component_1.ComponentService.register(KeyboardComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = KeyboardComponent;
+    } else if (isThunk(vNode)) {
+        thunks(vNode, null, patch, index)
+    }
+}
 
-},{"../Component":207,"../Edge":208,"../Geo":210,"rxjs/Observable":28,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/withLatestFrom":76}],228:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var vd = require("virtual-dom");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var LoadingComponent = (function (_super) {
-    __extends(LoadingComponent, _super);
-    function LoadingComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
+function undefinedKeys(obj) {
+    var result = {}
+
+    for (var key in obj) {
+        result[key] = undefined
     }
-    LoadingComponent.prototype._activate = function () {
-        var _this = this;
-        this._loadingSubscription = this._navigator.loadingService.loading$
-            .combineLatest(this._navigator.imageLoadingService.loadstatus$, function (loading, loadStatus) {
-            if (!loading) {
-                return { name: "loading", vnode: _this._getBarVNode(100) };
+
+    return result
+}
+
+// List diff, naive left to right reordering
+function reorder(aChildren, bChildren) {
+    // O(M) time, O(M) memory
+    var bChildIndex = keyIndex(bChildren)
+    var bKeys = bChildIndex.keys
+    var bFree = bChildIndex.free
+
+    if (bFree.length === bChildren.length) {
+        return {
+            children: bChildren,
+            moves: null
+        }
+    }
+
+    // O(N) time, O(N) memory
+    var aChildIndex = keyIndex(aChildren)
+    var aKeys = aChildIndex.keys
+    var aFree = aChildIndex.free
+
+    if (aFree.length === aChildren.length) {
+        return {
+            children: bChildren,
+            moves: null
+        }
+    }
+
+    // O(MAX(N, M)) memory
+    var newChildren = []
+
+    var freeIndex = 0
+    var freeCount = bFree.length
+    var deletedItems = 0
+
+    // Iterate through a and match a node in b
+    // O(N) time,
+    for (var i = 0 ; i < aChildren.length; i++) {
+        var aItem = aChildren[i]
+        var itemIndex
+
+        if (aItem.key) {
+            if (bKeys.hasOwnProperty(aItem.key)) {
+                // Match up the old keys
+                itemIndex = bKeys[aItem.key]
+                newChildren.push(bChildren[itemIndex])
+
+            } else {
+                // Remove old keyed items
+                itemIndex = i - deletedItems++
+                newChildren.push(null)
             }
-            var total = 0;
-            var loaded = 0;
-            for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
-                var loadStat = _a[_i];
-                if (loadStat.loaded !== loadStat.total) {
-                    loaded += loadStat.loaded;
-                    total += loadStat.total;
+        } else {
+            // Match the item in a with the next free item in b
+            if (freeIndex < freeCount) {
+                itemIndex = bFree[freeIndex++]
+                newChildren.push(bChildren[itemIndex])
+            } else {
+                // There are no free items in b to match with
+                // the free items in a, so the extra free nodes
+                // are deleted.
+                itemIndex = i - deletedItems++
+                newChildren.push(null)
+            }
+        }
+    }
+
+    var lastFreeIndex = freeIndex >= bFree.length ?
+        bChildren.length :
+        bFree[freeIndex]
+
+    // Iterate through b and append any new keys
+    // O(M) time
+    for (var j = 0; j < bChildren.length; j++) {
+        var newItem = bChildren[j]
+
+        if (newItem.key) {
+            if (!aKeys.hasOwnProperty(newItem.key)) {
+                // Add any new keyed items
+                // We are adding new items to the end and then sorting them
+                // in place. In future we should insert new items in place.
+                newChildren.push(newItem)
+            }
+        } else if (j >= lastFreeIndex) {
+            // Add any leftover non-keyed items
+            newChildren.push(newItem)
+        }
+    }
+
+    var simulate = newChildren.slice()
+    var simulateIndex = 0
+    var removes = []
+    var inserts = []
+    var simulateItem
+
+    for (var k = 0; k < bChildren.length;) {
+        var wantedItem = bChildren[k]
+        simulateItem = simulate[simulateIndex]
+
+        // remove items
+        while (simulateItem === null && simulate.length) {
+            removes.push(remove(simulate, simulateIndex, null))
+            simulateItem = simulate[simulateIndex]
+        }
+
+        if (!simulateItem || simulateItem.key !== wantedItem.key) {
+            // if we need a key in this position...
+            if (wantedItem.key) {
+                if (simulateItem && simulateItem.key) {
+                    // if an insert doesn't put this key in place, it needs to move
+                    if (bKeys[simulateItem.key] !== k + 1) {
+                        removes.push(remove(simulate, simulateIndex, simulateItem.key))
+                        simulateItem = simulate[simulateIndex]
+                        // if the remove didn't put the wanted item in place, we need to insert it
+                        if (!simulateItem || simulateItem.key !== wantedItem.key) {
+                            inserts.push({key: wantedItem.key, to: k})
+                        }
+                        // items are matching, so skip ahead
+                        else {
+                            simulateIndex++
+                        }
+                    }
+                    else {
+                        inserts.push({key: wantedItem.key, to: k})
+                    }
+                }
+                else {
+                    inserts.push({key: wantedItem.key, to: k})
                 }
+                k++
             }
-            var percentage = 100;
-            if (total !== 0) {
-                percentage = (loaded / total) * 100;
+            // a key in simulate has no matching wanted key, remove it
+            else if (simulateItem && simulateItem.key) {
+                removes.push(remove(simulate, simulateIndex, simulateItem.key))
             }
-            return { name: _this._name, vnode: _this._getBarVNode(percentage) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    LoadingComponent.prototype._deactivate = function () {
-        this._loadingSubscription.unsubscribe();
-    };
-    LoadingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    LoadingComponent.prototype._getBarVNode = function (percentage) {
-        var loadingBarStyle = {};
-        var loadingContainerStyle = {};
-        if (percentage !== 100) {
-            loadingBarStyle.width = percentage.toFixed(0) + "%";
-            loadingBarStyle.opacity = "1";
         }
         else {
-            loadingBarStyle.width = "100%";
-            loadingBarStyle.opacity = "0";
+            simulateIndex++
+            k++
         }
-        return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]);
-    };
-    LoadingComponent.componentName = "loading";
-    return LoadingComponent;
-}(Component_1.Component));
-exports.LoadingComponent = LoadingComponent;
-Component_1.ComponentService.register(LoadingComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LoadingComponent;
+    }
 
-},{"../Component":207,"rxjs/add/operator/combineLatest":49,"underscore":158,"virtual-dom":163}],229:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/merge");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-/**
- * @class MouseComponent
- * @classdesc Component handling mouse and touch events for camera movement.
- */
-var MouseComponent = (function (_super) {
-    __extends(MouseComponent, _super);
-    function MouseComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._spatial = new Geo_1.Spatial();
+    // remove all the remaining nodes from simulate
+    while(simulateIndex < simulate.length) {
+        simulateItem = simulate[simulateIndex]
+        removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key))
     }
-    MouseComponent.prototype._activate = function () {
-        var _this = this;
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$)
-            .map(function (event) {
-            return true;
-        });
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$)
-            .map(function (event) {
-            return false;
-        });
-        var dragging$ = Observable_1.Observable
-            .merge(draggingStarted$, draggingStopped$)
-            .startWith(false)
-            .share();
-        this._activeSubscription = dragging$
-            .subscribe(this._container.mouseService.activate$);
-        this._cursorSubscription = dragging$
-            .map(function (dragging) {
-            var className = dragging ? "MouseContainerGrabbing" : "MouseContainerGrab";
-            var vNode = vd.h("div." + className, {}, []);
-            return { name: _this._name, vnode: vNode };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        var mouseMovement$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDrag$)
-            .map(function (e) {
-            return {
-                clientX: e.clientX,
-                clientY: e.clientY,
-                movementX: e.movementX,
-                movementY: e.movementY,
-            };
-        });
-        var touchMovement$ = this._container.touchService.singleTouchMove$
-            .map(function (touch) {
-            return {
-                clientX: touch.clientX,
-                clientY: touch.clientY,
-                movementX: touch.movementX,
-                movementY: touch.movementY,
-            };
-        });
-        this._movementSubscription = Observable_1.Observable
-            .merge(mouseMovement$, touchMovement$)
-            .withLatestFrom(this._navigator.stateService.currentState$, function (m, f) {
-            return [m, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.stateService.currentCamera$, function (m, r, t, c) {
-            return [m, r, t, c];
-        })
-            .map(function (args) {
-            var movement = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var camera = args[3].clone();
-            var element = _this._container.element;
-            var offsetWidth = element.offsetWidth;
-            var offsetHeight = element.offsetHeight;
-            var clientRect = element.getBoundingClientRect();
-            var canvasX = movement.clientX - clientRect.left;
-            var canvasY = movement.clientY - clientRect.top;
-            var currentDirection = _this._unproject(canvasX, canvasY, offsetWidth, offsetHeight, render.perspective)
-                .sub(render.perspective.position);
-            var directionX = _this._unproject(canvasX - movement.movementX, canvasY, offsetWidth, offsetHeight, render.perspective)
-                .sub(render.perspective.position);
-            var directionY = _this._unproject(canvasX, canvasY - movement.movementY, offsetWidth, offsetHeight, render.perspective)
-                .sub(render.perspective.position);
-            var deltaPhi = (movement.movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
-            var deltaTheta = (movement.movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
-            var upQuaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-            var upQuaternionInverse = upQuaternion.clone().inverse();
-            var offset = new THREE.Vector3();
-            offset.copy(camera.lookat).sub(camera.position);
-            offset.applyQuaternion(upQuaternion);
-            var length = offset.length();
-            var phi = Math.atan2(offset.y, offset.x);
-            phi += deltaPhi;
-            var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-            theta += deltaTheta;
-            theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta));
-            offset.x = Math.sin(theta) * Math.cos(phi);
-            offset.y = Math.sin(theta) * Math.sin(phi);
-            offset.z = Math.cos(theta);
-            offset.applyQuaternion(upQuaternionInverse);
-            var lookat = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length));
-            var basic = transform.projectBasic(lookat.toArray());
-            var original = transform.projectBasic(camera.lookat.toArray());
-            var x = basic[0] - original[0];
-            var y = basic[1] - original[1];
-            if (Math.abs(x) > 1) {
-                x = 0;
-            }
-            else if (x > 0.5) {
-                x = x - 1;
-            }
-            else if (x < -0.5) {
-                x = x + 1;
-            }
-            return [x, y];
-        })
-            .subscribe(function (basicRotation) {
-            _this._navigator.stateService.rotateBasic(basicRotation);
-        });
-        this._mouseWheelSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseWheel$)
-            .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
-            return [w, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) {
-            return [w, r, t];
-        })
-            .subscribe(function (args) {
-            var event = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var element = _this._container.element;
-            var offsetWidth = element.offsetWidth;
-            var offsetHeight = element.offsetHeight;
-            var clientRect = element.getBoundingClientRect();
-            var canvasX = event.clientX - clientRect.left;
-            var canvasY = event.clientY - clientRect.top;
-            var unprojected = _this._unproject(canvasX, canvasY, offsetWidth, offsetHeight, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var deltaY = event.deltaY;
-            if (event.deltaMode === 1) {
-                deltaY = 40 * deltaY;
-            }
-            else if (event.deltaMode === 2) {
-                deltaY = 800 * deltaY;
-            }
-            var zoom = -3 * deltaY / offsetHeight;
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-        this._pinchSubscription = this._container.touchService.pinch$
-            .withLatestFrom(this._navigator.stateService.currentState$, function (p, f) {
-            return [p, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (p, r, t) {
-            return [p, r, t];
-        })
-            .subscribe(function (args) {
-            var pinch = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var element = _this._container.element;
-            var offsetWidth = element.offsetWidth;
-            var offsetHeight = element.offsetHeight;
-            var clientRect = element.getBoundingClientRect();
-            var unprojected = _this._unproject(pinch.centerClientX - clientRect.left, pinch.centerClientY - clientRect.top, offsetWidth, offsetHeight, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var zoom = 3 * pinch.distanceChange / Math.min(offsetHeight, offsetWidth);
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-        this._container.mouseService.claimMouse(this._name, 0);
-    };
-    MouseComponent.prototype._deactivate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._activeSubscription.unsubscribe();
-        this._cursorSubscription.unsubscribe();
-        this._movementSubscription.unsubscribe();
-        this._mouseWheelSubscription.unsubscribe();
-        this._pinchSubscription.unsubscribe();
-    };
-    MouseComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    MouseComponent.prototype._unproject = function (canvasX, canvasY, offsetWidth, offsetHeight, perspectiveCamera) {
-        var projectedX = 2 * canvasX / offsetWidth - 1;
-        var projectedY = 1 - 2 * canvasY / offsetHeight;
-        return new THREE.Vector3(projectedX, projectedY, 1).unproject(perspectiveCamera);
-    };
-    /** @inheritdoc */
-    MouseComponent.componentName = "mouse";
-    return MouseComponent;
-}(Component_1.Component));
-exports.MouseComponent = MouseComponent;
-Component_1.ComponentService.register(MouseComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MouseComponent;
 
-},{"../Component":207,"../Geo":210,"rxjs/Observable":28,"rxjs/add/observable/merge":43,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/withLatestFrom":76,"three":157,"virtual-dom":163}],230:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/first");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var NavigationComponent = (function (_super) {
-    __extends(NavigationComponent, _super);
-    function NavigationComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._dirNames = {};
-        this._dirNames[Edge_1.EdgeDirection.StepForward] = "Forward";
-        this._dirNames[Edge_1.EdgeDirection.StepBackward] = "Backward";
-        this._dirNames[Edge_1.EdgeDirection.StepLeft] = "Left";
-        this._dirNames[Edge_1.EdgeDirection.StepRight] = "Right";
-        this._dirNames[Edge_1.EdgeDirection.TurnLeft] = "Turnleft";
-        this._dirNames[Edge_1.EdgeDirection.TurnRight] = "Turnright";
-        this._dirNames[Edge_1.EdgeDirection.TurnU] = "Turnaround";
+    // If the only moves we have are deletes then we can just
+    // let the delete patch remove these items.
+    if (removes.length === deletedItems && !inserts.length) {
+        return {
+            children: newChildren,
+            moves: null
+        }
     }
-    NavigationComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.pano ?
-                Observable_1.Observable.of([]) :
-                Observable_1.Observable.combineLatest(node.sequenceEdges$, node.spatialEdges$, function (seq, spa) {
-                    return seq.edges.concat(spa.edges);
-                });
-        })
-            .map(function (edges) {
-            var btns = [];
-            for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-                var edge = edges_1[_i];
-                var direction = edge.data.direction;
-                var name_1 = _this._dirNames[direction];
-                if (name_1 == null) {
-                    continue;
-                }
-                btns.push(_this._createVNode(direction, name_1));
-            }
-            return { name: _this._name, vnode: vd.h("div.NavigationComponent", btns) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    NavigationComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    NavigationComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    NavigationComponent.prototype._createVNode = function (direction, name) {
-        var _this = this;
-        return vd.h("span.Direction.Direction" + name, {
-            onclick: function (ev) {
-                _this._navigator.moveDir$(direction)
-                    .subscribe(function (node) { return; }, function (error) { console.error(error); });
-            },
-        }, []);
-    };
-    NavigationComponent.componentName = "navigation";
-    return NavigationComponent;
-}(Component_1.Component));
-exports.NavigationComponent = NavigationComponent;
-Component_1.ComponentService.register(NavigationComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = NavigationComponent;
 
-},{"../Component":207,"../Edge":208,"rxjs/Observable":28,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"virtual-dom":163}],231:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/fromPromise");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinct");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/pluck");
-require("rxjs/add/operator/scan");
-var Component_1 = require("../Component");
-var DescriptionState = (function () {
-    function DescriptionState() {
+    return {
+        children: newChildren,
+        moves: {
+            removes: removes,
+            inserts: inserts
+        }
     }
-    return DescriptionState;
-}());
-var RouteState = (function () {
-    function RouteState() {
+}
+
+function remove(arr, index, key) {
+    arr.splice(index, 1)
+
+    return {
+        from: index,
+        key: key
     }
-    return RouteState;
-}());
-var RouteTrack = (function () {
-    function RouteTrack() {
-        this.nodeInstructions = [];
-        this.nodeInstructionsOrdered = [];
+}
+
+function keyIndex(children) {
+    var keys = {}
+    var free = []
+    var length = children.length
+
+    for (var i = 0; i < length; i++) {
+        var child = children[i]
+
+        if (child.key) {
+            keys[child.key] = i
+        } else {
+            free.push(i)
+        }
     }
-    return RouteTrack;
-}());
-var RouteComponent = (function (_super) {
-    __extends(RouteComponent, _super);
-    function RouteComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
+
+    return {
+        keys: keys,     // A hash of key name to index
+        free: free      // An array of unkeyed item indices
     }
-    RouteComponent.prototype._activate = function () {
-        var _this = this;
-        var _slowedStream$;
-        _slowedStream$ = this._navigator.stateService.currentState$.filter(function (frame) {
-            return (frame.id % 2) === 0;
-        }).filter(function (frame) {
-            return frame.state.nodesAhead < 15;
-        }).distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        });
-        var _routeTrack$;
-        _routeTrack$ = this.configuration$.mergeMap(function (conf) {
-            return Observable_1.Observable.from(conf.paths);
-        }).distinct(function (p1, p2) {
-            return p1.sequenceKey === p2.sequenceKey;
-        }).mergeMap(function (path) {
-            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey])
-                .map(function (sequenceByKey) {
-                return sequenceByKey[path.sequenceKey];
-            });
-        }).combineLatest(this.configuration$, function (sequence, conf) {
-            var i = 0;
-            var instructionPlaces = [];
-            for (var _i = 0, _a = conf.paths; _i < _a.length; _i++) {
-                var path = _a[_i];
-                if (path.sequenceKey === sequence.key) {
-                    var nodeInstructions = [];
-                    var saveKey = false;
-                    for (var _b = 0, _c = sequence.keys; _b < _c.length; _b++) {
-                        var key = _c[_b];
-                        if (path.startKey === key) {
-                            saveKey = true;
-                        }
-                        if (saveKey) {
-                            var description = null;
-                            for (var _d = 0, _e = path.infoKeys; _d < _e.length; _d++) {
-                                var infoKey = _e[_d];
-                                if (infoKey.key === key) {
-                                    description = infoKey.description;
-                                }
-                            }
-                            nodeInstructions.push({ description: description, key: key });
-                        }
-                        if (path.stopKey === key) {
-                            saveKey = false;
-                        }
-                    }
-                    instructionPlaces.push({ nodeInstructions: nodeInstructions, place: i });
-                }
-                i++;
-            }
-            return instructionPlaces;
-        }).scan(function (routeTrack, instructionPlaces) {
-            for (var _i = 0, instructionPlaces_1 = instructionPlaces; _i < instructionPlaces_1.length; _i++) {
-                var instructionPlace = instructionPlaces_1[_i];
-                routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;
-            }
-            routeTrack.nodeInstructions = _.flatten(routeTrack.nodeInstructionsOrdered);
-            return routeTrack;
-        }, new RouteTrack());
-        this._disposable = _slowedStream$
-            .combineLatest(_routeTrack$, this.configuration$, function (frame, routeTrack, conf) {
-            return { conf: conf, frame: frame, routeTrack: routeTrack };
-        }).scan(function (routeState, rtAndFrame) {
-            if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {
-                routeState.routeTrack = rtAndFrame.routeTrack;
-                routeState.currentNode = rtAndFrame.frame.state.currentNode;
-                routeState.lastNode = rtAndFrame.frame.state.lastNode;
-                routeState.playing = true;
-            }
-            else {
-                _this._navigator.stateService.cutNodes();
-                routeState.playing = false;
-            }
-            return routeState;
-        }, new RouteState())
-            .filter(function (routeState) {
-            return routeState.playing;
-        }).filter(function (routeState) {
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (!nodeInstruction) {
-                    continue;
-                }
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    return true;
-                }
-            }
-            return false;
-        }).distinctUntilChanged(undefined, function (routeState) {
-            return routeState.lastNode.key;
-        }).mergeMap(function (routeState) {
-            var i = 0;
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    break;
-                }
-                i++;
-            }
-            var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1];
-            if (!nextInstruction) {
-                return Observable_1.Observable.of(null);
-            }
-            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
-        }).combineLatest(this.configuration$, function (node, conf) {
-            return { conf: conf, node: node };
-        }).filter(function (cAN) {
-            return cAN.node !== null && cAN.conf.playing;
-        }).pluck("node").subscribe(this._navigator.stateService.appendNode$);
-        this._disposableDescription = this._navigator.stateService.currentNode$
-            .combineLatest(_routeTrack$, this.configuration$, function (node, routeTrack, conf) {
-            if (conf.playing !== undefined && !conf.playing) {
-                return "quit";
-            }
-            var description = null;
-            for (var _i = 0, _a = routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === node.key) {
-                    description = nodeInstruction.description;
-                    break;
-                }
-            }
-            return description;
-        }).scan(function (descriptionState, description) {
-            if (description !== descriptionState.description && description !== null) {
-                descriptionState.description = description;
-                descriptionState.showsLeft = 6;
-            }
-            else {
-                descriptionState.showsLeft--;
-            }
-            if (description === "quit") {
-                descriptionState.description = null;
-            }
-            return descriptionState;
-        }, new DescriptionState()).map(function (descriptionState) {
-            if (descriptionState.showsLeft > 0 && descriptionState.description) {
-                return { name: _this._name, vnode: _this._getRouteAnnotationNode(descriptionState.description) };
-            }
-            else {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-        }).subscribe(this._container.domRenderer.render$);
-    };
-    RouteComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._disposableDescription.unsubscribe();
-    };
-    RouteComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    RouteComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    RouteComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
-        return vd.h("div.RouteFrame", {}, [
+}
+
+function appendPatch(apply, patch) {
+    if (apply) {
+        if (isArray(apply)) {
+            apply.push(patch)
+        } else {
+            apply = [apply, patch]
+        }
+
+        return apply
+    } else {
+        return patch
+    }
+}
+
+},{"../vnode/handle-thunk":259,"../vnode/is-thunk":260,"../vnode/is-vnode":262,"../vnode/is-vtext":263,"../vnode/is-widget":264,"../vnode/vpatch":267,"./diff-props":269,"x-is-array":289}],271:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function (require) {
+
+       var makePromise = require('./makePromise');
+       var Scheduler = require('./Scheduler');
+       var async = require('./env').asap;
+
+       return makePromise({
+               scheduler: new Scheduler(async)
+       });
+
+});
+})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
+
+},{"./Scheduler":272,"./env":284,"./makePromise":286}],272:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       // Credit to Twisol (https://github.com/Twisol) for suggesting
+       // this type of extensible queue + trampoline approach for next-tick conflation.
+
+       /**
+        * Async task scheduler
+        * @param {function} async function to schedule a single async function
+        * @constructor
+        */
+       function Scheduler(async) {
+               this._async = async;
+               this._running = false;
+
+               this._queue = this;
+               this._queueLen = 0;
+               this._afterQueue = {};
+               this._afterQueueLen = 0;
+
+               var self = this;
+               this.drain = function() {
+                       self._drain();
+               };
+       }
+
+       /**
+        * Enqueue a task
+        * @param {{ run:function }} task
+        */
+       Scheduler.prototype.enqueue = function(task) {
+               this._queue[this._queueLen++] = task;
+               this.run();
+       };
+
+       /**
+        * Enqueue a task to run after the main task queue
+        * @param {{ run:function }} task
+        */
+       Scheduler.prototype.afterQueue = function(task) {
+               this._afterQueue[this._afterQueueLen++] = task;
+               this.run();
+       };
+
+       Scheduler.prototype.run = function() {
+               if (!this._running) {
+                       this._running = true;
+                       this._async(this.drain);
+               }
+       };
+
+       /**
+        * Drain the handler queue entirely, and then the after queue
+        */
+       Scheduler.prototype._drain = function() {
+               var i = 0;
+               for (; i < this._queueLen; ++i) {
+                       this._queue[i].run();
+                       this._queue[i] = void 0;
+               }
+
+               this._queueLen = 0;
+               this._running = false;
+
+               for (i = 0; i < this._afterQueueLen; ++i) {
+                       this._afterQueue[i].run();
+                       this._afterQueue[i] = void 0;
+               }
+
+               this._afterQueueLen = 0;
+       };
+
+       return Scheduler;
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],273:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       /**
+        * Custom error type for promises rejected by promise.timeout
+        * @param {string} message
+        * @constructor
+        */
+       function TimeoutError (message) {
+               Error.call(this);
+               this.message = message;
+               this.name = TimeoutError.name;
+               if (typeof Error.captureStackTrace === 'function') {
+                       Error.captureStackTrace(this, TimeoutError);
+               }
+       }
+
+       TimeoutError.prototype = Object.create(Error.prototype);
+       TimeoutError.prototype.constructor = TimeoutError;
+
+       return TimeoutError;
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+},{}],274:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       makeApply.tryCatchResolve = tryCatchResolve;
+
+       return makeApply;
+
+       function makeApply(Promise, call) {
+               if(arguments.length < 2) {
+                       call = tryCatchResolve;
+               }
+
+               return apply;
+
+               function apply(f, thisArg, args) {
+                       var p = Promise._defer();
+                       var l = args.length;
+                       var params = new Array(l);
+                       callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
+
+                       return p;
+               }
+
+               function callAndResolve(c, h) {
+                       if(c.i < 0) {
+                               return call(c.f, c.thisArg, c.params, h);
+                       }
+
+                       var handler = Promise._handler(c.args[c.i]);
+                       handler.fold(callAndResolveNext, c, void 0, h);
+               }
+
+               function callAndResolveNext(c, x, h) {
+                       c.params[c.i] = x;
+                       c.i -= 1;
+                       callAndResolve(c, h);
+               }
+       }
+
+       function tryCatchResolve(f, thisArg, args, resolver) {
+               try {
+                       resolver.resolve(f.apply(thisArg, args));
+               } catch(e) {
+                       resolver.reject(e);
+               }
+       }
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+
+
+},{}],275:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function(require) {
+
+       var state = require('../state');
+       var applier = require('../apply');
+
+       return function array(Promise) {
+
+               var applyFold = applier(Promise);
+               var toPromise = Promise.resolve;
+               var all = Promise.all;
+
+               var ar = Array.prototype.reduce;
+               var arr = Array.prototype.reduceRight;
+               var slice = Array.prototype.slice;
+
+               // Additional array combinators
+
+               Promise.any = any;
+               Promise.some = some;
+               Promise.settle = settle;
+
+               Promise.map = map;
+               Promise.filter = filter;
+               Promise.reduce = reduce;
+               Promise.reduceRight = reduceRight;
+
+               /**
+                * When this promise fulfills with an array, do
+                * onFulfilled.apply(void 0, array)
+                * @param {function} onFulfilled function to apply
+                * @returns {Promise} promise for the result of applying onFulfilled
+                */
+               Promise.prototype.spread = function(onFulfilled) {
+                       return this.then(all).then(function(array) {
+                               return onFulfilled.apply(this, array);
+                       });
+               };
+
+               return Promise;
+
+               /**
+                * One-winner competitive race.
+                * Return a promise that will fulfill when one of the promises
+                * in the input array fulfills, or will reject when all promises
+                * have rejected.
+                * @param {array} promises
+                * @returns {Promise} promise for the first fulfilled value
+                */
+               function any(promises) {
+                       var p = Promise._defer();
+                       var resolver = p._handler;
+                       var l = promises.length>>>0;
+
+                       var pending = l;
+                       var errors = [];
+
+                       for (var h, x, i = 0; i < l; ++i) {
+                               x = promises[i];
+                               if(x === void 0 && !(i in promises)) {
+                                       --pending;
+                                       continue;
+                               }
+
+                               h = Promise._handler(x);
+                               if(h.state() > 0) {
+                                       resolver.become(h);
+                                       Promise._visitRemaining(promises, i, h);
+                                       break;
+                               } else {
+                                       h.visit(resolver, handleFulfill, handleReject);
+                               }
+                       }
+
+                       if(pending === 0) {
+                               resolver.reject(new RangeError('any(): array must not be empty'));
+                       }
+
+                       return p;
+
+                       function handleFulfill(x) {
+                               /*jshint validthis:true*/
+                               errors = null;
+                               this.resolve(x); // this === resolver
+                       }
+
+                       function handleReject(e) {
+                               /*jshint validthis:true*/
+                               if(this.resolved) { // this === resolver
+                                       return;
+                               }
+
+                               errors.push(e);
+                               if(--pending === 0) {
+                                       this.reject(errors);
+                               }
+                       }
+               }
+
+               /**
+                * N-winner competitive race
+                * Return a promise that will fulfill when n input promises have
+                * fulfilled, or will reject when it becomes impossible for n
+                * input promises to fulfill (ie when promises.length - n + 1
+                * have rejected)
+                * @param {array} promises
+                * @param {number} n
+                * @returns {Promise} promise for the earliest n fulfillment values
+                *
+                * @deprecated
+                */
+               function some(promises, n) {
+                       /*jshint maxcomplexity:7*/
+                       var p = Promise._defer();
+                       var resolver = p._handler;
+
+                       var results = [];
+                       var errors = [];
+
+                       var l = promises.length>>>0;
+                       var nFulfill = 0;
+                       var nReject;
+                       var x, i; // reused in both for() loops
+
+                       // First pass: count actual array items
+                       for(i=0; i<l; ++i) {
+                               x = promises[i];
+                               if(x === void 0 && !(i in promises)) {
+                                       continue;
+                               }
+                               ++nFulfill;
+                       }
+
+                       // Compute actual goals
+                       n = Math.max(n, 0);
+                       nReject = (nFulfill - n + 1);
+                       nFulfill = Math.min(n, nFulfill);
+
+                       if(n > nFulfill) {
+                               resolver.reject(new RangeError('some(): array must contain at least '
+                               + n + ' item(s), but had ' + nFulfill));
+                       } else if(nFulfill === 0) {
+                               resolver.resolve(results);
+                       }
+
+                       // Second pass: observe each array item, make progress toward goals
+                       for(i=0; i<l; ++i) {
+                               x = promises[i];
+                               if(x === void 0 && !(i in promises)) {
+                                       continue;
+                               }
+
+                               Promise._handler(x).visit(resolver, fulfill, reject, resolver.notify);
+                       }
+
+                       return p;
+
+                       function fulfill(x) {
+                               /*jshint validthis:true*/
+                               if(this.resolved) { // this === resolver
+                                       return;
+                               }
+
+                               results.push(x);
+                               if(--nFulfill === 0) {
+                                       errors = null;
+                                       this.resolve(results);
+                               }
+                       }
+
+                       function reject(e) {
+                               /*jshint validthis:true*/
+                               if(this.resolved) { // this === resolver
+                                       return;
+                               }
+
+                               errors.push(e);
+                               if(--nReject === 0) {
+                                       results = null;
+                                       this.reject(errors);
+                               }
+                       }
+               }
+
+               /**
+                * Apply f to the value of each promise in a list of promises
+                * and return a new list containing the results.
+                * @param {array} promises
+                * @param {function(x:*, index:Number):*} f mapping function
+                * @returns {Promise}
+                */
+               function map(promises, f) {
+                       return Promise._traverse(f, promises);
+               }
+
+               /**
+                * Filter the provided array of promises using the provided predicate.  Input may
+                * contain promises and values
+                * @param {Array} promises array of promises and values
+                * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
+                *  Must return truthy (or promise for truthy) for items to retain.
+                * @returns {Promise} promise that will fulfill with an array containing all items
+                *  for which predicate returned truthy.
+                */
+               function filter(promises, predicate) {
+                       var a = slice.call(promises);
+                       return Promise._traverse(predicate, a).then(function(keep) {
+                               return filterSync(a, keep);
+                       });
+               }
+
+               function filterSync(promises, keep) {
+                       // Safe because we know all promises have fulfilled if we've made it this far
+                       var l = keep.length;
+                       var filtered = new Array(l);
+                       for(var i=0, j=0; i<l; ++i) {
+                               if(keep[i]) {
+                                       filtered[j++] = Promise._handler(promises[i]).value;
+                               }
+                       }
+                       filtered.length = j;
+                       return filtered;
+
+               }
+
+               /**
+                * Return a promise that will always fulfill with an array containing
+                * the outcome states of all input promises.  The returned promise
+                * will never reject.
+                * @param {Array} promises
+                * @returns {Promise} promise for array of settled state descriptors
+                */
+               function settle(promises) {
+                       return all(promises.map(settleOne));
+               }
+
+               function settleOne(p) {
+                       // Optimize the case where we get an already-resolved when.js promise
+                       //  by extracting its state:
+                       var handler;
+                       if (p instanceof Promise) {
+                               // This is our own Promise type and we can reach its handler internals:
+                               handler = p._handler.join();
+                       }
+                       if((handler && handler.state() === 0) || !handler) {
+                               // Either still pending, or not a Promise at all:
+                               return toPromise(p).then(state.fulfilled, state.rejected);
+                       }
+
+                       // The promise is our own, but it is already resolved. Take a shortcut.
+                       // Since we're not actually handling the resolution, we need to disable
+                       // rejection reporting.
+                       handler._unreport();
+                       return state.inspect(handler);
+               }
+
+               /**
+                * Traditional reduce function, similar to `Array.prototype.reduce()`, but
+                * input may contain promises and/or values, and reduceFunc
+                * may return either a value or a promise, *and* initialValue may
+                * be a promise for the starting value.
+                * @param {Array|Promise} promises array or promise for an array of anything,
+                *      may contain a mix of promises and values.
+                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
+                * @returns {Promise} that will resolve to the final reduced value
+                */
+               function reduce(promises, f /*, initialValue */) {
+                       return arguments.length > 2 ? ar.call(promises, liftCombine(f), arguments[2])
+                                       : ar.call(promises, liftCombine(f));
+               }
+
+               /**
+                * Traditional reduce function, similar to `Array.prototype.reduceRight()`, but
+                * input may contain promises and/or values, and reduceFunc
+                * may return either a value or a promise, *and* initialValue may
+                * be a promise for the starting value.
+                * @param {Array|Promise} promises array or promise for an array of anything,
+                *      may contain a mix of promises and values.
+                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
+                * @returns {Promise} that will resolve to the final reduced value
+                */
+               function reduceRight(promises, f /*, initialValue */) {
+                       return arguments.length > 2 ? arr.call(promises, liftCombine(f), arguments[2])
+                                       : arr.call(promises, liftCombine(f));
+               }
+
+               function liftCombine(f) {
+                       return function(z, x, i) {
+                               return applyFold(f, void 0, [z,x,i]);
+                       };
+               }
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+
+},{"../apply":274,"../state":287}],276:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return function flow(Promise) {
+
+               var resolve = Promise.resolve;
+               var reject = Promise.reject;
+               var origCatch = Promise.prototype['catch'];
+
+               /**
+                * Handle the ultimate fulfillment value or rejection reason, and assume
+                * responsibility for all errors.  If an error propagates out of result
+                * or handleFatalError, it will be rethrown to the host, resulting in a
+                * loud stack track on most platforms and a crash on some.
+                * @param {function?} onResult
+                * @param {function?} onError
+                * @returns {undefined}
+                */
+               Promise.prototype.done = function(onResult, onError) {
+                       this._handler.visit(this._handler.receiver, onResult, onError);
+               };
+
+               /**
+                * Add Error-type and predicate matching to catch.  Examples:
+                * promise.catch(TypeError, handleTypeError)
+                *   .catch(predicate, handleMatchedErrors)
+                *   .catch(handleRemainingErrors)
+                * @param onRejected
+                * @returns {*}
+                */
+               Promise.prototype['catch'] = Promise.prototype.otherwise = function(onRejected) {
+                       if (arguments.length < 2) {
+                               return origCatch.call(this, onRejected);
+                       }
+
+                       if(typeof onRejected !== 'function') {
+                               return this.ensure(rejectInvalidPredicate);
+                       }
+
+                       return origCatch.call(this, createCatchFilter(arguments[1], onRejected));
+               };
+
+               /**
+                * Wraps the provided catch handler, so that it will only be called
+                * if the predicate evaluates truthy
+                * @param {?function} handler
+                * @param {function} predicate
+                * @returns {function} conditional catch handler
+                */
+               function createCatchFilter(handler, predicate) {
+                       return function(e) {
+                               return evaluatePredicate(e, predicate)
+                                       ? handler.call(this, e)
+                                       : reject(e);
+                       };
+               }
+
+               /**
+                * Ensures that onFulfilledOrRejected will be called regardless of whether
+                * this promise is fulfilled or rejected.  onFulfilledOrRejected WILL NOT
+                * receive the promises' value or reason.  Any returned value will be disregarded.
+                * onFulfilledOrRejected may throw or return a rejected promise to signal
+                * an additional error.
+                * @param {function} handler handler to be called regardless of
+                *  fulfillment or rejection
+                * @returns {Promise}
+                */
+               Promise.prototype['finally'] = Promise.prototype.ensure = function(handler) {
+                       if(typeof handler !== 'function') {
+                               return this;
+                       }
+
+                       return this.then(function(x) {
+                               return runSideEffect(handler, this, identity, x);
+                       }, function(e) {
+                               return runSideEffect(handler, this, reject, e);
+                       });
+               };
+
+               function runSideEffect (handler, thisArg, propagate, value) {
+                       var result = handler.call(thisArg);
+                       return maybeThenable(result)
+                               ? propagateValue(result, propagate, value)
+                               : propagate(value);
+               }
+
+               function propagateValue (result, propagate, x) {
+                       return resolve(result).then(function () {
+                               return propagate(x);
+                       });
+               }
+
+               /**
+                * Recover from a failure by returning a defaultValue.  If defaultValue
+                * is a promise, it's fulfillment value will be used.  If defaultValue is
+                * a promise that rejects, the returned promise will reject with the
+                * same reason.
+                * @param {*} defaultValue
+                * @returns {Promise} new promise
+                */
+               Promise.prototype['else'] = Promise.prototype.orElse = function(defaultValue) {
+                       return this.then(void 0, function() {
+                               return defaultValue;
+                       });
+               };
+
+               /**
+                * Shortcut for .then(function() { return value; })
+                * @param  {*} value
+                * @return {Promise} a promise that:
+                *  - is fulfilled if value is not a promise, or
+                *  - if value is a promise, will fulfill with its value, or reject
+                *    with its reason.
+                */
+               Promise.prototype['yield'] = function(value) {
+                       return this.then(function() {
+                               return value;
+                       });
+               };
+
+               /**
+                * Runs a side effect when this promise fulfills, without changing the
+                * fulfillment value.
+                * @param {function} onFulfilledSideEffect
+                * @returns {Promise}
+                */
+               Promise.prototype.tap = function(onFulfilledSideEffect) {
+                       return this.then(onFulfilledSideEffect)['yield'](this);
+               };
+
+               return Promise;
+       };
+
+       function rejectInvalidPredicate() {
+               throw new TypeError('catch predicate must be a function');
+       }
+
+       function evaluatePredicate(e, predicate) {
+               return isError(predicate) ? e instanceof predicate : predicate(e);
+       }
+
+       function isError(predicate) {
+               return predicate === Error
+                       || (predicate != null && predicate.prototype instanceof Error);
+       }
+
+       function maybeThenable(x) {
+               return (typeof x === 'object' || typeof x === 'function') && x !== null;
+       }
+
+       function identity(x) {
+               return x;
+       }
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],277:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+/** @author Jeff Escalante */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return function fold(Promise) {
+
+               Promise.prototype.fold = function(f, z) {
+                       var promise = this._beget();
+
+                       this._handler.fold(function(z, x, to) {
+                               Promise._handler(z).fold(function(x, z, to) {
+                                       to.resolve(f.call(this, z, x));
+                               }, x, this, to);
+                       }, z, promise._handler.receiver, promise._handler);
+
+                       return promise;
+               };
+
+               return Promise;
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],278:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function(require) {
+
+       var inspect = require('../state').inspect;
+
+       return function inspection(Promise) {
+
+               Promise.prototype.inspect = function() {
+                       return inspect(Promise._handler(this));
+               };
+
+               return Promise;
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+
+},{"../state":287}],279:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return function generate(Promise) {
+
+               var resolve = Promise.resolve;
+
+               Promise.iterate = iterate;
+               Promise.unfold = unfold;
+
+               return Promise;
+
+               /**
+                * @deprecated Use github.com/cujojs/most streams and most.iterate
+                * Generate a (potentially infinite) stream of promised values:
+                * x, f(x), f(f(x)), etc. until condition(x) returns true
+                * @param {function} f function to generate a new x from the previous x
+                * @param {function} condition function that, given the current x, returns
+                *  truthy when the iterate should stop
+                * @param {function} handler function to handle the value produced by f
+                * @param {*|Promise} x starting value, may be a promise
+                * @return {Promise} the result of the last call to f before
+                *  condition returns true
+                */
+               function iterate(f, condition, handler, x) {
+                       return unfold(function(x) {
+                               return [x, f(x)];
+                       }, condition, handler, x);
+               }
+
+               /**
+                * @deprecated Use github.com/cujojs/most streams and most.unfold
+                * Generate a (potentially infinite) stream of promised values
+                * by applying handler(generator(seed)) iteratively until
+                * condition(seed) returns true.
+                * @param {function} unspool function that generates a [value, newSeed]
+                *  given a seed.
+                * @param {function} condition function that, given the current seed, returns
+                *  truthy when the unfold should stop
+                * @param {function} handler function to handle the value produced by unspool
+                * @param x {*|Promise} starting value, may be a promise
+                * @return {Promise} the result of the last value produced by unspool before
+                *  condition returns true
+                */
+               function unfold(unspool, condition, handler, x) {
+                       return resolve(x).then(function(seed) {
+                               return resolve(condition(seed)).then(function(done) {
+                                       return done ? seed : resolve(unspool(seed)).spread(next);
+                               });
+                       });
+
+                       function next(item, newSeed) {
+                               return resolve(handler(item)).then(function() {
+                                       return unfold(unspool, condition, handler, newSeed);
+                               });
+                       }
+               }
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],280:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return function progress(Promise) {
+
+               /**
+                * @deprecated
+                * Register a progress handler for this promise
+                * @param {function} onProgress
+                * @returns {Promise}
+                */
+               Promise.prototype.progress = function(onProgress) {
+                       return this.then(void 0, void 0, onProgress);
+               };
+
+               return Promise;
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],281:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function(require) {
+
+       var env = require('../env');
+       var TimeoutError = require('../TimeoutError');
+
+       function setTimeout(f, ms, x, y) {
+               return env.setTimer(function() {
+                       f(x, y, ms);
+               }, ms);
+       }
+
+       return function timed(Promise) {
+               /**
+                * Return a new promise whose fulfillment value is revealed only
+                * after ms milliseconds
+                * @param {number} ms milliseconds
+                * @returns {Promise}
+                */
+               Promise.prototype.delay = function(ms) {
+                       var p = this._beget();
+                       this._handler.fold(handleDelay, ms, void 0, p._handler);
+                       return p;
+               };
+
+               function handleDelay(ms, x, h) {
+                       setTimeout(resolveDelay, ms, x, h);
+               }
+
+               function resolveDelay(x, h) {
+                       h.resolve(x);
+               }
+
+               /**
+                * Return a new promise that rejects after ms milliseconds unless
+                * this promise fulfills earlier, in which case the returned promise
+                * fulfills with the same value.
+                * @param {number} ms milliseconds
+                * @param {Error|*=} reason optional rejection reason to use, defaults
+                *   to a TimeoutError if not provided
+                * @returns {Promise}
+                */
+               Promise.prototype.timeout = function(ms, reason) {
+                       var p = this._beget();
+                       var h = p._handler;
+
+                       var t = setTimeout(onTimeout, ms, reason, p._handler);
+
+                       this._handler.visit(h,
+                               function onFulfill(x) {
+                                       env.clearTimer(t);
+                                       this.resolve(x); // this = h
+                               },
+                               function onReject(x) {
+                                       env.clearTimer(t);
+                                       this.reject(x); // this = h
+                               },
+                               h.notify);
+
+                       return p;
+               };
+
+               function onTimeout(reason, h, ms) {
+                       var e = typeof reason === 'undefined'
+                               ? new TimeoutError('timed out after ' + ms + 'ms')
+                               : reason;
+                       h.reject(e);
+               }
+
+               return Promise;
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+
+},{"../TimeoutError":273,"../env":284}],282:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function(require) {
+
+       var setTimer = require('../env').setTimer;
+       var format = require('../format');
+
+       return function unhandledRejection(Promise) {
+
+               var logError = noop;
+               var logInfo = noop;
+               var localConsole;
+
+               if(typeof console !== 'undefined') {
+                       // Alias console to prevent things like uglify's drop_console option from
+                       // removing console.log/error. Unhandled rejections fall into the same
+                       // category as uncaught exceptions, and build tools shouldn't silence them.
+                       localConsole = console;
+                       logError = typeof localConsole.error !== 'undefined'
+                               ? function (e) { localConsole.error(e); }
+                               : function (e) { localConsole.log(e); };
+
+                       logInfo = typeof localConsole.info !== 'undefined'
+                               ? function (e) { localConsole.info(e); }
+                               : function (e) { localConsole.log(e); };
+               }
+
+               Promise.onPotentiallyUnhandledRejection = function(rejection) {
+                       enqueue(report, rejection);
+               };
+
+               Promise.onPotentiallyUnhandledRejectionHandled = function(rejection) {
+                       enqueue(unreport, rejection);
+               };
+
+               Promise.onFatalRejection = function(rejection) {
+                       enqueue(throwit, rejection.value);
+               };
+
+               var tasks = [];
+               var reported = [];
+               var running = null;
+
+               function report(r) {
+                       if(!r.handled) {
+                               reported.push(r);
+                               logError('Potentially unhandled rejection [' + r.id + '] ' + format.formatError(r.value));
+                       }
+               }
+
+               function unreport(r) {
+                       var i = reported.indexOf(r);
+                       if(i >= 0) {
+                               reported.splice(i, 1);
+                               logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value));
+                       }
+               }
+
+               function enqueue(f, x) {
+                       tasks.push(f, x);
+                       if(running === null) {
+                               running = setTimer(flush, 0);
+                       }
+               }
+
+               function flush() {
+                       running = null;
+                       while(tasks.length > 0) {
+                               tasks.shift()(tasks.shift());
+                       }
+               }
+
+               return Promise;
+       };
+
+       function throwit(e) {
+               throw e;
+       }
+
+       function noop() {}
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+
+},{"../env":284,"../format":285}],283:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return function addWith(Promise) {
+               /**
+                * Returns a promise whose handlers will be called with `this` set to
+                * the supplied receiver.  Subsequent promises derived from the
+                * returned promise will also have their handlers called with receiver
+                * as `this`. Calling `with` with undefined or no arguments will return
+                * a promise whose handlers will again be called in the usual Promises/A+
+                * way (no `this`) thus safely undoing any previous `with` in the
+                * promise chain.
+                *
+                * WARNING: Promises returned from `with`/`withThis` are NOT Promises/A+
+                * compliant, specifically violating 2.2.5 (http://promisesaplus.com/#point-41)
+                *
+                * @param {object} receiver `this` value for all handlers attached to
+                *  the returned promise.
+                * @returns {Promise}
+                */
+               Promise.prototype['with'] = Promise.prototype.withThis = function(receiver) {
+                       var p = this._beget();
+                       var child = p._handler;
+                       child.receiver = receiver;
+                       this._handler.chain(child, receiver);
+                       return p;
+               };
+
+               return Promise;
+       };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+
+},{}],284:[function(require,module,exports){
+(function (process){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
+(function(define) { 'use strict';
+define(function(require) {
+       /*jshint maxcomplexity:6*/
+
+       // Sniff "best" async scheduling option
+       // Prefer process.nextTick or MutationObserver, then check for
+       // setTimeout, and finally vertx, since its the only env that doesn't
+       // have setTimeout
+
+       var MutationObs;
+       var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
+
+       // Default env
+       var setTimer = function(f, ms) { return setTimeout(f, ms); };
+       var clearTimer = function(t) { return clearTimeout(t); };
+       var asap = function (f) { return capturedSetTimeout(f, 0); };
+
+       // Detect specific env
+       if (isNode()) { // Node
+               asap = function (f) { return process.nextTick(f); };
+
+       } else if (MutationObs = hasMutationObserver()) { // Modern browser
+               asap = initMutationObserver(MutationObs);
+
+       } else if (!capturedSetTimeout) { // vert.x
+               var vertxRequire = require;
+               var vertx = vertxRequire('vertx');
+               setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
+               clearTimer = vertx.cancelTimer;
+               asap = vertx.runOnLoop || vertx.runOnContext;
+       }
+
+       return {
+               setTimer: setTimer,
+               clearTimer: clearTimer,
+               asap: asap
+       };
+
+       function isNode () {
+               return typeof process !== 'undefined' &&
+                       Object.prototype.toString.call(process) === '[object process]';
+       }
+
+       function hasMutationObserver () {
+           return (typeof MutationObserver !== 'undefined' && MutationObserver) ||
+                       (typeof WebKitMutationObserver !== 'undefined' && WebKitMutationObserver);
+       }
+
+       function initMutationObserver(MutationObserver) {
+               var scheduled;
+               var node = document.createTextNode('');
+               var o = new MutationObserver(run);
+               o.observe(node, { characterData: true });
+
+               function run() {
+                       var f = scheduled;
+                       scheduled = void 0;
+                       f();
+               }
+
+               var i = 0;
+               return function (f) {
+                       scheduled = f;
+                       node.data = (i ^= 1);
+               };
+       }
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
+
+}).call(this,require('_process'))
+
+},{"_process":7}],285:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return {
+               formatError: formatError,
+               formatObject: formatObject,
+               tryStringify: tryStringify
+       };
+
+       /**
+        * Format an error into a string.  If e is an Error and has a stack property,
+        * it's returned.  Otherwise, e is formatted using formatObject, with a
+        * warning added about e not being a proper Error.
+        * @param {*} e
+        * @returns {String} formatted string, suitable for output to developers
+        */
+       function formatError(e) {
+               var s = typeof e === 'object' && e !== null && (e.stack || e.message) ? e.stack || e.message : formatObject(e);
+               return e instanceof Error ? s : s + ' (WARNING: non-Error used)';
+       }
+
+       /**
+        * Format an object, detecting "plain" objects and running them through
+        * JSON.stringify if possible.
+        * @param {Object} o
+        * @returns {string}
+        */
+       function formatObject(o) {
+               var s = String(o);
+               if(s === '[object Object]' && typeof JSON !== 'undefined') {
+                       s = tryStringify(o, s);
+               }
+               return s;
+       }
+
+       /**
+        * Try to return the result of JSON.stringify(x).  If that fails, return
+        * defaultValue
+        * @param {*} x
+        * @param {*} defaultValue
+        * @returns {String|*} JSON.stringify(x) or defaultValue
+        */
+       function tryStringify(x, defaultValue) {
+               try {
+                       return JSON.stringify(x);
+               } catch(e) {
+                       return defaultValue;
+               }
+       }
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],286:[function(require,module,exports){
+(function (process){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return function makePromise(environment) {
+
+               var tasks = environment.scheduler;
+               var emitRejection = initEmitRejection();
+
+               var objectCreate = Object.create ||
+                       function(proto) {
+                               function Child() {}
+                               Child.prototype = proto;
+                               return new Child();
+                       };
+
+               /**
+                * Create a promise whose fate is determined by resolver
+                * @constructor
+                * @returns {Promise} promise
+                * @name Promise
+                */
+               function Promise(resolver, handler) {
+                       this._handler = resolver === Handler ? handler : init(resolver);
+               }
+
+               /**
+                * Run the supplied resolver
+                * @param resolver
+                * @returns {Pending}
+                */
+               function init(resolver) {
+                       var handler = new Pending();
+
+                       try {
+                               resolver(promiseResolve, promiseReject, promiseNotify);
+                       } catch (e) {
+                               promiseReject(e);
+                       }
+
+                       return handler;
+
+                       /**
+                        * Transition from pre-resolution state to post-resolution state, notifying
+                        * all listeners of the ultimate fulfillment or rejection
+                        * @param {*} x resolution value
+                        */
+                       function promiseResolve (x) {
+                               handler.resolve(x);
+                       }
+                       /**
+                        * Reject this promise with reason, which will be used verbatim
+                        * @param {Error|*} reason rejection reason, strongly suggested
+                        *   to be an Error type
+                        */
+                       function promiseReject (reason) {
+                               handler.reject(reason);
+                       }
+
+                       /**
+                        * @deprecated
+                        * Issue a progress event, notifying all progress listeners
+                        * @param {*} x progress event payload to pass to all listeners
+                        */
+                       function promiseNotify (x) {
+                               handler.notify(x);
+                       }
+               }
+
+               // Creation
+
+               Promise.resolve = resolve;
+               Promise.reject = reject;
+               Promise.never = never;
+
+               Promise._defer = defer;
+               Promise._handler = getHandler;
+
+               /**
+                * Returns a trusted promise. If x is already a trusted promise, it is
+                * returned, otherwise returns a new trusted Promise which follows x.
+                * @param  {*} x
+                * @return {Promise} promise
+                */
+               function resolve(x) {
+                       return isPromise(x) ? x
+                               : new Promise(Handler, new Async(getHandler(x)));
+               }
+
+               /**
+                * Return a reject promise with x as its reason (x is used verbatim)
+                * @param {*} x
+                * @returns {Promise} rejected promise
+                */
+               function reject(x) {
+                       return new Promise(Handler, new Async(new Rejected(x)));
+               }
+
+               /**
+                * Return a promise that remains pending forever
+                * @returns {Promise} forever-pending promise.
+                */
+               function never() {
+                       return foreverPendingPromise; // Should be frozen
+               }
+
+               /**
+                * Creates an internal {promise, resolver} pair
+                * @private
+                * @returns {Promise}
+                */
+               function defer() {
+                       return new Promise(Handler, new Pending());
+               }
+
+               // Transformation and flow control
+
+               /**
+                * Transform this promise's fulfillment value, returning a new Promise
+                * for the transformed result.  If the promise cannot be fulfilled, onRejected
+                * is called with the reason.  onProgress *may* be called with updates toward
+                * this promise's fulfillment.
+                * @param {function=} onFulfilled fulfillment handler
+                * @param {function=} onRejected rejection handler
+                * @param {function=} onProgress @deprecated progress handler
+                * @return {Promise} new promise
+                */
+               Promise.prototype.then = function(onFulfilled, onRejected, onProgress) {
+                       var parent = this._handler;
+                       var state = parent.join().state();
+
+                       if ((typeof onFulfilled !== 'function' && state > 0) ||
+                               (typeof onRejected !== 'function' && state < 0)) {
+                               // Short circuit: value will not change, simply share handler
+                               return new this.constructor(Handler, parent);
+                       }
+
+                       var p = this._beget();
+                       var child = p._handler;
+
+                       parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress);
+
+                       return p;
+               };
+
+               /**
+                * If this promise cannot be fulfilled due to an error, call onRejected to
+                * handle the error. Shortcut for .then(undefined, onRejected)
+                * @param {function?} onRejected
+                * @return {Promise}
+                */
+               Promise.prototype['catch'] = function(onRejected) {
+                       return this.then(void 0, onRejected);
+               };
+
+               /**
+                * Creates a new, pending promise of the same type as this promise
+                * @private
+                * @returns {Promise}
+                */
+               Promise.prototype._beget = function() {
+                       return begetFrom(this._handler, this.constructor);
+               };
+
+               function begetFrom(parent, Promise) {
+                       var child = new Pending(parent.receiver, parent.join().context);
+                       return new Promise(Handler, child);
+               }
+
+               // Array combinators
+
+               Promise.all = all;
+               Promise.race = race;
+               Promise._traverse = traverse;
+
+               /**
+                * Return a promise that will fulfill when all promises in the
+                * input array have fulfilled, or will reject when one of the
+                * promises rejects.
+                * @param {array} promises array of promises
+                * @returns {Promise} promise for array of fulfillment values
+                */
+               function all(promises) {
+                       return traverseWith(snd, null, promises);
+               }
+
+               /**
+                * Array<Promise<X>> -> Promise<Array<f(X)>>
+                * @private
+                * @param {function} f function to apply to each promise's value
+                * @param {Array} promises array of promises
+                * @returns {Promise} promise for transformed values
+                */
+               function traverse(f, promises) {
+                       return traverseWith(tryCatch2, f, promises);
+               }
+
+               function traverseWith(tryMap, f, promises) {
+                       var handler = typeof f === 'function' ? mapAt : settleAt;
+
+                       var resolver = new Pending();
+                       var pending = promises.length >>> 0;
+                       var results = new Array(pending);
+
+                       for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) {
+                               x = promises[i];
+
+                               if (x === void 0 && !(i in promises)) {
+                                       --pending;
+                                       continue;
+                               }
+
+                               traverseAt(promises, handler, i, x, resolver);
+                       }
+
+                       if(pending === 0) {
+                               resolver.become(new Fulfilled(results));
+                       }
+
+                       return new Promise(Handler, resolver);
+
+                       function mapAt(i, x, resolver) {
+                               if(!resolver.resolved) {
+                                       traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver);
+                               }
+                       }
+
+                       function settleAt(i, x, resolver) {
+                               results[i] = x;
+                               if(--pending === 0) {
+                                       resolver.become(new Fulfilled(results));
+                               }
+                       }
+               }
+
+               function traverseAt(promises, handler, i, x, resolver) {
+                       if (maybeThenable(x)) {
+                               var h = getHandlerMaybeThenable(x);
+                               var s = h.state();
+
+                               if (s === 0) {
+                                       h.fold(handler, i, void 0, resolver);
+                               } else if (s > 0) {
+                                       handler(i, h.value, resolver);
+                               } else {
+                                       resolver.become(h);
+                                       visitRemaining(promises, i+1, h);
+                               }
+                       } else {
+                               handler(i, x, resolver);
+                       }
+               }
+
+               Promise._visitRemaining = visitRemaining;
+               function visitRemaining(promises, start, handler) {
+                       for(var i=start; i<promises.length; ++i) {
+                               markAsHandled(getHandler(promises[i]), handler);
+                       }
+               }
+
+               function markAsHandled(h, handler) {
+                       if(h === handler) {
+                               return;
+                       }
+
+                       var s = h.state();
+                       if(s === 0) {
+                               h.visit(h, void 0, h._unreport);
+                       } else if(s < 0) {
+                               h._unreport();
+                       }
+               }
+
+               /**
+                * Fulfill-reject competitive race. Return a promise that will settle
+                * to the same state as the earliest input promise to settle.
+                *
+                * WARNING: The ES6 Promise spec requires that race()ing an empty array
+                * must return a promise that is pending forever.  This implementation
+                * returns a singleton forever-pending promise, the same singleton that is
+                * returned by Promise.never(), thus can be checked with ===
+                *
+                * @param {array} promises array of promises to race
+                * @returns {Promise} if input is non-empty, a promise that will settle
+                * to the same outcome as the earliest input promise to settle. if empty
+                * is empty, returns a promise that will never settle.
+                */
+               function race(promises) {
+                       if(typeof promises !== 'object' || promises === null) {
+                               return reject(new TypeError('non-iterable passed to race()'));
+                       }
+
+                       // Sigh, race([]) is untestable unless we return *something*
+                       // that is recognizable without calling .then() on it.
+                       return promises.length === 0 ? never()
+                                : promises.length === 1 ? resolve(promises[0])
+                                : runRace(promises);
+               }
+
+               function runRace(promises) {
+                       var resolver = new Pending();
+                       var i, x, h;
+                       for(i=0; i<promises.length; ++i) {
+                               x = promises[i];
+                               if (x === void 0 && !(i in promises)) {
+                                       continue;
+                               }
+
+                               h = getHandler(x);
+                               if(h.state() !== 0) {
+                                       resolver.become(h);
+                                       visitRemaining(promises, i+1, h);
+                                       break;
+                               } else {
+                                       h.visit(resolver, resolver.resolve, resolver.reject);
+                               }
+                       }
+                       return new Promise(Handler, resolver);
+               }
+
+               // Promise internals
+               // Below this, everything is @private
+
+               /**
+                * Get an appropriate handler for x, without checking for cycles
+                * @param {*} x
+                * @returns {object} handler
+                */
+               function getHandler(x) {
+                       if(isPromise(x)) {
+                               return x._handler.join();
+                       }
+                       return maybeThenable(x) ? getHandlerUntrusted(x) : new Fulfilled(x);
+               }
+
+               /**
+                * Get a handler for thenable x.
+                * NOTE: You must only call this if maybeThenable(x) == true
+                * @param {object|function|Promise} x
+                * @returns {object} handler
+                */
+               function getHandlerMaybeThenable(x) {
+                       return isPromise(x) ? x._handler.join() : getHandlerUntrusted(x);
+               }
+
+               /**
+                * Get a handler for potentially untrusted thenable x
+                * @param {*} x
+                * @returns {object} handler
+                */
+               function getHandlerUntrusted(x) {
+                       try {
+                               var untrustedThen = x.then;
+                               return typeof untrustedThen === 'function'
+                                       ? new Thenable(untrustedThen, x)
+                                       : new Fulfilled(x);
+                       } catch(e) {
+                               return new Rejected(e);
+                       }
+               }
+
+               /**
+                * Handler for a promise that is pending forever
+                * @constructor
+                */
+               function Handler() {}
+
+               Handler.prototype.when
+                       = Handler.prototype.become
+                       = Handler.prototype.notify // deprecated
+                       = Handler.prototype.fail
+                       = Handler.prototype._unreport
+                       = Handler.prototype._report
+                       = noop;
+
+               Handler.prototype._state = 0;
+
+               Handler.prototype.state = function() {
+                       return this._state;
+               };
+
+               /**
+                * Recursively collapse handler chain to find the handler
+                * nearest to the fully resolved value.
+                * @returns {object} handler nearest the fully resolved value
+                */
+               Handler.prototype.join = function() {
+                       var h = this;
+                       while(h.handler !== void 0) {
+                               h = h.handler;
+                       }
+                       return h;
+               };
+
+               Handler.prototype.chain = function(to, receiver, fulfilled, rejected, progress) {
+                       this.when({
+                               resolver: to,
+                               receiver: receiver,
+                               fulfilled: fulfilled,
+                               rejected: rejected,
+                               progress: progress
+                       });
+               };
+
+               Handler.prototype.visit = function(receiver, fulfilled, rejected, progress) {
+                       this.chain(failIfRejected, receiver, fulfilled, rejected, progress);
+               };
+
+               Handler.prototype.fold = function(f, z, c, to) {
+                       this.when(new Fold(f, z, c, to));
+               };
+
+               /**
+                * Handler that invokes fail() on any handler it becomes
+                * @constructor
+                */
+               function FailIfRejected() {}
+
+               inherit(Handler, FailIfRejected);
+
+               FailIfRejected.prototype.become = function(h) {
+                       h.fail();
+               };
+
+               var failIfRejected = new FailIfRejected();
+
+               /**
+                * Handler that manages a queue of consumers waiting on a pending promise
+                * @constructor
+                */
+               function Pending(receiver, inheritedContext) {
+                       Promise.createContext(this, inheritedContext);
+
+                       this.consumers = void 0;
+                       this.receiver = receiver;
+                       this.handler = void 0;
+                       this.resolved = false;
+               }
+
+               inherit(Handler, Pending);
+
+               Pending.prototype._state = 0;
+
+               Pending.prototype.resolve = function(x) {
+                       this.become(getHandler(x));
+               };
+
+               Pending.prototype.reject = function(x) {
+                       if(this.resolved) {
+                               return;
+                       }
+
+                       this.become(new Rejected(x));
+               };
+
+               Pending.prototype.join = function() {
+                       if (!this.resolved) {
+                               return this;
+                       }
+
+                       var h = this;
+
+                       while (h.handler !== void 0) {
+                               h = h.handler;
+                               if (h === this) {
+                                       return this.handler = cycle();
+                               }
+                       }
+
+                       return h;
+               };
+
+               Pending.prototype.run = function() {
+                       var q = this.consumers;
+                       var handler = this.handler;
+                       this.handler = this.handler.join();
+                       this.consumers = void 0;
+
+                       for (var i = 0; i < q.length; ++i) {
+                               handler.when(q[i]);
+                       }
+               };
+
+               Pending.prototype.become = function(handler) {
+                       if(this.resolved) {
+                               return;
+                       }
+
+                       this.resolved = true;
+                       this.handler = handler;
+                       if(this.consumers !== void 0) {
+                               tasks.enqueue(this);
+                       }
+
+                       if(this.context !== void 0) {
+                               handler._report(this.context);
+                       }
+               };
+
+               Pending.prototype.when = function(continuation) {
+                       if(this.resolved) {
+                               tasks.enqueue(new ContinuationTask(continuation, this.handler));
+                       } else {
+                               if(this.consumers === void 0) {
+                                       this.consumers = [continuation];
+                               } else {
+                                       this.consumers.push(continuation);
+                               }
+                       }
+               };
+
+               /**
+                * @deprecated
+                */
+               Pending.prototype.notify = function(x) {
+                       if(!this.resolved) {
+                               tasks.enqueue(new ProgressTask(x, this));
+                       }
+               };
+
+               Pending.prototype.fail = function(context) {
+                       var c = typeof context === 'undefined' ? this.context : context;
+                       this.resolved && this.handler.join().fail(c);
+               };
+
+               Pending.prototype._report = function(context) {
+                       this.resolved && this.handler.join()._report(context);
+               };
+
+               Pending.prototype._unreport = function() {
+                       this.resolved && this.handler.join()._unreport();
+               };
+
+               /**
+                * Wrap another handler and force it into a future stack
+                * @param {object} handler
+                * @constructor
+                */
+               function Async(handler) {
+                       this.handler = handler;
+               }
+
+               inherit(Handler, Async);
+
+               Async.prototype.when = function(continuation) {
+                       tasks.enqueue(new ContinuationTask(continuation, this));
+               };
+
+               Async.prototype._report = function(context) {
+                       this.join()._report(context);
+               };
+
+               Async.prototype._unreport = function() {
+                       this.join()._unreport();
+               };
+
+               /**
+                * Handler that wraps an untrusted thenable and assimilates it in a future stack
+                * @param {function} then
+                * @param {{then: function}} thenable
+                * @constructor
+                */
+               function Thenable(then, thenable) {
+                       Pending.call(this);
+                       tasks.enqueue(new AssimilateTask(then, thenable, this));
+               }
+
+               inherit(Pending, Thenable);
+
+               /**
+                * Handler for a fulfilled promise
+                * @param {*} x fulfillment value
+                * @constructor
+                */
+               function Fulfilled(x) {
+                       Promise.createContext(this);
+                       this.value = x;
+               }
+
+               inherit(Handler, Fulfilled);
+
+               Fulfilled.prototype._state = 1;
+
+               Fulfilled.prototype.fold = function(f, z, c, to) {
+                       runContinuation3(f, z, this, c, to);
+               };
+
+               Fulfilled.prototype.when = function(cont) {
+                       runContinuation1(cont.fulfilled, this, cont.receiver, cont.resolver);
+               };
+
+               var errorId = 0;
+
+               /**
+                * Handler for a rejected promise
+                * @param {*} x rejection reason
+                * @constructor
+                */
+               function Rejected(x) {
+                       Promise.createContext(this);
+
+                       this.id = ++errorId;
+                       this.value = x;
+                       this.handled = false;
+                       this.reported = false;
+
+                       this._report();
+               }
+
+               inherit(Handler, Rejected);
+
+               Rejected.prototype._state = -1;
+
+               Rejected.prototype.fold = function(f, z, c, to) {
+                       to.become(this);
+               };
+
+               Rejected.prototype.when = function(cont) {
+                       if(typeof cont.rejected === 'function') {
+                               this._unreport();
+                       }
+                       runContinuation1(cont.rejected, this, cont.receiver, cont.resolver);
+               };
+
+               Rejected.prototype._report = function(context) {
+                       tasks.afterQueue(new ReportTask(this, context));
+               };
+
+               Rejected.prototype._unreport = function() {
+                       if(this.handled) {
+                               return;
+                       }
+                       this.handled = true;
+                       tasks.afterQueue(new UnreportTask(this));
+               };
+
+               Rejected.prototype.fail = function(context) {
+                       this.reported = true;
+                       emitRejection('unhandledRejection', this);
+                       Promise.onFatalRejection(this, context === void 0 ? this.context : context);
+               };
+
+               function ReportTask(rejection, context) {
+                       this.rejection = rejection;
+                       this.context = context;
+               }
+
+               ReportTask.prototype.run = function() {
+                       if(!this.rejection.handled && !this.rejection.reported) {
+                               this.rejection.reported = true;
+                               emitRejection('unhandledRejection', this.rejection) ||
+                                       Promise.onPotentiallyUnhandledRejection(this.rejection, this.context);
+                       }
+               };
+
+               function UnreportTask(rejection) {
+                       this.rejection = rejection;
+               }
+
+               UnreportTask.prototype.run = function() {
+                       if(this.rejection.reported) {
+                               emitRejection('rejectionHandled', this.rejection) ||
+                                       Promise.onPotentiallyUnhandledRejectionHandled(this.rejection);
+                       }
+               };
+
+               // Unhandled rejection hooks
+               // By default, everything is a noop
+
+               Promise.createContext
+                       = Promise.enterContext
+                       = Promise.exitContext
+                       = Promise.onPotentiallyUnhandledRejection
+                       = Promise.onPotentiallyUnhandledRejectionHandled
+                       = Promise.onFatalRejection
+                       = noop;
+
+               // Errors and singletons
+
+               var foreverPendingHandler = new Handler();
+               var foreverPendingPromise = new Promise(Handler, foreverPendingHandler);
+
+               function cycle() {
+                       return new Rejected(new TypeError('Promise cycle'));
+               }
+
+               // Task runners
+
+               /**
+                * Run a single consumer
+                * @constructor
+                */
+               function ContinuationTask(continuation, handler) {
+                       this.continuation = continuation;
+                       this.handler = handler;
+               }
+
+               ContinuationTask.prototype.run = function() {
+                       this.handler.join().when(this.continuation);
+               };
+
+               /**
+                * Run a queue of progress handlers
+                * @constructor
+                */
+               function ProgressTask(value, handler) {
+                       this.handler = handler;
+                       this.value = value;
+               }
+
+               ProgressTask.prototype.run = function() {
+                       var q = this.handler.consumers;
+                       if(q === void 0) {
+                               return;
+                       }
+
+                       for (var c, i = 0; i < q.length; ++i) {
+                               c = q[i];
+                               runNotify(c.progress, this.value, this.handler, c.receiver, c.resolver);
+                       }
+               };
+
+               /**
+                * Assimilate a thenable, sending it's value to resolver
+                * @param {function} then
+                * @param {object|function} thenable
+                * @param {object} resolver
+                * @constructor
+                */
+               function AssimilateTask(then, thenable, resolver) {
+                       this._then = then;
+                       this.thenable = thenable;
+                       this.resolver = resolver;
+               }
+
+               AssimilateTask.prototype.run = function() {
+                       var h = this.resolver;
+                       tryAssimilate(this._then, this.thenable, _resolve, _reject, _notify);
+
+                       function _resolve(x) { h.resolve(x); }
+                       function _reject(x)  { h.reject(x); }
+                       function _notify(x)  { h.notify(x); }
+               };
+
+               function tryAssimilate(then, thenable, resolve, reject, notify) {
+                       try {
+                               then.call(thenable, resolve, reject, notify);
+                       } catch (e) {
+                               reject(e);
+                       }
+               }
+
+               /**
+                * Fold a handler value with z
+                * @constructor
+                */
+               function Fold(f, z, c, to) {
+                       this.f = f; this.z = z; this.c = c; this.to = to;
+                       this.resolver = failIfRejected;
+                       this.receiver = this;
+               }
+
+               Fold.prototype.fulfilled = function(x) {
+                       this.f.call(this.c, this.z, x, this.to);
+               };
+
+               Fold.prototype.rejected = function(x) {
+                       this.to.reject(x);
+               };
+
+               Fold.prototype.progress = function(x) {
+                       this.to.notify(x);
+               };
+
+               // Other helpers
+
+               /**
+                * @param {*} x
+                * @returns {boolean} true iff x is a trusted Promise
+                */
+               function isPromise(x) {
+                       return x instanceof Promise;
+               }
+
+               /**
+                * Test just enough to rule out primitives, in order to take faster
+                * paths in some code
+                * @param {*} x
+                * @returns {boolean} false iff x is guaranteed *not* to be a thenable
+                */
+               function maybeThenable(x) {
+                       return (typeof x === 'object' || typeof x === 'function') && x !== null;
+               }
+
+               function runContinuation1(f, h, receiver, next) {
+                       if(typeof f !== 'function') {
+                               return next.become(h);
+                       }
+
+                       Promise.enterContext(h);
+                       tryCatchReject(f, h.value, receiver, next);
+                       Promise.exitContext();
+               }
+
+               function runContinuation3(f, x, h, receiver, next) {
+                       if(typeof f !== 'function') {
+                               return next.become(h);
+                       }
+
+                       Promise.enterContext(h);
+                       tryCatchReject3(f, x, h.value, receiver, next);
+                       Promise.exitContext();
+               }
+
+               /**
+                * @deprecated
+                */
+               function runNotify(f, x, h, receiver, next) {
+                       if(typeof f !== 'function') {
+                               return next.notify(x);
+                       }
+
+                       Promise.enterContext(h);
+                       tryCatchReturn(f, x, receiver, next);
+                       Promise.exitContext();
+               }
+
+               function tryCatch2(f, a, b) {
+                       try {
+                               return f(a, b);
+                       } catch(e) {
+                               return reject(e);
+                       }
+               }
+
+               /**
+                * Return f.call(thisArg, x), or if it throws return a rejected promise for
+                * the thrown exception
+                */
+               function tryCatchReject(f, x, thisArg, next) {
+                       try {
+                               next.become(getHandler(f.call(thisArg, x)));
+                       } catch(e) {
+                               next.become(new Rejected(e));
+                       }
+               }
+
+               /**
+                * Same as above, but includes the extra argument parameter.
+                */
+               function tryCatchReject3(f, x, y, thisArg, next) {
+                       try {
+                               f.call(thisArg, x, y, next);
+                       } catch(e) {
+                               next.become(new Rejected(e));
+                       }
+               }
+
+               /**
+                * @deprecated
+                * Return f.call(thisArg, x), or if it throws, *return* the exception
+                */
+               function tryCatchReturn(f, x, thisArg, next) {
+                       try {
+                               next.notify(f.call(thisArg, x));
+                       } catch(e) {
+                               next.notify(e);
+                       }
+               }
+
+               function inherit(Parent, Child) {
+                       Child.prototype = objectCreate(Parent.prototype);
+                       Child.prototype.constructor = Child;
+               }
+
+               function snd(x, y) {
+                       return y;
+               }
+
+               function noop() {}
+
+               function hasCustomEvent() {
+                       if(typeof CustomEvent === 'function') {
+                               try {
+                                       var ev = new CustomEvent('unhandledRejection');
+                                       return ev instanceof CustomEvent;
+                               } catch (ignoredException) {}
+                       }
+                       return false;
+               }
+
+               function hasInternetExplorerCustomEvent() {
+                       if(typeof document !== 'undefined' && typeof document.createEvent === 'function') {
+                               try {
+                                       // Try to create one event to make sure it's supported
+                                       var ev = document.createEvent('CustomEvent');
+                                       ev.initCustomEvent('eventType', false, true, {});
+                                       return true;
+                               } catch (ignoredException) {}
+                       }
+                       return false;
+               }
+
+               function initEmitRejection() {
+                       /*global process, self, CustomEvent*/
+                       if(typeof process !== 'undefined' && process !== null
+                               && typeof process.emit === 'function') {
+                               // Returning falsy here means to call the default
+                               // onPotentiallyUnhandledRejection API.  This is safe even in
+                               // browserify since process.emit always returns falsy in browserify:
+                               // https://github.com/defunctzombie/node-process/blob/master/browser.js#L40-L46
+                               return function(type, rejection) {
+                                       return type === 'unhandledRejection'
+                                               ? process.emit(type, rejection.value, rejection)
+                                               : process.emit(type, rejection);
+                               };
+                       } else if(typeof self !== 'undefined' && hasCustomEvent()) {
+                               return (function (self, CustomEvent) {
+                                       return function (type, rejection) {
+                                               var ev = new CustomEvent(type, {
+                                                       detail: {
+                                                               reason: rejection.value,
+                                                               key: rejection
+                                                       },
+                                                       bubbles: false,
+                                                       cancelable: true
+                                               });
+
+                                               return !self.dispatchEvent(ev);
+                                       };
+                               }(self, CustomEvent));
+                       } else if(typeof self !== 'undefined' && hasInternetExplorerCustomEvent()) {
+                               return (function(self, document) {
+                                       return function(type, rejection) {
+                                               var ev = document.createEvent('CustomEvent');
+                                               ev.initCustomEvent(type, false, true, {
+                                                       reason: rejection.value,
+                                                       key: rejection
+                                               });
+
+                                               return !self.dispatchEvent(ev);
+                                       };
+                               }(self, document));
+                       }
+
+                       return noop;
+               }
+
+               return Promise;
+       };
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+}).call(this,require('_process'))
+
+},{"_process":7}],287:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function() {
+
+       return {
+               pending: toPendingState,
+               fulfilled: toFulfilledState,
+               rejected: toRejectedState,
+               inspect: inspect
+       };
+
+       function toPendingState() {
+               return { state: 'pending' };
+       }
+
+       function toRejectedState(e) {
+               return { state: 'rejected', reason: e };
+       }
+
+       function toFulfilledState(x) {
+               return { state: 'fulfilled', value: x };
+       }
+
+       function inspect(handler) {
+               var state = handler.state();
+               return state === 0 ? toPendingState()
+                        : state > 0   ? toFulfilledState(handler.value)
+                                      : toRejectedState(handler.value);
+       }
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
+
+},{}],288:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+
+/**
+ * Promises/A+ and when() implementation
+ * when is part of the cujoJS family of libraries (http://cujojs.com/)
+ * @author Brian Cavalier
+ * @author John Hann
+ */
+(function(define) { 'use strict';
+define(function (require) {
+
+       var timed = require('./lib/decorators/timed');
+       var array = require('./lib/decorators/array');
+       var flow = require('./lib/decorators/flow');
+       var fold = require('./lib/decorators/fold');
+       var inspect = require('./lib/decorators/inspect');
+       var generate = require('./lib/decorators/iterate');
+       var progress = require('./lib/decorators/progress');
+       var withThis = require('./lib/decorators/with');
+       var unhandledRejection = require('./lib/decorators/unhandledRejection');
+       var TimeoutError = require('./lib/TimeoutError');
+
+       var Promise = [array, flow, fold, generate, progress,
+               inspect, withThis, timed, unhandledRejection]
+               .reduce(function(Promise, feature) {
+                       return feature(Promise);
+               }, require('./lib/Promise'));
+
+       var apply = require('./lib/apply')(Promise);
+
+       // Public API
+
+       when.promise     = promise;              // Create a pending promise
+       when.resolve     = Promise.resolve;      // Create a resolved promise
+       when.reject      = Promise.reject;       // Create a rejected promise
+
+       when.lift        = lift;                 // lift a function to return promises
+       when['try']      = attempt;              // call a function and return a promise
+       when.attempt     = attempt;              // alias for when.try
+
+       when.iterate     = Promise.iterate;      // DEPRECATED (use cujojs/most streams) Generate a stream of promises
+       when.unfold      = Promise.unfold;       // DEPRECATED (use cujojs/most streams) Generate a stream of promises
+
+       when.join        = join;                 // Join 2 or more promises
+
+       when.all         = all;                  // Resolve a list of promises
+       when.settle      = settle;               // Settle a list of promises
+
+       when.any         = lift(Promise.any);    // One-winner race
+       when.some        = lift(Promise.some);   // Multi-winner race
+       when.race        = lift(Promise.race);   // First-to-settle race
+
+       when.map         = map;                  // Array.map() for promises
+       when.filter      = filter;               // Array.filter() for promises
+       when.reduce      = lift(Promise.reduce);       // Array.reduce() for promises
+       when.reduceRight = lift(Promise.reduceRight);  // Array.reduceRight() for promises
+
+       when.isPromiseLike = isPromiseLike;      // Is something promise-like, aka thenable
+
+       when.Promise     = Promise;              // Promise constructor
+       when.defer       = defer;                // Create a {promise, resolve, reject} tuple
+
+       // Error types
+
+       when.TimeoutError = TimeoutError;
+
+       /**
+        * Get a trusted promise for x, or by transforming x with onFulfilled
+        *
+        * @param {*} x
+        * @param {function?} onFulfilled callback to be called when x is
+        *   successfully fulfilled.  If promiseOrValue is an immediate value, callback
+        *   will be invoked immediately.
+        * @param {function?} onRejected callback to be called when x is
+        *   rejected.
+        * @param {function?} onProgress callback to be called when progress updates
+        *   are issued for x. @deprecated
+        * @returns {Promise} a new promise that will fulfill with the return
+        *   value of callback or errback or the completion value of promiseOrValue if
+        *   callback and/or errback is not supplied.
+        */
+       function when(x, onFulfilled, onRejected, onProgress) {
+               var p = Promise.resolve(x);
+               if (arguments.length < 2) {
+                       return p;
+               }
+
+               return p.then(onFulfilled, onRejected, onProgress);
+       }
+
+       /**
+        * Creates a new promise whose fate is determined by resolver.
+        * @param {function} resolver function(resolve, reject, notify)
+        * @returns {Promise} promise whose fate is determine by resolver
+        */
+       function promise(resolver) {
+               return new Promise(resolver);
+       }
+
+       /**
+        * Lift the supplied function, creating a version of f that returns
+        * promises, and accepts promises as arguments.
+        * @param {function} f
+        * @returns {Function} version of f that returns promises
+        */
+       function lift(f) {
+               return function() {
+                       for(var i=0, l=arguments.length, a=new Array(l); i<l; ++i) {
+                               a[i] = arguments[i];
+                       }
+                       return apply(f, this, a);
+               };
+       }
+
+       /**
+        * Call f in a future turn, with the supplied args, and return a promise
+        * for the result.
+        * @param {function} f
+        * @returns {Promise}
+        */
+       function attempt(f /*, args... */) {
+               /*jshint validthis:true */
+               for(var i=0, l=arguments.length-1, a=new Array(l); i<l; ++i) {
+                       a[i] = arguments[i+1];
+               }
+               return apply(f, this, a);
+       }
+
+       /**
+        * Creates a {promise, resolver} pair, either or both of which
+        * may be given out safely to consumers.
+        * @return {{promise: Promise, resolve: function, reject: function, notify: function}}
+        */
+       function defer() {
+               return new Deferred();
+       }
+
+       function Deferred() {
+               var p = Promise._defer();
+
+               function resolve(x) { p._handler.resolve(x); }
+               function reject(x) { p._handler.reject(x); }
+               function notify(x) { p._handler.notify(x); }
+
+               this.promise = p;
+               this.resolve = resolve;
+               this.reject = reject;
+               this.notify = notify;
+               this.resolver = { resolve: resolve, reject: reject, notify: notify };
+       }
+
+       /**
+        * Determines if x is promise-like, i.e. a thenable object
+        * NOTE: Will return true for *any thenable object*, and isn't truly
+        * safe, since it may attempt to access the `then` property of x (i.e.
+        *  clever/malicious getters may do weird things)
+        * @param {*} x anything
+        * @returns {boolean} true if x is promise-like
+        */
+       function isPromiseLike(x) {
+               return x && typeof x.then === 'function';
+       }
+
+       /**
+        * Return a promise that will resolve only once all the supplied arguments
+        * have resolved. The resolution value of the returned promise will be an array
+        * containing the resolution values of each of the arguments.
+        * @param {...*} arguments may be a mix of promises and values
+        * @returns {Promise}
+        */
+       function join(/* ...promises */) {
+               return Promise.all(arguments);
+       }
+
+       /**
+        * Return a promise that will fulfill once all input promises have
+        * fulfilled, or reject when any one input promise rejects.
+        * @param {array|Promise} promises array (or promise for an array) of promises
+        * @returns {Promise}
+        */
+       function all(promises) {
+               return when(promises, Promise.all);
+       }
+
+       /**
+        * Return a promise that will always fulfill with an array containing
+        * the outcome states of all input promises.  The returned promise
+        * will only reject if `promises` itself is a rejected promise.
+        * @param {array|Promise} promises array (or promise for an array) of promises
+        * @returns {Promise} promise for array of settled state descriptors
+        */
+       function settle(promises) {
+               return when(promises, Promise.settle);
+       }
+
+       /**
+        * Promise-aware array map function, similar to `Array.prototype.map()`,
+        * but input array may contain promises or values.
+        * @param {Array|Promise} promises array of anything, may contain promises and values
+        * @param {function(x:*, index:Number):*} mapFunc map function which may
+        *  return a promise or value
+        * @returns {Promise} promise that will fulfill with an array of mapped values
+        *  or reject if any input promise rejects.
+        */
+       function map(promises, mapFunc) {
+               return when(promises, function(promises) {
+                       return Promise.map(promises, mapFunc);
+               });
+       }
+
+       /**
+        * Filter the provided array of promises using the provided predicate.  Input may
+        * contain promises and values
+        * @param {Array|Promise} promises array of promises and values
+        * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
+        *  Must return truthy (or promise for truthy) for items to retain.
+        * @returns {Promise} promise that will fulfill with an array containing all items
+        *  for which predicate returned truthy.
+        */
+       function filter(promises, predicate) {
+               return when(promises, function(promises) {
+                       return Promise.filter(promises, predicate);
+               });
+       }
+
+       return when;
+});
+})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
+
+},{"./lib/Promise":271,"./lib/TimeoutError":273,"./lib/apply":274,"./lib/decorators/array":275,"./lib/decorators/flow":276,"./lib/decorators/fold":277,"./lib/decorators/inspect":278,"./lib/decorators/iterate":279,"./lib/decorators/progress":280,"./lib/decorators/timed":281,"./lib/decorators/unhandledRejection":282,"./lib/decorators/with":283}],289:[function(require,module,exports){
+var nativeIsArray = Array.isArray
+var toString = Object.prototype.toString
+
+module.exports = nativeIsArray || isArray
+
+function isArray(obj) {
+    return toString.call(obj) === "[object Array]"
+}
+
+},{}],290:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var APIv3_1 = require("./api/APIv3");
+Object.defineProperty(exports, "APIv3", { enumerable: true, get: function () { return APIv3_1.APIv3; } });
+var ModelCreator_1 = require("./api/ModelCreator");
+Object.defineProperty(exports, "ModelCreator", { enumerable: true, get: function () { return ModelCreator_1.ModelCreator; } });
+__exportStar(require("./api/interfaces/interfaces"), exports);
+
+},{"./api/APIv3":303,"./api/ModelCreator":304,"./api/interfaces/interfaces":305}],291:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageBoundary = void 0;
+var Component_1 = require("./component/Component");
+Object.defineProperty(exports, "Component", { enumerable: true, get: function () { return Component_1.Component; } });
+var ComponentService_1 = require("./component/ComponentService");
+Object.defineProperty(exports, "ComponentService", { enumerable: true, get: function () { return ComponentService_1.ComponentService; } });
+var HandlerBase_1 = require("./component/utils/HandlerBase");
+Object.defineProperty(exports, "HandlerBase", { enumerable: true, get: function () { return HandlerBase_1.HandlerBase; } });
+var MeshFactory_1 = require("./component/utils/MeshFactory");
+Object.defineProperty(exports, "MeshFactory", { enumerable: true, get: function () { return MeshFactory_1.MeshFactory; } });
+var MeshScene_1 = require("./component/utils/MeshScene");
+Object.defineProperty(exports, "MeshScene", { enumerable: true, get: function () { return MeshScene_1.MeshScene; } });
+var MouseOperator_1 = require("./component/utils/MouseOperator");
+Object.defineProperty(exports, "MouseOperator", { enumerable: true, get: function () { return MouseOperator_1.MouseOperator; } });
+var ComponentSize_1 = require("./component/utils/ComponentSize");
+Object.defineProperty(exports, "ComponentSize", { enumerable: true, get: function () { return ComponentSize_1.ComponentSize; } });
+var AttributionComponent_1 = require("./component/AttributionComponent");
+Object.defineProperty(exports, "AttributionComponent", { enumerable: true, get: function () { return AttributionComponent_1.AttributionComponent; } });
+var BackgroundComponent_1 = require("./component/BackgroundComponent");
+Object.defineProperty(exports, "BackgroundComponent", { enumerable: true, get: function () { return BackgroundComponent_1.BackgroundComponent; } });
+var BearingComponent_1 = require("./component/BearingComponent");
+Object.defineProperty(exports, "BearingComponent", { enumerable: true, get: function () { return BearingComponent_1.BearingComponent; } });
+var CacheComponent_1 = require("./component/CacheComponent");
+Object.defineProperty(exports, "CacheComponent", { enumerable: true, get: function () { return CacheComponent_1.CacheComponent; } });
+var CoverComponent_1 = require("./component/CoverComponent");
+Object.defineProperty(exports, "CoverComponent", { enumerable: true, get: function () { return CoverComponent_1.CoverComponent; } });
+var DebugComponent_1 = require("./component/DebugComponent");
+Object.defineProperty(exports, "DebugComponent", { enumerable: true, get: function () { return DebugComponent_1.DebugComponent; } });
+var DirectionComponent_1 = require("./component/direction/DirectionComponent");
+Object.defineProperty(exports, "DirectionComponent", { enumerable: true, get: function () { return DirectionComponent_1.DirectionComponent; } });
+var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
+Object.defineProperty(exports, "DirectionDOMCalculator", { enumerable: true, get: function () { return DirectionDOMCalculator_1.DirectionDOMCalculator; } });
+var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
+Object.defineProperty(exports, "DirectionDOMRenderer", { enumerable: true, get: function () { return DirectionDOMRenderer_1.DirectionDOMRenderer; } });
+var ImageComponent_1 = require("./component/ImageComponent");
+Object.defineProperty(exports, "ImageComponent", { enumerable: true, get: function () { return ImageComponent_1.ImageComponent; } });
+var KeyboardComponent_1 = require("./component/keyboard/KeyboardComponent");
+Object.defineProperty(exports, "KeyboardComponent", { enumerable: true, get: function () { return KeyboardComponent_1.KeyboardComponent; } });
+var KeyPlayHandler_1 = require("./component/keyboard/KeyPlayHandler");
+Object.defineProperty(exports, "KeyPlayHandler", { enumerable: true, get: function () { return KeyPlayHandler_1.KeyPlayHandler; } });
+var KeyZoomHandler_1 = require("./component/keyboard/KeyZoomHandler");
+Object.defineProperty(exports, "KeyZoomHandler", { enumerable: true, get: function () { return KeyZoomHandler_1.KeyZoomHandler; } });
+var KeySequenceNavigationHandler_1 = require("./component/keyboard/KeySequenceNavigationHandler");
+Object.defineProperty(exports, "KeySequenceNavigationHandler", { enumerable: true, get: function () { return KeySequenceNavigationHandler_1.KeySequenceNavigationHandler; } });
+var KeySpatialNavigationHandler_1 = require("./component/keyboard/KeySpatialNavigationHandler");
+Object.defineProperty(exports, "KeySpatialNavigationHandler", { enumerable: true, get: function () { return KeySpatialNavigationHandler_1.KeySpatialNavigationHandler; } });
+var LoadingComponent_1 = require("./component/LoadingComponent");
+Object.defineProperty(exports, "LoadingComponent", { enumerable: true, get: function () { return LoadingComponent_1.LoadingComponent; } });
+var Marker_1 = require("./component/marker/marker/Marker");
+Object.defineProperty(exports, "Marker", { enumerable: true, get: function () { return Marker_1.Marker; } });
+var MarkerComponent_1 = require("./component/marker/MarkerComponent");
+Object.defineProperty(exports, "MarkerComponent", { enumerable: true, get: function () { return MarkerComponent_1.MarkerComponent; } });
+var MarkerScene_1 = require("./component/marker/MarkerScene");
+Object.defineProperty(exports, "MarkerScene", { enumerable: true, get: function () { return MarkerScene_1.MarkerScene; } });
+var MarkerSet_1 = require("./component/marker/MarkerSet");
+Object.defineProperty(exports, "MarkerSet", { enumerable: true, get: function () { return MarkerSet_1.MarkerSet; } });
+var MouseComponent_1 = require("./component/mouse/MouseComponent");
+Object.defineProperty(exports, "MouseComponent", { enumerable: true, get: function () { return MouseComponent_1.MouseComponent; } });
+__exportStar(require("./component/mouse/HandlerTypes"), exports);
+var BounceHandler_1 = require("./component/mouse/BounceHandler");
+Object.defineProperty(exports, "BounceHandler", { enumerable: true, get: function () { return BounceHandler_1.BounceHandler; } });
+var DragPanHandler_1 = require("./component/mouse/DragPanHandler");
+Object.defineProperty(exports, "DragPanHandler", { enumerable: true, get: function () { return DragPanHandler_1.DragPanHandler; } });
+var DoubleClickZoomHandler_1 = require("./component/mouse/DoubleClickZoomHandler");
+Object.defineProperty(exports, "DoubleClickZoomHandler", { enumerable: true, get: function () { return DoubleClickZoomHandler_1.DoubleClickZoomHandler; } });
+var EarthControlHandler_1 = require("./component/mouse/EarthControlHandler");
+Object.defineProperty(exports, "EarthControlHandler", { enumerable: true, get: function () { return EarthControlHandler_1.EarthControlHandler; } });
+var ScrollZoomHandler_1 = require("./component/mouse/ScrollZoomHandler");
+Object.defineProperty(exports, "ScrollZoomHandler", { enumerable: true, get: function () { return ScrollZoomHandler_1.ScrollZoomHandler; } });
+var TouchZoomHandler_1 = require("./component/mouse/TouchZoomHandler");
+Object.defineProperty(exports, "TouchZoomHandler", { enumerable: true, get: function () { return TouchZoomHandler_1.TouchZoomHandler; } });
+var ImageBoundary = require("./component/mouse/ImageBoundary");
+exports.ImageBoundary = ImageBoundary;
+var Popup_1 = require("./component/popup/popup/Popup");
+Object.defineProperty(exports, "Popup", { enumerable: true, get: function () { return Popup_1.Popup; } });
+var PopupComponent_1 = require("./component/popup/PopupComponent");
+Object.defineProperty(exports, "PopupComponent", { enumerable: true, get: function () { return PopupComponent_1.PopupComponent; } });
+var NavigationComponent_1 = require("./component/NavigationComponent");
+Object.defineProperty(exports, "NavigationComponent", { enumerable: true, get: function () { return NavigationComponent_1.NavigationComponent; } });
+var RouteComponent_1 = require("./component/RouteComponent");
+Object.defineProperty(exports, "RouteComponent", { enumerable: true, get: function () { return RouteComponent_1.RouteComponent; } });
+var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
+Object.defineProperty(exports, "SequenceComponent", { enumerable: true, get: function () { return SequenceComponent_1.SequenceComponent; } });
+var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
+Object.defineProperty(exports, "SequenceDOMRenderer", { enumerable: true, get: function () { return SequenceDOMRenderer_1.SequenceDOMRenderer; } });
+var SequenceMode_1 = require("./component/sequence/SequenceMode");
+Object.defineProperty(exports, "SequenceMode", { enumerable: true, get: function () { return SequenceMode_1.SequenceMode; } });
+var SpatialDataCache_1 = require("./component/spatialdata/SpatialDataCache");
+Object.defineProperty(exports, "SpatialDataCache", { enumerable: true, get: function () { return SpatialDataCache_1.SpatialDataCache; } });
+var SpatialDataComponent_1 = require("./component/spatialdata/SpatialDataComponent");
+Object.defineProperty(exports, "SpatialDataComponent", { enumerable: true, get: function () { return SpatialDataComponent_1.SpatialDataComponent; } });
+var SpatialDataScene_1 = require("./component/spatialdata/SpatialDataScene");
+Object.defineProperty(exports, "SpatialDataScene", { enumerable: true, get: function () { return SpatialDataScene_1.SpatialDataScene; } });
+var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
+Object.defineProperty(exports, "ImagePlaneComponent", { enumerable: true, get: function () { return ImagePlaneComponent_1.ImagePlaneComponent; } });
+var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
+Object.defineProperty(exports, "ImagePlaneGLRenderer", { enumerable: true, get: function () { return ImagePlaneGLRenderer_1.ImagePlaneGLRenderer; } });
+var Shaders_1 = require("./component/shaders/Shaders");
+Object.defineProperty(exports, "Shaders", { enumerable: true, get: function () { return Shaders_1.Shaders; } });
+var SimpleMarker_1 = require("./component/marker/marker/SimpleMarker");
+Object.defineProperty(exports, "SimpleMarker", { enumerable: true, get: function () { return SimpleMarker_1.SimpleMarker; } });
+var CircleMarker_1 = require("./component/marker/marker/CircleMarker");
+Object.defineProperty(exports, "CircleMarker", { enumerable: true, get: function () { return CircleMarker_1.CircleMarker; } });
+var SliderComponent_1 = require("./component/slider/SliderComponent");
+Object.defineProperty(exports, "SliderComponent", { enumerable: true, get: function () { return SliderComponent_1.SliderComponent; } });
+var SliderDOMRenderer_1 = require("./component/slider/SliderDOMRenderer");
+Object.defineProperty(exports, "SliderDOMRenderer", { enumerable: true, get: function () { return SliderDOMRenderer_1.SliderDOMRenderer; } });
+var SliderGLRenderer_1 = require("./component/slider/SliderGLRenderer");
+Object.defineProperty(exports, "SliderGLRenderer", { enumerable: true, get: function () { return SliderGLRenderer_1.SliderGLRenderer; } });
+var StatsComponent_1 = require("./component/StatsComponent");
+Object.defineProperty(exports, "StatsComponent", { enumerable: true, get: function () { return StatsComponent_1.StatsComponent; } });
+var TagHandlerBase_1 = require("./component/tag/handlers/TagHandlerBase");
+Object.defineProperty(exports, "TagHandlerBase", { enumerable: true, get: function () { return TagHandlerBase_1.TagHandlerBase; } });
+var CreateHandlerBase_1 = require("./component/tag/handlers/CreateHandlerBase");
+Object.defineProperty(exports, "CreateHandlerBase", { enumerable: true, get: function () { return CreateHandlerBase_1.CreateHandlerBase; } });
+var CreatePointHandler_1 = require("./component/tag/handlers/CreatePointHandler");
+Object.defineProperty(exports, "CreatePointHandler", { enumerable: true, get: function () { return CreatePointHandler_1.CreatePointHandler; } });
+var CreateVertexHandler_1 = require("./component/tag/handlers/CreateVertexHandler");
+Object.defineProperty(exports, "CreateVertexHandler", { enumerable: true, get: function () { return CreateVertexHandler_1.CreateVertexHandler; } });
+var CreatePointsHandler_1 = require("./component/tag/handlers/CreatePointsHandler");
+Object.defineProperty(exports, "CreatePointsHandler", { enumerable: true, get: function () { return CreatePointsHandler_1.CreatePointsHandler; } });
+var CreatePolygonHandler_1 = require("./component/tag/handlers/CreatePolygonHandler");
+Object.defineProperty(exports, "CreatePolygonHandler", { enumerable: true, get: function () { return CreatePolygonHandler_1.CreatePolygonHandler; } });
+var CreateRectHandler_1 = require("./component/tag/handlers/CreateRectHandler");
+Object.defineProperty(exports, "CreateRectHandler", { enumerable: true, get: function () { return CreateRectHandler_1.CreateRectHandler; } });
+var CreateRectDragHandler_1 = require("./component/tag/handlers/CreateRectDragHandler");
+Object.defineProperty(exports, "CreateRectDragHandler", { enumerable: true, get: function () { return CreateRectDragHandler_1.CreateRectDragHandler; } });
+var EditVertexHandler_1 = require("./component/tag/handlers/EditVertexHandler");
+Object.defineProperty(exports, "EditVertexHandler", { enumerable: true, get: function () { return EditVertexHandler_1.EditVertexHandler; } });
+var Tag_1 = require("./component/tag/tag/Tag");
+Object.defineProperty(exports, "Tag", { enumerable: true, get: function () { return Tag_1.Tag; } });
+var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
+Object.defineProperty(exports, "OutlineTag", { enumerable: true, get: function () { return OutlineTag_1.OutlineTag; } });
+var ExtremePointTag_1 = require("./component/tag/tag/ExtremePointTag");
+Object.defineProperty(exports, "ExtremePointTag", { enumerable: true, get: function () { return ExtremePointTag_1.ExtremePointTag; } });
+var RenderTag_1 = require("./component/tag/tag/RenderTag");
+Object.defineProperty(exports, "RenderTag", { enumerable: true, get: function () { return RenderTag_1.RenderTag; } });
+var OutlineRenderTagBase_1 = require("./component/tag/tag/OutlineRenderTagBase");
+Object.defineProperty(exports, "OutlineRenderTagBase", { enumerable: true, get: function () { return OutlineRenderTagBase_1.OutlineRenderTagBase; } });
+var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
+Object.defineProperty(exports, "OutlineRenderTag", { enumerable: true, get: function () { return OutlineRenderTag_1.OutlineRenderTag; } });
+var ExtremePointRenderTag_1 = require("./component/tag/tag/ExtremePointRenderTag");
+Object.defineProperty(exports, "ExtremePointRenderTag", { enumerable: true, get: function () { return ExtremePointRenderTag_1.ExtremePointRenderTag; } });
+var SpotTag_1 = require("./component/tag/tag/SpotTag");
+Object.defineProperty(exports, "SpotTag", { enumerable: true, get: function () { return SpotTag_1.SpotTag; } });
+var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
+Object.defineProperty(exports, "SpotRenderTag", { enumerable: true, get: function () { return SpotRenderTag_1.SpotRenderTag; } });
+var TagDomain_1 = require("./component/tag/tag/TagDomain");
+Object.defineProperty(exports, "TagDomain", { enumerable: true, get: function () { return TagDomain_1.TagDomain; } });
+var TagComponent_1 = require("./component/tag/TagComponent");
+Object.defineProperty(exports, "TagComponent", { enumerable: true, get: function () { return TagComponent_1.TagComponent; } });
+var TagCreator_1 = require("./component/tag/TagCreator");
+Object.defineProperty(exports, "TagCreator", { enumerable: true, get: function () { return TagCreator_1.TagCreator; } });
+var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
+Object.defineProperty(exports, "TagDOMRenderer", { enumerable: true, get: function () { return TagDOMRenderer_1.TagDOMRenderer; } });
+var TagMode_1 = require("./component/tag/TagMode");
+Object.defineProperty(exports, "TagMode", { enumerable: true, get: function () { return TagMode_1.TagMode; } });
+var TagOperation_1 = require("./component/tag/TagOperation");
+Object.defineProperty(exports, "TagOperation", { enumerable: true, get: function () { return TagOperation_1.TagOperation; } });
+var TagScene_1 = require("./component/tag/TagScene");
+Object.defineProperty(exports, "TagScene", { enumerable: true, get: function () { return TagScene_1.TagScene; } });
+var TagSet_1 = require("./component/tag/TagSet");
+Object.defineProperty(exports, "TagSet", { enumerable: true, get: function () { return TagSet_1.TagSet; } });
+var Geometry_1 = require("./component/tag/geometry/Geometry");
+Object.defineProperty(exports, "Geometry", { enumerable: true, get: function () { return Geometry_1.Geometry; } });
+var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
+Object.defineProperty(exports, "VertexGeometry", { enumerable: true, get: function () { return VertexGeometry_1.VertexGeometry; } });
+var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
+Object.defineProperty(exports, "RectGeometry", { enumerable: true, get: function () { return RectGeometry_1.RectGeometry; } });
+var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
+Object.defineProperty(exports, "PointGeometry", { enumerable: true, get: function () { return PointGeometry_1.PointGeometry; } });
+var PointsGeometry_1 = require("./component/tag/geometry/PointsGeometry");
+Object.defineProperty(exports, "PointsGeometry", { enumerable: true, get: function () { return PointsGeometry_1.PointsGeometry; } });
+var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
+Object.defineProperty(exports, "PolygonGeometry", { enumerable: true, get: function () { return PolygonGeometry_1.PolygonGeometry; } });
+var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
+Object.defineProperty(exports, "GeometryTagError", { enumerable: true, get: function () { return GeometryTagError_1.GeometryTagError; } });
+var ZoomComponent_1 = require("./component/zoom/ZoomComponent");
+Object.defineProperty(exports, "ZoomComponent", { enumerable: true, get: function () { return ZoomComponent_1.ZoomComponent; } });
+var CreateTag_1 = require("./component/tag/tag/CreateTag");
+Object.defineProperty(exports, "CreateTag", { enumerable: true, get: function () { return CreateTag_1.CreateTag; } });
+var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
+Object.defineProperty(exports, "OutlineCreateTag", { enumerable: true, get: function () { return OutlineCreateTag_1.OutlineCreateTag; } });
+var ExtremePointCreateTag_1 = require("./component/tag/tag/ExtremePointCreateTag");
+Object.defineProperty(exports, "ExtremePointCreateTag", { enumerable: true, get: function () { return ExtremePointCreateTag_1.ExtremePointCreateTag; } });
+__exportStar(require("./component/interfaces/interfaces"), exports);
+
+},{"./component/AttributionComponent":306,"./component/BackgroundComponent":307,"./component/BearingComponent":308,"./component/CacheComponent":309,"./component/Component":310,"./component/ComponentService":311,"./component/CoverComponent":312,"./component/DebugComponent":313,"./component/ImageComponent":314,"./component/LoadingComponent":315,"./component/NavigationComponent":316,"./component/RouteComponent":317,"./component/StatsComponent":318,"./component/direction/DirectionComponent":319,"./component/direction/DirectionDOMCalculator":320,"./component/direction/DirectionDOMRenderer":321,"./component/imageplane/ImagePlaneComponent":322,"./component/imageplane/ImagePlaneGLRenderer":323,"./component/interfaces/interfaces":327,"./component/keyboard/KeyPlayHandler":328,"./component/keyboard/KeySequenceNavigationHandler":329,"./component/keyboard/KeySpatialNavigationHandler":330,"./component/keyboard/KeyZoomHandler":331,"./component/keyboard/KeyboardComponent":332,"./component/marker/MarkerComponent":334,"./component/marker/MarkerScene":335,"./component/marker/MarkerSet":336,"./component/marker/marker/CircleMarker":338,"./component/marker/marker/Marker":339,"./component/marker/marker/SimpleMarker":340,"./component/mouse/BounceHandler":341,"./component/mouse/DoubleClickZoomHandler":342,"./component/mouse/DragPanHandler":343,"./component/mouse/EarthControlHandler":344,"./component/mouse/HandlerTypes":345,"./component/mouse/ImageBoundary":346,"./component/mouse/MouseComponent":347,"./component/mouse/ScrollZoomHandler":348,"./component/mouse/TouchZoomHandler":349,"./component/popup/PopupComponent":351,"./component/popup/popup/Popup":352,"./component/sequence/SequenceComponent":353,"./component/sequence/SequenceDOMRenderer":354,"./component/sequence/SequenceMode":355,"./component/shaders/Shaders":356,"./component/slider/SliderComponent":357,"./component/slider/SliderDOMRenderer":358,"./component/slider/SliderGLRenderer":359,"./component/spatialdata/SpatialDataCache":362,"./component/spatialdata/SpatialDataComponent":363,"./component/spatialdata/SpatialDataScene":364,"./component/tag/TagComponent":367,"./component/tag/TagCreator":368,"./component/tag/TagDOMRenderer":369,"./component/tag/TagMode":370,"./component/tag/TagOperation":371,"./component/tag/TagScene":372,"./component/tag/TagSet":373,"./component/tag/error/GeometryTagError":374,"./component/tag/geometry/Geometry":375,"./component/tag/geometry/PointGeometry":376,"./component/tag/geometry/PointsGeometry":377,"./component/tag/geometry/PolygonGeometry":378,"./component/tag/geometry/RectGeometry":379,"./component/tag/geometry/VertexGeometry":380,"./component/tag/handlers/CreateHandlerBase":381,"./component/tag/handlers/CreatePointHandler":382,"./component/tag/handlers/CreatePointsHandler":383,"./component/tag/handlers/CreatePolygonHandler":384,"./component/tag/handlers/CreateRectDragHandler":385,"./component/tag/handlers/CreateRectHandler":386,"./component/tag/handlers/CreateVertexHandler":387,"./component/tag/handlers/EditVertexHandler":388,"./component/tag/handlers/TagHandlerBase":389,"./component/tag/tag/CreateTag":391,"./component/tag/tag/ExtremePointCreateTag":392,"./component/tag/tag/ExtremePointRenderTag":393,"./component/tag/tag/ExtremePointTag":394,"./component/tag/tag/OutlineCreateTag":395,"./component/tag/tag/OutlineRenderTag":396,"./component/tag/tag/OutlineRenderTagBase":397,"./component/tag/tag/OutlineTag":398,"./component/tag/tag/RenderTag":399,"./component/tag/tag/SpotRenderTag":400,"./component/tag/tag/SpotTag":401,"./component/tag/tag/Tag":402,"./component/tag/tag/TagDomain":403,"./component/utils/ComponentSize":404,"./component/utils/HandlerBase":405,"./component/utils/MeshFactory":406,"./component/utils/MeshScene":407,"./component/utils/MouseOperator":408,"./component/zoom/ZoomComponent":409}],292:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
+Object.defineProperty(exports, "EdgeDirection", { enumerable: true, get: function () { return EdgeDirection_1.EdgeDirection; } });
+var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
+Object.defineProperty(exports, "EdgeCalculatorSettings", { enumerable: true, get: function () { return EdgeCalculatorSettings_1.EdgeCalculatorSettings; } });
+var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
+Object.defineProperty(exports, "EdgeCalculatorDirections", { enumerable: true, get: function () { return EdgeCalculatorDirections_1.EdgeCalculatorDirections; } });
+var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
+Object.defineProperty(exports, "EdgeCalculatorCoefficients", { enumerable: true, get: function () { return EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients; } });
+var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
+Object.defineProperty(exports, "EdgeCalculator", { enumerable: true, get: function () { return EdgeCalculator_1.EdgeCalculator; } });
+__exportStar(require("./graph/edge/interfaces/interfaces"), exports);
+
+},{"./graph/edge/EdgeCalculator":433,"./graph/edge/EdgeCalculatorCoefficients":434,"./graph/edge/EdgeCalculatorDirections":435,"./graph/edge/EdgeCalculatorSettings":436,"./graph/edge/EdgeDirection":437,"./graph/edge/interfaces/interfaces":438}],293:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AbortMapillaryError_1 = require("./error/AbortMapillaryError");
+Object.defineProperty(exports, "AbortMapillaryError", { enumerable: true, get: function () { return AbortMapillaryError_1.AbortMapillaryError; } });
+var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
+Object.defineProperty(exports, "ArgumentMapillaryError", { enumerable: true, get: function () { return ArgumentMapillaryError_1.ArgumentMapillaryError; } });
+var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
+Object.defineProperty(exports, "GraphMapillaryError", { enumerable: true, get: function () { return GraphMapillaryError_1.GraphMapillaryError; } });
+var MapillaryError_1 = require("./error/MapillaryError");
+Object.defineProperty(exports, "MapillaryError", { enumerable: true, get: function () { return MapillaryError_1.MapillaryError; } });
+
+},{"./error/AbortMapillaryError":410,"./error/ArgumentMapillaryError":411,"./error/GraphMapillaryError":412,"./error/MapillaryError":413}],294:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Lines = exports.Geo = void 0;
+var Camera_1 = require("./geo/Camera");
+Object.defineProperty(exports, "Camera", { enumerable: true, get: function () { return Camera_1.Camera; } });
+var GeoCoords_1 = require("./geo/GeoCoords");
+Object.defineProperty(exports, "GeoCoords", { enumerable: true, get: function () { return GeoCoords_1.GeoCoords; } });
+var GeoRBush_1 = require("./geo/GeoRBush");
+Object.defineProperty(exports, "GeoRBush", { enumerable: true, get: function () { return GeoRBush_1.GeoRBush; } });
+var ViewportCoords_1 = require("./geo/ViewportCoords");
+Object.defineProperty(exports, "ViewportCoords", { enumerable: true, get: function () { return ViewportCoords_1.ViewportCoords; } });
+var Spatial_1 = require("./geo/Spatial");
+Object.defineProperty(exports, "Spatial", { enumerable: true, get: function () { return Spatial_1.Spatial; } });
+var Transform_1 = require("./geo/Transform");
+Object.defineProperty(exports, "Transform", { enumerable: true, get: function () { return Transform_1.Transform; } });
+__exportStar(require("./geo/interfaces/interfaces"), exports);
+var Geo = require("./geo/Geo");
+exports.Geo = Geo;
+var Lines = require("./geo/Lines");
+exports.Lines = Lines;
+
+},{"./geo/Camera":414,"./geo/Geo":415,"./geo/GeoCoords":416,"./geo/GeoRBush":417,"./geo/Lines":418,"./geo/Spatial":419,"./geo/Transform":420,"./geo/ViewportCoords":421,"./geo/interfaces/interfaces":422}],295:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var FilterCreator_1 = require("./graph/FilterCreator");
+Object.defineProperty(exports, "FilterCreator", { enumerable: true, get: function () { return FilterCreator_1.FilterCreator; } });
+var Graph_1 = require("./graph/Graph");
+Object.defineProperty(exports, "Graph", { enumerable: true, get: function () { return Graph_1.Graph; } });
+var GraphCalculator_1 = require("./graph/GraphCalculator");
+Object.defineProperty(exports, "GraphCalculator", { enumerable: true, get: function () { return GraphCalculator_1.GraphCalculator; } });
+var GraphMode_1 = require("./graph/GraphMode");
+Object.defineProperty(exports, "GraphMode", { enumerable: true, get: function () { return GraphMode_1.GraphMode; } });
+var GraphService_1 = require("./graph/GraphService");
+Object.defineProperty(exports, "GraphService", { enumerable: true, get: function () { return GraphService_1.GraphService; } });
+var ImageLoadingService_1 = require("./graph/ImageLoadingService");
+Object.defineProperty(exports, "ImageLoadingService", { enumerable: true, get: function () { return ImageLoadingService_1.ImageLoadingService; } });
+var MeshReader_1 = require("./graph/MeshReader");
+Object.defineProperty(exports, "MeshReader", { enumerable: true, get: function () { return MeshReader_1.MeshReader; } });
+var Node_1 = require("./graph/Node");
+Object.defineProperty(exports, "Node", { enumerable: true, get: function () { return Node_1.Node; } });
+var NodeCache_1 = require("./graph/NodeCache");
+Object.defineProperty(exports, "NodeCache", { enumerable: true, get: function () { return NodeCache_1.NodeCache; } });
+var Sequence_1 = require("./graph/Sequence");
+Object.defineProperty(exports, "Sequence", { enumerable: true, get: function () { return Sequence_1.Sequence; } });
+__exportStar(require("./graph/interfaces/interfaces"), exports);
+
+},{"./graph/FilterCreator":423,"./graph/Graph":424,"./graph/GraphCalculator":425,"./graph/GraphMode":426,"./graph/GraphService":427,"./graph/ImageLoadingService":428,"./graph/MeshReader":429,"./graph/Node":430,"./graph/NodeCache":431,"./graph/Sequence":432,"./graph/interfaces/interfaces":439}],296:[function(require,module,exports){
+"use strict";
+/**
+ * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
+ * @name Mapillary
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpatialDataComponent = exports.PopupComponent = exports.MarkerComponent = exports.TagComponent = void 0;
+__exportStar(require("./Support"), exports);
+var Edge_1 = require("./Edge");
+Object.defineProperty(exports, "EdgeDirection", { enumerable: true, get: function () { return Edge_1.EdgeDirection; } });
+var Error_1 = require("./Error");
+Object.defineProperty(exports, "AbortMapillaryError", { enumerable: true, get: function () { return Error_1.AbortMapillaryError; } });
+var Render_1 = require("./Render");
+Object.defineProperty(exports, "RenderMode", { enumerable: true, get: function () { return Render_1.RenderMode; } });
+var State_1 = require("./State");
+Object.defineProperty(exports, "TransitionMode", { enumerable: true, get: function () { return State_1.TransitionMode; } });
+var Viewer_1 = require("./Viewer");
+Object.defineProperty(exports, "Alignment", { enumerable: true, get: function () { return Viewer_1.Alignment; } });
+Object.defineProperty(exports, "ImageSize", { enumerable: true, get: function () { return Viewer_1.ImageSize; } });
+Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return Viewer_1.Viewer; } });
+var Component_1 = require("./Component");
+Object.defineProperty(exports, "SliderMode", { enumerable: true, get: function () { return Component_1.SliderMode; } });
+Object.defineProperty(exports, "ComponentSize", { enumerable: true, get: function () { return Component_1.ComponentSize; } });
+var TagComponent = require("./component/tag/Tag");
+exports.TagComponent = TagComponent;
+var MarkerComponent = require("./component/marker/Marker");
+exports.MarkerComponent = MarkerComponent;
+var PopupComponent = require("./component/popup/Popup");
+exports.PopupComponent = PopupComponent;
+var SpatialDataComponent = require("./component/spatialdata/SpatialData");
+exports.SpatialDataComponent = SpatialDataComponent;
+
+},{"./Component":291,"./Edge":292,"./Error":293,"./Render":297,"./State":298,"./Support":299,"./Viewer":302,"./component/marker/Marker":333,"./component/popup/Popup":350,"./component/spatialdata/SpatialData":361,"./component/tag/Tag":366}],297:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var DOMRenderer_1 = require("./render/DOMRenderer");
+Object.defineProperty(exports, "DOMRenderer", { enumerable: true, get: function () { return DOMRenderer_1.DOMRenderer; } });
+var GLRenderer_1 = require("./render/GLRenderer");
+Object.defineProperty(exports, "GLRenderer", { enumerable: true, get: function () { return GLRenderer_1.GLRenderer; } });
+var GLRenderStage_1 = require("./render/GLRenderStage");
+Object.defineProperty(exports, "GLRenderStage", { enumerable: true, get: function () { return GLRenderStage_1.GLRenderStage; } });
+var RenderCamera_1 = require("./render/RenderCamera");
+Object.defineProperty(exports, "RenderCamera", { enumerable: true, get: function () { return RenderCamera_1.RenderCamera; } });
+var RenderMode_1 = require("./render/RenderMode");
+Object.defineProperty(exports, "RenderMode", { enumerable: true, get: function () { return RenderMode_1.RenderMode; } });
+var RenderService_1 = require("./render/RenderService");
+Object.defineProperty(exports, "RenderService", { enumerable: true, get: function () { return RenderService_1.RenderService; } });
+__exportStar(require("./render/interfaces/interfaces"), exports);
+
+},{"./render/DOMRenderer":440,"./render/GLRenderStage":441,"./render/GLRenderer":442,"./render/RenderCamera":443,"./render/RenderMode":444,"./render/RenderService":445,"./render/interfaces/interfaces":446}],298:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var FrameGenerator_1 = require("./state/FrameGenerator");
+Object.defineProperty(exports, "FrameGenerator", { enumerable: true, get: function () { return FrameGenerator_1.FrameGenerator; } });
+var RotationDelta_1 = require("./state/RotationDelta");
+Object.defineProperty(exports, "RotationDelta", { enumerable: true, get: function () { return RotationDelta_1.RotationDelta; } });
+var State_1 = require("./state/State");
+Object.defineProperty(exports, "State", { enumerable: true, get: function () { return State_1.State; } });
+var StateBase_1 = require("./state/states/StateBase");
+Object.defineProperty(exports, "StateBase", { enumerable: true, get: function () { return StateBase_1.StateBase; } });
+var StateContext_1 = require("./state/StateContext");
+Object.defineProperty(exports, "StateContext", { enumerable: true, get: function () { return StateContext_1.StateContext; } });
+var StateService_1 = require("./state/StateService");
+Object.defineProperty(exports, "StateService", { enumerable: true, get: function () { return StateService_1.StateService; } });
+var TransitionMode_1 = require("./state/TransitionMode");
+Object.defineProperty(exports, "TransitionMode", { enumerable: true, get: function () { return TransitionMode_1.TransitionMode; } });
+var EarthState_1 = require("./state/states/EarthState");
+Object.defineProperty(exports, "EarthState", { enumerable: true, get: function () { return EarthState_1.EarthState; } });
+var InteractiveStateBase_1 = require("./state/states/InteractiveStateBase");
+Object.defineProperty(exports, "InteractiveStateBase", { enumerable: true, get: function () { return InteractiveStateBase_1.InteractiveStateBase; } });
+var InteractiveWaitingState_1 = require("./state/states/InteractiveWaitingState");
+Object.defineProperty(exports, "InteractiveWaitingState", { enumerable: true, get: function () { return InteractiveWaitingState_1.InteractiveWaitingState; } });
+var TraversingState_1 = require("./state/states/TraversingState");
+Object.defineProperty(exports, "TraversingState", { enumerable: true, get: function () { return TraversingState_1.TraversingState; } });
+var WaitingState_1 = require("./state/states/WaitingState");
+Object.defineProperty(exports, "WaitingState", { enumerable: true, get: function () { return WaitingState_1.WaitingState; } });
+__exportStar(require("./state/interfaces/interfaces"), exports);
+
+},{"./state/FrameGenerator":447,"./state/RotationDelta":448,"./state/State":449,"./state/StateContext":450,"./state/StateService":451,"./state/TransitionMode":452,"./state/interfaces/interfaces":453,"./state/states/EarthState":454,"./state/states/InteractiveStateBase":455,"./state/states/InteractiveWaitingState":456,"./state/states/StateBase":457,"./state/states/TraversingState":458,"./state/states/WaitingState":459}],299:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isFallbackSupported = exports.isSupported = void 0;
+var support = require("./utils/Support");
+/**
+ * Test whether the current browser supports the full
+ * functionality of MapillaryJS.
+ *
+ * @description The full functionality includes WebGL rendering.
+ *
+ * @return {boolean}
+ *
+ * @example `var supported = Mapillary.isSupported();`
+ */
+function isSupported() {
+    return isFallbackSupported() &&
+        support.isWebGLSupportedCached();
+}
+exports.isSupported = isSupported;
+/**
+ * Test whether the current browser supports the fallback
+ * functionality of MapillaryJS.
+ *
+ * @description The fallback functionality does not include WebGL
+ * rendering, only 2D canvas rendering.
+ *
+ * @return {boolean}
+ *
+ * @example `var fallbackSupported = Mapillary.isFallbackSupported();`
+ */
+function isFallbackSupported() {
+    return support.isBrowser() &&
+        support.isBlobSupported() &&
+        support.isArraySupported() &&
+        support.isFunctionSupported() &&
+        support.isJSONSupported() &&
+        support.isObjectSupported();
+}
+exports.isFallbackSupported = isFallbackSupported;
+
+},{"./utils/Support":468}],300:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
+Object.defineProperty(exports, "ImageTileLoader", { enumerable: true, get: function () { return ImageTileLoader_1.ImageTileLoader; } });
+var ImageTileStore_1 = require("./tiles/ImageTileStore");
+Object.defineProperty(exports, "ImageTileStore", { enumerable: true, get: function () { return ImageTileStore_1.ImageTileStore; } });
+var TextureProvider_1 = require("./tiles/TextureProvider");
+Object.defineProperty(exports, "TextureProvider", { enumerable: true, get: function () { return TextureProvider_1.TextureProvider; } });
+var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
+Object.defineProperty(exports, "RegionOfInterestCalculator", { enumerable: true, get: function () { return RegionOfInterestCalculator_1.RegionOfInterestCalculator; } });
+__exportStar(require("./tiles/interfaces/interfaces"), exports);
+
+},{"./tiles/ImageTileLoader":460,"./tiles/ImageTileStore":461,"./tiles/RegionOfInterestCalculator":462,"./tiles/TextureProvider":463,"./tiles/interfaces/interfaces":464}],301:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var DOM_1 = require("./utils/DOM");
+Object.defineProperty(exports, "DOM", { enumerable: true, get: function () { return DOM_1.DOM; } });
+var EventEmitter_1 = require("./utils/EventEmitter");
+Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return EventEmitter_1.EventEmitter; } });
+var Settings_1 = require("./utils/Settings");
+Object.defineProperty(exports, "Settings", { enumerable: true, get: function () { return Settings_1.Settings; } });
+__exportStar(require("./utils/Support"), exports);
+var Urls_1 = require("./utils/Urls");
+Object.defineProperty(exports, "Urls", { enumerable: true, get: function () { return Urls_1.Urls; } });
+
+},{"./utils/DOM":465,"./utils/EventEmitter":466,"./utils/Settings":467,"./utils/Support":468,"./utils/Urls":469}],302:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var Alignment_1 = require("./viewer/Alignment");
+Object.defineProperty(exports, "Alignment", { enumerable: true, get: function () { return Alignment_1.Alignment; } });
+var CacheService_1 = require("./viewer/CacheService");
+Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return CacheService_1.CacheService; } });
+var ComponentController_1 = require("./viewer/ComponentController");
+Object.defineProperty(exports, "ComponentController", { enumerable: true, get: function () { return ComponentController_1.ComponentController; } });
+var Container_1 = require("./viewer/Container");
+Object.defineProperty(exports, "Container", { enumerable: true, get: function () { return Container_1.Container; } });
+var Observer_1 = require("./viewer/Observer");
+Object.defineProperty(exports, "Observer", { enumerable: true, get: function () { return Observer_1.Observer; } });
+var ImageSize_1 = require("./viewer/ImageSize");
+Object.defineProperty(exports, "ImageSize", { enumerable: true, get: function () { return ImageSize_1.ImageSize; } });
+var KeyboardService_1 = require("./viewer/KeyboardService");
+Object.defineProperty(exports, "KeyboardService", { enumerable: true, get: function () { return KeyboardService_1.KeyboardService; } });
+var LoadingService_1 = require("./viewer/LoadingService");
+Object.defineProperty(exports, "LoadingService", { enumerable: true, get: function () { return LoadingService_1.LoadingService; } });
+var MouseService_1 = require("./viewer/MouseService");
+Object.defineProperty(exports, "MouseService", { enumerable: true, get: function () { return MouseService_1.MouseService; } });
+var Navigator_1 = require("./viewer/Navigator");
+Object.defineProperty(exports, "Navigator", { enumerable: true, get: function () { return Navigator_1.Navigator; } });
+var PlayService_1 = require("./viewer/PlayService");
+Object.defineProperty(exports, "PlayService", { enumerable: true, get: function () { return PlayService_1.PlayService; } });
+var Projection_1 = require("./viewer/Projection");
+Object.defineProperty(exports, "Projection", { enumerable: true, get: function () { return Projection_1.Projection; } });
+var SpriteService_1 = require("./viewer/SpriteService");
+Object.defineProperty(exports, "SpriteService", { enumerable: true, get: function () { return SpriteService_1.SpriteService; } });
+var TouchService_1 = require("./viewer/TouchService");
+Object.defineProperty(exports, "TouchService", { enumerable: true, get: function () { return TouchService_1.TouchService; } });
+var Viewer_1 = require("./viewer/Viewer");
+Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return Viewer_1.Viewer; } });
+__exportStar(require("./viewer/interfaces/interfaces"), exports);
+
+},{"./viewer/Alignment":470,"./viewer/CacheService":471,"./viewer/ComponentController":472,"./viewer/Container":473,"./viewer/ImageSize":474,"./viewer/KeyboardService":475,"./viewer/LoadingService":476,"./viewer/MouseService":477,"./viewer/Navigator":478,"./viewer/Observer":479,"./viewer/PlayService":481,"./viewer/Projection":482,"./viewer/SpriteService":483,"./viewer/TouchService":484,"./viewer/Viewer":485,"./viewer/interfaces/interfaces":486}],303:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.APIv3 = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var API_1 = require("../API");
+/**
+ * @class APIv3
+ *
+ * @classdesc Provides methods for access of API v3.
+ */
+var APIv3 = /** @class */ (function () {
+    /**
+     * Create a new api v3 instance.
+     *
+     * @param {number} clientId - Client id for API requests.
+     * @param {number} [token] - Optional bearer token for API requests of
+     * protected resources.
+     * @param {ModelCreator} [creator] - Optional model creator instance.
+     */
+    function APIv3(clientId, token, creator) {
+        this._clientId = clientId;
+        this._modelCreator = creator != null ? creator : new API_1.ModelCreator();
+        this._model = this._modelCreator.createModel(clientId, token);
+        this._pageCount = 999;
+        this._pathImageByKey = "imageByKey";
+        this._pathImageCloseTo = "imageCloseTo";
+        this._pathImagesByH = "imagesByH";
+        this._pathImageViewAdd = "imageViewAdd";
+        this._pathSequenceByKey = "sequenceByKey";
+        this._pathSequenceViewAdd = "sequenceViewAdd";
+        this._propertiesCore = [
+            "cl",
+            "l",
+            "sequence_key",
+        ];
+        this._propertiesFill = [
+            "captured_at",
+            "captured_with_camera_uuid",
+            "user",
+            "organization_key",
+            "private",
+            "project",
+        ];
+        this._propertiesKey = [
+            "key",
+        ];
+        this._propertiesSequence = [
+            "keys",
+        ];
+        this._propertiesSpatial = [
+            "atomic_scale",
+            "cluster_key",
+            "c_rotation",
+            "ca",
+            "calt",
+            "camera_projection_type",
+            "cca",
+            "cfocal",
+            "ck1",
+            "ck2",
+            "gpano",
+            "height",
+            "merge_cc",
+            "merge_version",
+            "orientation",
+            "width",
+        ];
+        this._propertiesUser = [
+            "username",
+        ];
+    }
+    Object.defineProperty(APIv3.prototype, "clientId", {
+        get: function () {
+            return this._clientId;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    APIv3.prototype.imageByKeyFill$ = function (keys) {
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImageByKey,
+            keys,
+            this._propertiesKey
+                .concat(this._propertiesFill)
+                .concat(this._propertiesSpatial),
+            this._propertiesKey
+                .concat(this._propertiesUser)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
+            }
+            return value.json.imageByKey;
+        })), this._pathImageByKey, keys);
+    };
+    APIv3.prototype.imageByKeyFull$ = function (keys) {
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImageByKey,
+            keys,
+            this._propertiesKey
+                .concat(this._propertiesCore)
+                .concat(this._propertiesFill)
+                .concat(this._propertiesSpatial),
+            this._propertiesKey
+                .concat(this._propertiesUser)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
+            }
+            return value.json.imageByKey;
+        })), this._pathImageByKey, keys);
+    };
+    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
+        var lonLat = lon + ":" + lat;
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImageCloseTo,
+            [lonLat],
+            this._propertiesKey
+                .concat(this._propertiesCore)
+                .concat(this._propertiesFill)
+                .concat(this._propertiesSpatial),
+            this._propertiesKey
+                .concat(this._propertiesUser)
+        ])).pipe(operators_1.map(function (value) {
+            return value != null ? value.json.imageCloseTo[lonLat] : null;
+        })), this._pathImageCloseTo, [lonLat]);
+    };
+    APIv3.prototype.imagesByH$ = function (hs) {
+        var _this = this;
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImagesByH,
+            hs,
+            { from: 0, to: this._pageCount },
+            this._propertiesKey
+                .concat(this._propertiesCore)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                value = { json: { imagesByH: {} } };
+                for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) {
+                    var h = hs_1[_i];
+                    value.json.imagesByH[h] = {};
+                    for (var i = 0; i <= _this._pageCount; i++) {
+                        value.json.imagesByH[h][i] = null;
+                    }
+                }
+            }
+            return value.json.imagesByH;
+        })), this._pathImagesByH, hs);
+    };
+    APIv3.prototype.imageViewAdd$ = function (keys) {
+        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, keys);
+    };
+    APIv3.prototype.invalidateImageByKey = function (keys) {
+        this._invalidateGet(this._pathImageByKey, keys);
+    };
+    APIv3.prototype.invalidateImagesByH = function (hs) {
+        this._invalidateGet(this._pathImagesByH, hs);
+    };
+    APIv3.prototype.invalidateSequenceByKey = function (sKeys) {
+        this._invalidateGet(this._pathSequenceByKey, sKeys);
+    };
+    APIv3.prototype.setToken = function (token) {
+        this._model.invalidate([]);
+        this._model = null;
+        this._model = this._modelCreator.createModel(this._clientId, token);
+    };
+    APIv3.prototype.sequenceByKey$ = function (sequenceKeys) {
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathSequenceByKey,
+            sequenceKeys,
+            this._propertiesKey
+                .concat(this._propertiesSequence)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                value = { json: { sequenceByKey: {} } };
+            }
+            for (var _i = 0, sequenceKeys_1 = sequenceKeys; _i < sequenceKeys_1.length; _i++) {
+                var sequenceKey = sequenceKeys_1[_i];
+                if (!(sequenceKey in value.json.sequenceByKey)) {
+                    console.warn("Sequence data missing (" + sequenceKey + ")");
+                    value.json.sequenceByKey[sequenceKey] = { key: sequenceKey, keys: [] };
+                }
+            }
+            return value.json.sequenceByKey;
+        })), this._pathSequenceByKey, sequenceKeys);
+    };
+    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
+        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
+    };
+    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
+        var _this = this;
+        return observable.pipe(operators_1.catchError(function (error) {
+            _this._invalidateGet(path, paths);
+            throw error;
+        }));
+    };
+    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
+        var _this = this;
+        return observable.pipe(operators_1.catchError(function (error) {
+            _this._invalidateCall(path, paths);
+            throw error;
+        }));
+    };
+    APIv3.prototype._invalidateGet = function (path, paths) {
+        this._model.invalidate([path, paths]);
+    };
+    APIv3.prototype._invalidateCall = function (path, paths) {
+        this._model.invalidate([path], [paths]);
+    };
+    APIv3.prototype._wrapModelResponse$ = function (modelResponse) {
+        return rxjs_1.Observable
+            .create(function (subscriber) {
+            modelResponse
+                .then(function (value) {
+                subscriber.next(value);
+                subscriber.complete();
+            }, function (error) {
+                subscriber.error(error);
+            });
+        });
+    };
+    APIv3.prototype._wrapCallModelResponse$ = function (modelResponse) {
+        return this._wrapModelResponse$(modelResponse).pipe(operators_1.map(function (value) {
+            return;
+        }));
+    };
+    return APIv3;
+}());
+exports.APIv3 = APIv3;
+exports.default = APIv3;
+
+},{"../API":290,"rxjs":43,"rxjs/operators":241}],304:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ModelCreator = void 0;
+var falcor = require("falcor");
+var falcor_http_datasource_1 = require("falcor-http-datasource");
+var Utils_1 = require("../Utils");
+/**
+ * @class ModelCreator
+ *
+ * @classdesc Creates API models.
+ */
+var ModelCreator = /** @class */ (function () {
+    function ModelCreator() {
+    }
+    /**
+     * Creates a Falcor model.
+     *
+     * @description Max cache size will be set to 16 MB. Authorization
+     * header will be added if bearer token is supplied.
+     *
+     * @param {number} clientId - Client id for API requests.
+     * @param {number} [token] - Optional bearer token for API requests of
+     * protected resources.
+     * @returns {falcor.Model} Falcor model for HTTP requests.
+     */
+    ModelCreator.prototype.createModel = function (clientId, token) {
+        var configuration = {
+            crossDomain: true,
+            withCredentials: false,
+        };
+        if (token != null) {
+            configuration.headers = { "Authorization": "Bearer " + token };
+        }
+        return new falcor.Model({
+            maxSize: 16 * 1024 * 1024,
+            source: new falcor_http_datasource_1.default(Utils_1.Urls.falcorModel(clientId), configuration),
+        });
+    };
+    return ModelCreator;
+}());
+exports.ModelCreator = ModelCreator;
+exports.default = ModelCreator;
+
+},{"../Utils":301,"falcor":15,"falcor-http-datasource":10}],305:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],306:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AttributionComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var Utils_1 = require("../Utils");
+var AttributionComponent = /** @class */ (function (_super) {
+    __extends(AttributionComponent, _super);
+    function AttributionComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    AttributionComponent.prototype._activate = function () {
+        var _this = this;
+        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var node = _a[0], size = _a[1];
+            return {
+                name: _this._name,
+                vnode: _this._getAttributionNode(node.username, node.key, node.capturedAt, size.width),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    AttributionComponent.prototype._deactivate = function () {
+        this._disposable.unsubscribe();
+    };
+    AttributionComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    AttributionComponent.prototype._getAttributionNode = function (username, key, capturedAt, width) {
+        var compact = width <= 640;
+        var mapillaryIcon = vd.h("div.AttributionMapillaryLogo", []);
+        var mapillaryLink = vd.h("a.AttributionIconContainer", { href: Utils_1.Urls.explore, target: "_blank" }, [mapillaryIcon]);
+        var imageBy = compact ? "" + username : "image by " + username;
+        var imageByContent = vd.h("div.AttributionUsername", { textContent: imageBy }, []);
+        var date = new Date(capturedAt).toDateString().split(" ");
+        var formatted = (date.length > 3 ?
+            compact ?
+                [date[3]] :
+                [date[1], date[2] + ",", date[3]] :
+            date).join(" ");
+        var dateContent = vd.h("div.AttributionDate", { textContent: formatted }, []);
+        var imageLink = vd.h("a.AttributionImageContainer", { href: Utils_1.Urls.exporeImage(key), target: "_blank" }, [imageByContent, dateContent]);
+        var compactClass = compact ? ".AttributionCompact" : "";
+        return vd.h("div.AttributionContainer" + compactClass, {}, [mapillaryLink, imageLink]);
+    };
+    AttributionComponent.componentName = "attribution";
+    return AttributionComponent;
+}(Component_1.Component));
+exports.AttributionComponent = AttributionComponent;
+Component_1.ComponentService.register(AttributionComponent);
+exports.default = AttributionComponent;
+
+},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],307:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BackgroundComponent = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var BackgroundComponent = /** @class */ (function (_super) {
+    __extends(BackgroundComponent, _super);
+    function BackgroundComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    BackgroundComponent.prototype._activate = function () {
+        this._container.domRenderer.render$
+            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given image.") });
+    };
+    BackgroundComponent.prototype._deactivate = function () {
+        return;
+    };
+    BackgroundComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    BackgroundComponent.prototype._getBackgroundNode = function (notice) {
+        // todo: add condition for when to display the DOM node
+        return vd.h("div.BackgroundWrapper", {}, [
+            vd.h("p", { textContent: notice }, []),
+        ]);
+    };
+    BackgroundComponent.componentName = "background";
+    return BackgroundComponent;
+}(Component_1.Component));
+exports.BackgroundComponent = BackgroundComponent;
+Component_1.ComponentService.register(BackgroundComponent);
+exports.default = BackgroundComponent;
+
+},{"../Component":291,"virtual-dom":247}],308:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BearingComponent = void 0;
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var UnitBezier = require("@mapbox/unitbezier");
+var rxjs_1 = require("rxjs");
+var Component_1 = require("../Component");
+var Geo_1 = require("../Geo");
+var ViewportCoords_1 = require("../geo/ViewportCoords");
+var ComponentSize_1 = require("./utils/ComponentSize");
+/**
+ * @class BearingComponent
+ *
+ * @classdesc Component for indicating bearing and field of view.
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var bearingComponent = viewer.getComponent("bearing");
+ * bearingComponent.configure({ size: Mapillary.ComponentSize.Small });
+ * ```
+ */
+var BearingComponent = /** @class */ (function (_super) {
+    __extends(BearingComponent, _super);
+    function BearingComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._spatial = new Geo_1.Spatial();
+        _this._viewportCoords = new ViewportCoords_1.default();
+        _this._svgNamespace = "http://www.w3.org/2000/svg";
+        _this._distinctThreshold = Math.PI / 360;
+        _this._animationSpeed = 0.075;
+        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
+        return _this;
+    }
+    BearingComponent.prototype._activate = function () {
+        var _this = this;
+        var cameraBearingFov$ = this._container.renderService.renderCamera$.pipe(operators_1.map(function (rc) {
+            var vFov = _this._spatial.degToRad(rc.perspective.fov);
+            var hFov = rc.perspective.aspect === Number.POSITIVE_INFINITY ?
+                Math.PI :
+                Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;
+            return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];
+        }), operators_1.distinctUntilChanged(function (a1, a2) {
+            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
+                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
+        }));
+        var nodeFov$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        })), this._navigator.panService.panNodes$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], panNodes = _a[1];
+            var node = frame.state.currentNode;
+            var transform = frame.state.currentTransform;
+            if (node.pano) {
+                var panoHFov = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
+                return [panoHFov / 2, panoHFov / 2];
+            }
+            var currentProjectedPoints = _this._computeProjectedPoints(transform);
+            var hFov = _this._spatial.degToRad(_this._computeHorizontalFov(currentProjectedPoints));
+            var hFovLeft = hFov / 2;
+            var hFovRight = hFov / 2;
+            for (var _i = 0, panNodes_1 = panNodes; _i < panNodes_1.length; _i++) {
+                var _b = panNodes_1[_i], n = _b[0], f = _b[2];
+                var diff = _this._spatial.wrap(n.ca - node.ca, -180, 180);
+                if (diff < 0) {
+                    hFovLeft = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
+                }
+                else {
+                    hFovRight = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
+                }
+            }
+            return [hFovLeft, hFovRight];
+        }), operators_1.distinctUntilChanged(function (_a, _b) {
+            var hFovLeft1 = _a[0], hFovRight1 = _a[1];
+            var hFovLeft2 = _b[0], hFovRight2 = _b[1];
+            return Math.abs(hFovLeft2 - hFovLeft1) < _this._distinctThreshold &&
+                Math.abs(hFovRight2 - hFovRight1) < _this._distinctThreshold;
+        }));
+        var offset$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        })), this._container.renderService.bearing$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], bearing = _a[1];
+            var offset = _this._spatial.degToRad(frame.state.currentNode.ca - bearing);
+            return offset;
+        }));
+        var nodeFovOperation$ = new rxjs_1.Subject();
+        var smoothNodeFov$ = nodeFovOperation$.pipe(operators_1.scan(function (state, operation) {
+            return operation(state);
+        }, { alpha: 0, curr: [0, 0, 0], prev: [0, 0, 0] }), operators_1.map(function (state) {
+            var alpha = _this._unitBezier.solve(state.alpha);
+            var curr = state.curr;
+            var prev = state.prev;
+            return [
+                _this._interpolate(prev[0], curr[0], alpha),
+                _this._interpolate(prev[1], curr[1], alpha),
+            ];
+        }));
+        this._fovSubscription = nodeFov$.pipe(operators_1.map(function (nbf) {
+            return function (state) {
+                var a = _this._unitBezier.solve(state.alpha);
+                var c = state.curr;
+                var p = state.prev;
+                var prev = [
+                    _this._interpolate(p[0], c[0], a),
+                    _this._interpolate(p[1], c[1], a),
+                ];
+                var curr = nbf.slice();
+                return {
+                    alpha: 0,
+                    curr: curr,
+                    prev: prev,
+                };
+            };
+        }))
+            .subscribe(nodeFovOperation$);
+        this._fovAnimationSubscription = nodeFov$.pipe(operators_1.switchMap(function () {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.skip(1), operators_1.scan(function (alpha) {
+                return alpha + _this._animationSpeed;
+            }, 0), operators_1.takeWhile(function (alpha) {
+                return alpha <= 1 + _this._animationSpeed;
+            }), operators_1.map(function (alpha) {
+                return Math.min(alpha, 1);
+            }));
+        }), operators_1.map(function (alpha) {
+            return function (nbfState) {
+                return {
+                    alpha: alpha,
+                    curr: nbfState.curr.slice(),
+                    prev: nbfState.prev.slice(),
+                };
+            };
+        }))
+            .subscribe(nodeFovOperation$);
+        var nodeBearingFov$ = rxjs_1.combineLatest(offset$, smoothNodeFov$).pipe(operators_1.map(function (_a) {
+            var offset = _a[0], fov = _a[1];
+            return [offset, fov[0], fov[1]];
+        }));
+        this._renderSubscription = rxjs_1.combineLatest(cameraBearingFov$, nodeBearingFov$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var _b = _a[0], cb = _b[0], cf = _b[1], _c = _a[1], no = _c[0], nfl = _c[1], nfr = _c[2], configuration = _a[2], size = _a[3];
+            var background = _this._createBackground(cb);
+            var fovIndicator = _this._createFovIndicator(nfl, nfr, no);
+            var north = _this._createNorth(cb);
+            var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, cf), "#FFF"));
+            var compact = configuration.size === ComponentSize_1.default.Small ||
+                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
+                ".BearingCompact" : "";
+            return {
+                name: _this._name,
+                vnode: vd.h("div.BearingIndicatorContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [
+                    background,
+                    fovIndicator,
+                    north,
+                    cameraSector,
+                ]),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    BearingComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+        this._fovSubscription.unsubscribe();
+        this._fovAnimationSubscription.unsubscribe();
+    };
+    BearingComponent.prototype._getDefaultConfiguration = function () {
+        return { size: ComponentSize_1.default.Automatic };
+    };
+    BearingComponent.prototype._createFovIndicator = function (fovLeft, fovRigth, offset) {
+        var arc = this._createFovArc(fovLeft, fovRigth);
+        var group = vd.h("g", {
+            attributes: { transform: "translate(18,18)" },
+            namespace: this._svgNamespace,
+        }, [arc]);
+        var svg = vd.h("svg", {
+            attributes: { viewBox: "0 0 36 36" },
+            namespace: this._svgNamespace,
+            style: {
+                height: "36px",
+                left: "2px",
+                position: "absolute",
+                top: "2px",
+                transform: "rotateZ(" + this._spatial.radToDeg(offset) + "deg)",
+                width: "36px",
+            },
+        }, [group]);
+        return svg;
+    };
+    BearingComponent.prototype._createFovArc = function (fovLeft, fovRigth) {
+        var radius = 16.75;
+        var strokeWidth = 2.5;
+        var fov = fovLeft + fovRigth;
+        if (fov > 2 * Math.PI - Math.PI / 90) {
+            return vd.h("circle", {
+                attributes: {
+                    cx: "0",
+                    cy: "0",
+                    "fill-opacity": "0",
+                    r: "" + radius,
+                    stroke: "#FFF",
+                    "stroke-width": "" + strokeWidth,
+                },
+                namespace: this._svgNamespace,
+            }, []);
+        }
+        var arcStart = -Math.PI / 2 - fovLeft;
+        var arcEnd = arcStart + fov;
+        var startX = radius * Math.cos(arcStart);
+        var startY = radius * Math.sin(arcStart);
+        var endX = radius * Math.cos(arcEnd);
+        var endY = radius * Math.sin(arcEnd);
+        var largeArc = fov >= Math.PI ? 1 : 0;
+        var description = "M " + startX + " " + startY + " A " + radius + " " + radius + " 0 " + largeArc + " 1 " + endX + " " + endY;
+        return vd.h("path", {
+            attributes: {
+                d: description,
+                "fill-opacity": "0",
+                stroke: "#FFF",
+                "stroke-width": "" + strokeWidth,
+            },
+            namespace: this._svgNamespace,
+        }, []);
+    };
+    BearingComponent.prototype._createCircleSectorCompass = function (cameraSector) {
+        var group = vd.h("g", {
+            attributes: { transform: "translate(1,1)" },
+            namespace: this._svgNamespace,
+        }, [cameraSector]);
+        var svg = vd.h("svg", {
+            attributes: { viewBox: "0 0 2 2" },
+            namespace: this._svgNamespace,
+            style: {
+                height: "26px",
+                left: "7px",
+                position: "absolute",
+                top: "7px",
+                width: "26px",
+            },
+        }, [group]);
+        return svg;
+    };
+    BearingComponent.prototype._createCircleSector = function (fov, fill) {
+        if (fov > 2 * Math.PI - Math.PI / 90) {
+            return vd.h("circle", {
+                attributes: { cx: "0", cy: "0", fill: fill, r: "1" },
+                namespace: this._svgNamespace,
+            }, []);
+        }
+        var arcStart = -Math.PI / 2 - fov / 2;
+        var arcEnd = arcStart + fov;
+        var startX = Math.cos(arcStart);
+        var startY = Math.sin(arcStart);
+        var endX = Math.cos(arcEnd);
+        var endY = Math.sin(arcEnd);
+        var largeArc = fov >= Math.PI ? 1 : 0;
+        var description = "M 0 0 " + startX + " " + startY + " A 1 1 0 " + largeArc + " 1 " + endX + " " + endY;
+        return vd.h("path", {
+            attributes: { d: description, fill: fill },
+            namespace: this._svgNamespace,
+        }, []);
+    };
+    BearingComponent.prototype._createNorth = function (bearing) {
+        var north = vd.h("div.BearingNorth", []);
+        var container = vd.h("div.BearingNorthContainer", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [north]);
+        return container;
+    };
+    BearingComponent.prototype._createBackground = function (bearing) {
+        return vd.h("div.BearingIndicatorBackground", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [
+            vd.h("div.BearingIndicatorBackgroundCircle", []),
+            vd.h("div.BearingIndicatorBackgroundArrowContainer", [
+                vd.h("div.BearingIndicatorBackgroundArrow", []),
+            ]),
+        ]);
+    };
+    BearingComponent.prototype._computeProjectedPoints = function (transform) {
+        var vertices = [[1, 0]];
+        var directions = [[0, 0.5]];
+        var pointsPerLine = 12;
+        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
+    };
+    BearingComponent.prototype._computeHorizontalFov = function (projectedPoints) {
+        var _this = this;
+        var fovs = projectedPoints
+            .map(function (projectedPoint) {
+            return _this._coordToFov(projectedPoint[0]);
+        });
+        var fov = Math.min.apply(Math, fovs);
+        return fov;
+    };
+    BearingComponent.prototype._coordToFov = function (x) {
+        return this._spatial.radToDeg(2 * Math.atan(x));
+    };
+    BearingComponent.prototype._interpolate = function (x1, x2, alpha) {
+        return (1 - alpha) * x1 + alpha * x2;
+    };
+    BearingComponent.componentName = "bearing";
+    return BearingComponent;
+}(Component_1.Component));
+exports.BearingComponent = BearingComponent;
+Component_1.ComponentService.register(BearingComponent);
+exports.default = BearingComponent;
+
+
+},{"../Component":291,"../Geo":294,"../geo/ViewportCoords":421,"./utils/ComponentSize":404,"@mapbox/unitbezier":2,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],309:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CacheComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Edge_1 = require("../Edge");
+var Component_1 = require("../Component");
+var CacheComponent = /** @class */ (function (_super) {
+    __extends(CacheComponent, _super);
+    function CacheComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    /**
+     * Set the cache depth.
+     *
+     * Configures the cache depth. The cache depth can be different for
+     * different edge direction types.
+     *
+     * @param {ICacheDepth} depth - Cache depth structure.
+     */
+    CacheComponent.prototype.setDepth = function (depth) {
+        this.configure({ depth: depth });
+    };
+    CacheComponent.prototype._activate = function () {
+        var _this = this;
+        this._sequenceSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }), operators_1.filter(function (status) {
+            return status.cached;
+        })), this._configuration$).pipe(operators_1.switchMap(function (nc) {
+            var status = nc[0];
+            var configuration = nc[1];
+            var sequenceDepth = Math.max(0, Math.min(4, configuration.depth.sequence));
+            var next$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Next, sequenceDepth);
+            var prev$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Prev, sequenceDepth);
+            return rxjs_1.merge(next$, prev$).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to cache sequence edges.", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+        this._spatialSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return rxjs_1.combineLatest(rxjs_1.of(node), node.spatialEdges$.pipe(operators_1.filter(function (status) {
+                return status.cached;
+            })));
+        })), this._configuration$).pipe(operators_1.switchMap(function (_a) {
+            var _b = _a[0], node = _b[0], edgeStatus = _b[1], configuration = _a[1];
+            var edges = edgeStatus.edges;
+            var depth = configuration.depth;
+            var panoDepth = Math.max(0, Math.min(2, depth.pano));
+            var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));
+            var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));
+            var pano$ = _this._cache$(edges, Edge_1.EdgeDirection.Pano, panoDepth);
+            var forward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepForward, stepDepth);
+            var backward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepBackward, stepDepth);
+            var left$ = _this._cache$(edges, Edge_1.EdgeDirection.StepLeft, stepDepth);
+            var right$ = _this._cache$(edges, Edge_1.EdgeDirection.StepRight, stepDepth);
+            var turnLeft$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnLeft, turnDepth);
+            var turnRight$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnRight, turnDepth);
+            var turnU$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnU, turnDepth);
+            return rxjs_1.merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to cache spatial edges.", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+    };
+    CacheComponent.prototype._deactivate = function () {
+        this._sequenceSubscription.unsubscribe();
+        this._spatialSubscription.unsubscribe();
+    };
+    CacheComponent.prototype._getDefaultConfiguration = function () {
+        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };
+    };
+    CacheComponent.prototype._cache$ = function (edges, direction, depth) {
+        var _this = this;
+        return rxjs_1.zip(rxjs_1.of(edges), rxjs_1.of(depth)).pipe(operators_1.expand(function (ed) {
+            var es = ed[0];
+            var d = ed[1];
+            var edgesDepths$ = [];
+            if (d > 0) {
+                for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
+                    var edge = es_1[_i];
+                    if (edge.data.direction === direction) {
+                        edgesDepths$.push(rxjs_1.zip(_this._navigator.graphService.cacheNode$(edge.to).pipe(operators_1.mergeMap(function (n) {
+                            return _this._nodeToEdges$(n, direction);
+                        })), rxjs_1.of(d - 1)));
+                    }
+                }
+            }
+            return rxjs_1.from(edgesDepths$).pipe(operators_1.mergeAll());
+        }), operators_1.skip(1));
+    };
+    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
+        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+            node.sequenceEdges$ :
+            node.spatialEdges$).pipe(operators_1.first(function (status) {
+            return status.cached;
+        }), operators_1.map(function (status) {
+            return status.edges;
+        }));
+    };
+    CacheComponent.componentName = "cache";
+    return CacheComponent;
+}(Component_1.Component));
+exports.CacheComponent = CacheComponent;
+Component_1.ComponentService.register(CacheComponent);
+exports.default = CacheComponent;
+
+},{"../Component":291,"../Edge":292,"rxjs":43,"rxjs/operators":241}],310:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Component = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Utils_1 = require("../Utils");
+var Component = /** @class */ (function (_super) {
+    __extends(Component, _super);
+    function Component(name, container, navigator) {
+        var _this = _super.call(this) || this;
+        _this._activated$ = new rxjs_1.BehaviorSubject(false);
+        _this._configurationSubject$ = new rxjs_1.Subject();
+        _this._activated = false;
+        _this._container = container;
+        _this._name = name;
+        _this._navigator = navigator;
+        _this._configuration$ =
+            _this._configurationSubject$.pipe(operators_1.startWith(_this.defaultConfiguration), operators_1.scan(function (conf, newConf) {
+                for (var key in newConf) {
+                    if (newConf.hasOwnProperty(key)) {
+                        conf[key] = newConf[key];
+                    }
+                }
+                return conf;
+            }), operators_1.publishReplay(1), operators_1.refCount());
+        _this._configuration$.subscribe(function () { });
+        return _this;
+    }
+    Object.defineProperty(Component.prototype, "activated", {
+        get: function () {
+            return this._activated;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "activated$", {
+        /** @ignore */
+        get: function () {
+            return this._activated$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "defaultConfiguration", {
+        /**
+         * Get default configuration.
+         *
+         * @returns {TConfiguration} Default configuration for component.
+         */
+        get: function () {
+            return this._getDefaultConfiguration();
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "configuration$", {
+        /** @ignore */
+        get: function () {
+            return this._configuration$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "name", {
+        /**
+         * Get name.
+         *
+         * @description The name of the component. Used when interacting with the
+         * component through the Viewer's API.
+         */
+        get: function () {
+            return this._name;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Component.prototype.activate = function (conf) {
+        if (this._activated) {
+            return;
+        }
+        if (conf !== undefined) {
+            this._configurationSubject$.next(conf);
+        }
+        this._activated = true;
+        this._activate();
+        this._activated$.next(true);
+    };
+    Component.prototype.configure = function (conf) {
+        this._configurationSubject$.next(conf);
+    };
+    Component.prototype.deactivate = function () {
+        if (!this._activated) {
+            return;
+        }
+        this._activated = false;
+        this._deactivate();
+        this._container.domRenderer.clear(this._name);
+        this._container.glRenderer.clear(this._name);
+        this._activated$.next(false);
+    };
+    /**
+     * Detect the viewer's new width and height and resize the component's
+     * rendered elements accordingly if applicable.
+     *
+     * @ignore
+     */
+    Component.prototype.resize = function () { return; };
+    Component.componentName = "not_worthy";
+    return Component;
+}(Utils_1.EventEmitter));
+exports.Component = Component;
+exports.default = Component;
+
+},{"../Utils":301,"rxjs":43,"rxjs/operators":241}],311:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ComponentService = void 0;
+var Error_1 = require("../Error");
+var ComponentService = /** @class */ (function () {
+    function ComponentService(container, navigator) {
+        this._components = {};
+        for (var componentName in ComponentService.registeredComponents) {
+            if (!ComponentService.registeredComponents.hasOwnProperty(componentName)) {
+                continue;
+            }
+            var component = ComponentService.registeredComponents[componentName];
+            this._components[componentName] = {
+                active: false,
+                component: new component(componentName, container, navigator),
+            };
+        }
+        this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
+        this._coverComponent.activate();
+        this._coverActivated = true;
+    }
+    ComponentService.register = function (component) {
+        if (ComponentService.registeredComponents[component.componentName] === undefined) {
+            ComponentService.registeredComponents[component.componentName] = component;
+        }
+    };
+    ComponentService.registerCover = function (coverComponent) {
+        ComponentService.registeredCoverComponent = coverComponent;
+    };
+    Object.defineProperty(ComponentService.prototype, "coverActivated", {
+        get: function () {
+            return this._coverActivated;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    ComponentService.prototype.activateCover = function () {
+        if (this._coverActivated) {
+            return;
+        }
+        this._coverActivated = true;
+        for (var componentName in this._components) {
+            if (!this._components.hasOwnProperty(componentName)) {
+                continue;
+            }
+            var component = this._components[componentName];
+            if (component.active) {
+                component.component.deactivate();
+            }
+        }
+    };
+    ComponentService.prototype.deactivateCover = function () {
+        if (!this._coverActivated) {
+            return;
+        }
+        this._coverActivated = false;
+        for (var componentName in this._components) {
+            if (!this._components.hasOwnProperty(componentName)) {
+                continue;
+            }
+            var component = this._components[componentName];
+            if (component.active) {
+                component.component.activate();
+            }
+        }
+    };
+    ComponentService.prototype.activate = function (name) {
+        this._checkName(name);
+        this._components[name].active = true;
+        if (!this._coverActivated) {
+            this.get(name).activate();
+        }
+    };
+    ComponentService.prototype.configure = function (name, conf) {
+        this._checkName(name);
+        this.get(name).configure(conf);
+    };
+    ComponentService.prototype.deactivate = function (name) {
+        this._checkName(name);
+        this._components[name].active = false;
+        if (!this._coverActivated) {
+            this.get(name).deactivate();
+        }
+    };
+    ComponentService.prototype.get = function (name) {
+        return this._components[name].component;
+    };
+    ComponentService.prototype.getCover = function () {
+        return this._coverComponent;
+    };
+    ComponentService.prototype._checkName = function (name) {
+        if (!(name in this._components)) {
+            throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name);
+        }
+    };
+    ComponentService.registeredComponents = {};
+    return ComponentService;
+}());
+exports.ComponentService = ComponentService;
+exports.default = ComponentService;
+
+},{"../Error":293}],312:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CoverComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var Utils_1 = require("../Utils");
+var Viewer_1 = require("../Viewer");
+var CoverComponent = /** @class */ (function (_super) {
+    __extends(CoverComponent, _super);
+    function CoverComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    CoverComponent.prototype._activate = function () {
+        var _this = this;
+        this._configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (configuration) {
+            return configuration.state;
+        }), operators_1.switchMap(function (configuration) {
+            return rxjs_1.combineLatest(rxjs_1.of(configuration.state), _this._navigator.stateService.currentNode$);
+        }), operators_1.switchMap(function (_a) {
+            var state = _a[0], node = _a[1];
+            var keySrc$ = rxjs_1.combineLatest(rxjs_1.of(node.key), node.image$.pipe(operators_1.filter(function (image) {
+                return !!image;
+            }), operators_1.map(function (image) {
+                return image.src;
+            })));
+            return state === Component_1.CoverState.Visible ? keySrc$.pipe(operators_1.first()) : keySrc$;
+        }), operators_1.distinctUntilChanged(function (_a, _b) {
+            var k1 = _a[0], s1 = _a[1];
+            var k2 = _b[0], s2 = _b[1];
+            return k1 === k2 && s1 === s2;
+        }), operators_1.map(function (_a) {
+            var key = _a[0], src = _a[1];
+            return { key: key, src: src };
+        }))
+            .subscribe(this._configurationSubject$);
+        this._renderSubscription = rxjs_1.combineLatest(this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var configuration = _a[0], size = _a[1];
+            if (!configuration.key) {
+                return { name: _this._name, vnode: vd.h("div", []) };
+            }
+            var compactClass = size.width <= 640 || size.height <= 480 ? ".CoverCompact" : "";
+            if (configuration.state === Component_1.CoverState.Hidden) {
+                var doneContainer = vd.h("div.CoverContainer.CoverDone" + compactClass, [_this._getCoverBackgroundVNode(configuration)]);
+                return { name: _this._name, vnode: doneContainer };
+            }
+            var container = vd.h("div.CoverContainer" + compactClass, [_this._getCoverButtonVNode(configuration)]);
+            return { name: _this._name, vnode: container };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    CoverComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+        this._keySubscription.unsubscribe();
+    };
+    CoverComponent.prototype._getDefaultConfiguration = function () {
+        return { state: Component_1.CoverState.Visible };
+    };
+    CoverComponent.prototype._getCoverButtonVNode = function (configuration) {
+        var _this = this;
+        var cover = configuration.state === Component_1.CoverState.Loading ? "div.Cover.CoverLoading" : "div.Cover";
+        var coverButton = vd.h("div.CoverButton", [vd.h("div.CoverButtonIcon", [])]);
+        var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []);
+        var coverIndicator = vd.h("div.CoverIndicator", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, []);
+        return vd.h(cover, [
+            this._getCoverBackgroundVNode(configuration),
+            coverIndicator,
+            coverButton,
+            coverLogo,
+        ]);
+    };
+    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
+        var url = conf.src != null ?
+            conf.src : Utils_1.Urls.thumbnail(conf.key, Viewer_1.ImageSize.Size640);
+        var properties = { style: { backgroundImage: "url(" + url + ")" } };
+        var children = [];
+        if (conf.state === Component_1.CoverState.Loading) {
+            children.push(vd.h("div.Spinner", {}, []));
+        }
+        return vd.h("div.CoverBackground", properties, children);
+    };
+    CoverComponent.componentName = "cover";
+    return CoverComponent;
+}(Component_1.Component));
+exports.CoverComponent = CoverComponent;
+Component_1.ComponentService.registerCover(CoverComponent);
+exports.default = CoverComponent;
+
+},{"../Component":291,"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],313:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DebugComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var DebugComponent = /** @class */ (function (_super) {
+    __extends(DebugComponent, _super);
+    function DebugComponent() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this._open$ = new rxjs_1.BehaviorSubject(false);
+        return _this;
+    }
+    DebugComponent.prototype._activate = function () {
+        var _this = this;
+        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._open$, this._navigator.imageLoadingService.loadstatus$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], open = _a[1], loadStatus = _a[2];
+            return { name: _this._name, vnode: _this._getDebugVNode(open, _this._getDebugInfo(frame, loadStatus)) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    DebugComponent.prototype._deactivate = function () {
+        this._disposable.unsubscribe();
+    };
+    DebugComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    DebugComponent.prototype._getDebugInfo = function (frame, loadStatus) {
+        var ret = [];
+        ret.push(vd.h("h2", "Node"));
+        if (frame.state.currentNode) {
+            ret.push(vd.h("p", "currentNode: " + frame.state.currentNode.key));
+        }
+        if (frame.state.previousNode) {
+            ret.push(vd.h("p", "previousNode: " + frame.state.previousNode.key));
+        }
+        ret.push(vd.h("h2", "Loading"));
+        var total = 0;
+        var loaded = 0;
+        var loading = 0;
+        for (var key in loadStatus) {
+            if (!loadStatus.hasOwnProperty(key)) {
+                continue;
+            }
+            var status_1 = loadStatus[key];
+            total += status_1.loaded;
+            if (status_1.loaded !== status_1.total) {
+                loading++;
+            }
+            else {
+                loaded++;
+            }
+        }
+        ret.push(vd.h("p", "Loaded Images: " + loaded));
+        ret.push(vd.h("p", "Loading Images: " + loading));
+        ret.push(vd.h("p", "Total bytes loaded: " + total));
+        ret.push(vd.h("h2", "Camera"));
+        ret.push(vd.h("p", "camera.position.x: " + frame.state.camera.position.x));
+        ret.push(vd.h("p", "camera.position.y: " + frame.state.camera.position.y));
+        ret.push(vd.h("p", "camera.position.z: " + frame.state.camera.position.z));
+        ret.push(vd.h("p", "camera.lookat.x: " + frame.state.camera.lookat.x));
+        ret.push(vd.h("p", "camera.lookat.y: " + frame.state.camera.lookat.y));
+        ret.push(vd.h("p", "camera.lookat.z: " + frame.state.camera.lookat.z));
+        ret.push(vd.h("p", "camera.up.x: " + frame.state.camera.up.x));
+        ret.push(vd.h("p", "camera.up.y: " + frame.state.camera.up.y));
+        ret.push(vd.h("p", "camera.up.z: " + frame.state.camera.up.z));
+        return ret;
+    };
+    DebugComponent.prototype._getDebugVNode = function (open, info) {
+        if (open) {
+            return vd.h("div.Debug", {}, [
+                vd.h("h2", {}, ["Debug"]),
+                this._getDebugVNodeButton(open),
+                vd.h("pre", {}, info),
+            ]);
+        }
+        else {
+            return this._getDebugVNodeButton(open);
+        }
+    };
+    DebugComponent.prototype._getDebugVNodeButton = function (open) {
+        var buttonText = open ? "Disable Debug" : "D";
+        var buttonCssClass = open ? "" : ".DebugButtonFixed";
+        if (open) {
+            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._closeDebugElement.bind(this) }, [buttonText]);
+        }
+        else {
+            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._openDebugElement.bind(this) }, [buttonText]);
+        }
+    };
+    DebugComponent.prototype._closeDebugElement = function (open) {
+        this._open$.next(false);
+    };
+    DebugComponent.prototype._openDebugElement = function () {
+        this._open$.next(true);
+    };
+    DebugComponent.componentName = "debug";
+    return DebugComponent;
+}(Component_1.Component));
+exports.DebugComponent = DebugComponent;
+Component_1.ComponentService.register(DebugComponent);
+exports.default = DebugComponent;
+
+},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],314:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var Utils_1 = require("../Utils");
+var ImageComponent = /** @class */ (function (_super) {
+    __extends(ImageComponent, _super);
+    function ImageComponent(name, container, navigator, dom) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._canvasId = container.id + "-" + _this._name;
+        _this._dom = !!dom ? dom : new Utils_1.DOM();
+        return _this;
+    }
+    ImageComponent.prototype._activate = function () {
+        var _this = this;
+        var canvasSize$ = this._container.domRenderer.element$.pipe(operators_1.map(function (element) {
+            return _this._dom.document.getElementById(_this._canvasId);
+        }), operators_1.filter(function (canvas) {
+            return !!canvas;
+        }), operators_1.map(function (canvas) {
+            var adaptableDomRenderer = canvas.parentElement;
+            var width = adaptableDomRenderer.offsetWidth;
+            var height = adaptableDomRenderer.offsetHeight;
+            return [canvas, { height: height, width: width }];
+        }), operators_1.distinctUntilChanged(function (s1, s2) {
+            return s1.height === s2.height && s1.width === s2.width;
+        }, function (_a) {
+            var canvas = _a[0], size = _a[1];
+            return size;
+        }));
+        this.drawSubscription = rxjs_1.combineLatest(canvasSize$, this._navigator.stateService.currentNode$)
+            .subscribe(function (_a) {
+            var _b = _a[0], canvas = _b[0], size = _b[1], node = _a[1];
+            canvas.width = size.width;
+            canvas.height = size.height;
+            canvas
+                .getContext("2d")
+                .drawImage(node.image, 0, 0, size.width, size.height);
+        });
+        this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) });
+    };
+    ImageComponent.prototype._deactivate = function () {
+        this.drawSubscription.unsubscribe();
+    };
+    ImageComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    ImageComponent.componentName = "image";
+    return ImageComponent;
+}(Component_1.Component));
+exports.ImageComponent = ImageComponent;
+Component_1.ComponentService.register(ImageComponent);
+exports.default = ImageComponent;
+
+
+},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],315:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.LoadingComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var LoadingComponent = /** @class */ (function (_super) {
+    __extends(LoadingComponent, _super);
+    function LoadingComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    LoadingComponent.prototype._activate = function () {
+        var _this = this;
+        this._loadingSubscription = this._navigator.loadingService.loading$.pipe(operators_1.switchMap(function (loading) {
+            return loading ?
+                _this._navigator.imageLoadingService.loadstatus$ :
+                rxjs_1.of({});
+        }), operators_1.map(function (loadStatus) {
+            var total = 0;
+            var loaded = 0;
+            for (var key in loadStatus) {
+                if (!loadStatus.hasOwnProperty(key)) {
+                    continue;
+                }
+                var status_1 = loadStatus[key];
+                if (status_1.loaded !== status_1.total) {
+                    loaded += status_1.loaded;
+                    total += status_1.total;
+                }
+            }
+            var percentage = 100;
+            if (total !== 0) {
+                percentage = (loaded / total) * 100;
+            }
+            return { name: _this._name, vnode: _this._getBarVNode(percentage) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    LoadingComponent.prototype._deactivate = function () {
+        this._loadingSubscription.unsubscribe();
+    };
+    LoadingComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    LoadingComponent.prototype._getBarVNode = function (percentage) {
+        var loadingBarStyle = {};
+        var loadingContainerStyle = {};
+        if (percentage !== 100) {
+            loadingBarStyle.width = percentage.toFixed(0) + "%";
+            loadingBarStyle.opacity = "1";
+        }
+        else {
+            loadingBarStyle.width = "100%";
+            loadingBarStyle.opacity = "0";
+        }
+        return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]);
+    };
+    LoadingComponent.componentName = "loading";
+    return LoadingComponent;
+}(Component_1.Component));
+exports.LoadingComponent = LoadingComponent;
+Component_1.ComponentService.register(LoadingComponent);
+exports.default = LoadingComponent;
+
+},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],316:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.NavigationComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Edge_1 = require("../Edge");
+var Error_1 = require("../Error");
+var Component_1 = require("../Component");
+/**
+ * @class NavigationComponent
+ *
+ * @classdesc Fallback navigation component for environments without WebGL support.
+ *
+ * Replaces the functionality in the Direction and Sequence components.
+ */
+var NavigationComponent = /** @class */ (function (_super) {
+    __extends(NavigationComponent, _super);
+    /** @ignore */
+    function NavigationComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._seqNames = {};
+        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Prev]] = "Prev";
+        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Next]] = "Next";
+        _this._spaTopNames = {};
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnLeft]] = "Turnleft";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepLeft]] = "Left";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepForward]] = "Forward";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepRight]] = "Right";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnRight]] = "Turnright";
+        _this._spaBottomNames = {};
+        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnU]] = "Turnaround";
+        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepBackward]] = "Backward";
+        return _this;
+    }
+    NavigationComponent.prototype._activate = function () {
+        var _this = this;
+        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._configuration$).pipe(operators_1.switchMap(function (_a) {
+            var node = _a[0], configuration = _a[1];
+            var sequenceEdges$ = configuration.sequence ?
+                node.sequenceEdges$.pipe(operators_1.map(function (status) {
+                    return status.edges
+                        .map(function (edge) {
+                        return edge.data.direction;
+                    });
+                })) :
+                rxjs_1.of([]);
+            var spatialEdges$ = !node.pano && configuration.spatial ?
+                node.spatialEdges$.pipe(operators_1.map(function (status) {
+                    return status.edges
+                        .map(function (edge) {
+                        return edge.data.direction;
+                    });
+                })) :
+                rxjs_1.of([]);
+            return rxjs_1.combineLatest(sequenceEdges$, spatialEdges$).pipe(operators_1.map(function (_a) {
+                var seq = _a[0], spa = _a[1];
+                return seq.concat(spa);
+            }));
+        }), operators_1.map(function (edgeDirections) {
+            var seqs = _this._createArrowRow(_this._seqNames, edgeDirections);
+            var spaTops = _this._createArrowRow(_this._spaTopNames, edgeDirections);
+            var spaBottoms = _this._createArrowRow(_this._spaBottomNames, edgeDirections);
+            var seqContainer = vd.h("div.NavigationSequence", seqs);
+            var spaTopContainer = vd.h("div.NavigationSpatialTop", spaTops);
+            var spaBottomContainer = vd.h("div.NavigationSpatialBottom", spaBottoms);
+            var spaContainer = vd.h("div.NavigationSpatial", [spaTopContainer, spaBottomContainer]);
+            return { name: _this._name, vnode: vd.h("div.NavigationContainer", [seqContainer, spaContainer]) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    NavigationComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+    };
+    NavigationComponent.prototype._getDefaultConfiguration = function () {
+        return { sequence: true, spatial: true };
+    };
+    NavigationComponent.prototype._createArrowRow = function (arrowNames, edgeDirections) {
+        var arrows = [];
+        for (var arrowName in arrowNames) {
+            if (!(arrowNames.hasOwnProperty(arrowName))) {
+                continue;
+            }
+            var direction = Edge_1.EdgeDirection[arrowName];
+            if (edgeDirections.indexOf(direction) !== -1) {
+                arrows.push(this._createVNode(direction, arrowNames[arrowName], "visible"));
+            }
+            else {
+                arrows.push(this._createVNode(direction, arrowNames[arrowName], "hidden"));
+            }
+        }
+        return arrows;
+    };
+    NavigationComponent.prototype._createVNode = function (direction, name, visibility) {
+        var _this = this;
+        return vd.h("span.Direction.Direction" + name, {
+            onclick: function (ev) {
+                _this._navigator.moveDir$(direction)
+                    .subscribe(undefined, function (error) {
+                    if (!(error instanceof Error_1.AbortMapillaryError)) {
+                        console.error(error);
+                    }
+                });
+            },
+            style: {
+                visibility: visibility,
+            },
+        }, []);
+    };
+    NavigationComponent.componentName = "navigation";
+    return NavigationComponent;
+}(Component_1.Component));
+exports.NavigationComponent = NavigationComponent;
+Component_1.ComponentService.register(NavigationComponent);
+exports.default = NavigationComponent;
+
+},{"../Component":291,"../Edge":292,"../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],317:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RouteComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var DescriptionState = /** @class */ (function () {
+    function DescriptionState() {
+    }
+    return DescriptionState;
+}());
+var RouteState = /** @class */ (function () {
+    function RouteState() {
+    }
+    return RouteState;
+}());
+var RouteTrack = /** @class */ (function () {
+    function RouteTrack() {
+        this.nodeInstructions = [];
+        this.nodeInstructionsOrdered = [];
+    }
+    return RouteTrack;
+}());
+var RouteComponent = /** @class */ (function (_super) {
+    __extends(RouteComponent, _super);
+    function RouteComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    RouteComponent.prototype.play = function () {
+        this.configure({ playing: true });
+    };
+    RouteComponent.prototype.stop = function () {
+        this.configure({ playing: false });
+    };
+    RouteComponent.prototype._activate = function () {
+        var _this = this;
+        var slowedStream$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return (frame.id % 2) === 0;
+        }), operators_1.filter(function (frame) {
+            return frame.state.nodesAhead < 15;
+        }), operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.lastNode.key;
+        }));
+        var routeTrack$ = rxjs_1.combineLatest(this.configuration$.pipe(operators_1.mergeMap(function (conf) {
+            return rxjs_1.from(conf.paths);
+        }), operators_1.distinct(function (p) {
+            return p.sequenceKey;
+        }), operators_1.mergeMap(function (path) {
+            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]).pipe(operators_1.map(function (sequenceByKey) {
+                return sequenceByKey[path.sequenceKey];
+            }));
+        })), this.configuration$).pipe(operators_1.map(function (_a) {
+            var sequence = _a[0], conf = _a[1];
+            var i = 0;
+            var instructionPlaces = [];
+            for (var _i = 0, _b = conf.paths; _i < _b.length; _i++) {
+                var path = _b[_i];
+                if (path.sequenceKey === sequence.key) {
+                    var nodeInstructions = [];
+                    var saveKey = false;
+                    for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
+                        var key = _d[_c];
+                        if (path.startKey === key) {
+                            saveKey = true;
+                        }
+                        if (saveKey) {
+                            var description = null;
+                            for (var _e = 0, _f = path.infoKeys; _e < _f.length; _e++) {
+                                var infoKey = _f[_e];
+                                if (infoKey.key === key) {
+                                    description = infoKey.description;
+                                }
+                            }
+                            nodeInstructions.push({ description: description, key: key });
+                        }
+                        if (path.stopKey === key) {
+                            saveKey = false;
+                        }
+                    }
+                    instructionPlaces.push({ nodeInstructions: nodeInstructions, place: i });
+                }
+                i++;
+            }
+            return instructionPlaces;
+        }), operators_1.scan(function (routeTrack, instructionPlaces) {
+            for (var _i = 0, instructionPlaces_1 = instructionPlaces; _i < instructionPlaces_1.length; _i++) {
+                var instructionPlace = instructionPlaces_1[_i];
+                routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;
+            }
+            for (var place in routeTrack.nodeInstructionsOrdered) {
+                if (!routeTrack.nodeInstructionsOrdered.hasOwnProperty(place)) {
+                    continue;
+                }
+                var instructionGroup = routeTrack.nodeInstructionsOrdered[place];
+                for (var _a = 0, instructionGroup_1 = instructionGroup; _a < instructionGroup_1.length; _a++) {
+                    var instruction = instructionGroup_1[_a];
+                    routeTrack.nodeInstructions.push(instruction);
+                }
+            }
+            return routeTrack;
+        }, new RouteTrack()));
+        var cacheNode$ = rxjs_1.combineLatest(slowedStream$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], routeTrack = _a[1], conf = _a[2];
+            return { conf: conf, frame: frame, routeTrack: routeTrack };
+        }), operators_1.scan(function (routeState, rtAndFrame) {
+            if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {
+                routeState.routeTrack = rtAndFrame.routeTrack;
+                routeState.currentNode = rtAndFrame.frame.state.currentNode;
+                routeState.lastNode = rtAndFrame.frame.state.lastNode;
+                routeState.playing = true;
+            }
+            else {
+                _this._navigator.stateService.cutNodes();
+                routeState.playing = false;
+            }
+            return routeState;
+        }, new RouteState()), operators_1.filter(function (routeState) {
+            return routeState.playing;
+        }), operators_1.filter(function (routeState) {
+            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
+                var nodeInstruction = _a[_i];
+                if (!nodeInstruction) {
+                    continue;
+                }
+                if (nodeInstruction.key === routeState.lastNode.key) {
+                    return true;
+                }
+            }
+            return false;
+        }), operators_1.distinctUntilChanged(undefined, function (routeState) {
+            return routeState.lastNode.key;
+        }), operators_1.mergeMap(function (routeState) {
+            var i = 0;
+            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
+                var nodeInstruction = _a[_i];
+                if (nodeInstruction.key === routeState.lastNode.key) {
+                    break;
+                }
+                i++;
+            }
+            var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1];
+            if (!nextInstruction) {
+                return rxjs_1.of(null);
+            }
+            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
+        }));
+        this._disposable = rxjs_1.combineLatest(cacheNode$, this.configuration$).pipe(operators_1.map(function (_a) {
+            var node = _a[0], conf = _a[1];
+            return { conf: conf, node: node };
+        }), operators_1.filter(function (cAN) {
+            return cAN.node !== null && cAN.conf.playing;
+        }), operators_1.pluck("node"))
+            .subscribe(this._navigator.stateService.appendNode$);
+        this._disposableDescription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
+            var node = _a[0], routeTrack = _a[1], conf = _a[2];
+            if (conf.playing !== undefined && !conf.playing) {
+                return "quit";
+            }
+            var description = null;
+            for (var _i = 0, _b = routeTrack.nodeInstructions; _i < _b.length; _i++) {
+                var nodeInstruction = _b[_i];
+                if (nodeInstruction.key === node.key) {
+                    description = nodeInstruction.description;
+                    break;
+                }
+            }
+            return description;
+        }), operators_1.scan(function (descriptionState, description) {
+            if (description !== descriptionState.description && description !== null) {
+                descriptionState.description = description;
+                descriptionState.showsLeft = 6;
+            }
+            else {
+                descriptionState.showsLeft--;
+            }
+            if (description === "quit") {
+                descriptionState.description = null;
+            }
+            return descriptionState;
+        }, new DescriptionState()), operators_1.map(function (descriptionState) {
+            if (descriptionState.showsLeft > 0 && descriptionState.description) {
+                return { name: _this._name, vnode: _this._getRouteAnnotationNode(descriptionState.description) };
+            }
+            else {
+                return { name: _this._name, vnode: vd.h("div", []) };
+            }
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    RouteComponent.prototype._deactivate = function () {
+        this._disposable.unsubscribe();
+        this._disposableDescription.unsubscribe();
+    };
+    RouteComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
+        return vd.h("div.RouteFrame", {}, [
             vd.h("p", { textContent: description }, []),
         ]);
     };
-    RouteComponent.componentName = "route";
-    return RouteComponent;
-}(Component_1.Component));
-exports.RouteComponent = RouteComponent;
-Component_1.ComponentService.register(RouteComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RouteComponent;
-
-},{"../Component":207,"rxjs/Observable":28,"rxjs/add/observable/fromPromise":42,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":49,"rxjs/add/operator/distinct":52,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/pluck":65,"rxjs/add/operator/scan":68,"underscore":158,"virtual-dom":163}],232:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/buffer");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-var Component_1 = require("../Component");
-var StatsComponent = (function (_super) {
-    __extends(StatsComponent, _super);
-    function StatsComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-    }
-    StatsComponent.prototype._activate = function () {
+    RouteComponent.componentName = "route";
+    return RouteComponent;
+}(Component_1.Component));
+exports.RouteComponent = RouteComponent;
+Component_1.ComponentService.register(RouteComponent);
+exports.default = RouteComponent;
+
+},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],318:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.StatsComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../Component");
+var StatsComponent = /** @class */ (function (_super) {
+    __extends(StatsComponent, _super);
+    function StatsComponent(name, container, navigator, scheduler) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._scheduler = scheduler;
+        return _this;
+    }
+    StatsComponent.prototype._activate = function () {
+        var _this = this;
+        this._sequenceSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.scan(function (keys, node) {
+            var sKey = node.sequenceKey;
+            keys.report = [];
+            if (!(sKey in keys.reported)) {
+                keys.report = [sKey];
+                keys.reported[sKey] = true;
+            }
+            return keys;
+        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
+            return keys.report.length > 0;
+        }), operators_1.mergeMap(function (keys) {
+            return _this._navigator.apiV3.sequenceViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to report sequence stats (" + keys.report + ")", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+        this._imageSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
+            return node.key;
+        })).pipe(operators_1.buffer(this._navigator.stateService.currentNode$.pipe(operators_1.debounceTime(5000, this._scheduler))), operators_1.scan(function (keys, newKeys) {
+            keys.report = [];
+            for (var _i = 0, newKeys_1 = newKeys; _i < newKeys_1.length; _i++) {
+                var key = newKeys_1[_i];
+                if (!(key in keys.reported)) {
+                    keys.report.push(key);
+                    keys.reported[key] = true;
+                }
+            }
+            return keys;
+        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
+            return keys.report.length > 0;
+        }), operators_1.mergeMap(function (keys) {
+            return _this._navigator.apiV3.imageViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to report image stats (" + keys.report + ")", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+    };
+    StatsComponent.prototype._deactivate = function () {
+        this._sequenceSubscription.unsubscribe();
+        this._imageSubscription.unsubscribe();
+    };
+    StatsComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    StatsComponent.componentName = "stats";
+    return StatsComponent;
+}(Component_1.Component));
+exports.StatsComponent = StatsComponent;
+Component_1.ComponentService.register(StatsComponent);
+exports.default = StatsComponent;
+
+},{"../Component":291,"rxjs":43,"rxjs/operators":241}],319:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DirectionComponent = void 0;
+var vd = require("virtual-dom");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * @class DirectionComponent
+ * @classdesc Component showing navigation arrows for steps and turns.
+ */
+var DirectionComponent = /** @class */ (function (_super) {
+    __extends(DirectionComponent, _super);
+    function DirectionComponent(name, container, navigator, directionDOMRenderer) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._renderer = !!directionDOMRenderer ?
+            directionDOMRenderer :
+            new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, { height: container.element.offsetHeight, width: container.element.offsetWidth });
+        _this._hoveredKeySubject$ = new rxjs_1.Subject();
+        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
+        return _this;
+    }
+    Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", {
+        /**
+         * Get hovered key observable.
+         *
+         * @description An observable emitting the key of the node for the direction
+         * arrow that is being hovered. When the mouse leaves a direction arrow null
+         * is emitted.
+         *
+         * @returns {Observable<string>}
+         */
+        get: function () {
+            return this._hoveredKey$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Set highlight key.
+     *
+     * @description The arrow pointing towards the node corresponding to the
+     * highlight key will be highlighted.
+     *
+     * @param {string} highlightKey Key of node to be highlighted if existing
+     * among arrows.
+     */
+    DirectionComponent.prototype.setHighlightKey = function (highlightKey) {
+        this.configure({ highlightKey: highlightKey });
+    };
+    /**
+     * Set min width of container element.
+     *
+     * @description  Set min width of the non transformed container element holding
+     * the navigation arrows. If the min width is larger than the max width the
+     * min width value will be used.
+     *
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
+     */
+    DirectionComponent.prototype.setMinWidth = function (minWidth) {
+        this.configure({ minWidth: minWidth });
+    };
+    /**
+     * Set max width of container element.
+     *
+     * @description Set max width of the non transformed container element holding
+     * the navigation arrows. If the min width is larger than the max width the
+     * min width value will be used.
+     *
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
+     */
+    DirectionComponent.prototype.setMaxWidth = function (maxWidth) {
+        this.configure({ maxWidth: maxWidth });
+    };
+    DirectionComponent.prototype._activate = function () {
+        var _this = this;
+        this._configurationSubscription = this._configuration$
+            .subscribe(function (configuration) {
+            _this._renderer.setConfiguration(configuration);
+        });
+        this._resizeSubscription = this._container.renderService.size$
+            .subscribe(function (size) {
+            _this._renderer.resize(size);
+        });
+        this._nodeSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.tap(function (node) {
+            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
+            _this._renderer.setNode(node);
+        }), operators_1.withLatestFrom(this._configuration$), operators_1.switchMap(function (_a) {
+            var node = _a[0], configuration = _a[1];
+            return rxjs_1.combineLatest(node.spatialEdges$, configuration.distinguishSequence ?
+                _this._navigator.graphService
+                    .cacheSequence$(node.sequenceKey).pipe(operators_1.catchError(function (error, caught) {
+                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
+                    return rxjs_1.of(null);
+                })) :
+                rxjs_1.of(null));
+        }))
+            .subscribe(function (_a) {
+            var edgeStatus = _a[0], sequence = _a[1];
+            _this._renderer.setEdges(edgeStatus, sequence);
+        });
+        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$.pipe(operators_1.tap(function (renderCamera) {
+            _this._renderer.setRenderCamera(renderCamera);
+        }), operators_1.map(function () {
+            return _this._renderer;
+        }), operators_1.filter(function (renderer) {
+            return renderer.needsRender;
+        }), operators_1.map(function (renderer) {
+            return { name: _this._name, vnode: renderer.render(_this._navigator) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._hoveredKeySubscription = rxjs_1.combineLatest(this._container.domRenderer.element$, this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$.pipe(operators_1.startWith(null)), this._container.mouseService.mouseUp$.pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
+            var element = _a[0];
+            var elements = element.getElementsByClassName("DirectionsPerspective");
+            for (var i = 0; i < elements.length; i++) {
+                var hovered = elements.item(i).querySelector(":hover");
+                if (hovered != null && hovered.hasAttribute("data-key")) {
+                    return hovered.getAttribute("data-key");
+                }
+            }
+            return null;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(this._hoveredKeySubject$);
+        this._emitHoveredKeySubscription = this._hoveredKey$
+            .subscribe(function (key) {
+            _this.fire(DirectionComponent.hoveredkeychanged, key);
+        });
+    };
+    DirectionComponent.prototype._deactivate = function () {
+        this._configurationSubscription.unsubscribe();
+        this._emitHoveredKeySubscription.unsubscribe();
+        this._hoveredKeySubscription.unsubscribe();
+        this._nodeSubscription.unsubscribe();
+        this._renderCameraSubscription.unsubscribe();
+    };
+    DirectionComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            distinguishSequence: false,
+            maxWidth: 460,
+            minWidth: 260,
+        };
+    };
+    /** @inheritdoc */
+    DirectionComponent.componentName = "direction";
+    /**
+     * Event fired when the hovered key changes.
+     *
+     * @description Emits the key of the node for the direction
+     * arrow that is being hovered. When the mouse leaves a
+     * direction arrow null is emitted.
+     *
+     * @event DirectionComponent#hoveredkeychanged
+     * @type {string} The hovered key, null if no key is hovered.
+     */
+    DirectionComponent.hoveredkeychanged = "hoveredkeychanged";
+    return DirectionComponent;
+}(Component_1.Component));
+exports.DirectionComponent = DirectionComponent;
+Component_1.ComponentService.register(DirectionComponent);
+exports.default = DirectionComponent;
+
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],320:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DirectionDOMCalculator = void 0;
+var Geo_1 = require("../../Geo");
+/**
+ * @class DirectionDOMCalculator
+ * @classdesc Helper class for calculating DOM CSS properties.
+ */
+var DirectionDOMCalculator = /** @class */ (function () {
+    function DirectionDOMCalculator(configuration, size) {
+        this._spatial = new Geo_1.Spatial();
+        this._minThresholdWidth = 320;
+        this._maxThresholdWidth = 1480;
+        this._minThresholdHeight = 240;
+        this._maxThresholdHeight = 820;
+        this._configure(configuration);
+        this._resize(size);
+        this._reset();
+    }
+    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
+        get: function () {
+            return this._minWidth;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
+        get: function () {
+            return this._maxWidth;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
+        get: function () {
+            return this._containerWidth;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
+        get: function () {
+            return this._containerWidthCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
+        get: function () {
+            return this._containerMarginCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
+        get: function () {
+            return this._containerLeftCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
+        get: function () {
+            return this._containerHeight;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
+        get: function () {
+            return this._containerHeightCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
+        get: function () {
+            return this._containerBottomCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
+        get: function () {
+            return this._stepCircleSize;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
+        get: function () {
+            return this._stepCircleSizeCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
+        get: function () {
+            return this._stepCircleMarginCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
+        get: function () {
+            return this._turnCircleSize;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
+        get: function () {
+            return this._turnCircleSizeCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
+        get: function () {
+            return this._outerRadius;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
+        get: function () {
+            return this._innerRadius;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
+        get: function () {
+            return this._shadowOffset;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Configures the min and max width values.
+     *
+     * @param {IDirectionConfiguration} configuration Configuration
+     * with min and max width values.
+     */
+    DirectionDOMCalculator.prototype.configure = function (configuration) {
+        this._configure(configuration);
+        this._reset();
+    };
+    /**
+     * Resizes all properties according to the width and height
+     * of the size object.
+     *
+     * @param {ISize} size The size of the container element.
+     */
+    DirectionDOMCalculator.prototype.resize = function (size) {
+        this._resize(size);
+        this._reset();
+    };
+    /**
+     * Calculates the coordinates on the unit circle for an angle.
+     *
+     * @param {number} angle Angle in radians.
+     * @returns {Array<number>} The x and y coordinates on the unit circle.
+     */
+    DirectionDOMCalculator.prototype.angleToCoordinates = function (angle) {
+        return [Math.cos(angle), Math.sin(angle)];
+    };
+    /**
+     * Calculates the coordinates on the unit circle for the
+     * relative angle between the first and second angle.
+     *
+     * @param {number} first Angle in radians.
+     * @param {number} second Angle in radians.
+     * @returns {Array<number>} The x and y coordinates on the unit circle
+     * for the relative angle between the first and second angle.
+     */
+    DirectionDOMCalculator.prototype.relativeAngleToCoordiantes = function (first, second) {
+        var relativeAngle = this._spatial.wrapAngle(first - second);
+        return this.angleToCoordinates(relativeAngle);
+    };
+    DirectionDOMCalculator.prototype._configure = function (configuration) {
+        this._minWidth = configuration.minWidth;
+        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);
+    };
+    DirectionDOMCalculator.prototype._resize = function (size) {
+        this._elementWidth = size.width;
+        this._elementHeight = size.height;
+    };
+    DirectionDOMCalculator.prototype._reset = function () {
+        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);
+        this._containerHeight = this._getContainerHeight(this.containerWidth);
+        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);
+        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);
+        this._outerRadius = this._getOuterRadius(this._containerHeight);
+        this._innerRadius = this._getInnerRadius(this._containerHeight);
+        this._shadowOffset = 3;
+        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);
+        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);
+        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));
+        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);
+        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));
+        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);
+        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);
+        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);
+    };
+    DirectionDOMCalculator.prototype._getContainerWidth = function (elementWidth, elementHeight) {
+        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
+        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
+        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
+        coeff = 0.04 * Math.round(25 * coeff);
+        return this._minWidth + coeff * (this._maxWidth - this._minWidth);
+    };
+    DirectionDOMCalculator.prototype._getContainerHeight = function (containerWidth) {
+        return 0.77 * containerWidth;
+    };
+    DirectionDOMCalculator.prototype._getStepCircleDiameter = function (containerHeight) {
+        return 0.34 * containerHeight;
+    };
+    DirectionDOMCalculator.prototype._getTurnCircleDiameter = function (containerHeight) {
+        return 0.3 * containerHeight;
+    };
+    DirectionDOMCalculator.prototype._getOuterRadius = function (containerHeight) {
+        return 0.31 * containerHeight;
+    };
+    DirectionDOMCalculator.prototype._getInnerRadius = function (containerHeight) {
+        return 0.125 * containerHeight;
+    };
+    DirectionDOMCalculator.prototype._numberToCssPixels = function (value) {
+        return value + "px";
+    };
+    DirectionDOMCalculator.prototype._getMaxWidth = function (value, minWidth) {
+        return value > minWidth ? value : minWidth;
+    };
+    return DirectionDOMCalculator;
+}());
+exports.DirectionDOMCalculator = DirectionDOMCalculator;
+exports.default = DirectionDOMCalculator;
+
+
+},{"../../Geo":294}],321:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DirectionDOMRenderer = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+var Geo_1 = require("../../Geo");
+/**
+ * @class DirectionDOMRenderer
+ * @classdesc DOM renderer for direction arrows.
+ */
+var DirectionDOMRenderer = /** @class */ (function () {
+    function DirectionDOMRenderer(configuration, size) {
+        this._isEdge = false;
+        this._spatial = new Geo_1.Spatial();
+        this._calculator = new Component_1.DirectionDOMCalculator(configuration, size);
+        this._node = null;
+        this._rotation = { phi: 0, theta: 0 };
+        this._epsilon = 0.5 * Math.PI / 180;
+        this._highlightKey = null;
+        this._distinguishSequence = false;
+        this._needsRender = false;
+        this._stepEdges = [];
+        this._turnEdges = [];
+        this._panoEdges = [];
+        this._sequenceEdgeKeys = [];
+        this._stepDirections = [
+            Edge_1.EdgeDirection.StepForward,
+            Edge_1.EdgeDirection.StepBackward,
+            Edge_1.EdgeDirection.StepLeft,
+            Edge_1.EdgeDirection.StepRight,
+        ];
+        this._turnDirections = [
+            Edge_1.EdgeDirection.TurnLeft,
+            Edge_1.EdgeDirection.TurnRight,
+            Edge_1.EdgeDirection.TurnU,
+        ];
+        this._turnNames = {};
+        this._turnNames[Edge_1.EdgeDirection.TurnLeft] = "TurnLeft";
+        this._turnNames[Edge_1.EdgeDirection.TurnRight] = "TurnRight";
+        this._turnNames[Edge_1.EdgeDirection.TurnU] = "TurnAround";
+        // detects IE 8-11, then Edge 20+.
+        var isIE = !!document.documentMode;
+        this._isEdge = !isIE && !!window.StyleMedia;
+    }
+    Object.defineProperty(DirectionDOMRenderer.prototype, "needsRender", {
+        /**
+         * Get needs render.
+         *
+         * @returns {boolean} Value indicating whether render should be called.
+         */
+        get: function () {
+            return this._needsRender;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Renders virtual DOM elements.
+     *
+     * @description Calling render resets the needs render property.
+     */
+    DirectionDOMRenderer.prototype.render = function (navigator) {
+        this._needsRender = false;
+        var rotation = this._rotation;
+        var steps = [];
+        var turns = [];
+        if (this._node.pano) {
+            steps = steps.concat(this._createPanoArrows(navigator, rotation));
+        }
+        else {
+            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));
+            steps = steps.concat(this._createStepArrows(navigator, rotation));
+            turns = turns.concat(this._createTurnArrows(navigator));
+        }
+        return this._getContainer(steps, turns, rotation);
+    };
+    DirectionDOMRenderer.prototype.setEdges = function (edgeStatus, sequence) {
+        this._setEdges(edgeStatus, sequence);
+        this._setNeedsRender();
+    };
+    /**
+     * Set node for which to show edges.
+     *
+     * @param {Node} node
+     */
+    DirectionDOMRenderer.prototype.setNode = function (node) {
+        this._node = node;
+        this._clearEdges();
+        this._setNeedsRender();
+    };
+    /**
+     * Set the render camera to use for calculating rotations.
+     *
+     * @param {RenderCamera} renderCamera
+     */
+    DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) {
+        var rotation = renderCamera.rotation;
+        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {
+            return;
+        }
+        this._rotation = rotation;
+        this._setNeedsRender();
+    };
+    /**
+     * Set configuration values.
+     *
+     * @param {IDirectionConfiguration} configuration
+     */
+    DirectionDOMRenderer.prototype.setConfiguration = function (configuration) {
+        var needsRender = false;
+        if (this._highlightKey !== configuration.highlightKey ||
+            this._distinguishSequence !== configuration.distinguishSequence) {
+            this._highlightKey = configuration.highlightKey;
+            this._distinguishSequence = configuration.distinguishSequence;
+            needsRender = true;
+        }
+        if (this._calculator.minWidth !== configuration.minWidth ||
+            this._calculator.maxWidth !== configuration.maxWidth) {
+            this._calculator.configure(configuration);
+            needsRender = true;
+        }
+        if (needsRender) {
+            this._setNeedsRender();
+        }
+    };
+    /**
+     * Detect the element's width and height and resize
+     * elements accordingly.
+     *
+     * @param {ISize} size Size of vßiewer container element.
+     */
+    DirectionDOMRenderer.prototype.resize = function (size) {
+        this._calculator.resize(size);
+        this._setNeedsRender();
+    };
+    DirectionDOMRenderer.prototype._setNeedsRender = function () {
+        if (this._node != null) {
+            this._needsRender = true;
+        }
+    };
+    DirectionDOMRenderer.prototype._clearEdges = function () {
+        this._stepEdges = [];
+        this._turnEdges = [];
+        this._panoEdges = [];
+        this._sequenceEdgeKeys = [];
+    };
+    DirectionDOMRenderer.prototype._setEdges = function (edgeStatus, sequence) {
+        this._stepEdges = [];
+        this._turnEdges = [];
+        this._panoEdges = [];
+        this._sequenceEdgeKeys = [];
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            var direction = edge.data.direction;
+            if (this._stepDirections.indexOf(direction) > -1) {
+                this._stepEdges.push(edge);
+                continue;
+            }
+            if (this._turnDirections.indexOf(direction) > -1) {
+                this._turnEdges.push(edge);
+                continue;
+            }
+            if (edge.data.direction === Edge_1.EdgeDirection.Pano) {
+                this._panoEdges.push(edge);
+            }
+        }
+        if (this._distinguishSequence && sequence != null) {
+            var edges = this._panoEdges
+                .concat(this._stepEdges)
+                .concat(this._turnEdges);
+            for (var _b = 0, edges_1 = edges; _b < edges_1.length; _b++) {
+                var edge = edges_1[_b];
+                var edgeKey = edge.to;
+                for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
+                    var sequenceKey = _d[_c];
+                    if (sequenceKey === edgeKey) {
+                        this._sequenceEdgeKeys.push(edgeKey);
+                        break;
+                    }
+                }
+            }
+        }
+    };
+    DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) {
+        var arrows = [];
+        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
+            var panoEdge = _a[_i];
+            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.outerRadius, "DirectionsArrowPano"));
+        }
+        for (var _b = 0, _c = this._stepEdges; _b < _c.length; _b++) {
+            var stepEdge = _c[_b];
+            arrows.push(this._createPanoToPerspectiveArrow(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
+        }
+        return arrows;
+    };
+    DirectionDOMRenderer.prototype._createPanoToPerspectiveArrow = function (navigator, key, azimuth, rotation, direction) {
+        var threshold = Math.PI / 8;
+        var relativePhi = rotation.phi;
+        switch (direction) {
+            case Edge_1.EdgeDirection.StepBackward:
+                relativePhi = rotation.phi - Math.PI;
+                break;
+            case Edge_1.EdgeDirection.StepLeft:
+                relativePhi = rotation.phi + Math.PI / 2;
+                break;
+            case Edge_1.EdgeDirection.StepRight:
+                relativePhi = rotation.phi - Math.PI / 2;
+                break;
+            default:
+                break;
+        }
+        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {
+            return this._createVNodeByKey(navigator, key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep");
+        }
+        return this._createVNodeDisabled(key, azimuth, rotation);
+    };
+    DirectionDOMRenderer.prototype._createPerspectiveToPanoArrows = function (navigator, rotation) {
+        var arrows = [];
+        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
+            var panoEdge = _a[_i];
+            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.innerRadius, "DirectionsArrowPano", true));
+        }
+        return arrows;
+    };
+    DirectionDOMRenderer.prototype._createStepArrows = function (navigator, rotation) {
+        var arrows = [];
+        for (var _i = 0, _a = this._stepEdges; _i < _a.length; _i++) {
+            var stepEdge = _a[_i];
+            arrows.push(this._createVNodeByDirection(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
+        }
+        return arrows;
+    };
+    DirectionDOMRenderer.prototype._createTurnArrows = function (navigator) {
+        var turns = [];
+        for (var _i = 0, _a = this._turnEdges; _i < _a.length; _i++) {
+            var turnEdge = _a[_i];
+            var direction = turnEdge.data.direction;
+            var name_1 = this._turnNames[direction];
+            turns.push(this._createVNodeByTurn(navigator, turnEdge.to, name_1, direction));
+        }
+        return turns;
+    };
+    DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) {
+        var onClick = function (e) {
+            navigator.moveToKey$(key)
+                .subscribe(undefined, function (error) {
+                if (!(error instanceof Error_1.AbortMapillaryError)) {
+                    console.error(error);
+                }
+            });
+        };
+        return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically);
+    };
+    DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) {
+        var onClick = function (e) {
+            navigator.moveDir$(direction)
+                .subscribe(undefined, function (error) {
+                if (!(error instanceof Error_1.AbortMapillaryError)) {
+                    console.error(error);
+                }
+            });
+        };
+        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick);
+    };
+    DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) {
+        var onClick = function (e) {
+            navigator.moveDir$(direction)
+                .subscribe(undefined, function (error) {
+                if (!(error instanceof Error_1.AbortMapillaryError)) {
+                    console.error(error);
+                }
+            });
+        };
+        var style = {
+            height: this._calculator.turnCircleSizeCss,
+            transform: "rotate(0)",
+            width: this._calculator.turnCircleSizeCss,
+        };
+        switch (direction) {
+            case Edge_1.EdgeDirection.TurnLeft:
+                style.left = "5px";
+                style.top = "5px";
+                break;
+            case Edge_1.EdgeDirection.TurnRight:
+                style.right = "5px";
+                style.top = "5px";
+                break;
+            case Edge_1.EdgeDirection.TurnU:
+                style.left = "5px";
+                style.bottom = "5px";
+                break;
+            default:
+                break;
+        }
+        var circleProperties = {
+            attributes: {
+                "data-key": key,
+            },
+            onclick: onClick,
+            style: style,
+        };
+        var circleClassName = "TurnCircle";
+        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
+            circleClassName += "Sequence";
+        }
+        if (this._highlightKey === key) {
+            circleClassName += "Highlight";
+        }
+        var turn = vd.h("div." + className, {}, []);
+        return vd.h("div." + circleClassName, circleProperties, [turn]);
+    };
+    DirectionDOMRenderer.prototype._createVNodeDisabled = function (key, azimuth, rotation) {
+        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowDisabled", "DirectionsCircleDisabled");
+    };
+    DirectionDOMRenderer.prototype._createVNode = function (key, azimuth, rotation, radius, className, circleClassName, onClick, shiftVertically) {
+        var translation = this._calculator.angleToCoordinates(azimuth - rotation.phi);
+        // rotate 90 degrees clockwise and flip over X-axis
+        var translationX = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);
+        var translationY = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);
+        var shadowTranslation = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);
+        var shadowOffset = this._calculator.shadowOffset;
+        var shadowTranslationX = -shadowOffset * shadowTranslation[1];
+        var shadowTranslationY = shadowOffset * shadowTranslation[0];
+        var filter = "drop-shadow(" + shadowTranslationX + "px " + shadowTranslationY + "px 1px rgba(0,0,0,0.8))";
+        var properties = {
+            style: {
+                "-webkit-filter": filter,
+                filter: filter,
+            },
+        };
+        var chevron = vd.h("div." + className, properties, []);
+        var azimuthDeg = -this._spatial.radToDeg(azimuth - rotation.phi);
+        var circleTransform = shiftVertically ?
+            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg) translateZ(-0.01px)" :
+            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg)";
+        var circleProperties = {
+            attributes: { "data-key": key },
+            onclick: onClick,
+            style: {
+                height: this._calculator.stepCircleSizeCss,
+                marginLeft: this._calculator.stepCircleMarginCss,
+                marginTop: this._calculator.stepCircleMarginCss,
+                transform: circleTransform,
+                width: this._calculator.stepCircleSizeCss,
+            },
+        };
+        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
+            circleClassName += "Sequence";
+        }
+        if (this._highlightKey === key) {
+            circleClassName += "Highlight";
+        }
+        return vd.h("div." + circleClassName, circleProperties, [chevron]);
+    };
+    DirectionDOMRenderer.prototype._getContainer = function (steps, turns, rotation) {
+        // edge does not handle hover on perspective transforms.
+        var transform = this._isEdge ?
+            "rotateX(60deg)" :
+            "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)";
+        var properties = {
+            oncontextmenu: function (event) { event.preventDefault(); },
+            style: {
+                bottom: this._calculator.containerBottomCss,
+                height: this._calculator.containerHeightCss,
+                left: this._calculator.containerLeftCss,
+                marginLeft: this._calculator.containerMarginCss,
+                transform: transform,
+                width: this._calculator.containerWidthCss,
+            },
+        };
+        return vd.h("div.DirectionsPerspective", properties, turns.concat(steps));
+    };
+    return DirectionDOMRenderer;
+}());
+exports.DirectionDOMRenderer = DirectionDOMRenderer;
+exports.default = DirectionDOMRenderer;
+
+
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"../../Geo":294,"virtual-dom":247}],322:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImagePlaneComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Viewer_1 = require("../../Viewer");
+var Render_1 = require("../../Render");
+var Tiles_1 = require("../../Tiles");
+var Utils_1 = require("../../Utils");
+var ViewportCoords_1 = require("../../geo/ViewportCoords");
+var Spatial_1 = require("../../geo/Spatial");
+var ImagePlaneComponent = /** @class */ (function (_super) {
+    __extends(ImagePlaneComponent, _super);
+    function ImagePlaneComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
+        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
+        _this._rendererOperation$ = new rxjs_1.Subject();
+        _this._rendererCreator$ = new rxjs_1.Subject();
+        _this._rendererDisposer$ = new rxjs_1.Subject();
+        _this._renderer$ = _this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
+            return operation(renderer);
+        }, null), operators_1.filter(function (renderer) {
+            return renderer != null;
+        }), operators_1.distinctUntilChanged(undefined, function (renderer) {
+            return renderer.frameId;
+        }));
+        _this._rendererCreator$.pipe(operators_1.map(function () {
+            return function (renderer) {
+                if (renderer != null) {
+                    throw new Error("Multiple image plane states can not be created at the same time");
+                }
+                return new Component_1.ImagePlaneGLRenderer();
+            };
+        }))
+            .subscribe(_this._rendererOperation$);
+        _this._rendererDisposer$.pipe(operators_1.map(function () {
+            return function (renderer) {
+                renderer.dispose();
+                return null;
+            };
+        }))
+            .subscribe(_this._rendererOperation$);
+        return _this;
+    }
+    ImagePlaneComponent.prototype._activate = function () {
+        var _this = this;
+        this._rendererSubscription = this._renderer$.pipe(operators_1.map(function (renderer) {
+            var renderHash = {
+                name: _this._name,
+                render: {
+                    frameId: renderer.frameId,
+                    needsRender: renderer.needsRender,
+                    render: renderer.render.bind(renderer),
+                    stage: Render_1.GLRenderStage.Background,
+                },
+            };
+            renderer.clearNeedsRender();
+            return renderHash;
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        this._rendererCreator$.next(null);
+        this._stateSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return function (renderer) {
+                renderer.updateFrame(frame);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
+            var frame = _a[0], renderer = _a[1], size = _a[2];
+            var state = frame.state;
+            var viewportSize = Math.max(size.width, size.height);
+            var currentNode = state.currentNode;
+            var currentTransform = state.currentTransform;
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
+        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
+            return function (renderer) {
+                renderer.setTextureProvider(provider.key, provider);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
+            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
+        }))
+            .subscribe(function (_a) {
+            var provider = _a[0], size = _a[1];
+            var viewportSize = Math.max(size.width, size.height);
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            provider.setTileSize(tileSize);
+        });
+        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
+            .subscribe(function (pair) {
+            var previous = pair[0];
+            previous.abort();
+        });
+        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
+            var camera = _a[0], size = _a[1];
+            return [
+                camera.camera.position.clone(),
+                camera.camera.lookat.clone(),
+                camera.zoom.valueOf(),
+                size.height.valueOf(),
+                size.width.valueOf()
+            ];
+        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
+            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
+        }), operators_1.map(function (pls) {
+            var samePosition = pls[0][0].equals(pls[1][0]);
+            var sameLookat = pls[0][1].equals(pls[1][1]);
+            var sameZoom = pls[0][2] === pls[1][2];
+            var sameHeight = pls[0][3] === pls[1][3];
+            var sameWidth = pls[0][4] === pls[1][4];
+            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
+        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
+            return stalled;
+        }), operators_1.switchMap(function (stalled) {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
+        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
+        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return roiTrigger$.pipe(operators_1.map(function (_a) {
+                var camera = _a[0], size = _a[1], transform = _a[2];
+                var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, transform, camera.perspective);
+                if (basic[0] < 0 || basic[1] < 0 || basic[0] > 1 || basic[1] > 1) {
+                    return undefined;
+                }
+                return [
+                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
+                    provider,
+                ];
+            }), operators_1.filter(function (args) {
+                return !!args;
+            }));
+        }), operators_1.filter(function (args) {
+            return !args[1].disposed;
+        }))
+            .subscribe(function (args) {
+            var roi = args[0];
+            var provider = args[1];
+            provider.setRegionOfInterest(roi);
+        });
+        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return provider.hasTexture$;
+        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
+        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead === 0;
+        }), operators_1.map(function (frame) {
+            return frame.state.currentNode;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
+            return !args[1];
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.filter(function (node) {
+            return node.pano ?
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
+        }), operators_1.switchMap(function (node) {
+            var baseImageSize = node.pano ?
+                Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.baseImageSize;
+            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
+                return rxjs_1.empty();
+            }
+            var image$ = node
+                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
+                return [n.image, n];
+            }));
+            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
+                return hasTexture;
+            }))), operators_1.catchError(function (error, caught) {
+                console.error("Failed to fetch high res image (" + node.key + ")", error);
+                return rxjs_1.empty();
+            }));
+        })).pipe(operators_1.publish(), operators_1.refCount());
+        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
+            .subscribe(function (args) {
+            if (args[0][1].key !== args[1].key ||
+                args[1].disposed) {
+                return;
+            }
+            args[1].updateBackground(args[0][0]);
+        });
+        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
+            return function (renderer) {
+                renderer.updateTextureImage(imn[0], imn[1]);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        this._clearPeripheryPlaneSubscription = this._navigator.panService.panNodes$.pipe(operators_1.filter(function (panNodes) {
+            return panNodes.length === 0;
+        }), operators_1.map(function () {
+            return function (renderer) {
+                renderer.clearPeripheryPlanes();
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        var cachedPanNodes$ = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
+            return rxjs_1.from(nts).pipe(operators_1.mergeMap(function (_a) {
+                var n = _a[0], t = _a[1];
+                return rxjs_1.combineLatest(_this._navigator.graphService.cacheNode$(n.key).pipe(operators_1.catchError(function (error) {
+                    console.error("Failed to cache periphery node (" + n.key + ")", error);
+                    return rxjs_1.empty();
+                })), rxjs_1.of(t));
+            }));
+        }), operators_1.share());
+        this._addPeripheryPlaneSubscription = cachedPanNodes$.pipe(operators_1.map(function (_a) {
+            var n = _a[0], t = _a[1];
+            return function (renderer) {
+                renderer.addPeripheryPlane(n, t);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        this._updatePeripheryPlaneTextureSubscription = cachedPanNodes$.pipe(operators_1.mergeMap(function (_a) {
+            var n = _a[0];
+            return Viewer_1.ImageSize.Size2048 > Math.max(n.image.width, n.image.height) ?
+                n.cacheImage$(Viewer_1.ImageSize.Size2048).pipe(operators_1.catchError(function () {
+                    return rxjs_1.empty();
+                })) :
+                rxjs_1.empty();
+        }), operators_1.map(function (n) {
+            return function (renderer) {
+                renderer.updateTextureImage(n.image, n);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.alpha < 1;
+        }), operators_1.distinctUntilChanged());
+        var panTrigger$ = rxjs_1.combineLatest(this._container.mouseService.active$, this._container.touchService.active$, this._navigator.stateService.inMotion$, inTransition$).pipe(operators_1.map(function (_a) {
+            var mouseActive = _a[0], touchActive = _a[1], inMotion = _a[2], inTransition = _a[3];
+            return !(mouseActive || touchActive || inMotion || inTransition);
+        }), operators_1.filter(function (trigger) {
+            return trigger;
+        }));
+        this._moveToPeripheryNodeSubscription = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
+            return panTrigger$.pipe(operators_1.withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentNode$, _this._navigator.stateService.currentTransform$), operators_1.mergeMap(function (_a) {
+                var renderCamera = _a[1], currentNode = _a[2], currentTransform = _a[3];
+                return rxjs_1.of([
+                    renderCamera,
+                    currentNode,
+                    currentTransform,
+                    nts,
+                ]);
+            }));
+        }), operators_1.switchMap(function (_a) {
+            var camera = _a[0], cn = _a[1], ct = _a[2], nts = _a[3];
+            var direction = camera.camera.lookat.clone().sub(camera.camera.position);
+            var cd = new Spatial_1.default().viewingDirection(cn.rotation);
+            var ca = cd.angleTo(direction);
+            var closest = [ca, undefined];
+            var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, ct, camera.perspective);
+            if (basic[0] >= 0 && basic[0] <= 1 && basic[1] >= 0 && basic[1] <= 1) {
+                closest[0] = Number.NEGATIVE_INFINITY;
+            }
+            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
+                var n = nts_1[_i][0];
+                var d = new Spatial_1.default().viewingDirection(n.rotation);
+                var a = d.angleTo(direction);
+                if (a < closest[0]) {
+                    closest[0] = a;
+                    closest[1] = n.key;
+                }
+            }
+            if (!closest[1]) {
+                return rxjs_1.empty();
+            }
+            return _this._navigator.moveToKey$(closest[1]).pipe(operators_1.catchError(function () {
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe();
+    };
+    ImagePlaneComponent.prototype._deactivate = function () {
+        this._rendererDisposer$.next(null);
+        this._abortTextureProviderSubscription.unsubscribe();
+        this._hasTextureSubscription.unsubscribe();
+        this._rendererSubscription.unsubscribe();
+        this._setRegionOfInterestSubscription.unsubscribe();
+        this._setTextureProviderSubscription.unsubscribe();
+        this._setTileSizeSubscription.unsubscribe();
+        this._stateSubscription.unsubscribe();
+        this._textureProviderSubscription.unsubscribe();
+        this._updateBackgroundSubscription.unsubscribe();
+        this._updateTextureImageSubscription.unsubscribe();
+        this._clearPeripheryPlaneSubscription.unsubscribe();
+        this._addPeripheryPlaneSubscription.unsubscribe();
+        this._updatePeripheryPlaneTextureSubscription.unsubscribe();
+        this._moveToPeripheryNodeSubscription.unsubscribe();
+    };
+    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    ImagePlaneComponent.componentName = "imagePlane";
+    return ImagePlaneComponent;
+}(Component_1.Component));
+exports.ImagePlaneComponent = ImagePlaneComponent;
+Component_1.ComponentService.register(ImagePlaneComponent);
+exports.default = ImagePlaneComponent;
+
+},{"../../Component":291,"../../Render":297,"../../Tiles":300,"../../Utils":301,"../../Viewer":302,"../../geo/Spatial":419,"../../geo/ViewportCoords":421,"rxjs":43,"rxjs/operators":241}],323:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImagePlaneGLRenderer = void 0;
+var Component_1 = require("../../Component");
+var ImagePlaneGLRenderer = /** @class */ (function () {
+    function ImagePlaneGLRenderer() {
+        this._factory = new Component_1.MeshFactory();
+        this._scene = new Component_1.MeshScene();
+        this._alpha = 0;
+        this._alphaOld = 0;
+        this._fadeOutSpeed = 0.05;
+        this._currentKey = null;
+        this._previousKey = null;
+        this._providerDisposers = {};
+        this._frameId = 0;
+        this._needsRender = false;
+    }
+    Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", {
+        get: function () {
+            return this._frameId;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
+        get: function () {
+            return this._needsRender;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () {
+        this._needsRender = true;
+    };
+    ImagePlaneGLRenderer.prototype.addPeripheryPlane = function (node, transform) {
+        var mesh = this._factory.createMesh(node, transform);
+        var planes = {};
+        planes[node.key] = mesh;
+        this._scene.addPeripheryPlanes(planes);
+        this._needsRender = true;
+    };
+    ImagePlaneGLRenderer.prototype.clearPeripheryPlanes = function () {
+        this._scene.setPeripheryPlanes({});
+        this._needsRender = true;
+    };
+    ImagePlaneGLRenderer.prototype.updateFrame = function (frame) {
+        this._updateFrameId(frame.id);
+        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;
+        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;
+        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;
+    };
+    ImagePlaneGLRenderer.prototype.setTextureProvider = function (key, provider) {
+        var _this = this;
+        if (key !== this._currentKey) {
+            return;
+        }
+        var createdSubscription = provider.textureCreated$
+            .subscribe(function (texture) {
+            _this._updateTexture(texture);
+        });
+        var updatedSubscription = provider.textureUpdated$
+            .subscribe(function (updated) {
+            _this._needsRender = true;
+        });
+        var dispose = function () {
+            createdSubscription.unsubscribe();
+            updatedSubscription.unsubscribe();
+            provider.dispose();
+        };
+        if (key in this._providerDisposers) {
+            var disposeProvider = this._providerDisposers[key];
+            disposeProvider();
+            delete this._providerDisposers[key];
+        }
+        this._providerDisposers[key] = dispose;
+    };
+    ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) {
+        this._needsRender = true;
+        var planes = this._extend({}, this._scene.planes, this._scene.planesOld, this._scene.planesPeriphery);
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            if (key !== node.key) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var texture = material.uniforms.projectorTex.value;
+            texture.image = image;
+            texture.needsUpdate = true;
+        }
+    };
+    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
+        var planes = this._scene.planes;
+        var planesOld = this._scene.planesOld;
+        var planesPeriphery = this._scene.planesPeriphery;
+        var planeAlpha = Object.keys(planesOld).length ? 1 : this._alpha;
+        var peripheryAlpha = Object.keys(planesOld).length ? 1 : Math.floor(this._alpha);
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            plane.material.uniforms.opacity.value = planeAlpha;
+        }
+        for (var key in planesOld) {
+            if (!planesOld.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planesOld[key];
+            plane.material.uniforms.opacity.value = this._alphaOld;
+        }
+        for (var key in planesPeriphery) {
+            if (!planesPeriphery.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planesPeriphery[key];
+            plane.material.uniforms.opacity.value = peripheryAlpha;
+        }
+        renderer.render(this._scene.scenePeriphery, perspectiveCamera);
+        renderer.render(this._scene.scene, perspectiveCamera);
+        renderer.render(this._scene.sceneOld, perspectiveCamera);
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            plane.material.uniforms.opacity.value = this._alpha;
+        }
+        renderer.render(this._scene.scene, perspectiveCamera);
+    };
+    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
+        this._needsRender = false;
+    };
+    ImagePlaneGLRenderer.prototype.dispose = function () {
+        this._scene.clear();
+    };
+    ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) {
+        this._frameId = frameId;
+    };
+    ImagePlaneGLRenderer.prototype._updateAlpha = function (alpha) {
+        if (alpha === this._alpha) {
+            return false;
+        }
+        this._alpha = alpha;
+        return true;
+    };
+    ImagePlaneGLRenderer.prototype._updateAlphaOld = function (alpha) {
+        if (alpha < 1 || this._alphaOld === 0) {
+            return false;
+        }
+        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);
+        return true;
+    };
+    ImagePlaneGLRenderer.prototype._updateImagePlanes = function (state) {
+        if (state.currentNode == null || state.currentNode.key === this._currentKey) {
+            return false;
+        }
+        var previousKey = state.previousNode != null ? state.previousNode.key : null;
+        var currentKey = state.currentNode.key;
+        if (this._previousKey !== previousKey &&
+            this._previousKey !== currentKey &&
+            this._previousKey in this._providerDisposers) {
+            var disposeProvider = this._providerDisposers[this._previousKey];
+            disposeProvider();
+            delete this._providerDisposers[this._previousKey];
+        }
+        if (previousKey != null) {
+            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {
+                var previousMesh = this._factory.createMesh(state.previousNode, state.previousTransform);
+                var previousPlanes = {};
+                previousPlanes[previousKey] = previousMesh;
+                this._scene.updateImagePlanes(previousPlanes);
+            }
+            this._previousKey = previousKey;
+        }
+        this._currentKey = currentKey;
+        var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform);
+        var planes = {};
+        planes[currentKey] = currentMesh;
+        this._scene.updateImagePlanes(planes);
+        this._alphaOld = 1;
+        return true;
+    };
+    ImagePlaneGLRenderer.prototype._updateTexture = function (texture) {
+        this._needsRender = true;
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var oldTexture = material.uniforms.projectorTex.value;
+            material.uniforms.projectorTex.value = null;
+            oldTexture.dispose();
+            material.uniforms.projectorTex.value = texture;
+        }
+    };
+    ImagePlaneGLRenderer.prototype._extend = function (dest) {
+        var sources = [];
+        for (var _i = 1; _i < arguments.length; _i++) {
+            sources[_i - 1] = arguments[_i];
+        }
+        for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {
+            var src = sources_1[_a];
+            for (var k in src) {
+                if (!src.hasOwnProperty(k)) {
+                    continue;
+                }
+                dest[k] = src[k];
+            }
+        }
+        return dest;
+    };
+    return ImagePlaneGLRenderer;
+}());
+exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
+exports.default = ImagePlaneGLRenderer;
+
+},{"../../Component":291}],324:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],325:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CoverState = void 0;
+var CoverState;
+(function (CoverState) {
+    CoverState[CoverState["Hidden"] = 0] = "Hidden";
+    CoverState[CoverState["Loading"] = 1] = "Loading";
+    CoverState[CoverState["Visible"] = 2] = "Visible";
+})(CoverState = exports.CoverState || (exports.CoverState = {}));
+
+},{}],326:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SliderMode = void 0;
+/**
+ * Enumeration for slider mode.
+ *
+ * @enum {number}
+ * @readonly
+ *
+ * @description Modes for specifying how transitions
+ * between nodes are performed in slider mode. Only
+ * applicable when the slider component determines
+ * that transitions with motion is possilble. When it
+ * is not, the stationary mode will be applied.
+ */
+var SliderMode;
+(function (SliderMode) {
+    /**
+     * Transitions with motion.
+     *
+     * @description The slider component moves the
+     * camera between the node origins.
+     *
+     * In this mode it is not possible to zoom or pan.
+     *
+     * The slider component falls back to stationary
+     * mode when it determines that the pair of nodes
+     * does not have a strong enough relation.
+     */
+    SliderMode[SliderMode["Motion"] = 0] = "Motion";
+    /**
+     * Stationary transitions.
+     *
+     * @description The camera is stationary.
+     *
+     * In this mode it is possible to zoom and pan.
+     */
+    SliderMode[SliderMode["Stationary"] = 1] = "Stationary";
+})(SliderMode = exports.SliderMode || (exports.SliderMode = {}));
+
+},{}],327:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var ICoverConfiguration_1 = require("./ICoverConfiguration");
+Object.defineProperty(exports, "CoverState", { enumerable: true, get: function () { return ICoverConfiguration_1.CoverState; } });
+var ISliderConfiguration_1 = require("./ISliderConfiguration");
+Object.defineProperty(exports, "SliderMode", { enumerable: true, get: function () { return ISliderConfiguration_1.SliderMode; } });
+__exportStar(require("../imageplane/interfaces/interfaces"), exports);
+__exportStar(require("../marker/interfaces/interfaces"), exports);
+__exportStar(require("../spatialdata/interfaces/interfaces"), exports);
+__exportStar(require("../tag/interfaces/interfaces"), exports);
+
+},{"../imageplane/interfaces/interfaces":324,"../marker/interfaces/interfaces":337,"../spatialdata/interfaces/interfaces":365,"../tag/interfaces/interfaces":390,"./ICoverConfiguration":325,"./ISliderConfiguration":326}],328:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeyPlayHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+/**
+ * The `KeyPlayHandler` allows the user to control the play behavior
+ * using the following key commands:
+ *
+ * `Spacebar`: Start or stop playing.
+ * `SHIFT` + `D`: Switch direction.
+ * `<`: Decrease speed.
+ * `>`: Increase speed.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyPlay.disable();
+ * keyboardComponent.keyPlay.enable();
+ *
+ * var isEnabled = keyboardComponent.keyPlay.isEnabled;
+ * ```
+ */
+var KeyPlayHandler = /** @class */ (function (_super) {
+    __extends(KeyPlayHandler, _super);
+    function KeyPlayHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    KeyPlayHandler.prototype._enable = function () {
+        var _this = this;
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }))))
+            .subscribe(function (_a) {
+            var event = _a[0], playing = _a[1], direction = _a[2], speed = _a[3], status = _a[4];
+            if (event.altKey || event.ctrlKey || event.metaKey) {
+                return;
+            }
+            switch (event.key) {
+                case "D":
+                    if (!event.shiftKey) {
+                        return;
+                    }
+                    var newDirection = playing ?
+                        null : direction === Edge_1.EdgeDirection.Next ?
+                        Edge_1.EdgeDirection.Prev : direction === Edge_1.EdgeDirection.Prev ?
+                        Edge_1.EdgeDirection.Next : null;
+                    if (newDirection != null) {
+                        _this._navigator.playService.setDirection(newDirection);
+                    }
+                    break;
+                case " ":
+                    if (event.shiftKey) {
+                        return;
+                    }
+                    if (playing) {
+                        _this._navigator.playService.stop();
+                    }
+                    else {
+                        for (var _i = 0, _b = status.edges; _i < _b.length; _i++) {
+                            var edge = _b[_i];
+                            if (edge.data.direction === direction) {
+                                _this._navigator.playService.play();
+                            }
+                        }
+                    }
+                    break;
+                case "<":
+                    _this._navigator.playService.setSpeed(speed - 0.05);
+                    break;
+                case ">":
+                    _this._navigator.playService.setSpeed(speed + 0.05);
+                    break;
+                default:
+                    return;
+            }
+            event.preventDefault();
+        });
+    };
+    KeyPlayHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
+    };
+    KeyPlayHandler.prototype._getConfiguration = function (enable) {
+        return { keyZoom: enable };
+    };
+    return KeyPlayHandler;
+}(Component_1.HandlerBase));
+exports.KeyPlayHandler = KeyPlayHandler;
+exports.default = KeyPlayHandler;
+
+},{"../../Component":291,"../../Edge":292,"rxjs/operators":241}],329:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeySequenceNavigationHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+/**
+ * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the
+ * following key commands:
+ *
+ * `ALT` + `Up Arrow`: Navigate to next image in the sequence.
+ * `ALT` + `Down Arrow`: Navigate to previous image in sequence.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keySequenceNavigation.disable();
+ * keyboardComponent.keySequenceNavigation.enable();
+ *
+ * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;
+ * ```
+ */
+var KeySequenceNavigationHandler = /** @class */ (function (_super) {
+    __extends(KeySequenceNavigationHandler, _super);
+    function KeySequenceNavigationHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    KeySequenceNavigationHandler.prototype._enable = function () {
+        var _this = this;
+        var sequenceEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }));
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(sequenceEdges$))
+            .subscribe(function (_a) {
+            var event = _a[0], edgeStatus = _a[1];
+            var direction = null;
+            switch (event.keyCode) {
+                case 38: // up
+                    direction = Edge_1.EdgeDirection.Next;
+                    break;
+                case 40: // down
+                    direction = Edge_1.EdgeDirection.Prev;
+                    break;
+                default:
+                    return;
+            }
+            event.preventDefault();
+            if (!event.altKey || event.shiftKey || !edgeStatus.cached) {
+                return;
+            }
+            for (var _i = 0, _b = edgeStatus.edges; _i < _b.length; _i++) {
+                var edge = _b[_i];
+                if (edge.data.direction === direction) {
+                    _this._navigator.moveToKey$(edge.to)
+                        .subscribe(undefined, function (error) {
+                        if (!(error instanceof Error_1.AbortMapillaryError)) {
+                            console.error(error);
+                        }
+                    });
+                    return;
+                }
+            }
+        });
+    };
+    KeySequenceNavigationHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
+    };
+    KeySequenceNavigationHandler.prototype._getConfiguration = function (enable) {
+        return { keySequenceNavigation: enable };
+    };
+    return KeySequenceNavigationHandler;
+}(Component_1.HandlerBase));
+exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler;
+exports.default = KeySequenceNavigationHandler;
+
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],330:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeySpatialNavigationHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+/**
+ * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the
+ * following key commands:
+ *
+ * `Up Arrow`: Step forward.
+ * `Down Arrow`: Step backward.
+ * `Left Arrow`: Step to the left.
+ * `Rigth Arrow`: Step to the right.
+ * `SHIFT` + `Down Arrow`: Turn around.
+ * `SHIFT` + `Left Arrow`: Turn to the left.
+ * `SHIFT` + `Rigth Arrow`: Turn to the right.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keySpatialNavigation.disable();
+ * keyboardComponent.keySpatialNavigation.enable();
+ *
+ * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;
+ * ```
+ */
+var KeySpatialNavigationHandler = /** @class */ (function (_super) {
+    __extends(KeySpatialNavigationHandler, _super);
+    /** @ignore */
+    function KeySpatialNavigationHandler(component, container, navigator, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        return _this;
+    }
+    KeySpatialNavigationHandler.prototype._enable = function () {
+        var _this = this;
+        var spatialEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.spatialEdges$;
+        }));
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(spatialEdges$, this._navigator.stateService.currentState$))
+            .subscribe(function (_a) {
+            var event = _a[0], edgeStatus = _a[1], frame = _a[2];
+            var pano = frame.state.currentNode.pano;
+            var direction = null;
+            switch (event.keyCode) {
+                case 37: // left
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
+                    break;
+                case 38: // up
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
+                    break;
+                case 39: // right
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
+                    break;
+                case 40: // down
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
+                    break;
+                default:
+                    return;
+            }
+            event.preventDefault();
+            if (event.altKey || !edgeStatus.cached ||
+                (event.shiftKey && pano)) {
+                return;
+            }
+            if (!pano) {
+                _this._moveDir(direction, edgeStatus);
+            }
+            else {
+                var shifts = {};
+                shifts[Edge_1.EdgeDirection.StepBackward] = Math.PI;
+                shifts[Edge_1.EdgeDirection.StepForward] = 0;
+                shifts[Edge_1.EdgeDirection.StepLeft] = Math.PI / 2;
+                shifts[Edge_1.EdgeDirection.StepRight] = -Math.PI / 2;
+                var phi = _this._rotationFromCamera(frame.state.camera).phi;
+                var navigationAngle = _this._spatial.wrapAngle(phi + shifts[direction]);
+                var threshold = Math.PI / 4;
+                var edges = edgeStatus.edges.filter(function (e) {
+                    return e.data.direction === Edge_1.EdgeDirection.Pano || e.data.direction === direction;
+                });
+                var smallestAngle = Number.MAX_VALUE;
+                var toKey = null;
+                for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
+                    var edge = edges_1[_i];
+                    var angle = Math.abs(_this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));
+                    if (angle < Math.min(smallestAngle, threshold)) {
+                        smallestAngle = angle;
+                        toKey = edge.to;
+                    }
+                }
+                if (toKey == null) {
+                    return;
+                }
+                _this._moveToKey(toKey);
+            }
+        });
+    };
+    KeySpatialNavigationHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
+    };
+    KeySpatialNavigationHandler.prototype._getConfiguration = function (enable) {
+        return { keySpatialNavigation: enable };
+    };
+    KeySpatialNavigationHandler.prototype._moveDir = function (direction, edgeStatus) {
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            if (edge.data.direction === direction) {
+                this._moveToKey(edge.to);
+                return;
+            }
+        }
+    };
+    KeySpatialNavigationHandler.prototype._moveToKey = function (key) {
+        this._navigator.moveToKey$(key)
+            .subscribe(undefined, function (error) {
+            if (!(error instanceof Error_1.AbortMapillaryError)) {
+                console.error(error);
+            }
+        });
+    };
+    KeySpatialNavigationHandler.prototype._rotationFromCamera = function (camera) {
+        var direction = camera.lookat.clone().sub(camera.position);
+        var upProjection = direction.clone().dot(camera.up);
+        var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));
+        var phi = Math.atan2(planeProjection.y, planeProjection.x);
+        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
+        return { phi: phi, theta: theta };
+    };
+    return KeySpatialNavigationHandler;
+}(Component_1.HandlerBase));
+exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler;
+exports.default = KeySpatialNavigationHandler;
+
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],331:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeyZoomHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `KeyZoomHandler` allows the user to zoom in and out using the
+ * following key commands:
+ *
+ * `+`: Zoom in.
+ * `-`: Zoom out.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyZoom.disable();
+ * keyboardComponent.keyZoom.enable();
+ *
+ * var isEnabled = keyboardComponent.keyZoom.isEnabled;
+ * ```
+ */
+var KeyZoomHandler = /** @class */ (function (_super) {
+    __extends(KeyZoomHandler, _super);
+    /** @ignore */
+    function KeyZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    KeyZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var event = _a[0], render = _a[1], transform = _a[2];
+            if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
+                return;
+            }
+            var delta = 0;
+            switch (event.key) {
+                case "+":
+                    delta = 1;
+                    break;
+                case "-":
+                    delta = -1;
+                    break;
+                default:
+                    return;
+            }
+            event.preventDefault();
+            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            _this._navigator.stateService.zoomIn(delta, reference);
+        });
+    };
+    KeyZoomHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
+    };
+    KeyZoomHandler.prototype._getConfiguration = function (enable) {
+        return { keyZoom: enable };
+    };
+    return KeyZoomHandler;
+}(Component_1.HandlerBase));
+exports.KeyZoomHandler = KeyZoomHandler;
+exports.default = KeyZoomHandler;
+
+},{"../../Component":291,"rxjs/operators":241}],332:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeyboardComponent = void 0;
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+/**
+ * @class KeyboardComponent
+ *
+ * @classdesc Component for keyboard event handling.
+ *
+ * To retrive and use the keyboard component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ * ```
+ */
+var KeyboardComponent = /** @class */ (function (_super) {
+    __extends(KeyboardComponent, _super);
+    /** @ignore */
+    function KeyboardComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._keyPlayHandler = new Component_1.KeyPlayHandler(_this, container, navigator);
+        _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator);
+        _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial());
+        _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords());
+        return _this;
+    }
+    Object.defineProperty(KeyboardComponent.prototype, "keyPlay", {
+        /**
+         * Get key play.
+         *
+         * @returns {KeyPlayHandler} The key play handler.
+         */
+        get: function () {
+            return this._keyPlayHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", {
+        /**
+         * Get key sequence navigation.
+         *
+         * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.
+         */
+        get: function () {
+            return this._keySequenceNavigationHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", {
+        /**
+         * Get spatial.
+         *
+         * @returns {KeySpatialNavigationHandler} The spatial handler.
+         */
+        get: function () {
+            return this._keySpatialNavigationHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardComponent.prototype, "keyZoom", {
+        /**
+         * Get key zoom.
+         *
+         * @returns {KeyZoomHandler} The key zoom handler.
+         */
+        get: function () {
+            return this._keyZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    KeyboardComponent.prototype._activate = function () {
+        var _this = this;
+        this._configurationSubscription = this._configuration$
+            .subscribe(function (configuration) {
+            if (configuration.keyPlay) {
+                _this._keyPlayHandler.enable();
+            }
+            else {
+                _this._keyPlayHandler.disable();
+            }
+            if (configuration.keySequenceNavigation) {
+                _this._keySequenceNavigationHandler.enable();
+            }
+            else {
+                _this._keySequenceNavigationHandler.disable();
+            }
+            if (configuration.keySpatialNavigation) {
+                _this._keySpatialNavigationHandler.enable();
+            }
+            else {
+                _this._keySpatialNavigationHandler.disable();
+            }
+            if (configuration.keyZoom) {
+                _this._keyZoomHandler.enable();
+            }
+            else {
+                _this._keyZoomHandler.disable();
+            }
+        });
+    };
+    KeyboardComponent.prototype._deactivate = function () {
+        this._configurationSubscription.unsubscribe();
+        this._keyPlayHandler.disable();
+        this._keySequenceNavigationHandler.disable();
+        this._keySpatialNavigationHandler.disable();
+        this._keyZoomHandler.disable();
+    };
+    KeyboardComponent.prototype._getDefaultConfiguration = function () {
+        return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };
+    };
+    KeyboardComponent.componentName = "keyboard";
+    return KeyboardComponent;
+}(Component_1.Component));
+exports.KeyboardComponent = KeyboardComponent;
+Component_1.ComponentService.register(KeyboardComponent);
+exports.default = KeyboardComponent;
+
+},{"../../Component":291,"../../Geo":294}],333:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var MarkerComponent_1 = require("./MarkerComponent");
+Object.defineProperty(exports, "MarkerComponent", { enumerable: true, get: function () { return MarkerComponent_1.MarkerComponent; } });
+var SimpleMarker_1 = require("./marker/SimpleMarker");
+Object.defineProperty(exports, "SimpleMarker", { enumerable: true, get: function () { return SimpleMarker_1.SimpleMarker; } });
+var CircleMarker_1 = require("./marker/CircleMarker");
+Object.defineProperty(exports, "CircleMarker", { enumerable: true, get: function () { return CircleMarker_1.CircleMarker; } });
+
+},{"./MarkerComponent":334,"./marker/CircleMarker":338,"./marker/SimpleMarker":340}],334:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MarkerComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var THREE = require("three");
+var when = require("when");
+var Component_1 = require("../../Component");
+var Render_1 = require("../../Render");
+var Graph_1 = require("../../Graph");
+var Geo_1 = require("../../Geo");
+/**
+ * @class MarkerComponent
+ *
+ * @classdesc Component for showing and editing 3D marker objects.
+ *
+ * The `add` method is used for adding new markers or replacing
+ * markers already in the set.
+ *
+ * If a marker already in the set has the same
+ * id as one of the markers added, the old marker will be removed and
+ * the added marker will take its place.
+ *
+ * It is not possible to update markers in the set by updating any properties
+ * directly on the marker object. Markers need to be replaced by
+ * re-adding them for updates to geographic position or configuration
+ * to be reflected.
+ *
+ * Markers added to the marker component can be either interactive
+ * or non-interactive. Different marker types define their behavior.
+ * Markers with interaction support can be configured with options
+ * to respond to dragging inside the viewer and be detected when
+ * retrieving markers from pixel points with the `getMarkerIdAt` method.
+ *
+ * To retrive and use the marker component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>",
+ *     { component: { marker: true } });
+ *
+ * var markerComponent = viewer.getComponent("marker");
+ * ```
+ */
+var MarkerComponent = /** @class */ (function (_super) {
+    __extends(MarkerComponent, _super);
+    /** @ignore */
+    function MarkerComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._relativeGroundAltitude = -2;
+        _this._geoCoords = new Geo_1.GeoCoords();
+        _this._graphCalculator = new Graph_1.GraphCalculator();
+        _this._markerScene = new Component_1.MarkerScene();
+        _this._markerSet = new Component_1.MarkerSet();
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        return _this;
+    }
+    /**
+     * Add markers to the marker set or replace markers in the marker set.
+     *
+     * @description If a marker already in the set has the same
+     * id as one of the markers added, the old marker will be removed
+     * the added marker will take its place.
+     *
+     * Any marker inside the visible bounding bbox
+     * will be initialized and placed in the viewer.
+     *
+     * @param {Array<Marker>} markers - Markers to add.
+     *
+     * @example ```markerComponent.add([marker1, marker2]);```
+     */
+    MarkerComponent.prototype.add = function (markers) {
+        this._markerSet.add(markers);
+    };
+    /**
+     * Returns the marker in the marker set with the specified id, or
+     * undefined if the id matches no marker.
+     *
+     * @param {string} markerId - Id of the marker.
+     *
+     * @example ```var marker = markerComponent.get("markerId");```
+     *
+     */
+    MarkerComponent.prototype.get = function (markerId) {
+        return this._markerSet.get(markerId);
+    };
+    /**
+     * Returns an array of all markers.
+     *
+     * @example ```var markers = markerComponent.getAll();```
+     */
+    MarkerComponent.prototype.getAll = function () {
+        return this._markerSet.getAll();
+    };
+    /**
+     * Returns the id of the interactive marker closest to the current camera
+     * position at the specified point.
+     *
+     * @description Notice that the pixelPoint argument requires x, y
+     * coordinates from pixel space.
+     *
+     * With this function, you can use the coordinates provided by mouse
+     * events to get information out of the marker component.
+     *
+     * If no interactive geometry of an interactive marker exist at the pixel
+     * point, `null` will be returned.
+     *
+     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
+     * @returns {string} Id of the interactive marker closest to the camera. If no
+     * interactive marker exist at the pixel point, `null` will be returned.
+     *
+     * @example
+     * ```
+     * markerComponent.getMarkerIdAt([100, 100])
+     *     .then((markerId) => { console.log(markerId); });
+     * ```
+     */
+    MarkerComponent.prototype.getMarkerIdAt = function (pixelPoint) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
+                var viewport = _this._viewportCoords
+                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
+                var id = _this._markerScene.intersectObjects(viewport, render.perspective);
+                return id;
+            }))
+                .subscribe(function (id) {
+                resolve(id);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Check if a marker exist in the marker set.
+     *
+     * @param {string} markerId - Id of the marker.
+     *
+     * @example ```var markerExists = markerComponent.has("markerId");```
+     */
+    MarkerComponent.prototype.has = function (markerId) {
+        return this._markerSet.has(markerId);
+    };
+    /**
+     * Remove markers with the specified ids from the marker set.
+     *
+     * @param {Array<string>} markerIds - Ids for markers to remove.
+     *
+     * @example ```markerComponent.remove(["id-1", "id-2"]);```
+     */
+    MarkerComponent.prototype.remove = function (markerIds) {
+        this._markerSet.remove(markerIds);
+    };
+    /**
+     * Remove all markers from the marker set.
+     *
+     * @example ```markerComponent.removeAll();```
+     */
+    MarkerComponent.prototype.removeAll = function () {
+        this._markerSet.removeAll();
+    };
+    MarkerComponent.prototype._activate = function () {
+        var _this = this;
+        var groundAltitude$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.camera.position.z + _this._relativeGroundAltitude;
+        }), operators_1.distinctUntilChanged(function (a1, a2) {
+            return Math.abs(a1 - a2) < 0.01;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var geoInitiated$ = rxjs_1.combineLatest(groundAltitude$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
+        var clampedConfiguration$ = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };
+        }));
+        var currentlatLon$ = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) { return node.latLon; }), operators_1.publishReplay(1), operators_1.refCount());
+        var visibleBBox$ = rxjs_1.combineLatest(clampedConfiguration$, currentlatLon$).pipe(operators_1.map(function (_a) {
+            var configuration = _a[0], latLon = _a[1];
+            return _this._graphCalculator
+                .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var visibleMarkers$ = rxjs_1.combineLatest(rxjs_1.concat(rxjs_1.of(this._markerSet), this._markerSet.changed$), visibleBBox$).pipe(operators_1.map(function (_a) {
+            var set = _a[0], bbox = _a[1];
+            return set.search(bbox);
+        }));
+        this._setChangedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
+            return visibleMarkers$.pipe(operators_1.withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$));
+        }))
+            .subscribe(function (_a) {
+            var markers = _a[0], reference = _a[1], alt = _a[2];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            var sceneMarkers = markerScene.markers;
+            var markersToRemove = Object.assign({}, sceneMarkers);
+            for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
+                var marker = markers_1[_i];
+                if (marker.id in sceneMarkers) {
+                    delete markersToRemove[marker.id];
+                }
+                else {
+                    var point3d = geoCoords
+                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                    markerScene.add(marker, point3d);
+                }
+            }
+            for (var id in markersToRemove) {
+                if (!markersToRemove.hasOwnProperty(id)) {
+                    continue;
+                }
+                markerScene.remove(id);
+            }
+        });
+        this._markersUpdatedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
+            return _this._markerSet.updated$.pipe(operators_1.withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$));
+        }))
+            .subscribe(function (_a) {
+            var markers = _a[0], _b = _a[1], sw = _b[0], ne = _b[1], reference = _a[2], alt = _a[3];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) {
+                var marker = markers_2[_i];
+                var exists = markerScene.has(marker.id);
+                var visible = marker.latLon.lat > sw.lat &&
+                    marker.latLon.lat < ne.lat &&
+                    marker.latLon.lon > sw.lon &&
+                    marker.latLon.lon < ne.lon;
+                if (visible) {
+                    var point3d = geoCoords
+                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                    markerScene.add(marker, point3d);
+                }
+                else if (!visible && exists) {
+                    markerScene.remove(marker.id);
+                }
+            }
+        });
+        this._referenceSubscription = this._navigator.stateService.reference$.pipe(operators_1.skip(1), operators_1.withLatestFrom(groundAltitude$))
+            .subscribe(function (_a) {
+            var reference = _a[0], alt = _a[1];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
+                var marker = _b[_i];
+                var point3d = geoCoords
+                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                markerScene.update(marker.id, point3d);
+            }
+        });
+        this._adjustHeightSubscription = groundAltitude$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._navigator.stateService.reference$, currentlatLon$))
+            .subscribe(function (_a) {
+            var alt = _a[0], reference = _a[1], latLon = _a[2];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            var position = geoCoords
+                .geodeticToEnu(latLon.lat, latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
+                var marker = _b[_i];
+                var point3d = geoCoords
+                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                var distanceX = point3d[0] - position[0];
+                var distanceY = point3d[1] - position[1];
+                var groundDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
+                if (groundDistance > 50) {
+                    continue;
+                }
+                markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));
+            }
+        });
+        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            var scene = _this._markerScene;
+            return {
+                name: _this._name,
+                render: {
+                    frameId: frame.id,
+                    needsRender: scene.needsRender,
+                    render: scene.render.bind(scene),
+                    stage: Render_1.GLRenderStage.Foreground,
+                },
+            };
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        var hoveredMarkerId$ = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$).pipe(operators_1.map(function (_a) {
+            var render = _a[0], event = _a[1];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
+            var markerId = _this._markerScene.intersectObjects(viewport, render.perspective);
+            return markerId;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var draggingStarted$ = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function (event) {
+            return true;
+        }));
+        var draggingStopped$ = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function (event) {
+            return false;
+        }));
+        var filteredDragging$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.startWith(false));
+        this._dragEventSubscription = rxjs_1.merge(draggingStarted$.pipe(operators_1.withLatestFrom(hoveredMarkerId$)), rxjs_1.combineLatest(draggingStopped$, rxjs_1.of(null))).pipe(operators_1.startWith([false, null]), operators_1.pairwise())
+            .subscribe(function (_a) {
+            var previous = _a[0], current = _a[1];
+            var dragging = current[0];
+            var eventType = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;
+            var id = dragging ? current[1] : previous[1];
+            var marker = _this._markerScene.get(id);
+            var markerEvent = { marker: marker, target: _this, type: eventType };
+            _this.fire(eventType, markerEvent);
+        });
+        var mouseDown$ = rxjs_1.merge(this._container.mouseService.mouseDown$.pipe(operators_1.map(function (event) { return true; })), this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function (event) { return false; }))).pipe(operators_1.startWith(false));
+        this._mouseClaimSubscription = rxjs_1.combineLatest(this._container.mouseService.active$, hoveredMarkerId$.pipe(operators_1.distinctUntilChanged()), mouseDown$, filteredDragging$).pipe(operators_1.map(function (_a) {
+            var active = _a[0], markerId = _a[1], mouseDown = _a[2], filteredDragging = _a[3];
+            return (!active && markerId != null && mouseDown) || filteredDragging;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (claim) {
+            if (claim) {
+                _this._container.mouseService.claimMouse(_this._name, 1);
+                _this._container.mouseService.claimWheel(_this._name, 1);
+            }
+            else {
+                _this._container.mouseService.unclaimMouse(_this._name);
+                _this._container.mouseService.unclaimWheel(_this._name);
+            }
+        });
+        var offset$ = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$), operators_1.map(function (_a) {
+            var e = _a[0], id = _a[1], r = _a[2];
+            var marker = _this._markerScene.get(id);
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.projectToCanvas(marker.geometry.position.toArray(), element, r.perspective), groundCanvasX = _b[0], groundCanvasY = _b[1];
+            var _c = _this._viewportCoords.canvasPosition(e, element), canvasX = _c[0], canvasY = _c[1];
+            var offset = [canvasX - groundCanvasX, canvasY - groundCanvasY];
+            return [marker, offset, r];
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._updateMarkerSubscription = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDrag$).pipe(operators_1.withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$))
+            .subscribe(function (_a) {
+            var event = _a[0], _b = _a[1], marker = _b[0], offset = _b[1], render = _b[2], reference = _a[2], configuration = _a[3];
+            if (!_this._markerScene.has(marker.id)) {
+                return;
+            }
+            var element = _this._container.element;
+            var _c = _this._viewportCoords.canvasPosition(event, element), canvasX = _c[0], canvasY = _c[1];
+            var groundX = canvasX - offset[0];
+            var groundY = canvasY - offset[1];
+            var _d = _this._viewportCoords
+                .canvasToViewport(groundX, groundY, element), viewportX = _d[0], viewportY = _d[1];
+            var direction = new THREE.Vector3(viewportX, viewportY, 1)
+                .unproject(render.perspective)
+                .sub(render.perspective.position)
+                .normalize();
+            var distance = Math.min(_this._relativeGroundAltitude / direction.z, configuration.visibleBBoxSize / 2 - 0.1);
+            if (distance < 0) {
+                return;
+            }
+            var intersection = direction
+                .clone()
+                .multiplyScalar(distance)
+                .add(render.perspective.position);
+            intersection.z = render.perspective.position.z + _this._relativeGroundAltitude;
+            var _e = _this._geoCoords
+                .enuToGeodetic(intersection.x, intersection.y, intersection.z, reference.lat, reference.lon, reference.alt), lat = _e[0], lon = _e[1];
+            _this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });
+            _this._markerSet.update(marker);
+            var markerEvent = { marker: marker, target: _this, type: MarkerComponent.changed };
+            _this.fire(MarkerComponent.changed, markerEvent);
+        });
+    };
+    MarkerComponent.prototype._deactivate = function () {
+        this._adjustHeightSubscription.unsubscribe();
+        this._dragEventSubscription.unsubscribe();
+        this._markersUpdatedSubscription.unsubscribe();
+        this._mouseClaimSubscription.unsubscribe();
+        this._referenceSubscription.unsubscribe();
+        this._renderSubscription.unsubscribe();
+        this._setChangedSubscription.unsubscribe();
+        this._updateMarkerSubscription.unsubscribe();
+        this._markerScene.clear();
+    };
+    MarkerComponent.prototype._getDefaultConfiguration = function () {
+        return { visibleBBoxSize: 100 };
+    };
+    MarkerComponent.componentName = "marker";
+    /**
+     * Fired when the position of a marker is changed.
+     * @event
+     * @type {IMarkerEvent} markerEvent - Marker event data.
+     * @example
+     * ```
+     * markerComponent.on("changed", function(e) {
+     *     console.log(e.marker.id, e.marker.latLon);
+     * });
+     * ```
+     */
+    MarkerComponent.changed = "changed";
+    /**
+     * Fired when a marker drag interaction starts.
+     * @event
+     * @type {IMarkerEvent} markerEvent - Marker event data.
+     * @example
+     * ```
+     * markerComponent.on("dragstart", function(e) {
+     *     console.log(e.marker.id, e.marker.latLon);
+     * });
+     * ```
+     */
+    MarkerComponent.dragstart = "dragstart";
+    /**
+     * Fired when a marker drag interaction ends.
+     * @event
+     * @type {IMarkerEvent} markerEvent - Marker event data.
+     * @example
+     * ```
+     * markerComponent.on("dragend", function(e) {
+     *     console.log(e.marker.id, e.marker.latLon);
+     * });
+     * ```
+     */
+    MarkerComponent.dragend = "dragend";
+    return MarkerComponent;
+}(Component_1.Component));
+exports.MarkerComponent = MarkerComponent;
+Component_1.ComponentService.register(MarkerComponent);
+exports.default = MarkerComponent;
+
+
+},{"../../Component":291,"../../Geo":294,"../../Graph":295,"../../Render":297,"rxjs":43,"rxjs/operators":241,"three":242,"when":288}],335:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MarkerScene = void 0;
+var THREE = require("three");
+var MarkerScene = /** @class */ (function () {
+    function MarkerScene(scene, raycaster) {
+        this._needsRender = false;
+        this._interactiveObjects = [];
+        this._markers = {};
+        this._objectMarkers = {};
+        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
+        this._scene = !!scene ? scene : new THREE.Scene();
+    }
+    Object.defineProperty(MarkerScene.prototype, "markers", {
+        get: function () {
+            return this._markers;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MarkerScene.prototype, "needsRender", {
+        get: function () {
+            return this._needsRender;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    MarkerScene.prototype.add = function (marker, position) {
+        if (marker.id in this._markers) {
+            this._dispose(marker.id);
+        }
+        marker.createGeometry(position);
+        this._scene.add(marker.geometry);
+        this._markers[marker.id] = marker;
+        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
+            var interactiveObject = _a[_i];
+            this._interactiveObjects.push(interactiveObject);
+            this._objectMarkers[interactiveObject.uuid] = marker.id;
+        }
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.clear = function () {
+        for (var id in this._markers) {
+            if (!this._markers.hasOwnProperty) {
+                continue;
+            }
+            this._dispose(id);
+        }
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.get = function (id) {
+        return this._markers[id];
+    };
+    MarkerScene.prototype.getAll = function () {
+        var _this = this;
+        return Object
+            .keys(this._markers)
+            .map(function (id) { return _this._markers[id]; });
+    };
+    MarkerScene.prototype.has = function (id) {
+        return id in this._markers;
+    };
+    MarkerScene.prototype.intersectObjects = function (_a, camera) {
+        var viewportX = _a[0], viewportY = _a[1];
+        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
+        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
+        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
+            var intersect = intersects_1[_i];
+            if (intersect.object.uuid in this._objectMarkers) {
+                return this._objectMarkers[intersect.object.uuid];
+            }
+        }
+        return null;
+    };
+    MarkerScene.prototype.lerpAltitude = function (id, alt, alpha) {
+        if (!(id in this._markers)) {
+            return;
+        }
+        this._markers[id].lerpAltitude(alt, alpha);
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.remove = function (id) {
+        if (!(id in this._markers)) {
+            return;
+        }
+        this._dispose(id);
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.render = function (perspectiveCamera, renderer) {
+        renderer.render(this._scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    MarkerScene.prototype.update = function (id, position, latLon) {
+        if (!(id in this._markers)) {
+            return;
+        }
+        var marker = this._markers[id];
+        marker.updatePosition(position, latLon);
+        this._needsRender = true;
+    };
+    MarkerScene.prototype._dispose = function (id) {
+        var marker = this._markers[id];
+        this._scene.remove(marker.geometry);
+        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
+            var interactiveObject = _a[_i];
+            var index = this._interactiveObjects.indexOf(interactiveObject);
+            if (index !== -1) {
+                this._interactiveObjects.splice(index, 1);
+            }
+            else {
+                console.warn("Object does not exist (" + interactiveObject.id + ") for " + id);
+            }
+            delete this._objectMarkers[interactiveObject.uuid];
+        }
+        marker.disposeGeometry();
+        delete this._markers[id];
+    };
+    return MarkerScene;
+}());
+exports.MarkerScene = MarkerScene;
+exports.default = MarkerScene;
+
+},{"three":242}],336:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MarkerSet = void 0;
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../Geo");
+var MarkerSet = /** @class */ (function () {
+    function MarkerSet() {
+        this._hash = {};
+        this._index = new Geo_1.GeoRBush(16);
+        this._indexChanged$ = new rxjs_1.Subject();
+        this._updated$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(MarkerSet.prototype, "changed$", {
+        get: function () {
+            return this._indexChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MarkerSet.prototype, "updated$", {
+        get: function () {
+            return this._updated$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    MarkerSet.prototype.add = function (markers) {
+        var updated = [];
+        var hash = this._hash;
+        var index = this._index;
+        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
+            var marker = markers_1[_i];
+            var id = marker.id;
+            if (id in hash) {
+                index.remove(hash[id]);
+                updated.push(marker);
+            }
+            var item = {
+                lat: marker.latLon.lat,
+                lon: marker.latLon.lon,
+                marker: marker,
+            };
+            hash[id] = item;
+            index.insert(item);
+        }
+        if (updated.length > 0) {
+            this._updated$.next(updated);
+        }
+        if (markers.length > updated.length) {
+            this._indexChanged$.next(this);
+        }
+    };
+    MarkerSet.prototype.has = function (id) {
+        return id in this._hash;
+    };
+    MarkerSet.prototype.get = function (id) {
+        return this.has(id) ? this._hash[id].marker : undefined;
+    };
+    MarkerSet.prototype.getAll = function () {
+        return this._index
+            .all()
+            .map(function (indexItem) {
+            return indexItem.marker;
+        });
+    };
+    MarkerSet.prototype.remove = function (ids) {
+        var hash = this._hash;
+        var index = this._index;
+        var changed = false;
+        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
+            var id = ids_1[_i];
+            if (!(id in hash)) {
+                continue;
+            }
+            var item = hash[id];
+            index.remove(item);
+            delete hash[id];
+            changed = true;
+        }
+        if (changed) {
+            this._indexChanged$.next(this);
+        }
+    };
+    MarkerSet.prototype.removeAll = function () {
+        this._hash = {};
+        this._index.clear();
+        this._indexChanged$.next(this);
+    };
+    MarkerSet.prototype.search = function (_a) {
+        var sw = _a[0], ne = _a[1];
+        return this._index
+            .search({
+            maxX: ne.lat,
+            maxY: ne.lon,
+            minX: sw.lat,
+            minY: sw.lon,
+        })
+            .map(function (indexItem) {
+            return indexItem.marker;
+        });
+    };
+    MarkerSet.prototype.update = function (marker) {
+        var hash = this._hash;
+        var index = this._index;
+        var id = marker.id;
+        if (!(id in hash)) {
+            return;
+        }
+        index.remove(hash[id]);
+        var item = {
+            lat: marker.latLon.lat,
+            lon: marker.latLon.lon,
+            marker: marker,
+        };
+        hash[id] = item;
+        index.insert(item);
+    };
+    return MarkerSet;
+}());
+exports.MarkerSet = MarkerSet;
+exports.default = MarkerSet;
+
+},{"../../Geo":294,"rxjs":43}],337:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],338:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CircleMarker = void 0;
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+/**
+ * @class CircleMarker
+ *
+ * @classdesc Non-interactive marker with a flat circle shape. The circle
+ * marker can not be configured to be interactive.
+ *
+ * Circle marker properties can not be updated after creation.
+ *
+ * To create and add one `CircleMarker` with default configuration
+ * and one with configuration use
+ *
+ * @example
+ * ```
+ * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker(
+ *     "id-1",
+ *     { lat: 0, lon: 0, });
+ *
+ * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker(
+ *     "id-2",
+ *     { lat: 0, lon: 0, },
+ *     {
+ *         color: "#0Ff",
+ *         opacity: 0.3,
+ *         radius: 0.7,
+ *     });
+ *
+ * markerComponent.add([defaultMarker, configuredMarker]);
+ * ```
+ */
+var CircleMarker = /** @class */ (function (_super) {
+    __extends(CircleMarker, _super);
+    function CircleMarker(id, latLon, options) {
+        var _this = _super.call(this, id, latLon) || this;
+        options = !!options ? options : {};
+        _this._color = options.color != null ? options.color : 0xffffff;
+        _this._opacity = options.opacity != null ? options.opacity : 0.4;
+        _this._radius = options.radius != null ? options.radius : 1;
+        return _this;
+    }
+    CircleMarker.prototype._createGeometry = function (position) {
+        var circle = new THREE.Mesh(new THREE.CircleGeometry(this._radius, 16), new THREE.MeshBasicMaterial({
+            color: this._color,
+            opacity: this._opacity,
+            transparent: true,
+        }));
+        circle.up.fromArray([0, 0, 1]);
+        circle.renderOrder = -1;
+        var group = new THREE.Object3D();
+        group.add(circle);
+        group.position.fromArray(position);
+        this._geometry = group;
+    };
+    CircleMarker.prototype._disposeGeometry = function () {
+        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
+            var mesh = _a[_i];
+            mesh.geometry.dispose();
+            mesh.material.dispose();
+        }
+    };
+    CircleMarker.prototype._getInteractiveObjects = function () {
+        return [];
+    };
+    return CircleMarker;
+}(Component_1.Marker));
+exports.CircleMarker = CircleMarker;
+exports.default = CircleMarker;
+
+},{"../../../Component":291,"three":242}],339:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Marker = void 0;
+/**
+ * @class Marker
+ *
+ * @classdesc Represents an abstract marker class that should be extended
+ * by marker implementations used in the marker component.
+ */
+var Marker = /** @class */ (function () {
+    function Marker(id, latLon) {
+        this._id = id;
+        this._latLon = latLon;
+    }
+    Object.defineProperty(Marker.prototype, "id", {
+        /**
+         * Get id.
+         * @returns {string} The id of the marker.
+         */
+        get: function () {
+            return this._id;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Marker.prototype, "geometry", {
+        /**
+         * Get geometry.
+         *
+         * @ignore
+         */
+        get: function () {
+            return this._geometry;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Marker.prototype, "latLon", {
+        /**
+         * Get lat lon.
+         * @returns {ILatLon} The geographic coordinates of the marker.
+         */
+        get: function () {
+            return this._latLon;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /** @ignore */
+    Marker.prototype.createGeometry = function (position) {
+        if (!!this._geometry) {
+            return;
+        }
+        this._createGeometry(position);
+        // update matrix world if raycasting occurs before first render
+        this._geometry.updateMatrixWorld(true);
+    };
+    /** @ignore */
+    Marker.prototype.disposeGeometry = function () {
+        if (!this._geometry) {
+            return;
+        }
+        this._disposeGeometry();
+        this._geometry = undefined;
+    };
+    /** @ignore */
+    Marker.prototype.getInteractiveObjects = function () {
+        if (!this._geometry) {
+            return [];
+        }
+        return this._getInteractiveObjects();
+    };
+    /** @ignore */
+    Marker.prototype.lerpAltitude = function (alt, alpha) {
+        if (!this._geometry) {
+            return;
+        }
+        this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt;
+    };
+    /** @ignore */
+    Marker.prototype.updatePosition = function (position, latLon) {
+        if (!!latLon) {
+            this._latLon.lat = latLon.lat;
+            this._latLon.lon = latLon.lon;
+        }
+        if (!this._geometry) {
+            return;
+        }
+        this._geometry.position.fromArray(position);
+        this._geometry.updateMatrixWorld(true);
+    };
+    return Marker;
+}());
+exports.Marker = Marker;
+exports.default = Marker;
+
+},{}],340:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SimpleMarker = void 0;
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+/**
+ * @class SimpleMarker
+ *
+ * @classdesc Interactive marker with ice cream shape. The sphere
+ * inside the ice cream can be configured to be interactive.
+ *
+ * Simple marker properties can not be updated after creation.
+ *
+ * To create and add one `SimpleMarker` with default configuration
+ * (non-interactive) and one interactive with configuration use
+ *
+ * @example
+ * ```
+ * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(
+ *     "id-1",
+ *     { lat: 0, lon: 0, });
+ *
+ * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(
+ *     "id-2",
+ *     { lat: 0, lon: 0, },
+ *     {
+ *         ballColor: "#00f",
+ *         ballOpacity: 0.5,
+ *         color: "#00f",
+ *         interactive: true,
+ *         opacity: 0.3,
+ *         radius: 0.7,
+ *     });
+ *
+ * markerComponent.add([defaultMarker, interactiveMarker]);
+ * ```
+ */
+var SimpleMarker = /** @class */ (function (_super) {
+    __extends(SimpleMarker, _super);
+    function SimpleMarker(id, latLon, options) {
+        var _this = _super.call(this, id, latLon) || this;
+        options = !!options ? options : {};
+        _this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;
+        _this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;
+        _this._circleToRayAngle = 2;
+        _this._color = options.color != null ? options.color : 0xff0000;
+        _this._interactive = !!options.interactive;
+        _this._opacity = options.opacity != null ? options.opacity : 0.4;
+        _this._radius = options.radius != null ? options.radius : 1;
+        return _this;
+    }
+    SimpleMarker.prototype._createGeometry = function (position) {
+        var radius = this._radius;
+        var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({
+            color: this._color,
+            opacity: this._opacity,
+            transparent: true,
+        }));
+        cone.renderOrder = 1;
+        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({
+            color: this._ballColor,
+            opacity: this._ballOpacity,
+            transparent: true,
+        }));
+        ball.position.z = this._markerHeight(radius);
+        var group = new THREE.Object3D();
+        group.add(ball);
+        group.add(cone);
+        group.position.fromArray(position);
+        this._geometry = group;
+    };
+    SimpleMarker.prototype._disposeGeometry = function () {
+        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
+            var mesh = _a[_i];
+            mesh.geometry.dispose();
+            mesh.material.dispose();
+        }
+    };
+    SimpleMarker.prototype._getInteractiveObjects = function () {
+        return this._interactive ? [this._geometry.children[0]] : [];
+    };
+    SimpleMarker.prototype._markerHeight = function (radius) {
+        var t = Math.tan(Math.PI - this._circleToRayAngle);
+        return radius * Math.sqrt(1 + t * t);
+    };
+    SimpleMarker.prototype._markerGeometry = function (radius, widthSegments, heightSegments) {
+        var geometry = new THREE.Geometry();
+        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
+        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
+        var height = this._markerHeight(radius);
+        var vertices = [];
+        for (var y = 0; y <= heightSegments; ++y) {
+            var verticesRow = [];
+            for (var x = 0; x <= widthSegments; ++x) {
+                var u = x / widthSegments * Math.PI * 2;
+                var v = y / heightSegments * Math.PI;
+                var r = void 0;
+                if (v < this._circleToRayAngle) {
+                    r = radius;
+                }
+                else {
+                    var t = Math.tan(v - this._circleToRayAngle);
+                    r = radius * Math.sqrt(1 + t * t);
+                }
+                var vertex = new THREE.Vector3();
+                vertex.x = r * Math.cos(u) * Math.sin(v);
+                vertex.y = r * Math.sin(u) * Math.sin(v);
+                vertex.z = r * Math.cos(v) + height;
+                geometry.vertices.push(vertex);
+                verticesRow.push(geometry.vertices.length - 1);
+            }
+            vertices.push(verticesRow);
+        }
+        for (var y = 0; y < heightSegments; ++y) {
+            for (var x = 0; x < widthSegments; ++x) {
+                var v1 = vertices[y][x + 1];
+                var v2 = vertices[y][x];
+                var v3 = vertices[y + 1][x];
+                var v4 = vertices[y + 1][x + 1];
+                var n1 = geometry.vertices[v1].clone().normalize();
+                var n2 = geometry.vertices[v2].clone().normalize();
+                var n3 = geometry.vertices[v3].clone().normalize();
+                var n4 = geometry.vertices[v4].clone().normalize();
+                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));
+                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));
+            }
+        }
+        geometry.computeFaceNormals();
+        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);
+        return geometry;
+    };
+    return SimpleMarker;
+}(Component_1.Marker));
+exports.SimpleMarker = SimpleMarker;
+exports.default = SimpleMarker;
+
+},{"../../../Component":291,"three":242}],341:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BounceHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `BounceHandler` ensures that the viewer bounces back to the image
+ * when drag panning outside of the image edge.
+ */
+var BounceHandler = /** @class */ (function (_super) {
+    __extends(BounceHandler, _super);
+    function BounceHandler(component, container, navigator, viewportCoords, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    BounceHandler.prototype._enable = function () {
+        var _this = this;
+        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.alpha < 1;
+        }), operators_1.distinctUntilChanged());
+        this._bounceSubscription = rxjs_1.combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (noForce) {
+            return noForce[0] || noForce[1] || noForce[2] || noForce[3];
+        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (noForce) {
+            return noForce ?
+                rxjs_1.empty() :
+                rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.pipe(operators_1.first()));
+        }), operators_1.withLatestFrom(this._navigator.panService.panNodes$))
+            .subscribe(function (_a) {
+            var _b = _a[0], render = _b[0], transform = _b[1], nts = _a[1];
+            if (!transform.hasValidScale && render.camera.focal < 0.1) {
+                return;
+            }
+            if (render.perspective.aspect === 0 || render.perspective.aspect === Number.POSITIVE_INFINITY) {
+                return;
+            }
+            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
+            var basic = _this._viewportCoords.viewportToBasic(0, 0, transform, render.perspective);
+            if ((basic[0] < 0 || basic[0] > 1) && nts.length > 0) {
+                distances[0] = distances[2] = 0;
+            }
+            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
+                var _c = nts_1[_i], t = _c[1];
+                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
+                for (var i = 1; i < distances.length; i += 2) {
+                    if (d[i] < distances[i]) {
+                        distances[i] = d[i];
+                    }
+                }
+            }
+            if (Math.max.apply(Math, distances) < 0.01) {
+                return;
+            }
+            var horizontalDistance = distances[1] - distances[3];
+            var verticalDistance = distances[0] - distances[2];
+            var currentDirection = _this._viewportCoords
+                .unprojectFromViewport(0, 0, render.perspective)
+                .sub(render.perspective.position);
+            var directionPhi = _this._viewportCoords
+                .unprojectFromViewport(horizontalDistance, 0, render.perspective)
+                .sub(render.perspective.position);
+            var directionTheta = _this._viewportCoords
+                .unprojectFromViewport(0, verticalDistance, render.perspective)
+                .sub(render.perspective.position);
+            var phi = (horizontalDistance > 0 ? 1 : -1) * directionPhi.angleTo(currentDirection);
+            var theta = (verticalDistance > 0 ? 1 : -1) * directionTheta.angleTo(currentDirection);
+            var threshold = Math.PI / 60;
+            var coeff = 1e-1;
+            phi = _this._spatial.clamp(coeff * phi, -threshold, threshold);
+            theta = _this._spatial.clamp(coeff * theta, -threshold, threshold);
+            _this._navigator.stateService.rotateUnbounded({ phi: phi, theta: theta });
+        });
+    };
+    BounceHandler.prototype._disable = function () {
+        this._bounceSubscription.unsubscribe();
+    };
+    BounceHandler.prototype._getConfiguration = function () {
+        return {};
+    };
+    return BounceHandler;
+}(Component_1.HandlerBase));
+exports.BounceHandler = BounceHandler;
+exports.default = BounceHandler;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],342:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DoubleClickZoomHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.doubleClickZoom.disable();
+ * mouseComponent.doubleClickZoom.enable();
+ *
+ * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;
+ * ```
+ */
+var DoubleClickZoomHandler = /** @class */ (function (_super) {
+    __extends(DoubleClickZoomHandler, _super);
+    /** @ignore */
+    function DoubleClickZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    DoubleClickZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._zoomSubscription = rxjs_1.merge(this._container.mouseService
+            .filtered$(this._component.name, this._container.mouseService.dblClick$), this._container.touchService.doubleTap$.pipe(operators_1.map(function (e) {
+            var touch = e.touches[0];
+            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };
+        }))).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var event = _a[0], render = _a[1], transform = _a[2];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            var delta = !!event.shiftKey ? -1 : 1;
+            _this._navigator.stateService.zoomIn(delta, reference);
+        });
+    };
+    DoubleClickZoomHandler.prototype._disable = function () {
+        this._zoomSubscription.unsubscribe();
+    };
+    DoubleClickZoomHandler.prototype._getConfiguration = function (enable) {
+        return { doubleClickZoom: enable };
+    };
+    return DoubleClickZoomHandler;
+}(Component_1.HandlerBase));
+exports.DoubleClickZoomHandler = DoubleClickZoomHandler;
+exports.default = DoubleClickZoomHandler;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],343:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DragPanHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.dragPan.disable();
+ * mouseComponent.dragPan.enable();
+ *
+ * var isEnabled = mouseComponent.dragPan.isEnabled;
+ * ```
+ */
+var DragPanHandler = /** @class */ (function (_super) {
+    __extends(DragPanHandler, _super);
+    /** @ignore */
+    function DragPanHandler(component, container, navigator, viewportCoords, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    DragPanHandler.prototype._enable = function () {
+        var _this = this;
+        var draggingStarted$ = this._container.mouseService
+            .filtered$(this._component.name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function () {
+            return true;
+        }), operators_1.share());
+        var draggingStopped$ = this._container.mouseService
+            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
+            return false;
+        }), operators_1.share());
+        this._activeMouseSubscription = rxjs_1.merge(draggingStarted$, draggingStopped$)
+            .subscribe(this._container.mouseService.activate$);
+        var documentMouseMove$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.switchMap(function (dragging) {
+            return dragging ?
+                _this._container.mouseService.documentMouseMove$ :
+                rxjs_1.empty();
+        }));
+        this._preventDefaultSubscription = rxjs_1.merge(documentMouseMove$, this._container.touchService.touchMove$)
+            .subscribe(function (event) {
+            event.preventDefault(); // prevent selection of content outside the viewer
+        });
+        var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$.pipe(operators_1.map(function () {
+            return true;
+        }));
+        var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () {
+            return false;
+        }));
+        this._activeTouchSubscription = rxjs_1.merge(touchMovingStarted$, touchMovingStopped$)
+            .subscribe(this._container.touchService.activate$);
+        var rotation$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;
+        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (enable) {
+            if (!enable) {
+                return rxjs_1.empty();
+            }
+            var mouseDrag$ = Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService);
+            var singleTouchDrag$ = rxjs_1.merge(_this._container.touchService.singleTouchDragStart$, _this._container.touchService.singleTouchDrag$, _this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () { return null; }))).pipe(operators_1.map(function (event) {
+                return event != null && event.touches.length > 0 ?
+                    event.touches[0] : null;
+            }), operators_1.pairwise(), operators_1.filter(function (pair) {
+                return pair[0] != null && pair[1] != null;
+            }));
+            return rxjs_1.merge(mouseDrag$, singleTouchDrag$);
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.panService.panNodes$), operators_1.map(function (_a) {
+            var events = _a[0], render = _a[1], transform = _a[2], nts = _a[3];
+            var previousEvent = events[0];
+            var event = events[1];
+            var movementX = event.clientX - previousEvent.clientX;
+            var movementY = event.clientY - previousEvent.clientY;
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective)
+                .sub(render.perspective.position);
+            var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movementX, canvasY, element, render.perspective)
+                .sub(render.perspective.position);
+            var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movementY, element, render.perspective)
+                .sub(render.perspective.position);
+            var phi = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
+            var theta = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
+            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
+            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
+                var _c = nts_1[_i], t = _c[1];
+                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
+                for (var i = 0; i < distances.length; i++) {
+                    if (d[i] < distances[i]) {
+                        distances[i] = d[i];
+                    }
+                }
+            }
+            if (distances[0] > 0 && theta < 0) {
+                theta /= Math.max(1, 2e2 * distances[0]);
+            }
+            if (distances[2] > 0 && theta > 0) {
+                theta /= Math.max(1, 2e2 * distances[2]);
+            }
+            if (distances[1] > 0 && phi < 0) {
+                phi /= Math.max(1, 2e2 * distances[1]);
+            }
+            if (distances[3] > 0 && phi > 0) {
+                phi /= Math.max(1, 2e2 * distances[3]);
+            }
+            return { phi: phi, theta: theta };
+        }), operators_1.share());
+        this._rotateWithoutInertiaSubscription = rotation$
+            .subscribe(function (rotation) {
+            _this._navigator.stateService.rotateWithoutInertia(rotation);
+        });
+        this._rotateSubscription = rotation$.pipe(operators_1.scan(function (rotationBuffer, rotation) {
+            _this._drainBuffer(rotationBuffer);
+            rotationBuffer.push([Date.now(), rotation]);
+            return rotationBuffer;
+        }, []), operators_1.sample(rxjs_1.merge(this._container.mouseService.filtered$(this._component.name, this._container.mouseService.mouseDragEnd$), this._container.touchService.singleTouchDragEnd$)), operators_1.map(function (rotationBuffer) {
+            var drainedBuffer = _this._drainBuffer(rotationBuffer.slice());
+            var rotation = { phi: 0, theta: 0 };
+            for (var _i = 0, drainedBuffer_1 = drainedBuffer; _i < drainedBuffer_1.length; _i++) {
+                var bufferedRotation = drainedBuffer_1[_i];
+                rotation.phi += bufferedRotation[1].phi;
+                rotation.theta += bufferedRotation[1].theta;
+            }
+            var count = drainedBuffer.length;
+            if (count > 0) {
+                rotation.phi /= count;
+                rotation.theta /= count;
+            }
+            var threshold = Math.PI / 18;
+            rotation.phi = _this._spatial.clamp(rotation.phi, -threshold, threshold);
+            rotation.theta = _this._spatial.clamp(rotation.theta, -threshold, threshold);
+            return rotation;
+        }))
+            .subscribe(function (rotation) {
+            _this._navigator.stateService.rotate(rotation);
+        });
+    };
+    DragPanHandler.prototype._disable = function () {
+        this._activeMouseSubscription.unsubscribe();
+        this._activeTouchSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._rotateSubscription.unsubscribe();
+        this._rotateWithoutInertiaSubscription.unsubscribe();
+        this._activeMouseSubscription = null;
+        this._activeTouchSubscription = null;
+        this._preventDefaultSubscription = null;
+        this._rotateSubscription = null;
+    };
+    DragPanHandler.prototype._getConfiguration = function (enable) {
+        return { dragPan: enable };
+    };
+    DragPanHandler.prototype._drainBuffer = function (buffer) {
+        var cutoff = 50;
+        var now = Date.now();
+        while (buffer.length > 0 && now - buffer[0][0] > cutoff) {
+            buffer.shift();
+        }
+        return buffer;
+    };
+    return DragPanHandler;
+}(Component_1.HandlerBase));
+exports.DragPanHandler = DragPanHandler;
+exports.default = DragPanHandler;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],344:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EarthControlHandler = void 0;
+var THREE = require("three");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var State_1 = require("../../State");
+var EarthControlHandler = /** @class */ (function (_super) {
+    __extends(EarthControlHandler, _super);
+    function EarthControlHandler(component, container, navigator, viewportCoords, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    EarthControlHandler.prototype._enable = function () {
+        var _this = this;
+        var earth$ = this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
+            return state === State_1.State.Earth;
+        }), operators_1.share());
+        this._preventDefaultSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            return earth ?
+                _this._container.mouseService.mouseWheel$ :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (event) {
+            event.preventDefault();
+        });
+        this._truckSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            if (!earth) {
+                return rxjs_1.empty();
+            }
+            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
+                var e1 = _a[0], e2 = _a[1];
+                return !(e1.ctrlKey && e2.ctrlKey);
+            }));
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var _b = _a[0], previous = _b[0], current = _b[1], render = _a[1], transform = _a[2];
+            var planeNormal = [0, 0, 1];
+            var planePoint = transform.unprojectBasic([0.5, 0.5], 0);
+            planePoint[2] -= 2;
+            var currentIntersection = _this._planeIntersection(current, planeNormal, planePoint, render.perspective, _this._container.element);
+            var previousIntersection = _this._planeIntersection(previous, planeNormal, planePoint, render.perspective, _this._container.element);
+            if (!currentIntersection || !previousIntersection) {
+                return null;
+            }
+            var direction = new THREE.Vector3()
+                .subVectors(currentIntersection, previousIntersection)
+                .multiplyScalar(-1)
+                .toArray();
+            return direction;
+        }), operators_1.filter(function (direction) {
+            return !!direction;
+        }))
+            .subscribe(function (direction) {
+            _this._navigator.stateService.truck(direction);
+        });
+        this._orbitSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            if (!earth) {
+                return rxjs_1.empty();
+            }
+            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
+                var e1 = _a[0], e2 = _a[1];
+                return e1.ctrlKey && e2.ctrlKey;
+            }));
+        }), operators_1.map(function (_a) {
+            var previous = _a[0], current = _a[1];
+            var _b = _this._eventToViewport(current, _this._container.element), currentX = _b[0], currentY = _b[1];
+            var _c = _this._eventToViewport(previous, _this._container.element), previousX = _c[0], previousY = _c[1];
+            var phi = (previousX - currentX) * Math.PI;
+            var theta = (currentY - previousY) * Math.PI / 2;
+            return { phi: phi, theta: theta };
+        }))
+            .subscribe(function (rotation) {
+            _this._navigator.stateService.orbit(rotation);
+        });
+        this._dollySubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            if (!earth) {
+                return rxjs_1.empty();
+            }
+            return _this._container.mouseService
+                .filteredWheel$(_this._component.name, _this._container.mouseService.mouseWheel$);
+        }), operators_1.map(function (event) {
+            var delta = event.deltaY;
+            if (event.deltaMode === 1) {
+                delta = 40 * delta;
+            }
+            else if (event.deltaMode === 2) {
+                delta = 800 * delta;
+            }
+            var canvasSize = _this._viewportCoords.containerToCanvas(_this._container.element);
+            return -delta / canvasSize[1];
+        }))
+            .subscribe(function (delta) {
+            _this._navigator.stateService.dolly(delta);
+        });
+    };
+    EarthControlHandler.prototype._disable = function () {
+        this._dollySubscription.unsubscribe();
+        this._orbitSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._truckSubscription.unsubscribe();
+    };
+    EarthControlHandler.prototype._getConfiguration = function () {
+        return {};
+    };
+    EarthControlHandler.prototype._eventToViewport = function (event, element) {
+        var previousCanvas = this._viewportCoords.canvasPosition(event, element);
+        return this._viewportCoords.canvasToViewport(previousCanvas[0], previousCanvas[1], element);
+    };
+    EarthControlHandler.prototype._planeIntersection = function (event, planeNormal, planePoint, camera, element) {
+        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
+        var direction = this._viewportCoords
+            .unprojectFromCanvas(canvasX, canvasY, element, camera)
+            .sub(camera.position)
+            .normalize();
+        if (Math.abs(this._spatial.angleToPlane(direction.toArray(), planeNormal)) < Math.PI / 90) {
+            return null;
+        }
+        var l0 = camera.position.clone();
+        var n = new THREE.Vector3().fromArray(planeNormal);
+        var p0 = new THREE.Vector3().fromArray(planePoint);
+        var d = new THREE.Vector3().subVectors(p0, l0).dot(n) / direction.clone().dot(n);
+        var intersection = new THREE.Vector3().addVectors(l0, direction.multiplyScalar(d));
+        if (this._viewportCoords.worldToCamera(intersection.toArray(), camera)[2] > 0) {
+            return null;
+        }
+        return intersection;
+    };
+    return EarthControlHandler;
+}(Component_1.HandlerBase));
+exports.EarthControlHandler = EarthControlHandler;
+exports.default = EarthControlHandler;
+
+},{"../../Component":291,"../../State":298,"rxjs":43,"rxjs/operators":241,"three":242}],345:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],346:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.viewportDistances = void 0;
+var Geo_1 = require("../../../src/Geo");
+function basicBoundaryPoints(pointsPerSide) {
+    var points = [];
+    var os = [[0, 0], [1, 0], [1, 1], [0, 1]];
+    var ds = [[1, 0], [0, 1], [-1, 0], [0, -1]];
+    for (var side = 0; side < 4; ++side) {
+        var o = os[side];
+        var d = ds[side];
+        for (var i = 0; i < pointsPerSide; ++i) {
+            points.push([o[0] + d[0] * i / pointsPerSide,
+                o[1] + d[1] * i / pointsPerSide]);
+        }
+    }
+    return points;
+}
+function insideViewport(x, y) {
+    return x >= -1 && x <= 1 && y >= -1 && y <= 1;
+}
+function insideBasic(x, y) {
+    return x >= 0 && x <= 1 && y >= 0 && y <= 1;
+}
+function viewportDistances(transform, perspective, viewportCoords) {
+    var boundaryPointsBasic = basicBoundaryPoints(100);
+    var boundaryPointsViewport = boundaryPointsBasic
+        .map(function (basic) {
+        return viewportCoords.basicToViewportSafe(basic[0], basic[1], transform, perspective);
+    });
+    var visibleBoundaryPoints = [];
+    var viewportSides = [
+        { x: -1, y: 1 },
+        { x: 1, y: 1 },
+        { x: 1, y: -1 },
+        { x: -1, y: -1 }
+    ];
+    var intersections = [false, false, false, false];
+    for (var i = 0; i < boundaryPointsViewport.length; i++) {
+        var p1 = boundaryPointsViewport[i];
+        var p2 = boundaryPointsViewport[(i + 1) % boundaryPointsViewport.length];
+        if (p1 === null) {
+            continue;
+        }
+        if (p2 === null) {
+            if (insideViewport(p1[0], p1[1])) {
+                visibleBoundaryPoints.push(p1);
+            }
+            continue;
+        }
+        var x1 = p1[0], y1 = p1[1];
+        var x2 = p2[0], y2 = p2[1];
+        if (insideViewport(x1, y1)) {
+            if (insideViewport(x2, y2)) {
+                visibleBoundaryPoints.push(p1);
+            }
+            else {
+                for (var side = 0; side < 4; side++) {
+                    var s1 = { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } };
+                    var s2 = { p1: viewportSides[side], p2: viewportSides[(side + 1) % 4] };
+                    var intersecting = Geo_1.Lines.segmentsIntersect(s1, s2);
+                    if (intersecting) {
+                        var intersection = Geo_1.Lines.segmentIntersection(s1, s2);
+                        visibleBoundaryPoints.push(p1, [intersection.x, intersection.y]);
+                        intersections[side] = true;
+                    }
+                }
+            }
+        }
+    }
+    var _a = viewportCoords.viewportToBasic(-1, 1, transform, perspective), topLeftBasicX = _a[0], topLeftBasicY = _a[1];
+    var _b = viewportCoords.viewportToBasic(1, 1, transform, perspective), topRightBasicX = _b[0], topRightBasicY = _b[1];
+    var _c = viewportCoords.viewportToBasic(1, -1, transform, perspective), bottomRightBasicX = _c[0], bottomRightBasicY = _c[1];
+    var _d = viewportCoords.viewportToBasic(-1, -1, transform, perspective), bottomLeftBasicX = _d[0], bottomLeftBasicY = _d[1];
+    if (insideBasic(topLeftBasicX, topLeftBasicY)) {
+        intersections[3] = intersections[0] = true;
+    }
+    if (insideBasic(topRightBasicX, topRightBasicY)) {
+        intersections[0] = intersections[1] = true;
+    }
+    if (insideBasic(bottomRightBasicX, bottomRightBasicY)) {
+        intersections[1] = intersections[2] = true;
+    }
+    if (insideBasic(bottomLeftBasicX, bottomLeftBasicY)) {
+        intersections[2] = intersections[3] = true;
+    }
+    var maximums = [-1, -1, 1, 1];
+    for (var _i = 0, visibleBoundaryPoints_1 = visibleBoundaryPoints; _i < visibleBoundaryPoints_1.length; _i++) {
+        var visibleBoundaryPoint = visibleBoundaryPoints_1[_i];
+        var x = visibleBoundaryPoint[0];
+        var y = visibleBoundaryPoint[1];
+        if (x > maximums[1]) {
+            maximums[1] = x;
+        }
+        if (x < maximums[3]) {
+            maximums[3] = x;
+        }
+        if (y > maximums[0]) {
+            maximums[0] = y;
+        }
+        if (y < maximums[2]) {
+            maximums[2] = y;
+        }
+    }
+    var boundary = [1, 1, -1, -1];
+    var distances = [];
+    for (var side = 0; side < 4; side++) {
+        if (intersections[side]) {
+            distances.push(0);
+            continue;
+        }
+        distances.push(Math.abs(boundary[side] - maximums[side]));
+    }
+    return distances;
+}
+exports.viewportDistances = viewportDistances;
+
+},{"../../../src/Geo":294}],347:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MouseComponent = void 0;
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+/**
+ * @class MouseComponent
+ *
+ * @classdesc Component handling mouse and touch events for camera movement.
+ *
+ * To retrive and use the mouse component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var mouseComponent = viewer.getComponent("mouse");
+ * ```
+ */
+var MouseComponent = /** @class */ (function (_super) {
+    __extends(MouseComponent, _super);
+    /** @ignore */
+    function MouseComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        var spatial = new Geo_1.Spatial();
+        var viewportCoords = new Geo_1.ViewportCoords();
+        _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial);
+        _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords);
+        _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial);
+        _this._earthControlHandler = new Component_1.EarthControlHandler(_this, container, navigator, viewportCoords, spatial);
+        _this._scrollZoomHandler = new Component_1.ScrollZoomHandler(_this, container, navigator, viewportCoords);
+        _this._touchZoomHandler = new Component_1.TouchZoomHandler(_this, container, navigator, viewportCoords);
+        return _this;
+    }
+    Object.defineProperty(MouseComponent.prototype, "doubleClickZoom", {
+        /**
+         * Get double click zoom.
+         *
+         * @returns {DoubleClickZoomHandler} The double click zoom handler.
+         */
+        get: function () {
+            return this._doubleClickZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseComponent.prototype, "dragPan", {
+        /**
+         * Get drag pan.
+         *
+         * @returns {DragPanHandler} The drag pan handler.
+         */
+        get: function () {
+            return this._dragPanHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseComponent.prototype, "scrollZoom", {
+        /**
+         * Get scroll zoom.
+         *
+         * @returns {ScrollZoomHandler} The scroll zoom handler.
+         */
+        get: function () {
+            return this._scrollZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseComponent.prototype, "touchZoom", {
+        /**
+         * Get touch zoom.
+         *
+         * @returns {TouchZoomHandler} The touch zoom handler.
+         */
+        get: function () {
+            return this._touchZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    MouseComponent.prototype._activate = function () {
+        var _this = this;
+        this._bounceHandler.enable();
+        this._earthControlHandler.enable();
+        this._configurationSubscription = this._configuration$
+            .subscribe(function (configuration) {
+            if (configuration.doubleClickZoom) {
+                _this._doubleClickZoomHandler.enable();
+            }
+            else {
+                _this._doubleClickZoomHandler.disable();
+            }
+            if (configuration.dragPan) {
+                _this._dragPanHandler.enable();
+            }
+            else {
+                _this._dragPanHandler.disable();
+            }
+            if (configuration.scrollZoom) {
+                _this._scrollZoomHandler.enable();
+            }
+            else {
+                _this._scrollZoomHandler.disable();
+            }
+            if (configuration.touchZoom) {
+                _this._touchZoomHandler.enable();
+            }
+            else {
+                _this._touchZoomHandler.disable();
+            }
+        });
+        this._container.mouseService.claimMouse(this._name, 0);
+    };
+    MouseComponent.prototype._deactivate = function () {
+        this._container.mouseService.unclaimMouse(this._name);
+        this._configurationSubscription.unsubscribe();
+        this._bounceHandler.disable();
+        this._doubleClickZoomHandler.disable();
+        this._dragPanHandler.disable();
+        this._earthControlHandler.disable();
+        this._scrollZoomHandler.disable();
+        this._touchZoomHandler.disable();
+    };
+    MouseComponent.prototype._getDefaultConfiguration = function () {
+        return { doubleClickZoom: false, dragPan: true, scrollZoom: true, touchZoom: true };
+    };
+    /** @inheritdoc */
+    MouseComponent.componentName = "mouse";
+    return MouseComponent;
+}(Component_1.Component));
+exports.MouseComponent = MouseComponent;
+Component_1.ComponentService.register(MouseComponent);
+exports.default = MouseComponent;
+
+},{"../../Component":291,"../../Geo":294}],348:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ScrollZoomHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.scrollZoom.disable();
+ * mouseComponent.scrollZoom.enable();
+ *
+ * var isEnabled = mouseComponent.scrollZoom.isEnabled;
+ * ```
+ */
+var ScrollZoomHandler = /** @class */ (function (_super) {
+    __extends(ScrollZoomHandler, _super);
+    /** @ignore */
+    function ScrollZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    ScrollZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._container.mouseService.claimWheel(this._component.name, 0);
+        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$
+            .subscribe(function (event) {
+            event.preventDefault();
+        });
+        this._zoomSubscription = this._container.mouseService
+            .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
+            return [w, f];
+        }), operators_1.filter(function (args) {
+            var state = args[1].state;
+            return state.currentNode.fullPano || state.nodesAhead < 1;
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) {
+            return [w, r, t];
+        }))
+            .subscribe(function (args) {
+            var event = args[0];
+            var render = args[1];
+            var transform = args[2];
+            var element = _this._container.element;
+            var _a = _this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
+            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            var deltaY = event.deltaY;
+            if (event.deltaMode === 1) {
+                deltaY = 40 * deltaY;
+            }
+            else if (event.deltaMode === 2) {
+                deltaY = 800 * deltaY;
+            }
+            var canvasSize = _this._viewportCoords.containerToCanvas(element);
+            var zoom = -3 * deltaY / canvasSize[1];
+            _this._navigator.stateService.zoomIn(zoom, reference);
+        });
+    };
+    ScrollZoomHandler.prototype._disable = function () {
+        this._container.mouseService.unclaimWheel(this._component.name);
+        this._preventDefaultSubscription.unsubscribe();
+        this._zoomSubscription.unsubscribe();
+        this._preventDefaultSubscription = null;
+        this._zoomSubscription = null;
+    };
+    ScrollZoomHandler.prototype._getConfiguration = function (enable) {
+        return { scrollZoom: enable };
+    };
+    return ScrollZoomHandler;
+}(Component_1.HandlerBase));
+exports.ScrollZoomHandler = ScrollZoomHandler;
+exports.default = ScrollZoomHandler;
+
+},{"../../Component":291,"rxjs/operators":241}],349:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TouchZoomHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.touchZoom.disable();
+ * mouseComponent.touchZoom.enable();
+ *
+ * var isEnabled = mouseComponent.touchZoom.isEnabled;
+ * ```
+ */
+var TouchZoomHandler = /** @class */ (function (_super) {
+    __extends(TouchZoomHandler, _super);
+    /** @ignore */
+    function TouchZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    TouchZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._preventDefaultSubscription = this._container.touchService.pinch$
+            .subscribe(function (pinch) {
+            pinch.originalEvent.preventDefault();
+        });
+        var pinchStarted$ = this._container.touchService.pinchStart$.pipe(operators_1.map(function (event) {
+            return true;
+        }));
+        var pinchStopped$ = this._container.touchService.pinchEnd$.pipe(operators_1.map(function (event) {
+            return false;
+        }));
+        this._activeSubscription = rxjs_1.merge(pinchStarted$, pinchStopped$)
+            .subscribe(this._container.touchService.activate$);
+        this._zoomSubscription = this._container.touchService.pinch$.pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$), operators_1.filter(function (args) {
+            var state = args[1].state;
+            return state.currentNode.fullPano || state.nodesAhead < 1;
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var pinch = _a[0], render = _a[1], transform = _a[2];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(pinch, element), canvasX = _b[0], canvasY = _b[1];
+            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            var _c = _this._viewportCoords.containerToCanvas(element), canvasWidth = _c[0], canvasHeight = _c[1];
+            var zoom = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);
+            _this._navigator.stateService.zoomIn(zoom, reference);
+        });
+    };
+    TouchZoomHandler.prototype._disable = function () {
+        this._activeSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._zoomSubscription.unsubscribe();
+        this._preventDefaultSubscription = null;
+        this._zoomSubscription = null;
+    };
+    TouchZoomHandler.prototype._getConfiguration = function (enable) {
+        return { touchZoom: enable };
+    };
+    return TouchZoomHandler;
+}(Component_1.HandlerBase));
+exports.TouchZoomHandler = TouchZoomHandler;
+exports.default = TouchZoomHandler;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],350:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Popup_1 = require("./popup/Popup");
+Object.defineProperty(exports, "Popup", { enumerable: true, get: function () { return Popup_1.Popup; } });
+var PopupComponent_1 = require("./PopupComponent");
+Object.defineProperty(exports, "PopupComponent", { enumerable: true, get: function () { return PopupComponent_1.PopupComponent; } });
+
+},{"./PopupComponent":351,"./popup/Popup":352}],351:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PopupComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Utils_1 = require("../../Utils");
+/**
+ * @class PopupComponent
+ *
+ * @classdesc Component for showing HTML popup objects.
+ *
+ * The `add` method is used for adding new popups. Popups are removed by reference.
+ *
+ * It is not possible to update popups in the set by updating any properties
+ * directly on the popup object. Popups need to be replaced by
+ * removing them and creating new ones with relevant changed properties and
+ * adding those instead.
+ *
+ * Popups are only relevant to a single image because they are based on
+ * 2D basic image coordinates. Popups related to a certain image should
+ * be removed when the viewer is moved to another node.
+ *
+ * To retrive and use the popup component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>",
+ *     { component: { popup: true } });
+ *
+ * var popupComponent = viewer.getComponent("popup");
+ * ```
+ */
+var PopupComponent = /** @class */ (function (_super) {
+    __extends(PopupComponent, _super);
+    /** @ignore */
+    function PopupComponent(name, container, navigator, dom) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._dom = !!dom ? dom : new Utils_1.DOM();
+        _this._popups = [];
+        _this._added$ = new rxjs_1.Subject();
+        _this._popups$ = new rxjs_1.Subject();
+        return _this;
+    }
+    /**
+     * Add popups to the popups set.
+     *
+     * @description Adding a new popup never replaces an old one
+     * because they are stored by reference. Adding an already
+     * existing popup has no effect.
+     *
+     * @param {Array<Popup>} popups - Popups to add.
+     *
+     * @example ```popupComponent.add([popup1, popup2]);```
+     */
+    PopupComponent.prototype.add = function (popups) {
+        for (var _i = 0, popups_1 = popups; _i < popups_1.length; _i++) {
+            var popup = popups_1[_i];
+            if (this._popups.indexOf(popup) !== -1) {
+                continue;
+            }
+            this._popups.push(popup);
+            if (this._activated) {
+                popup.setParentContainer(this._popupContainer);
+            }
+        }
+        this._added$.next(popups);
+        this._popups$.next(this._popups);
+    };
+    /**
+     * Returns an array of all popups.
+     *
+     * @example ```var popups = popupComponent.getAll();```
+     */
+    PopupComponent.prototype.getAll = function () {
+        return this._popups.slice();
+    };
+    /**
+     * Remove popups based on reference from the popup set.
+     *
+     * @param {Array<Popup>} popups - Popups to remove.
+     *
+     * @example ```popupComponent.remove([popup1, popup2]);```
+     */
+    PopupComponent.prototype.remove = function (popups) {
+        for (var _i = 0, popups_2 = popups; _i < popups_2.length; _i++) {
+            var popup = popups_2[_i];
+            this._remove(popup);
+        }
+        this._popups$.next(this._popups);
+    };
+    /**
+     * Remove all popups from the popup set.
+     *
+     * @example ```popupComponent.removeAll();```
+     */
+    PopupComponent.prototype.removeAll = function () {
+        for (var _i = 0, _a = this._popups.slice(); _i < _a.length; _i++) {
+            var popup = _a[_i];
+            this._remove(popup);
+        }
+        this._popups$.next(this._popups);
+    };
+    PopupComponent.prototype._activate = function () {
+        var _this = this;
+        this._popupContainer = this._dom.createElement("div", "mapillary-js-popup-container", this._container.element);
+        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
+            var popup = _a[_i];
+            popup.setParentContainer(this._popupContainer);
+        }
+        this._updateAllSubscription = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$)
+            .subscribe(function (_a) {
+            var renderCamera = _a[0], size = _a[1], transform = _a[2];
+            for (var _i = 0, _b = _this._popups; _i < _b.length; _i++) {
+                var popup = _b[_i];
+                popup.update(renderCamera, size, transform);
+            }
+        });
+        var changed$ = this._popups$.pipe(operators_1.startWith(this._popups), operators_1.switchMap(function (popups) {
+            return rxjs_1.from(popups).pipe(operators_1.mergeMap(function (popup) {
+                return popup.changed$;
+            }));
+        }), operators_1.map(function (popup) {
+            return [popup];
+        }));
+        this._updateAddedChangedSubscription = rxjs_1.merge(this._added$, changed$).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var popups = _a[0], renderCamera = _a[1], size = _a[2], transform = _a[3];
+            for (var _i = 0, popups_3 = popups; _i < popups_3.length; _i++) {
+                var popup = popups_3[_i];
+                popup.update(renderCamera, size, transform);
+            }
+        });
+    };
+    PopupComponent.prototype._deactivate = function () {
+        this._updateAllSubscription.unsubscribe();
+        this._updateAddedChangedSubscription.unsubscribe();
+        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
+            var popup = _a[_i];
+            popup.remove();
+        }
+        this._container.element.removeChild(this._popupContainer);
+        delete this._popupContainer;
+    };
+    PopupComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    PopupComponent.prototype._remove = function (popup) {
+        var index = this._popups.indexOf(popup);
+        if (index === -1) {
+            return;
+        }
+        var removed = this._popups.splice(index, 1)[0];
+        if (this._activated) {
+            removed.remove();
+        }
+    };
+    PopupComponent.componentName = "popup";
+    return PopupComponent;
+}(Component_1.Component));
+exports.PopupComponent = PopupComponent;
+Component_1.ComponentService.register(PopupComponent);
+exports.default = PopupComponent;
+
+},{"../../Component":291,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],352:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Popup = void 0;
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../../Geo");
+var Utils_1 = require("../../../Utils");
+var Viewer_1 = require("../../../Viewer");
+/**
+ * @class Popup
+ *
+ * @classdesc Popup instance for rendering custom HTML content
+ * on top of images. Popups are based on 2D basic image coordinates
+ * (see the {@link Viewer} class documentation for more information about coordinate
+ * systems) and a certain popup is therefore only relevant to a single image.
+ * Popups related to a certain image should be removed when moving
+ * to another image.
+ *
+ * A popup must have both its content and its point or rect set to be
+ * rendered. Popup options can not be updated after creation but the
+ * basic point or rect as well as its content can be changed by calling
+ * the appropriate methods.
+ *
+ * To create and add one `Popup` with default configuration
+ * (tooltip visuals and automatic float) and one with specific options
+ * use
+ *
+ * @example
+ * ```
+ * var defaultSpan = document.createElement('span');
+ * defaultSpan.innerHTML = 'hello default';
+ *
+ * var defaultPopup = new Mapillary.PopupComponent.Popup();
+ * defaultPopup.setDOMContent(defaultSpan);
+ * defaultPopup.setBasicPoint([0.3, 0.3]);
+ *
+ * var cleanSpan = document.createElement('span');
+ * cleanSpan.innerHTML = 'hello clean';
+ *
+ * var cleanPopup = new Mapillary.PopupComponent.Popup({
+ *     clean: true,
+ *     float: Mapillary.Alignment.Top,
+ *     offset: 10,
+ *     opacity: 0.7,
+ * });
+ *
+ * cleanPopup.setDOMContent(cleanSpan);
+ * cleanPopup.setBasicPoint([0.6, 0.6]);
+ *
+ * popupComponent.add([defaultPopup, cleanPopup]);
+ * ```
+ *
+ * @description Implementation of API methods and API documentation inspired
+ * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
+ */
+var Popup = /** @class */ (function () {
+    function Popup(options, viewportCoords, dom) {
+        this._options = {};
+        options = !!options ? options : {};
+        this._options.capturePointer = options.capturePointer === false ?
+            options.capturePointer : true;
+        this._options.clean = options.clean;
+        this._options.float = options.float;
+        this._options.offset = options.offset;
+        this._options.opacity = options.opacity;
+        this._options.position = options.position;
+        this._dom = !!dom ? dom : new Utils_1.DOM();
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        this._notifyChanged$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(Popup.prototype, "changed$", {
+        /**
+         * @description Internal observable used by the component to
+         * render the popup when its position or content has changed.
+         * @ignore
+         */
+        get: function () {
+            return this._notifyChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * @description Internal method used by the component to
+     * remove all references to the popup.
+     * @ignore
+     */
+    Popup.prototype.remove = function () {
+        if (this._content && this._content.parentNode) {
+            this._content.parentNode.removeChild(this._content);
+        }
+        if (this._container) {
+            this._container.parentNode.removeChild(this._container);
+            delete this._container;
+        }
+        if (this._parentContainer) {
+            delete this._parentContainer;
+        }
+    };
+    /**
+     * Sets a 2D basic image coordinates point to the popup's anchor, and
+     * moves the popup to it.
+     *
+     * @description Overwrites any previously set point or rect.
+     *
+     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setText('hello image');
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
+     */
+    Popup.prototype.setBasicPoint = function (basicPoint) {
+        this._point = basicPoint.slice();
+        this._rect = null;
+        this._notifyChanged$.next(this);
+    };
+    /**
+     * Sets a 2D basic image coordinates rect to the popup's anchor, and
+     * moves the popup to it.
+     *
+     * @description Overwrites any previously set point or rect.
+     *
+     * @param {Array<number>} basicRect - Rect in 2D basic image
+     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setText('hello image');
+     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);
+     *
+     * popupComponent.add([popup]);
+     * ```
+     */
+    Popup.prototype.setBasicRect = function (basicRect) {
+        this._rect = basicRect.slice();
+        this._point = null;
+        this._notifyChanged$.next(this);
+    };
+    /**
+     * Sets the popup's content to the element provided as a DOM node.
+     *
+     * @param {Node} htmlNode - A DOM node to be used as content for the popup.
+     *
+     * @example
+     * ```
+     * var div = document.createElement('div');
+     * div.innerHTML = 'hello image';
+     *
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setDOMContent(div);
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
+     */
+    Popup.prototype.setDOMContent = function (htmlNode) {
+        if (this._content && this._content.parentNode) {
+            this._content.parentNode.removeChild(this._content);
+        }
+        var className = "mapillaryjs-popup-content" +
+            (this._options.clean === true ? "-clean" : "") +
+            (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
+        this._content = this._dom.createElement("div", className, this._container);
+        this._content.appendChild(htmlNode);
+        this._notifyChanged$.next(this);
+    };
+    /**
+     * Sets the popup's content to the HTML provided as a string.
+     *
+     * @description This method does not perform HTML filtering or sanitization,
+     * and must be used only with trusted content. Consider Popup#setText if the
+     * content is an untrusted text string.
+     *
+     * @param {string} html - A string representing HTML content for the popup.
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setHTML('<div>hello image</div>');
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
+     */
+    Popup.prototype.setHTML = function (html) {
+        var frag = this._dom.document.createDocumentFragment();
+        var temp = this._dom.createElement("body");
+        var child;
+        temp.innerHTML = html;
+        while (true) {
+            child = temp.firstChild;
+            if (!child) {
+                break;
+            }
+            frag.appendChild(child);
+        }
+        this.setDOMContent(frag);
+    };
+    /**
+     * Sets the popup's content to a string of text.
+     *
+     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.
+     * Use this method for security against XSS if the popup content is user-provided.
+     *
+     * @param {string} text - Textual content for the popup.
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setText('hello image');
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
+     */
+    Popup.prototype.setText = function (text) {
+        this.setDOMContent(this._dom.document.createTextNode(text));
+    };
+    /**
+     * @description Internal method for attaching the popup to
+     * its parent container so that it is rendered in the DOM tree.
+     * @ignore
+     */
+    Popup.prototype.setParentContainer = function (parentContainer) {
+        this._parentContainer = parentContainer;
+    };
+    /**
+     * @description Internal method for updating the rendered
+     * position of the popup called by the popup component.
+     * @ignore
+     */
+    Popup.prototype.update = function (renderCamera, size, transform) {
+        var _a;
+        if (!this._parentContainer || !this._content) {
+            return;
+        }
+        if (!this._point && !this._rect) {
+            return;
+        }
+        if (!this._container) {
+            this._container = this._dom.createElement("div", "mapillaryjs-popup", this._parentContainer);
+            var showTip = this._options.clean !== true &&
+                this._options.float !== Viewer_1.Alignment.Center;
+            if (showTip) {
+                var tipClassName = "mapillaryjs-popup-tip" +
+                    (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
+                this._tip = this._dom.createElement("div", tipClassName, this._container);
+                this._dom.createElement("div", "mapillaryjs-popup-tip-inner", this._tip);
+            }
+            this._container.appendChild(this._content);
+            this._parentContainer.appendChild(this._container);
+            if (this._options.opacity != null) {
+                this._container.style.opacity = this._options.opacity.toString();
+            }
+        }
+        var pointPixel = null;
+        var position = this._alignmentToPopupAligment(this._options.position);
+        var float = this._alignmentToPopupAligment(this._options.float);
+        var classList = this._container.classList;
+        if (this._point != null) {
+            pointPixel =
+                this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+        }
+        else {
+            var alignments = ["center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right"];
+            var appliedPosition = null;
+            for (var _i = 0, alignments_1 = alignments; _i < alignments_1.length; _i++) {
+                var alignment = alignments_1[_i];
+                if (classList.contains("mapillaryjs-popup-float-" + alignment)) {
+                    appliedPosition = alignment;
+                    break;
+                }
+            }
+            _a = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform), pointPixel = _a[0], position = _a[1];
+            if (!float) {
+                float = position;
+            }
+        }
+        if (pointPixel == null) {
+            this._container.style.display = "none";
+            return;
+        }
+        this._container.style.display = "";
+        if (!float) {
+            var width = this._container.offsetWidth;
+            var height = this._container.offsetHeight;
+            var floats = this._pixelToFloats(pointPixel, size, width, height);
+            float = floats.length === 0 ? "top" : floats.join("-");
+        }
+        var offset = this._normalizeOffset(this._options.offset);
+        pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]];
+        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];
+        var floatTranslate = {
+            "bottom": "translate(-50%,0)",
+            "bottom-left": "translate(-100%,0)",
+            "bottom-right": "translate(0,0)",
+            "center": "translate(-50%,-50%)",
+            "left": "translate(-100%,-50%)",
+            "right": "translate(0,-50%)",
+            "top": "translate(-50%,-100%)",
+            "top-left": "translate(-100%,-100%)",
+            "top-right": "translate(0,-100%)",
+        };
+        for (var key in floatTranslate) {
+            if (!floatTranslate.hasOwnProperty(key)) {
+                continue;
+            }
+            classList.remove("mapillaryjs-popup-float-" + key);
+        }
+        classList.add("mapillaryjs-popup-float-" + float);
+        this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)";
+    };
+    Popup.prototype._rectToPixel = function (rect, position, appliedPosition, renderCamera, size, transform) {
+        if (!position) {
+            var width = this._container.offsetWidth;
+            var height = this._container.offsetHeight;
+            var floatOffsets = {
+                "bottom": [0, height / 2],
+                "bottom-left": [-width / 2, height / 2],
+                "bottom-right": [width / 2, height / 2],
+                "left": [-width / 2, 0],
+                "right": [width / 2, 0],
+                "top": [0, -height / 2],
+                "top-left": [-width / 2, -height / 2],
+                "top-right": [width / 2, -height / 2],
+            };
+            var automaticPositions = ["top", "bottom", "left", "right"];
+            var largestVisibleArea = [0, null, null];
+            for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) {
+                var automaticPosition = automaticPositions_1[_i];
+                var autoPointBasic = this._pointFromRectPosition(rect, automaticPosition);
+                var autoPointPixel = this._viewportCoords.basicToCanvasSafe(autoPointBasic[0], autoPointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+                if (autoPointPixel == null) {
+                    continue;
+                }
+                var floatOffset = floatOffsets[automaticPosition];
+                var offsetedPosition = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]];
+                var staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;
+                var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));
+                if (floats.length === 0 &&
+                    autoPointPixel[0] > 0 &&
+                    autoPointPixel[0] < size.width &&
+                    autoPointPixel[1] > 0 &&
+                    autoPointPixel[1] < size.height) {
+                    return [autoPointPixel, automaticPosition];
+                }
+                var minX = Math.max(offsetedPosition[0] - width / 2, 0);
+                var maxX = Math.min(offsetedPosition[0] + width / 2, size.width);
+                var minY = Math.max(offsetedPosition[1] - height / 2, 0);
+                var maxY = Math.min(offsetedPosition[1] + height / 2, size.height);
+                var visibleX = Math.max(0, maxX - minX);
+                var visibleY = Math.max(0, maxY - minY);
+                var visibleArea = staticCoeff * visibleX * visibleY;
+                if (visibleArea > largestVisibleArea[0]) {
+                    largestVisibleArea[0] = visibleArea;
+                    largestVisibleArea[1] = autoPointPixel;
+                    largestVisibleArea[2] = automaticPosition;
+                }
+            }
+            if (largestVisibleArea[0] > 0) {
+                return [largestVisibleArea[1], largestVisibleArea[2]];
+            }
+        }
+        var pointBasic = this._pointFromRectPosition(rect, position);
+        var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+        return [pointPixel, position != null ? position : "top"];
+    };
+    Popup.prototype._alignmentToPopupAligment = function (float) {
+        switch (float) {
+            case Viewer_1.Alignment.Bottom:
+                return "bottom";
+            case Viewer_1.Alignment.BottomLeft:
+                return "bottom-left";
+            case Viewer_1.Alignment.BottomRight:
+                return "bottom-right";
+            case Viewer_1.Alignment.Center:
+                return "center";
+            case Viewer_1.Alignment.Left:
+                return "left";
+            case Viewer_1.Alignment.Right:
+                return "right";
+            case Viewer_1.Alignment.Top:
+                return "top";
+            case Viewer_1.Alignment.TopLeft:
+                return "top-left";
+            case Viewer_1.Alignment.TopRight:
+                return "top-right";
+            default:
+                return null;
+        }
+    };
+    Popup.prototype._normalizeOffset = function (offset) {
+        if (offset == null) {
+            return this._normalizeOffset(0);
+        }
+        if (typeof offset === "number") {
+            // input specifies a radius
+            var sideOffset = offset;
+            var sign = sideOffset >= 0 ? 1 : -1;
+            var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2)));
+            return {
+                "bottom": [0, sideOffset],
+                "bottom-left": [-cornerOffset, cornerOffset],
+                "bottom-right": [cornerOffset, cornerOffset],
+                "center": [0, 0],
+                "left": [-sideOffset, 0],
+                "right": [sideOffset, 0],
+                "top": [0, -sideOffset],
+                "top-left": [-cornerOffset, -cornerOffset],
+                "top-right": [cornerOffset, -cornerOffset],
+            };
+        }
+        else {
+            // input specifes a value for each position
+            return {
+                "bottom": offset.bottom || [0, 0],
+                "bottom-left": offset.bottomLeft || [0, 0],
+                "bottom-right": offset.bottomRight || [0, 0],
+                "center": offset.center || [0, 0],
+                "left": offset.left || [0, 0],
+                "right": offset.right || [0, 0],
+                "top": offset.top || [0, 0],
+                "top-left": offset.topLeft || [0, 0],
+                "top-right": offset.topRight || [0, 0],
+            };
+        }
+    };
+    Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) {
+        var floats = [];
+        if (pointPixel[1] < height) {
+            floats.push("bottom");
+        }
+        else if (pointPixel[1] > size.height - height) {
+            floats.push("top");
+        }
+        if (pointPixel[0] < width / 2) {
+            floats.push("right");
+        }
+        else if (pointPixel[0] > size.width - width / 2) {
+            floats.push("left");
+        }
+        return floats;
+    };
+    Popup.prototype._pointFromRectPosition = function (rect, position) {
+        var x0 = rect[0];
+        var x1 = rect[0] < rect[2] ? rect[2] : rect[2] + 1;
+        var y0 = rect[1];
+        var y1 = rect[3];
+        switch (position) {
+            case "bottom":
+                return [(x0 + x1) / 2, y1];
+            case "bottom-left":
+                return [x0, y1];
+            case "bottom-right":
+                return [x1, y1];
+            case "center":
+                return [(x0 + x1) / 2, (y0 + y1) / 2];
+            case "left":
+                return [x0, (y0 + y1) / 2];
+            case "right":
+                return [x1, (y0 + y1) / 2];
+            case "top":
+                return [(x0 + x1) / 2, y0];
+            case "top-left":
+                return [x0, y0];
+            case "top-right":
+                return [x1, y0];
+            default:
+                return [(x0 + x1) / 2, y1];
+        }
+    };
+    return Popup;
+}());
+exports.Popup = Popup;
+exports.default = Popup;
+
+
+},{"../../../Geo":294,"../../../Utils":301,"../../../Viewer":302,"rxjs":43}],353:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SequenceComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Graph_1 = require("../../Graph");
+/**
+ * @class SequenceComponent
+ * @classdesc Component showing navigation arrows for sequence directions
+ * as well as playing button. Exposes an API to start and stop play.
+ */
+var SequenceComponent = /** @class */ (function (_super) {
+    __extends(SequenceComponent, _super);
+    function SequenceComponent(name, container, navigator, renderer, scheduler) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._sequenceDOMRenderer = !!renderer ? renderer : new Component_1.SequenceDOMRenderer(container);
+        _this._scheduler = scheduler;
+        _this._containerWidth$ = new rxjs_1.Subject();
+        _this._hoveredKeySubject$ = new rxjs_1.Subject();
+        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
+        _this._navigator.playService.playing$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
+            .subscribe(function (_a) {
+            var playing = _a[0], configuration = _a[1];
+            _this.fire(SequenceComponent.playingchanged, playing);
+            if (playing === configuration.playing) {
+                return;
+            }
+            if (playing) {
+                _this.play();
+            }
+            else {
+                _this.stop();
+            }
+        });
+        _this._navigator.playService.direction$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
+            .subscribe(function (_a) {
+            var direction = _a[0], configuration = _a[1];
+            if (direction !== configuration.direction) {
+                _this.setDirection(direction);
+            }
+        });
+        return _this;
+    }
+    Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
+        /**
+         * Get hovered key observable.
+         *
+         * @description An observable emitting the key of the node for the direction
+         * arrow that is being hovered. When the mouse leaves a direction arrow null
+         * is emitted.
+         *
+         * @returns {Observable<string>}
+         */
+        get: function () {
+            return this._hoveredKey$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Start playing.
+     *
+     * @fires PlayerComponent#playingchanged
+     */
+    SequenceComponent.prototype.play = function () {
+        this.configure({ playing: true });
+    };
+    /**
+     * Stop playing.
+     *
+     * @fires PlayerComponent#playingchanged
+     */
+    SequenceComponent.prototype.stop = function () {
+        this.configure({ playing: false });
+    };
+    /**
+     * Set the direction to follow when playing.
+     *
+     * @param {EdgeDirection} direction - The direction that will be followed when playing.
+     */
+    SequenceComponent.prototype.setDirection = function (direction) {
+        this.configure({ direction: direction });
+    };
+    /**
+     * Set highlight key.
+     *
+     * @description The arrow pointing towards the node corresponding to the
+     * highlight key will be highlighted.
+     *
+     * @param {string} highlightKey Key of node to be highlighted if existing.
+     */
+    SequenceComponent.prototype.setHighlightKey = function (highlightKey) {
+        this.configure({ highlightKey: highlightKey });
+    };
+    /**
+     * Set max width of container element.
+     *
+     * @description Set max width of the container element holding
+     * the sequence navigation elements. If the min width is larger than the
+     * max width the min width value will be used.
+     *
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
+     */
+    SequenceComponent.prototype.setMaxWidth = function (maxWidth) {
+        this.configure({ maxWidth: maxWidth });
+    };
+    /**
+     * Set min width of container element.
+     *
+     * @description Set min width of the container element holding
+     * the sequence navigation elements. If the min width is larger than the
+     * max width the min width value will be used.
+     *
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
+     */
+    SequenceComponent.prototype.setMinWidth = function (minWidth) {
+        this.configure({ minWidth: minWidth });
+    };
+    /**
+     * Set the value indicating whether the sequence UI elements should be visible.
+     *
+     * @param {boolean} visible
+     */
+    SequenceComponent.prototype.setVisible = function (visible) {
+        this.configure({ visible: visible });
+    };
+    SequenceComponent.prototype._activate = function () {
+        var _this = this;
+        this._sequenceDOMRenderer.activate();
+        var edgeStatus$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var sequence$ = this._navigator.stateService.currentNode$.pipe(operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.sequenceKey;
+        }), operators_1.switchMap(function (node) {
+            return rxjs_1.concat(rxjs_1.of(null), _this._navigator.graphService.cacheSequence$(node.sequenceKey).pipe(operators_1.retry(3), operators_1.catchError(function (e) {
+                console.error("Failed to cache sequence", e);
+                return rxjs_1.of(null);
+            })));
+        }), operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
+        this._sequenceSubscription = sequence$.subscribe();
+        var rendererKey$ = this._sequenceDOMRenderer.index$.pipe(operators_1.withLatestFrom(sequence$), operators_1.map(function (_a) {
+            var index = _a[0], sequence = _a[1];
+            return sequence != null ? sequence.keys[index] : null;
+        }), operators_1.filter(function (key) {
+            return !!key;
+        }), operators_1.distinctUntilChanged(), operators_1.publish(), operators_1.refCount());
+        this._moveSubscription = rxjs_1.merge(rendererKey$.pipe(operators_1.debounceTime(100, this._scheduler)), rendererKey$.pipe(operators_1.auditTime(400, this._scheduler))).pipe(operators_1.distinctUntilChanged(), operators_1.switchMap(function (key) {
+            return _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function (e) {
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe();
+        this._setSequenceGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
+            return changing;
+        }))
+            .subscribe(function () {
+            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Sequence);
+        });
+        this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
+            return !changing;
+        }))
+            .subscribe(function () {
+            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Spatial);
+        });
+        this._navigator.graphService.graphMode$.pipe(operators_1.switchMap(function (mode) {
+            return mode === Graph_1.GraphMode.Spatial ?
+                _this._navigator.stateService.currentNode$.pipe(operators_1.take(2)) :
+                rxjs_1.empty();
+        }), operators_1.filter(function (node) {
+            return !node.spatialEdges.cached;
+        }), operators_1.switchMap(function (node) {
+            return _this._navigator.graphService.cacheNode$(node.key).pipe(operators_1.catchError(function (e) {
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe();
+        this._stopSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
+            return changing;
+        }))
+            .subscribe(function () {
+            _this._navigator.playService.stop();
+        });
+        this._cacheSequenceNodesSubscription = rxjs_1.combineLatest(this._navigator.graphService.graphMode$, this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged())).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentNode$), operators_1.switchMap(function (_a) {
+            var _b = _a[0], mode = _b[0], changing = _b[1], node = _a[1];
+            return changing && mode === Graph_1.GraphMode.Sequence ?
+                _this._navigator.graphService.cacheSequenceNodes$(node.sequenceKey, node.key).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
+                    console.error("Failed to cache sequence nodes.", error);
+                    return rxjs_1.empty();
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe();
+        var position$ = sequence$.pipe(operators_1.switchMap(function (sequence) {
+            if (!sequence) {
+                return rxjs_1.of({ index: null, max: null });
+            }
+            var firstCurrentKey = true;
+            return _this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged(), operators_1.switchMap(function (changingPosition) {
+                var skipCount = !changingPosition && firstCurrentKey ? 0 : 1;
+                firstCurrentKey = false;
+                return changingPosition ?
+                    rendererKey$ :
+                    _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
+                        return node.key;
+                    }), operators_1.distinctUntilChanged(), operators_1.skip(skipCount));
+            }), operators_1.map(function (key) {
+                var index = sequence.keys.indexOf(key);
+                if (index === -1) {
+                    return { index: null, max: null };
+                }
+                return { index: index, max: sequence.keys.length - 1 };
+            }));
+        }));
+        this._renderSubscription = rxjs_1.combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.pipe(operators_1.startWith(this._sequenceDOMRenderer)), this._navigator.playService.speed$, position$).pipe(operators_1.map(function (_a) {
+            var edgeStatus = _a[0], configuration = _a[1], containerWidth = _a[2], renderer = _a[3], speed = _a[4], position = _a[5];
+            var vNode = _this._sequenceDOMRenderer
+                .render(edgeStatus, configuration, containerWidth, speed, position.index, position.max, _this, _this._navigator);
+            return { name: _this._name, vnode: vNode };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._setSpeedSubscription = this._sequenceDOMRenderer.speed$
+            .subscribe(function (speed) {
+            _this._navigator.playService.setSpeed(speed);
+        });
+        this._setDirectionSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.direction;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (direction) {
+            _this._navigator.playService.setDirection(direction);
+        });
+        this._containerWidthSubscription = rxjs_1.combineLatest(this._container.renderService.size$, this._configuration$.pipe(operators_1.distinctUntilChanged(function (value1, value2) {
+            return value1[0] === value2[0] && value1[1] === value2[1];
+        }, function (configuration) {
+            return [configuration.minWidth, configuration.maxWidth];
+        }))).pipe(operators_1.map(function (_a) {
+            var size = _a[0], configuration = _a[1];
+            return _this._sequenceDOMRenderer.getContainerWidth(size, configuration);
+        }))
+            .subscribe(this._containerWidth$);
+        this._playingSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.playing;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (playing) {
+            if (playing) {
+                _this._navigator.playService.play();
+            }
+            else {
+                _this._navigator.playService.stop();
+            }
+        });
+        this._hoveredKeySubscription = this._sequenceDOMRenderer.mouseEnterDirection$.pipe(operators_1.switchMap(function (direction) {
+            var edgeTo$ = edgeStatus$.pipe(operators_1.map(function (edgeStatus) {
+                for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+                    var edge = _a[_i];
+                    if (edge.data.direction === direction) {
+                        return edge.to;
+                    }
+                }
+                return null;
+            }), operators_1.takeUntil(_this._sequenceDOMRenderer.mouseLeaveDirection$));
+            return rxjs_1.concat(edgeTo$, rxjs_1.of(null));
+        }), operators_1.distinctUntilChanged())
+            .subscribe(this._hoveredKeySubject$);
+        this._emitHoveredKeySubscription = this._hoveredKey$
+            .subscribe(function (key) {
+            _this.fire(SequenceComponent.hoveredkeychanged, key);
+        });
+    };
+    SequenceComponent.prototype._deactivate = function () {
+        this._emitHoveredKeySubscription.unsubscribe();
+        this._renderSubscription.unsubscribe();
+        this._playingSubscription.unsubscribe();
+        this._containerWidthSubscription.unsubscribe();
+        this._hoveredKeySubscription.unsubscribe();
+        this._setSpeedSubscription.unsubscribe();
+        this._setDirectionSubscription.unsubscribe();
+        this._setSequenceGraphModeSubscription.unsubscribe();
+        this._setSpatialGraphModeSubscription.unsubscribe();
+        this._sequenceSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._cacheSequenceNodesSubscription.unsubscribe();
+        this._stopSubscription.unsubscribe();
+        this._sequenceDOMRenderer.deactivate();
+    };
+    SequenceComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            direction: Edge_1.EdgeDirection.Next,
+            maxWidth: 108,
+            minWidth: 70,
+            playing: false,
+            visible: true,
+        };
+    };
+    /** @inheritdoc */
+    SequenceComponent.componentName = "sequence";
+    /**
+     * Event fired when playing starts or stops.
+     *
+     * @event SequenceComponent#playingchanged
+     * @type {boolean} Indicates whether the player is playing.
+     */
+    SequenceComponent.playingchanged = "playingchanged";
+    /**
+     * Event fired when the hovered key changes.
+     *
+     * @description Emits the key of the node for the direction
+     * arrow that is being hovered. When the mouse leaves a
+     * direction arrow null is emitted.
+     *
+     * @event SequenceComponent#hoveredkeychanged
+     * @type {string} The hovered key, null if no key is hovered.
+     */
+    SequenceComponent.hoveredkeychanged = "hoveredkeychanged";
+    return SequenceComponent;
+}(Component_1.Component));
+exports.SequenceComponent = SequenceComponent;
+Component_1.ComponentService.register(SequenceComponent);
+exports.default = SequenceComponent;
+
+},{"../../Component":291,"../../Edge":292,"../../Graph":295,"rxjs":43,"rxjs/operators":241}],354:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SequenceDOMRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+var SequenceDOMRenderer = /** @class */ (function () {
+    function SequenceDOMRenderer(container) {
+        this._container = container;
+        this._minThresholdWidth = 320;
+        this._maxThresholdWidth = 1480;
+        this._minThresholdHeight = 240;
+        this._maxThresholdHeight = 820;
+        this._stepperDefaultWidth = 108;
+        this._controlsDefaultWidth = 88;
+        this._defaultHeight = 30;
+        this._expandControls = false;
+        this._mode = Component_1.SequenceMode.Default;
+        this._speed = 0.5;
+        this._changingSpeed = false;
+        this._index = null;
+        this._changingPosition = false;
+        this._mouseEnterDirection$ = new rxjs_1.Subject();
+        this._mouseLeaveDirection$ = new rxjs_1.Subject();
+        this._notifyChanged$ = new rxjs_1.Subject();
+        this._notifyChangingPositionChanged$ = new rxjs_1.Subject();
+        this._notifySpeedChanged$ = new rxjs_1.Subject();
+        this._notifyIndexChanged$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(SequenceDOMRenderer.prototype, "changed$", {
+        get: function () {
+            return this._notifyChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "changingPositionChanged$", {
+        get: function () {
+            return this._notifyChangingPositionChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", {
+        get: function () {
+            return this._notifySpeedChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "index$", {
+        get: function () {
+            return this._notifyIndexChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseEnterDirection$", {
+        get: function () {
+            return this._mouseEnterDirection$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseLeaveDirection$", {
+        get: function () {
+            return this._mouseLeaveDirection$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    SequenceDOMRenderer.prototype.activate = function () {
+        var _this = this;
+        if (!!this._changingSubscription) {
+            return;
+        }
+        this._changingSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
+            return touchEvent.touches.length === 0;
+        })))
+            .subscribe(function (event) {
+            if (_this._changingSpeed) {
+                _this._changingSpeed = false;
+            }
+            if (_this._changingPosition) {
+                _this._setChangingPosition(false);
+            }
+        });
+    };
+    SequenceDOMRenderer.prototype.deactivate = function () {
+        if (!this._changingSubscription) {
+            return;
+        }
+        this._changingSpeed = false;
+        this._changingPosition = false;
+        this._expandControls = false;
+        this._mode = Component_1.SequenceMode.Default;
+        this._changingSubscription.unsubscribe();
+        this._changingSubscription = null;
+    };
+    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, speed, index, max, component, navigator) {
+        if (configuration.visible === false) {
+            return vd.h("div.SequenceContainer", {}, []);
+        }
+        var stepper = this._createStepper(edgeStatus, configuration, containerWidth, component, navigator);
+        var controls = this._createSequenceControls(containerWidth);
+        var playback = this._createPlaybackControls(containerWidth, speed, component, configuration);
+        var timeline = this._createTimelineControls(containerWidth, index, max);
+        return vd.h("div.SequenceContainer", [stepper, controls, playback, timeline]);
+    };
+    SequenceDOMRenderer.prototype.getContainerWidth = function (size, configuration) {
+        var minWidth = configuration.minWidth;
+        var maxWidth = configuration.maxWidth;
+        if (maxWidth < minWidth) {
+            maxWidth = minWidth;
+        }
+        var relativeWidth = (size.width - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
+        var relativeHeight = (size.height - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
+        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
+        return minWidth + coeff * (maxWidth - minWidth);
+    };
+    SequenceDOMRenderer.prototype._createPositionInput = function (index, max) {
+        var _this = this;
+        this._index = index;
+        var onPosition = function (e) {
+            _this._index = Number(e.target.value);
+            _this._notifyIndexChanged$.next(_this._index);
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 65;
+        var onStart = function (e) {
+            e.stopPropagation();
+            _this._setChangingPosition(true);
+        };
+        var onMove = function (e) {
+            if (_this._changingPosition === true) {
+                e.stopPropagation();
+            }
+        };
+        var onKeyDown = function (e) {
+            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
+                e.key === "ArrowRight" || e.key === "ArrowUp") {
+                e.preventDefault();
+            }
+        };
+        var positionInputProperties = {
+            max: max != null ? max : 1,
+            min: 0,
+            onchange: onPosition,
+            oninput: onPosition,
+            onkeydown: onKeyDown,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: index != null ? index : 0,
+        };
+        var disabled = index == null || max == null || max <= 1;
+        if (disabled) {
+            positionInputProperties.disabled = "true";
+        }
+        var positionInput = vd.h("input.SequencePosition", positionInputProperties, []);
+        var positionContainerClass = disabled ? ".SequencePositionContainerDisabled" : ".SequencePositionContainer";
+        return vd.h("div" + positionContainerClass, [positionInput]);
+    };
+    SequenceDOMRenderer.prototype._createSpeedInput = function (speed) {
+        var _this = this;
+        this._speed = speed;
+        var onSpeed = function (e) {
+            _this._speed = Number(e.target.value) / 1000;
+            _this._notifySpeedChanged$.next(_this._speed);
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160;
+        var onStart = function (e) {
+            _this._changingSpeed = true;
+            e.stopPropagation();
+        };
+        var onMove = function (e) {
+            if (_this._changingSpeed === true) {
+                e.stopPropagation();
+            }
+        };
+        var onKeyDown = function (e) {
+            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
+                e.key === "ArrowRight" || e.key === "ArrowUp") {
+                e.preventDefault();
+            }
+        };
+        var speedInput = vd.h("input.SequenceSpeed", {
+            max: 1000,
+            min: 0,
+            onchange: onSpeed,
+            oninput: onSpeed,
+            onkeydown: onKeyDown,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: 1000 * speed,
+        }, []);
+        return vd.h("div.SequenceSpeedContainer", [speedInput]);
+    };
+    SequenceDOMRenderer.prototype._createPlaybackControls = function (containerWidth, speed, component, configuration) {
+        var _this = this;
+        if (this._mode !== Component_1.SequenceMode.Playback) {
+            return vd.h("div.SequencePlayback", []);
+        }
+        var switchIcon = vd.h("div.SequenceSwitchIcon.SequenceIconVisible", []);
+        var direction = configuration.direction === Edge_1.EdgeDirection.Next ?
+            Edge_1.EdgeDirection.Prev : Edge_1.EdgeDirection.Next;
+        var playing = configuration.playing;
+        var switchButtonProperties = {
+            onclick: function () {
+                if (!playing) {
+                    component.setDirection(direction);
+                }
+            },
+        };
+        var switchButtonClassName = configuration.playing ? ".SequenceSwitchButtonDisabled" : ".SequenceSwitchButton";
+        var switchButton = vd.h("div" + switchButtonClassName, switchButtonProperties, [switchIcon]);
+        var slowIcon = vd.h("div.SequenceSlowIcon.SequenceIconVisible", []);
+        var slowContainer = vd.h("div.SequenceSlowContainer", [slowIcon]);
+        var fastIcon = vd.h("div.SequenceFastIcon.SequenceIconVisible", []);
+        var fastContainer = vd.h("div.SequenceFastContainer", [fastIcon]);
+        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
+        var closeButtonProperties = {
+            onclick: function () {
+                _this._mode = Component_1.SequenceMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
+        var speedInput = this._createSpeedInput(speed);
+        var playbackChildren = [switchButton, slowContainer, speedInput, fastContainer, closeButton];
+        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
+        var playbackProperties = { style: { top: top + "px" } };
+        return vd.h("div.SequencePlayback", playbackProperties, playbackChildren);
+    };
+    SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
+        var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
+            configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
+        var onclick = configuration.playing ?
+            function (e) { component.stop(); } :
+            canPlay ? function (e) { component.play(); } : null;
+        var buttonProperties = { onclick: onclick };
+        var iconClass = configuration.playing ?
+            "Stop" :
+            canPlay ? "Play" : "PlayDisabled";
+        var iconProperties = { className: iconClass };
+        if (configuration.direction === Edge_1.EdgeDirection.Prev) {
+            iconProperties.style = {
+                transform: "rotate(180deg) translate(50%, 50%)",
+            };
+        }
+        var icon = vd.h("div.SequenceComponentIcon", iconProperties, []);
+        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
+        return vd.h("div." + buttonClass, buttonProperties, [icon]);
+    };
+    SequenceDOMRenderer.prototype._createSequenceControls = function (containerWidth) {
+        var _this = this;
+        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
+        var expanderProperties = {
+            onclick: function () {
+                _this._expandControls = !_this._expandControls;
+                _this._mode = Component_1.SequenceMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+            style: {
+                "border-bottom-right-radius": borderRadius + "px",
+                "border-top-right-radius": borderRadius + "px",
+            },
+        };
+        var expanderBar = vd.h("div.SequenceExpanderBar", []);
+        var expander = vd.h("div.SequenceExpanderButton", expanderProperties, [expanderBar]);
+        var fastIconClassName = this._mode === Component_1.SequenceMode.Playback ?
+            ".SequenceFastIconGrey.SequenceIconVisible" : ".SequenceFastIcon";
+        var fastIcon = vd.h("div" + fastIconClassName, []);
+        var playbackProperties = {
+            onclick: function () {
+                _this._mode = _this._mode === Component_1.SequenceMode.Playback ?
+                    Component_1.SequenceMode.Default :
+                    Component_1.SequenceMode.Playback;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var playback = vd.h("div.SequencePlaybackButton", playbackProperties, [fastIcon]);
+        var timelineIconClassName = this._mode === Component_1.SequenceMode.Timeline ?
+            ".SequenceTimelineIconGrey.SequenceIconVisible" : ".SequenceTimelineIcon";
+        var timelineIcon = vd.h("div" + timelineIconClassName, []);
+        var timelineProperties = {
+            onclick: function () {
+                _this._mode = _this._mode === Component_1.SequenceMode.Timeline ?
+                    Component_1.SequenceMode.Default :
+                    Component_1.SequenceMode.Timeline;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var timeline = vd.h("div.SequenceTimelineButton", timelineProperties, [timelineIcon]);
+        var properties = {
+            style: {
+                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
+                transform: "translate(" + (containerWidth / 2 + 2) + "px, 0)",
+                width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + "px",
+            },
+        };
+        var className = ".SequenceControls" +
+            (this._expandControls ? ".SequenceControlsExpanded" : "");
+        return vd.h("div" + className, properties, [playback, timeline, expander]);
+    };
+    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, containerWidth, configuration, navigator) {
         var _this = this;
-        this._sequenceSubscription = this._navigator.stateService.currentNode$
-            .scan(function (keys, node) {
-            var sKey = node.sequenceKey;
-            keys.report = [];
-            if (!(sKey in keys.reported)) {
-                keys.report = [sKey];
-                keys.reported[sKey] = true;
+        var nextProperties = {
+            onclick: nextKey != null ?
+                function (e) {
+                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
+                        .subscribe(undefined, function (error) {
+                        if (!(error instanceof Error_1.AbortMapillaryError)) {
+                            console.error(error);
+                        }
+                    });
+                } :
+                null,
+            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
+            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
+        };
+        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
+        var prevProperties = {
+            onclick: prevKey != null ?
+                function (e) {
+                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
+                        .subscribe(undefined, function (error) {
+                        if (!(error instanceof Error_1.AbortMapillaryError)) {
+                            console.error(error);
+                        }
+                    });
+                } :
+                null,
+            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
+            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
+            style: {
+                "border-bottom-left-radius": borderRadius + "px",
+                "border-top-left-radius": borderRadius + "px",
+            },
+        };
+        var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
+        var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
+        var nextIcon = vd.h("div.SequenceComponentIcon", []);
+        var prevIcon = vd.h("div.SequenceComponentIcon", []);
+        return [
+            vd.h("div." + prevClass, prevProperties, [prevIcon]),
+            vd.h("div." + nextClass, nextProperties, [nextIcon]),
+        ];
+    };
+    SequenceDOMRenderer.prototype._createStepper = function (edgeStatus, configuration, containerWidth, component, navigator) {
+        var nextKey = null;
+        var prevKey = null;
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
+                nextKey = edge.to;
             }
-            return keys;
-        }, { report: [], reported: {} })
-            .filter(function (keys) {
-            return keys.report.length > 0;
-        })
-            .mergeMap(function (keys) {
-            return _this._navigator.apiV3.sequenceViewAdd$(keys.report)
-                .catch(function (error, caught) {
-                console.error("Failed to report sequence stats (" + keys.report + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe();
-        this._imageSubscription = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return node.key;
-        })
-            .buffer(this._navigator.stateService.currentNode$.debounceTime(5000))
-            .scan(function (keys, newKeys) {
-            keys.report = [];
-            for (var _i = 0, newKeys_1 = newKeys; _i < newKeys_1.length; _i++) {
-                var key = newKeys_1[_i];
-                if (!(key in keys.reported)) {
-                    keys.report.push(key);
-                    keys.reported[key] = true;
-                }
+            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
+                prevKey = edge.to;
             }
-            return keys;
-        }, { report: [], reported: {} })
-            .filter(function (keys) {
-            return keys.report.length > 0;
-        })
-            .mergeMap(function (keys) {
-            return _this._navigator.apiV3.imageViewAdd$(keys.report)
-                .catch(function (error, caught) {
-                console.error("Failed to report image stats (" + keys.report + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe();
+        }
+        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
+        var buttons = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, navigator);
+        buttons.splice(1, 0, playingButton);
+        var containerProperties = {
+            oncontextmenu: function (event) { event.preventDefault(); },
+            style: {
+                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
+                width: containerWidth + "px",
+            },
+        };
+        return vd.h("div.SequenceStepper", containerProperties, buttons);
     };
-    StatsComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._imageSubscription.unsubscribe();
+    SequenceDOMRenderer.prototype._createTimelineControls = function (containerWidth, index, max) {
+        var _this = this;
+        if (this._mode !== Component_1.SequenceMode.Timeline) {
+            return vd.h("div.SequenceTimeline", []);
+        }
+        var positionInput = this._createPositionInput(index, max);
+        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
+        var closeButtonProperties = {
+            onclick: function () {
+                _this._mode = Component_1.SequenceMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
+        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
+        var playbackProperties = { style: { top: top + "px" } };
+        return vd.h("div.SequenceTimeline", playbackProperties, [positionInput, closeButton]);
     };
-    StatsComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
+        var className = direction === Edge_1.EdgeDirection.Next ?
+            "SequenceStepNext" :
+            "SequenceStepPrev";
+        if (key == null) {
+            className += "Disabled";
+        }
+        else {
+            if (highlightKey === key) {
+                className += "Highlight";
+            }
+        }
+        return className;
     };
-    StatsComponent.componentName = "stats";
-    return StatsComponent;
-}(Component_1.Component));
-exports.StatsComponent = StatsComponent;
-Component_1.ComponentService.register(StatsComponent);
+    SequenceDOMRenderer.prototype._setChangingPosition = function (value) {
+        this._changingPosition = value;
+        this._notifyChangingPositionChanged$.next(value);
+    };
+    return SequenceDOMRenderer;
+}());
+exports.SequenceDOMRenderer = SequenceDOMRenderer;
+exports.default = SequenceDOMRenderer;
+
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],355:[function(require,module,exports){
+"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = StatsComponent;
+exports.SequenceMode = void 0;
+var SequenceMode;
+(function (SequenceMode) {
+    SequenceMode[SequenceMode["Default"] = 0] = "Default";
+    SequenceMode[SequenceMode["Playback"] = 1] = "Playback";
+    SequenceMode[SequenceMode["Timeline"] = 2] = "Timeline";
+})(SequenceMode = exports.SequenceMode || (exports.SequenceMode = {}));
+exports.default = SequenceMode;
+
+},{}],356:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Shaders = void 0;
+
+var path = require("path");
+var Shaders = /** @class */ (function () {
+    function Shaders() {
+    }
+    Shaders.equirectangular = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    };
+    Shaders.equirectangularCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n\n    bool inverted = curtain < 0.5;\n\n    float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n    float curtainMax = curtain;\n\n    bool insideCurtain = inverted ?\n        x > curtainMin || x < curtainMax :\n        x > curtainMin && x < curtainMax;\n\n    vec4 baseColor;\n    if (insideCurtain) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    };
+    Shaders.perspective = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    };
+    Shaders.perspectiveCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    };
+    Shaders.fisheye = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r = sqrt(x * x + y * y);\n    float theta = atan(r, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    };
+    Shaders.fisheyeCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r2 = sqrt(x * x + y * y);\n    float theta = atan(r2, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r2;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    };
+    Shaders.perspectiveDistorted = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
+    };
+    Shaders.perspectiveDistortedCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
+    };
+    return Shaders;
+}());
+exports.Shaders = Shaders;
 
-},{"../Component":207,"rxjs/Observable":28,"rxjs/add/operator/buffer":47,"rxjs/add/operator/debounceTime":51,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68}],233:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+
+},{"path":39}],357:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/share");
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SliderComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var State_1 = require("../../State");
+var Render_1 = require("../../Render");
+var Tiles_1 = require("../../Tiles");
+var Utils_1 = require("../../Utils");
 /**
- * @class DirectionComponent
- * @classdesc Component showing navigation arrows for steps and turns.
+ * @class SliderComponent
+ *
+ * @classdesc Component for comparing pairs of images. Renders
+ * a slider for adjusting the curtain of the first image.
+ *
+ * Deactivate the sequence, direction and image plane
+ * components when activating the slider component to avoid
+ * interfering UI elements.
+ *
+ * To retrive and use the slider component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * viewer.deactivateComponent("imagePlane");
+ * viewer.deactivateComponent("direction");
+ * viewer.deactivateComponent("sequence");
+ *
+ * viewer.activateComponent("slider");
+ *
+ * var sliderComponent = viewer.getComponent("slider");
+ * ```
  */
-var DirectionComponent = (function (_super) {
-    __extends(DirectionComponent, _super);
-    function DirectionComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._renderer = new Component_1.DirectionDOMRenderer(this.defaultConfiguration, container.element);
-        this._hoveredKeySubject$ = new Subject_1.Subject();
-        this._hoveredKey$ = this._hoveredKeySubject$.share();
+var SliderComponent = /** @class */ (function (_super) {
+    __extends(SliderComponent, _super);
+    /** @ignore */
+    function SliderComponent(name, container, navigator, viewportCoords) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        _this._domRenderer = new Component_1.SliderDOMRenderer(container);
+        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
+        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
+        _this._spatial = new Geo_1.Spatial();
+        _this._glRendererOperation$ = new rxjs_1.Subject();
+        _this._glRendererCreator$ = new rxjs_1.Subject();
+        _this._glRendererDisposer$ = new rxjs_1.Subject();
+        _this._glRenderer$ = _this._glRendererOperation$.pipe(operators_1.scan(function (glRenderer, operation) {
+            return operation(glRenderer);
+        }, null), operators_1.filter(function (glRenderer) {
+            return glRenderer != null;
+        }), operators_1.distinctUntilChanged(undefined, function (glRenderer) {
+            return glRenderer.frameId;
+        }));
+        _this._glRendererCreator$.pipe(operators_1.map(function () {
+            return function (glRenderer) {
+                if (glRenderer != null) {
+                    throw new Error("Multiple slider states can not be created at the same time");
+                }
+                return new Component_1.SliderGLRenderer();
+            };
+        }))
+            .subscribe(_this._glRendererOperation$);
+        _this._glRendererDisposer$.pipe(operators_1.map(function () {
+            return function (glRenderer) {
+                glRenderer.dispose();
+                return null;
+            };
+        }))
+            .subscribe(_this._glRendererOperation$);
+        return _this;
     }
-    Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", {
-        /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
-         */
-        get: function () {
-            return this._hoveredKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
     /**
-     * Set highlight key.
+     * Set the initial position.
      *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
+     * @description Configures the intial position of the slider.
+     * The inital position value will be used when the component
+     * is activated.
      *
-     * @param {string} highlightKey Key of node to be highlighted if existing
-     * among arrows.
+     * @param {number} initialPosition - Initial slider position.
      */
-    DirectionComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
+    SliderComponent.prototype.setInitialPosition = function (initialPosition) {
+        this.configure({ initialPosition: initialPosition });
     };
     /**
-     * Set min width of container element.
-     *
-     * @description  Set min width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
+     * Set the image keys.
      *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * @description Configures the component to show the image
+     * planes for the supplied image keys.
      *
-     * @param {number} minWidth
+     * @param {ISliderKeys} keys - Slider keys object specifying
+     * the images to be shown in the foreground and the background.
      */
-    DirectionComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
+    SliderComponent.prototype.setKeys = function (keys) {
+        this.configure({ keys: keys });
     };
     /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
+     * Set the slider mode.
      *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * @description Configures the mode for transitions between
+     * image pairs.
      *
-     * @param {number} minWidth
+     * @param {SliderMode} mode - Slider mode to be set.
      */
-    DirectionComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
+    SliderComponent.prototype.setSliderMode = function (mode) {
+        this.configure({ mode: mode });
     };
-    /** @inheritdoc */
-    DirectionComponent.prototype.resize = function () {
-        this._renderer.resize(this._container.element);
+    /**
+     * Set the value controlling if the slider is visible.
+     *
+     * @param {boolean} sliderVisible - Value indicating if
+     * the slider should be visible or not.
+     */
+    SliderComponent.prototype.setSliderVisible = function (sliderVisible) {
+        this.configure({ sliderVisible: sliderVisible });
     };
-    DirectionComponent.prototype._activate = function () {
+    SliderComponent.prototype._activate = function () {
         var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            _this._renderer.setConfiguration(configuration);
+        this._modeSubcription = this._domRenderer.mode$
+            .subscribe(function (mode) {
+            _this.setSliderMode(mode);
         });
-        this._nodeSubscription = this._navigator.stateService.currentNode$
-            .do(function (node) {
-            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
-            _this._renderer.setNode(node);
-        })
-            .withLatestFrom(this._configuration$)
-            .switchMap(function (nc) {
-            var node = nc[0];
-            var configuration = nc[1];
-            return node.spatialEdges$
-                .withLatestFrom(configuration.distinguishSequence ?
-                _this._navigator.graphService
-                    .cacheSequence$(node.sequenceKey)
-                    .catch(function (error, caught) {
-                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
-                    return Observable_1.Observable.empty();
-                }) :
-                Observable_1.Observable.of(null));
-        })
-            .subscribe(function (es) {
-            _this._renderer.setEdges(es[0], es[1]);
+        this._glRenderSubscription = this._glRenderer$.pipe(operators_1.map(function (glRenderer) {
+            var renderHash = {
+                name: _this._name,
+                render: {
+                    frameId: glRenderer.frameId,
+                    needsRender: glRenderer.needsRender,
+                    render: glRenderer.render.bind(glRenderer),
+                    stage: Render_1.GLRenderStage.Background,
+                },
+            };
+            return renderHash;
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        var position$ = rxjs_1.concat(this.configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.initialPosition != null ?
+                configuration.initialPosition : 1;
+        }), operators_1.first()), this._domRenderer.position$);
+        var mode$ = this.configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.mode;
+        }), operators_1.distinctUntilChanged());
+        var motionless$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.motionless;
+        }), operators_1.distinctUntilChanged());
+        var fullPano$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.currentNode.fullPano;
+        }), operators_1.distinctUntilChanged());
+        var sliderVisible$ = rxjs_1.combineLatest(this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.sliderVisible;
+        })), this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return !(frame.state.currentNode == null ||
+                frame.state.previousNode == null ||
+                (frame.state.currentNode.pano && !frame.state.currentNode.fullPano) ||
+                (frame.state.previousNode.pano && !frame.state.previousNode.fullPano) ||
+                (frame.state.currentNode.fullPano && !frame.state.previousNode.fullPano));
+        }), operators_1.distinctUntilChanged())).pipe(operators_1.map(function (_a) {
+            var sliderVisible = _a[0], enabledState = _a[1];
+            return sliderVisible && enabledState;
+        }), operators_1.distinctUntilChanged());
+        this._waitSubscription = rxjs_1.combineLatest(mode$, motionless$, fullPano$, sliderVisible$).pipe(operators_1.withLatestFrom(this._navigator.stateService.state$))
+            .subscribe(function (_a) {
+            var _b = _a[0], mode = _b[0], motionless = _b[1], fullPano = _b[2], sliderVisible = _b[3], state = _a[1];
+            var interactive = sliderVisible &&
+                (motionless || mode === Component_1.SliderMode.Stationary || fullPano);
+            if (interactive && state !== State_1.State.WaitingInteractively) {
+                _this._navigator.stateService.waitInteractively();
+            }
+            else if (!interactive && state !== State_1.State.Waiting) {
+                _this._navigator.stateService.wait();
+            }
+        });
+        this._moveSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$)
+            .subscribe(function (_a) {
+            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4];
+            if (motionless || mode === Component_1.SliderMode.Stationary || fullPano) {
+                _this._navigator.stateService.moveTo(1);
+            }
+            else {
+                _this._navigator.stateService.moveTo(position);
+            }
         });
-        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$
-            .do(function (renderCamera) {
-            _this._renderer.setRenderCamera(renderCamera);
-        })
-            .map(function (renderCamera) {
-            return _this._renderer;
-        })
-            .filter(function (renderer) {
-            return renderer.needsRender;
-        })
-            .map(function (renderer) {
-            return { name: _this._name, vnode: renderer.render(_this._navigator) };
-        })
+        this._domRenderSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4], size = _a[5];
+            return {
+                name: _this._name,
+                vnode: _this._domRenderer.render(position, mode, motionless, fullPano, sliderVisible),
+            };
+        }))
             .subscribe(this._container.domRenderer.render$);
-        this._hoveredKeySubscription = Observable_1.Observable
-            .combineLatest([
-            this._container.domRenderer.element$,
-            this._container.renderService.renderCamera$,
-            this._container.mouseService.mouseMove$.startWith(null),
-            this._container.mouseService.mouseUp$.startWith(null),
-        ], function (e, rc, mm, mu) {
-            return e;
-        })
-            .map(function (element) {
-            var elements = element.getElementsByClassName("DirectionsPerspective");
-            for (var i = 0; i < elements.length; i++) {
-                var hovered = elements.item(i).querySelector(":hover");
-                if (hovered != null && hovered.hasAttribute("data-key")) {
-                    return hovered.getAttribute("data-key");
+        this._glRendererCreator$.next(null);
+        this._updateCurtainSubscription = rxjs_1.combineLatest(position$, fullPano$, sliderVisible$, this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.map(function (_a) {
+            var position = _a[0], fullPano = _a[1], visible = _a[2], render = _a[3], transform = _a[4];
+            if (!fullPano) {
+                return visible ? position : 1;
+            }
+            var basicMin = _this._viewportCoords.viewportToBasic(-1.15, 0, transform, render.perspective);
+            var basicMax = _this._viewportCoords.viewportToBasic(1.15, 0, transform, render.perspective);
+            var shiftedMax = basicMax[0] < basicMin[0] ? basicMax[0] + 1 : basicMax[0];
+            var basicPosition = basicMin[0] + position * (shiftedMax - basicMin[0]);
+            return basicPosition > 1 ? basicPosition - 1 : basicPosition;
+        }), operators_1.map(function (position) {
+            return function (glRenderer) {
+                glRenderer.updateCurtain(position);
+                return glRenderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._stateSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, mode$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], mode = _a[1];
+            return function (glRenderer) {
+                glRenderer.update(frame, mode);
+                return glRenderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._setKeysSubscription = this._configuration$.pipe(operators_1.filter(function (configuration) {
+            return configuration.keys != null;
+        }), operators_1.switchMap(function (configuration) {
+            return rxjs_1.zip(rxjs_1.zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground)).pipe(operators_1.map(function (nodes) {
+                return { background: nodes[0], foreground: nodes[1] };
+            })), _this._navigator.stateService.currentState$.pipe(operators_1.first())).pipe(operators_1.map(function (nf) {
+                return { nodes: nf[0], state: nf[1].state };
+            }));
+        }))
+            .subscribe(function (co) {
+            if (co.state.currentNode != null &&
+                co.state.previousNode != null &&
+                co.state.currentNode.key === co.nodes.foreground.key &&
+                co.state.previousNode.key === co.nodes.background.key) {
+                return;
+            }
+            if (co.state.currentNode.key === co.nodes.background.key) {
+                _this._navigator.stateService.setNodes([co.nodes.foreground]);
+                return;
+            }
+            if (co.state.currentNode.key === co.nodes.foreground.key &&
+                co.state.trajectory.length === 1) {
+                _this._navigator.stateService.prependNodes([co.nodes.background]);
+                return;
+            }
+            _this._navigator.stateService.setNodes([co.nodes.background]);
+            _this._navigator.stateService.setNodes([co.nodes.foreground]);
+        }, function (e) {
+            console.error(e);
+        });
+        var previousNode$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.previousNode;
+        }), operators_1.filter(function (node) {
+            return node != null;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }));
+        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
+            var frame = _a[0], renderer = _a[1], size = _a[2];
+            var state = frame.state;
+            var viewportSize = Math.max(size.width, size.height);
+            var currentNode = state.currentNode;
+            var currentTransform = state.currentTransform;
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
+        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
+            return function (renderer) {
+                renderer.setTextureProvider(provider.key, provider);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
+            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
+        }))
+            .subscribe(function (_a) {
+            var provider = _a[0], size = _a[1];
+            var viewportSize = Math.max(size.width, size.height);
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            provider.setTileSize(tileSize);
+        });
+        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
+            .subscribe(function (pair) {
+            var previous = pair[0];
+            previous.abort();
+        });
+        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
+            var camera = _a[0], size = _a[1];
+            return [
+                camera.camera.position.clone(),
+                camera.camera.lookat.clone(),
+                camera.zoom.valueOf(),
+                size.height.valueOf(),
+                size.width.valueOf()
+            ];
+        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
+            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
+        }), operators_1.map(function (pls) {
+            var samePosition = pls[0][0].equals(pls[1][0]);
+            var sameLookat = pls[0][1].equals(pls[1][1]);
+            var sameZoom = pls[0][2] === pls[1][2];
+            var sameHeight = pls[0][3] === pls[1][3];
+            var sameWidth = pls[0][4] === pls[1][4];
+            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
+        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
+            return stalled;
+        }), operators_1.switchMap(function (stalled) {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
+        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
+        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return roiTrigger$.pipe(operators_1.map(function (_a) {
+                var camera = _a[0], size = _a[1], transform = _a[2];
+                return [
+                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
+                    provider,
+                ];
+            }));
+        }), operators_1.filter(function (args) {
+            return !args[1].disposed;
+        }))
+            .subscribe(function (args) {
+            var roi = args[0];
+            var provider = args[1];
+            provider.setRegionOfInterest(roi);
+        });
+        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return provider.hasTexture$;
+        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
+        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead === 0;
+        }), operators_1.map(function (frame) {
+            return frame.state.currentNode;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
+            return !args[1];
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.filter(function (node) {
+            return node.pano ?
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
+        }), operators_1.switchMap(function (node) {
+            var baseImageSize = node.pano ?
+                Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.baseImageSize;
+            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
+                return rxjs_1.empty();
+            }
+            var image$ = node
+                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
+                return [n.image, n];
+            }));
+            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
+                return hasTexture;
+            }))), operators_1.catchError(function (error, caught) {
+                console.error("Failed to fetch high res image (" + node.key + ")", error);
+                return rxjs_1.empty();
+            }));
+        })).pipe(operators_1.publish(), operators_1.refCount());
+        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
+            .subscribe(function (args) {
+            if (args[0][1].key !== args[1].key ||
+                args[1].disposed) {
+                return;
+            }
+            args[1].updateBackground(args[0][0]);
+        });
+        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
+            return function (renderer) {
+                renderer.updateTextureImage(imn[0], imn[1]);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        var textureProviderPrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return !!frame.state.previousNode;
+        }), operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.previousNode.key;
+        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
+            var frame = _a[0], renderer = _a[1], size = _a[2];
+            var state = frame.state;
+            var viewportSize = Math.max(size.width, size.height);
+            var previousNode = state.previousNode;
+            var previousTransform = state.previousTransform;
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            return new Tiles_1.TextureProvider(previousNode.key, previousTransform.basicWidth, previousTransform.basicHeight, tileSize, previousNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._textureProviderSubscriptionPrev = textureProviderPrev$.subscribe(function () { });
+        this._setTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.map(function (provider) {
+            return function (renderer) {
+                renderer.setTextureProviderPrev(provider.key, provider);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._setTileSizeSubscriptionPrev = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
+            return rxjs_1.combineLatest(textureProviderPrev$, rxjs_1.of(size)).pipe(operators_1.first());
+        }))
+            .subscribe(function (_a) {
+            var provider = _a[0], size = _a[1];
+            var viewportSize = Math.max(size.width, size.height);
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            provider.setTileSize(tileSize);
+        });
+        this._abortTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.pairwise())
+            .subscribe(function (pair) {
+            var previous = pair[0];
+            previous.abort();
+        });
+        var roiTriggerPrev$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
+            var camera = _a[0], size = _a[1];
+            return [
+                camera.camera.position.clone(),
+                camera.camera.lookat.clone(),
+                camera.zoom.valueOf(),
+                size.height.valueOf(),
+                size.width.valueOf()
+            ];
+        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
+            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
+        }), operators_1.map(function (pls) {
+            var samePosition = pls[0][0].equals(pls[1][0]);
+            var sameLookat = pls[0][1].equals(pls[1][1]);
+            var sameZoom = pls[0][2] === pls[1][2];
+            var sameHeight = pls[0][3] === pls[1][3];
+            var sameWidth = pls[0][4] === pls[1][4];
+            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
+        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
+            return stalled;
+        }), operators_1.switchMap(function (stalled) {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
+        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
+        this._setRegionOfInterestSubscriptionPrev = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
+            return roiTriggerPrev$.pipe(operators_1.map(function (_a) {
+                var camera = _a[0], size = _a[1], transform = _a[2];
+                return [
+                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
+                    provider,
+                ];
+            }));
+        }), operators_1.filter(function (args) {
+            return !args[1].disposed;
+        }), operators_1.withLatestFrom(this._navigator.stateService.currentState$))
+            .subscribe(function (_a) {
+            var _b = _a[0], roi = _b[0], provider = _b[1], frame = _a[1];
+            var shiftedRoi = null;
+            if (frame.state.previousNode.fullPano) {
+                if (frame.state.currentNode.fullPano) {
+                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
+                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
+                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
+                    var shift = directionDiff / (2 * Math.PI);
+                    var bbox = {
+                        maxX: _this._spatial.wrap(roi.bbox.maxX + shift, 0, 1),
+                        maxY: roi.bbox.maxY,
+                        minX: _this._spatial.wrap(roi.bbox.minX + shift, 0, 1),
+                        minY: roi.bbox.minY,
+                    };
+                    shiftedRoi = {
+                        bbox: bbox,
+                        pixelHeight: roi.pixelHeight,
+                        pixelWidth: roi.pixelWidth,
+                    };
+                }
+                else {
+                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
+                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
+                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
+                    var shiftX = directionDiff / (2 * Math.PI);
+                    var a1 = _this._spatial.angleToPlane(currentViewingDirection.toArray(), [0, 0, 1]);
+                    var a2 = _this._spatial.angleToPlane(previousViewingDirection.toArray(), [0, 0, 1]);
+                    var shiftY = (a2 - a1) / (2 * Math.PI);
+                    var currentTransform = frame.state.currentTransform;
+                    var size = Math.max(currentTransform.basicWidth, currentTransform.basicHeight);
+                    var hFov = size > 0 ?
+                        2 * Math.atan(0.5 * currentTransform.basicWidth / (size * currentTransform.focal)) :
+                        Math.PI / 3;
+                    var vFov = size > 0 ?
+                        2 * Math.atan(0.5 * currentTransform.basicHeight / (size * currentTransform.focal)) :
+                        Math.PI / 3;
+                    var spanningWidth = hFov / (2 * Math.PI);
+                    var spanningHeight = vFov / Math.PI;
+                    var basicWidth = (roi.bbox.maxX - roi.bbox.minX) * spanningWidth;
+                    var basicHeight = (roi.bbox.maxY - roi.bbox.minY) * spanningHeight;
+                    var pixelWidth = roi.pixelWidth * spanningWidth;
+                    var pixelHeight = roi.pixelHeight * spanningHeight;
+                    var zoomShiftX = (roi.bbox.minX + roi.bbox.maxX) / 2 - 0.5;
+                    var zoomShiftY = (roi.bbox.minY + roi.bbox.maxY) / 2 - 0.5;
+                    var minX = 0.5 + shiftX + spanningWidth * zoomShiftX - basicWidth / 2;
+                    var maxX = 0.5 + shiftX + spanningWidth * zoomShiftX + basicWidth / 2;
+                    var minY = 0.5 + shiftY + spanningHeight * zoomShiftY - basicHeight / 2;
+                    var maxY = 0.5 + shiftY + spanningHeight * zoomShiftY + basicHeight / 2;
+                    var bbox = {
+                        maxX: _this._spatial.wrap(maxX, 0, 1),
+                        maxY: maxY,
+                        minX: _this._spatial.wrap(minX, 0, 1),
+                        minY: minY,
+                    };
+                    shiftedRoi = {
+                        bbox: bbox,
+                        pixelHeight: pixelHeight,
+                        pixelWidth: pixelWidth,
+                    };
                 }
             }
-            return null;
-        })
-            .distinctUntilChanged()
-            .subscribe(this._hoveredKeySubject$);
+            else {
+                var currentBasicAspect = frame.state.currentTransform.basicAspect;
+                var previousBasicAspect = frame.state.previousTransform.basicAspect;
+                var _c = _this._getBasicCorners(currentBasicAspect, previousBasicAspect), _d = _c[0], cornerMinX = _d[0], cornerMinY = _d[1], _e = _c[1], cornerMaxX = _e[0], cornerMaxY = _e[1];
+                var basicWidth = cornerMaxX - cornerMinX;
+                var basicHeight = cornerMaxY - cornerMinY;
+                var pixelWidth = roi.pixelWidth / basicWidth;
+                var pixelHeight = roi.pixelHeight / basicHeight;
+                var minX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.minX / basicWidth;
+                var maxX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.maxX / basicWidth;
+                var minY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.minY / basicHeight;
+                var maxY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.maxY / basicHeight;
+                var bbox = {
+                    maxX: maxX,
+                    maxY: maxY,
+                    minX: minX,
+                    minY: minY,
+                };
+                _this._clipBoundingBox(bbox);
+                shiftedRoi = {
+                    bbox: bbox,
+                    pixelHeight: pixelHeight,
+                    pixelWidth: pixelWidth,
+                };
+            }
+            provider.setRegionOfInterest(shiftedRoi);
+        });
+        var hasTexturePrev$ = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
+            return provider.hasTexture$;
+        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasTextureSubscriptionPrev = hasTexturePrev$.subscribe(function () { });
+        var nodeImagePrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead === 0 && !!frame.state.previousNode;
+        }), operators_1.map(function (frame) {
+            return frame.state.previousNode;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexturePrev$), operators_1.filter(function (args) {
+            return !args[1];
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.filter(function (node) {
+            return node.pano ?
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
+        }), operators_1.switchMap(function (node) {
+            var baseImageSize = node.pano ?
+                Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.baseImageSize;
+            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
+                return rxjs_1.empty();
+            }
+            var image$ = node
+                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
+                return [n.image, n];
+            }));
+            return image$.pipe(operators_1.takeUntil(hasTexturePrev$.pipe(operators_1.filter(function (hasTexture) {
+                return hasTexture;
+            }))), operators_1.catchError(function (error, caught) {
+                console.error("Failed to fetch high res image (" + node.key + ")", error);
+                return rxjs_1.empty();
+            }));
+        })).pipe(operators_1.publish(), operators_1.refCount());
+        this._updateBackgroundSubscriptionPrev = nodeImagePrev$.pipe(operators_1.withLatestFrom(textureProviderPrev$))
+            .subscribe(function (args) {
+            if (args[0][1].key !== args[1].key ||
+                args[1].disposed) {
+                return;
+            }
+            args[1].updateBackground(args[0][0]);
+        });
+        this._updateTextureImageSubscriptionPrev = nodeImagePrev$.pipe(operators_1.map(function (imn) {
+            return function (renderer) {
+                renderer.updateTextureImage(imn[0], imn[1]);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
     };
-    DirectionComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this._renderCameraSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
+    SliderComponent.prototype._deactivate = function () {
+        var _this = this;
+        this._waitSubscription.unsubscribe();
+        this._navigator.stateService.state$.pipe(operators_1.first())
+            .subscribe(function (state) {
+            if (state !== State_1.State.Traversing) {
+                _this._navigator.stateService.traverse();
+            }
+        });
+        this._glRendererDisposer$.next(null);
+        this._domRenderer.deactivate();
+        this._modeSubcription.unsubscribe();
+        this._setKeysSubscription.unsubscribe();
+        this._stateSubscription.unsubscribe();
+        this._glRenderSubscription.unsubscribe();
+        this._domRenderSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._updateCurtainSubscription.unsubscribe();
+        this._textureProviderSubscription.unsubscribe();
+        this._setTextureProviderSubscription.unsubscribe();
+        this._setTileSizeSubscription.unsubscribe();
+        this._abortTextureProviderSubscription.unsubscribe();
+        this._setRegionOfInterestSubscription.unsubscribe();
+        this._hasTextureSubscription.unsubscribe();
+        this._updateBackgroundSubscription.unsubscribe();
+        this._updateTextureImageSubscription.unsubscribe();
+        this._textureProviderSubscriptionPrev.unsubscribe();
+        this._setTextureProviderSubscriptionPrev.unsubscribe();
+        this._setTileSizeSubscriptionPrev.unsubscribe();
+        this._abortTextureProviderSubscriptionPrev.unsubscribe();
+        this._setRegionOfInterestSubscriptionPrev.unsubscribe();
+        this._hasTextureSubscriptionPrev.unsubscribe();
+        this._updateBackgroundSubscriptionPrev.unsubscribe();
+        this._updateTextureImageSubscriptionPrev.unsubscribe();
+        this.configure({ keys: null });
     };
-    DirectionComponent.prototype._getDefaultConfiguration = function () {
+    SliderComponent.prototype._getDefaultConfiguration = function () {
         return {
-            distinguishSequence: false,
-            maxWidth: 460,
-            minWidth: 260,
+            initialPosition: 1,
+            mode: Component_1.SliderMode.Motion,
+            sliderVisible: true,
         };
     };
-    /** @inheritdoc */
-    DirectionComponent.componentName = "direction";
-    return DirectionComponent;
-}(Component_1.Component));
-exports.DirectionComponent = DirectionComponent;
-Component_1.ComponentService.register(DirectionComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DirectionComponent;
-
-},{"../../Component":207,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/share":69,"virtual-dom":163}],234:[function(require,module,exports){
-"use strict";
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMCalculator
- * @classdesc Helper class for calculating DOM CSS properties.
- */
-var DirectionDOMCalculator = (function () {
-    function DirectionDOMCalculator(configuration, element) {
-        this._spatial = new Geo_1.Spatial();
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._configure(configuration);
-        this._resize(element);
-        this._reset();
-    }
-    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
-        get: function () {
-            return this._minWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
-        get: function () {
-            return this._maxWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
-        get: function () {
-            return this._containerWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
-        get: function () {
-            return this._containerWidthCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
-        get: function () {
-            return this._containerMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
-        get: function () {
-            return this._containerLeftCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
-        get: function () {
-            return this._containerHeight;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
-        get: function () {
-            return this._containerHeightCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
-        get: function () {
-            return this._containerBottomCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
-        get: function () {
-            return this._stepCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
-        get: function () {
-            return this._stepCircleSizeCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
-        get: function () {
-            return this._stepCircleMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
+    SliderComponent.prototype._catchCacheNode$ = function (key) {
+        return this._navigator.graphService.cacheNode$(key).pipe(operators_1.catchError(function (error, caught) {
+            console.error("Failed to cache slider node (" + key + ")", error);
+            return rxjs_1.empty();
+        }));
+    };
+    SliderComponent.prototype._getBasicCorners = function (currentAspect, previousAspect) {
+        var offsetX;
+        var offsetY;
+        if (currentAspect > previousAspect) {
+            offsetX = 0.5;
+            offsetY = 0.5 * currentAspect / previousAspect;
+        }
+        else {
+            offsetX = 0.5 * previousAspect / currentAspect;
+            offsetY = 0.5;
+        }
+        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
+    };
+    SliderComponent.prototype._clipBoundingBox = function (bbox) {
+        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
+        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
+        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
+        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
+    };
+    SliderComponent.componentName = "slider";
+    return SliderComponent;
+}(Component_1.Component));
+exports.SliderComponent = SliderComponent;
+Component_1.ComponentService.register(SliderComponent);
+exports.default = SliderComponent;
+
+
+},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../State":298,"../../Tiles":300,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],358:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SliderDOMRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var SliderDOMRenderer = /** @class */ (function () {
+    function SliderDOMRenderer(container) {
+        this._container = container;
+        this._interacting = false;
+        this._notifyModeChanged$ = new rxjs_1.Subject();
+        this._notifyPositionChanged$ = new rxjs_1.Subject();
+        this._stopInteractionSubscription = null;
+    }
+    Object.defineProperty(SliderDOMRenderer.prototype, "mode$", {
         get: function () {
-            return this._turnCircleSize;
+            return this._notifyModeChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
+    Object.defineProperty(SliderDOMRenderer.prototype, "position$", {
         get: function () {
-            return this._turnCircleSizeCss;
+            return this._notifyPositionChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
+    SliderDOMRenderer.prototype.activate = function () {
+        var _this = this;
+        if (!!this._stopInteractionSubscription) {
+            return;
+        }
+        this._stopInteractionSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
+            return touchEvent.touches.length === 0;
+        })))
+            .subscribe(function (event) {
+            if (_this._interacting) {
+                _this._interacting = false;
+            }
+        });
+    };
+    SliderDOMRenderer.prototype.deactivate = function () {
+        if (!this._stopInteractionSubscription) {
+            return;
+        }
+        this._interacting = false;
+        this._stopInteractionSubscription.unsubscribe();
+        this._stopInteractionSubscription = null;
+    };
+    SliderDOMRenderer.prototype.render = function (position, mode, motionless, pano, visible) {
+        var children = [];
+        if (visible) {
+            children.push(vd.h("div.SliderBorder", []));
+            var modeVisible = !(motionless || pano);
+            if (modeVisible) {
+                children.push(this._createModeButton(mode));
+                children.push(this._createModeButton2d(mode));
+            }
+            children.push(this._createPositionInput(position, modeVisible));
+        }
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(215, Math.min(400, boundingRect.width - 100));
+        return vd.h("div.SliderContainer", { style: { width: width + "px" } }, children);
+    };
+    SliderDOMRenderer.prototype._createModeButton = function (mode) {
+        var _this = this;
+        var properties = {
+            onclick: function () {
+                if (mode === Component_1.SliderMode.Motion) {
+                    return;
+                }
+                _this._notifyModeChanged$.next(Component_1.SliderMode.Motion);
+            },
+        };
+        var className = mode === Component_1.SliderMode.Stationary ?
+            "SliderModeButtonDisabled" :
+            "SliderModeButton";
+        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]);
+    };
+    SliderDOMRenderer.prototype._createModeButton2d = function (mode) {
+        var _this = this;
+        var properties = {
+            onclick: function () {
+                if (mode === Component_1.SliderMode.Stationary) {
+                    return;
+                }
+                _this._notifyModeChanged$.next(Component_1.SliderMode.Stationary);
+            },
+        };
+        var className = mode === Component_1.SliderMode.Motion ?
+            "SliderModeButton2dDisabled" :
+            "SliderModeButton2d";
+        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon2d", [])]);
+    };
+    SliderDOMRenderer.prototype._createPositionInput = function (position, modeVisible) {
+        var _this = this;
+        var onChange = function (e) {
+            _this._notifyPositionChanged$.next(Number(e.target.value) / 1000);
+        };
+        var onStart = function (e) {
+            _this._interacting = true;
+            e.stopPropagation();
+        };
+        var onMove = function (e) {
+            if (_this._interacting) {
+                e.stopPropagation();
+            }
+        };
+        var onKeyDown = function (e) {
+            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
+                e.key === "ArrowRight" || e.key === "ArrowUp") {
+                e.preventDefault();
+            }
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(215, Math.min(400, boundingRect.width - 105)) - 84 + (modeVisible ? 0 : 52);
+        var positionInput = vd.h("input.SliderPosition", {
+            max: 1000,
+            min: 0,
+            onchange: onChange,
+            oninput: onChange,
+            onkeydown: onKeyDown,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: 1000 * position,
+        }, []);
+        return vd.h("div.SliderPositionContainer", [positionInput]);
+    };
+    return SliderDOMRenderer;
+}());
+exports.SliderDOMRenderer = SliderDOMRenderer;
+exports.default = SliderDOMRenderer;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],359:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SliderGLRenderer = void 0;
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var SliderGLRenderer = /** @class */ (function () {
+    function SliderGLRenderer() {
+        this._factory = new Component_1.MeshFactory();
+        this._scene = new Component_1.MeshScene();
+        this._spatial = new Geo_1.Spatial();
+        this._currentKey = null;
+        this._previousKey = null;
+        this._disabled = false;
+        this._curtain = 1;
+        this._frameId = 0;
+        this._needsRender = false;
+        this._mode = null;
+        this._currentProviderDisposers = {};
+        this._previousProviderDisposers = {};
+    }
+    Object.defineProperty(SliderGLRenderer.prototype, "disabled", {
         get: function () {
-            return this._outerRadius;
+            return this._disabled;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
+    Object.defineProperty(SliderGLRenderer.prototype, "frameId", {
         get: function () {
-            return this._innerRadius;
+            return this._frameId;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
+    Object.defineProperty(SliderGLRenderer.prototype, "needsRender", {
         get: function () {
-            return this._shadowOffset;
+            return this._needsRender;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Configures the min and max width values.
-     *
-     * @param {IDirectionConfiguration} configuration Configuration
-     * with min and max width values.
-     */
-    DirectionDOMCalculator.prototype.configure = function (configuration) {
-        this._configure(configuration);
-        this._reset();
+    SliderGLRenderer.prototype.setTextureProvider = function (key, provider) {
+        this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this));
+    };
+    SliderGLRenderer.prototype.setTextureProviderPrev = function (key, provider) {
+        this._setTextureProvider(key, this._previousKey, provider, this._previousProviderDisposers, this._updateTexturePrev.bind(this));
+    };
+    SliderGLRenderer.prototype.update = function (frame, mode) {
+        this._updateFrameId(frame.id);
+        this._updateImagePlanes(frame.state, mode);
+    };
+    SliderGLRenderer.prototype.updateCurtain = function (curtain) {
+        if (this._curtain === curtain) {
+            return;
+        }
+        this._curtain = curtain;
+        this._updateCurtain();
+        this._needsRender = true;
+    };
+    SliderGLRenderer.prototype.updateTexture = function (image, node) {
+        var planes = node.key === this._currentKey ?
+            this._scene.planes :
+            node.key === this._previousKey ?
+                this._scene.planesOld :
+                {};
+        if (Object.keys(planes).length === 0) {
+            return;
+        }
+        this._needsRender = true;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var texture = material.uniforms.projectorTex.value;
+            texture.image = image;
+            texture.needsUpdate = true;
+        }
+    };
+    SliderGLRenderer.prototype.updateTextureImage = function (image, node) {
+        if (this._currentKey !== node.key) {
+            return;
+        }
+        this._needsRender = true;
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var texture = material.uniforms.projectorTex.value;
+            texture.image = image;
+            texture.needsUpdate = true;
+        }
+    };
+    SliderGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
+        if (!this.disabled) {
+            renderer.render(this._scene.sceneOld, perspectiveCamera);
+        }
+        renderer.render(this._scene.scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    SliderGLRenderer.prototype.dispose = function () {
+        this._scene.clear();
+        for (var key in this._currentProviderDisposers) {
+            if (!this._currentProviderDisposers.hasOwnProperty(key)) {
+                continue;
+            }
+            this._currentProviderDisposers[key]();
+        }
+        for (var key in this._previousProviderDisposers) {
+            if (!this._previousProviderDisposers.hasOwnProperty(key)) {
+                continue;
+            }
+            this._previousProviderDisposers[key]();
+        }
+        this._currentProviderDisposers = {};
+        this._previousProviderDisposers = {};
+    };
+    SliderGLRenderer.prototype._getBasicCorners = function (currentAspect, previousAspect) {
+        var offsetX;
+        var offsetY;
+        if (currentAspect > previousAspect) {
+            offsetX = 0.5;
+            offsetY = 0.5 * currentAspect / previousAspect;
+        }
+        else {
+            offsetX = 0.5 * previousAspect / currentAspect;
+            offsetY = 0.5;
+        }
+        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
+    };
+    SliderGLRenderer.prototype._setDisabled = function (state) {
+        this._disabled = state.currentNode == null ||
+            state.previousNode == null ||
+            (state.currentNode.pano && !state.currentNode.fullPano) ||
+            (state.previousNode.pano && !state.previousNode.fullPano) ||
+            (state.currentNode.fullPano && !state.previousNode.fullPano);
+    };
+    SliderGLRenderer.prototype._setTextureProvider = function (key, originalKey, provider, providerDisposers, updateTexture) {
+        var _this = this;
+        if (key !== originalKey) {
+            return;
+        }
+        var createdSubscription = provider.textureCreated$
+            .subscribe(updateTexture);
+        var updatedSubscription = provider.textureUpdated$
+            .subscribe(function (updated) {
+            _this._needsRender = true;
+        });
+        var dispose = function () {
+            createdSubscription.unsubscribe();
+            updatedSubscription.unsubscribe();
+            provider.dispose();
+        };
+        if (key in providerDisposers) {
+            var disposeProvider = providerDisposers[key];
+            disposeProvider();
+            delete providerDisposers[key];
+        }
+        providerDisposers[key] = dispose;
+    };
+    SliderGLRenderer.prototype._updateCurtain = function () {
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var shaderMaterial = plane.material;
+            if (!!shaderMaterial.uniforms.curtain) {
+                shaderMaterial.uniforms.curtain.value = this._curtain;
+            }
+        }
+    };
+    SliderGLRenderer.prototype._updateFrameId = function (frameId) {
+        this._frameId = frameId;
+    };
+    SliderGLRenderer.prototype._updateImagePlanes = function (state, mode) {
+        var currentChanged = state.currentNode != null && this._currentKey !== state.currentNode.key;
+        var previousChanged = state.previousNode != null && this._previousKey !== state.previousNode.key;
+        var modeChanged = this._mode !== mode;
+        if (!(currentChanged || previousChanged || modeChanged)) {
+            return;
+        }
+        this._setDisabled(state);
+        this._needsRender = true;
+        this._mode = mode;
+        var motionless = state.motionless || mode === Component_1.SliderMode.Stationary || state.currentNode.pano;
+        if (this.disabled || previousChanged) {
+            if (this._previousKey in this._previousProviderDisposers) {
+                this._previousProviderDisposers[this._previousKey]();
+                delete this._previousProviderDisposers[this._previousKey];
+            }
+        }
+        if (this.disabled) {
+            this._scene.setImagePlanesOld({});
+        }
+        else {
+            if (previousChanged || modeChanged) {
+                var previousNode = state.previousNode;
+                this._previousKey = previousNode.key;
+                var elements = state.currentTransform.rt.elements;
+                var translation = [elements[12], elements[13], elements[14]];
+                var currentAspect = state.currentTransform.basicAspect;
+                var previousAspect = state.previousTransform.basicAspect;
+                var textureScale = currentAspect > previousAspect ?
+                    [1, previousAspect / currentAspect] :
+                    [currentAspect / previousAspect, 1];
+                var rotation = state.currentNode.rotation;
+                var width = state.currentNode.width;
+                var height = state.currentNode.height;
+                if (previousNode.fullPano) {
+                    rotation = state.previousNode.rotation;
+                    translation = this._spatial
+                        .rotate(this._spatial
+                        .opticalCenter(state.currentNode.rotation, translation)
+                        .toArray(), rotation)
+                        .multiplyScalar(-1)
+                        .toArray();
+                    width = state.previousNode.width;
+                    height = state.previousNode.height;
+                }
+                var transform = new Geo_1.Transform(state.currentNode.orientation, width, height, state.currentNode.focal, state.currentNode.scale, previousNode.gpano, rotation, translation, previousNode.image, textureScale);
+                var mesh = undefined;
+                if (previousNode.fullPano) {
+                    mesh = this._factory.createMesh(previousNode, motionless || state.currentNode.fullPano ? transform : state.previousTransform);
+                }
+                else {
+                    if (motionless) {
+                        var _a = this._getBasicCorners(currentAspect, previousAspect), _b = _a[0], basicX0 = _b[0], basicY0 = _b[1], _c = _a[1], basicX1 = _c[0], basicY1 = _c[1];
+                        mesh = this._factory.createFlatMesh(state.previousNode, transform, basicX0, basicX1, basicY0, basicY1);
+                    }
+                    else {
+                        mesh = this._factory.createMesh(state.previousNode, state.previousTransform);
+                    }
+                }
+                var previousPlanes = {};
+                previousPlanes[previousNode.key] = mesh;
+                this._scene.setImagePlanesOld(previousPlanes);
+            }
+        }
+        if (currentChanged || modeChanged) {
+            if (this._currentKey in this._currentProviderDisposers) {
+                this._currentProviderDisposers[this._currentKey]();
+                delete this._currentProviderDisposers[this._currentKey];
+            }
+            this._currentKey = state.currentNode.key;
+            var planes = {};
+            if (state.currentNode.fullPano) {
+                planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
+            }
+            else if (state.currentNode.pano && !state.currentNode.fullPano) {
+                planes[state.currentNode.key] = this._factory.createMesh(state.currentNode, state.currentTransform);
+            }
+            else {
+                if (motionless) {
+                    planes[state.currentNode.key] = this._factory.createDistortedCurtainMesh(state.currentNode, state.currentTransform);
+                }
+                else {
+                    planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
+                }
+            }
+            this._scene.setImagePlanes(planes);
+            this._updateCurtain();
+        }
+    };
+    SliderGLRenderer.prototype._updateTexture = function (texture) {
+        this._needsRender = true;
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var oldTexture = material.uniforms.projectorTex.value;
+            material.uniforms.projectorTex.value = null;
+            oldTexture.dispose();
+            material.uniforms.projectorTex.value = texture;
+        }
+    };
+    SliderGLRenderer.prototype._updateTexturePrev = function (texture) {
+        this._needsRender = true;
+        var planes = this._scene.planesOld;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var oldTexture = material.uniforms.projectorTex.value;
+            material.uniforms.projectorTex.value = null;
+            oldTexture.dispose();
+            material.uniforms.projectorTex.value = texture;
+        }
+    };
+    return SliderGLRenderer;
+}());
+exports.SliderGLRenderer = SliderGLRenderer;
+exports.default = SliderGLRenderer;
+
+
+},{"../../Component":291,"../../Geo":294}],360:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CameraVisualizationMode = void 0;
+var CameraVisualizationMode;
+(function (CameraVisualizationMode) {
+    CameraVisualizationMode[CameraVisualizationMode["Default"] = 0] = "Default";
+    CameraVisualizationMode[CameraVisualizationMode["Cluster"] = 1] = "Cluster";
+    CameraVisualizationMode[CameraVisualizationMode["ConnectedComponent"] = 2] = "ConnectedComponent";
+    CameraVisualizationMode[CameraVisualizationMode["Sequence"] = 3] = "Sequence";
+})(CameraVisualizationMode = exports.CameraVisualizationMode || (exports.CameraVisualizationMode = {}));
+exports.default = CameraVisualizationMode;
+
+},{}],361:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
+Object.defineProperty(exports, "CameraVisualizationMode", { enumerable: true, get: function () { return CameraVisualizationMode_1.CameraVisualizationMode; } });
+
+},{"./CameraVisualizationMode":360}],362:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpatialDataCache = void 0;
+var geohash = require("latlon-geohash");
+var pako = require("pako");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Error_1 = require("../../Error");
+var Utils_1 = require("../../Utils");
+var SpatialDataCache = /** @class */ (function () {
+    function SpatialDataCache(graphService) {
+        this._graphService = graphService;
+        this._tiles = {};
+        this._cacheRequests = {};
+        this._clusterReconstructions = {};
+        this._clusterReconstructionTiles = {};
+        this._tileClusters = {};
+        this._cachingTiles$ = {};
+        this._cachingClusterReconstructions$ = {};
+    }
+    SpatialDataCache.prototype.cacheClusterReconstructions$ = function (hash) {
+        var _this = this;
+        if (!this.hasTile(hash)) {
+            throw new Error("Cannot cache reconstructions of a non-existing tile.");
+        }
+        if (this.hasClusterReconstructions(hash)) {
+            throw new Error("Cannot cache reconstructions that already exists.");
+        }
+        if (this.isCachingClusterReconstructions(hash)) {
+            return this._cachingClusterReconstructions$[hash];
+        }
+        var clusterKeys = this.getTile(hash)
+            .filter(function (nd) {
+            return !!nd.clusterKey;
+        })
+            .map(function (nd) {
+            return nd.clusterKey;
+        })
+            .filter(function (v, i, a) {
+            return a.indexOf(v) === i;
+        });
+        this._tileClusters[hash] = clusterKeys;
+        this._cacheRequests[hash] = [];
+        this._cachingClusterReconstructions$[hash] = rxjs_1.from(clusterKeys).pipe(operators_1.mergeMap(function (key) {
+            if (_this._hasClusterReconstruction(key)) {
+                return rxjs_1.of(_this._getClusterReconstruction(key));
+            }
+            return _this._getClusterReconstruction$(key, _this._cacheRequests[hash])
+                .pipe(operators_1.catchError(function (error) {
+                if (error instanceof Error_1.AbortMapillaryError) {
+                    return rxjs_1.empty();
+                }
+                console.error(error);
+                return rxjs_1.empty();
+            }));
+        }, 6), operators_1.filter(function () {
+            return hash in _this._tileClusters;
+        }), operators_1.tap(function (reconstruction) {
+            if (!_this._hasClusterReconstruction(reconstruction.key)) {
+                _this._clusterReconstructions[reconstruction.key] = reconstruction;
+            }
+            if (!(reconstruction.key in _this._clusterReconstructionTiles)) {
+                _this._clusterReconstructionTiles[reconstruction.key] = [];
+            }
+            if (_this._clusterReconstructionTiles[reconstruction.key].indexOf(hash) === -1) {
+                _this._clusterReconstructionTiles[reconstruction.key].push(hash);
+            }
+        }), operators_1.finalize(function () {
+            if (hash in _this._cachingClusterReconstructions$) {
+                delete _this._cachingClusterReconstructions$[hash];
+            }
+            if (hash in _this._cacheRequests) {
+                delete _this._cacheRequests[hash];
+            }
+        }), operators_1.publish(), operators_1.refCount());
+        return this._cachingClusterReconstructions$[hash];
+    };
+    SpatialDataCache.prototype.cacheTile$ = function (hash) {
+        var _this = this;
+        if (hash.length !== 8) {
+            throw new Error("Hash needs to be level 8.");
+        }
+        if (this.hasTile(hash)) {
+            throw new Error("Cannot cache tile that already exists.");
+        }
+        if (this.isCachingTile(hash)) {
+            return this._cachingTiles$[hash];
+        }
+        var bounds = geohash.bounds(hash);
+        var sw = { lat: bounds.sw.lat, lon: bounds.sw.lon };
+        var ne = { lat: bounds.ne.lat, lon: bounds.ne.lon };
+        this._cachingTiles$[hash] = this._graphService.cacheBoundingBox$(sw, ne).pipe(operators_1.catchError(function (error) {
+            console.error(error);
+            return rxjs_1.empty();
+        }), operators_1.map(function (nodes) {
+            return nodes
+                .map(function (n) {
+                return _this._createNodeData(n);
+            });
+        }), operators_1.filter(function () {
+            return !(hash in _this._tiles);
+        }), operators_1.tap(function (nodeData) {
+            var _a;
+            _this._tiles[hash] = [];
+            (_a = _this._tiles[hash]).push.apply(_a, nodeData);
+            delete _this._cachingTiles$[hash];
+        }), operators_1.finalize(function () {
+            if (hash in _this._cachingTiles$) {
+                delete _this._cachingTiles$[hash];
+            }
+        }), operators_1.publish(), operators_1.refCount());
+        return this._cachingTiles$[hash];
+    };
+    SpatialDataCache.prototype.isCachingClusterReconstructions = function (hash) {
+        return hash in this._cachingClusterReconstructions$;
+    };
+    SpatialDataCache.prototype.isCachingTile = function (hash) {
+        return hash in this._cachingTiles$;
+    };
+    SpatialDataCache.prototype.hasClusterReconstructions = function (hash) {
+        if (hash in this._cachingClusterReconstructions$ ||
+            !(hash in this._tileClusters)) {
+            return false;
+        }
+        for (var _i = 0, _a = this._tileClusters[hash]; _i < _a.length; _i++) {
+            var key = _a[_i];
+            if (!(key in this._clusterReconstructions)) {
+                return false;
+            }
+        }
+        return true;
+    };
+    SpatialDataCache.prototype.hasTile = function (hash) {
+        return !(hash in this._cachingTiles$) && hash in this._tiles;
+    };
+    SpatialDataCache.prototype.getClusterReconstructions = function (hash) {
+        var _this = this;
+        return hash in this._tileClusters ?
+            this._tileClusters[hash]
+                .map(function (key) {
+                return _this._clusterReconstructions[key];
+            })
+                .filter(function (reconstruction) {
+                return !!reconstruction;
+            }) :
+            [];
+    };
+    SpatialDataCache.prototype.getTile = function (hash) {
+        return hash in this._tiles ? this._tiles[hash] : [];
+    };
+    SpatialDataCache.prototype.uncache = function (keepHashes) {
+        for (var _i = 0, _a = Object.keys(this._cacheRequests); _i < _a.length; _i++) {
+            var hash = _a[_i];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            for (var _b = 0, _c = this._cacheRequests[hash]; _b < _c.length; _b++) {
+                var request = _c[_b];
+                request.abort();
+            }
+            delete this._cacheRequests[hash];
+        }
+        for (var _d = 0, _e = Object.keys(this._tileClusters); _d < _e.length; _d++) {
+            var hash = _e[_d];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            for (var _f = 0, _g = this._tileClusters[hash]; _f < _g.length; _f++) {
+                var key = _g[_f];
+                if (!(key in this._clusterReconstructionTiles)) {
+                    continue;
+                }
+                var index = this._clusterReconstructionTiles[key].indexOf(hash);
+                if (index === -1) {
+                    continue;
+                }
+                this._clusterReconstructionTiles[key].splice(index, 1);
+                if (this._clusterReconstructionTiles[key].length > 0) {
+                    continue;
+                }
+                delete this._clusterReconstructionTiles[key];
+                delete this._clusterReconstructions[key];
+            }
+            delete this._tileClusters[hash];
+        }
+        for (var _h = 0, _j = Object.keys(this._tiles); _h < _j.length; _h++) {
+            var hash = _j[_h];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            delete this._tiles[hash];
+        }
     };
-    /**
-     * Resizes all properties according to the width and height
-     * of the element.
-     *
-     * @param {HTMLElement} element The container element from which to extract
-     * the width and height.
-     */
-    DirectionDOMCalculator.prototype.resize = function (element) {
-        this._resize(element);
-        this._reset();
+    SpatialDataCache.prototype._createNodeData = function (node) {
+        return {
+            alt: node.alt,
+            cameraProjection: node.cameraProjection,
+            clusterKey: node.clusterKey,
+            focal: node.focal,
+            gpano: node.gpano,
+            height: node.height,
+            k1: node.ck1,
+            k2: node.ck2,
+            key: node.key,
+            lat: node.latLon.lat,
+            lon: node.latLon.lon,
+            mergeCC: node.mergeCC,
+            orientation: node.orientation,
+            originalLat: node.originalLatLon.lat,
+            originalLon: node.originalLatLon.lon,
+            rotation: [node.rotation[0], node.rotation[1], node.rotation[2]],
+            scale: node.scale,
+            sequenceKey: node.sequenceKey,
+            width: node.width,
+        };
     };
-    /**
-     * Calculates the coordinates on the unit circle for an angle.
-     *
-     * @param {number} angle Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle.
-     */
-    DirectionDOMCalculator.prototype.angleToCoordinates = function (angle) {
-        return [Math.cos(angle), Math.sin(angle)];
+    SpatialDataCache.prototype._getClusterReconstruction = function (key) {
+        return this._clusterReconstructions[key];
+    };
+    SpatialDataCache.prototype._getClusterReconstruction$ = function (key, requests) {
+        return rxjs_1.Observable.create(function (subscriber) {
+            var xhr = new XMLHttpRequest();
+            xhr.open("GET", Utils_1.Urls.clusterReconstruction(key), true);
+            xhr.responseType = "arraybuffer";
+            xhr.timeout = 15000;
+            xhr.onload = function () {
+                if (!xhr.response) {
+                    subscriber.error(new Error("Cluster reconstruction retreival failed (" + key + ")"));
+                }
+                else {
+                    var inflated = pako.inflate(xhr.response, { to: "string" });
+                    var reconstructions = JSON.parse(inflated);
+                    if (reconstructions.length < 1) {
+                        subscriber.error(new Error("No cluster reconstruction exists (" + key + ")"));
+                    }
+                    var reconstruction = reconstructions[0];
+                    reconstruction.key = key;
+                    subscriber.next(reconstruction);
+                    subscriber.complete();
+                }
+            };
+            xhr.onerror = function () {
+                subscriber.error(new Error("Failed to get cluster reconstruction (" + key + ")"));
+            };
+            xhr.ontimeout = function () {
+                subscriber.error(new Error("Cluster reconstruction request timed out (" + key + ")"));
+            };
+            xhr.onabort = function () {
+                subscriber.error(new Error_1.AbortMapillaryError("Cluster reconstruction request was aborted (" + key + ")"));
+            };
+            requests.push(xhr);
+            xhr.send(null);
+        });
     };
-    /**
-     * Calculates the coordinates on the unit circle for the
-     * relative angle between the first and second angle.
-     *
-     * @param {number} first Angle in radians.
-     * @param {number} second Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle
-     * for the relative angle between the first and second angle.
-     */
-    DirectionDOMCalculator.prototype.relativeAngleToCoordiantes = function (first, second) {
-        var relativeAngle = this._spatial.wrapAngle(first - second);
-        return this.angleToCoordinates(relativeAngle);
+    SpatialDataCache.prototype._hasClusterReconstruction = function (key) {
+        return key in this._clusterReconstructions;
     };
-    DirectionDOMCalculator.prototype._configure = function (configuration) {
-        this._minWidth = configuration.minWidth;
-        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);
+    return SpatialDataCache;
+}());
+exports.SpatialDataCache = SpatialDataCache;
+exports.default = SpatialDataCache;
+
+},{"../../Error":293,"../../Utils":301,"latlon-geohash":21,"pako":23,"rxjs":43,"rxjs/operators":241}],363:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    DirectionDOMCalculator.prototype._resize = function (element) {
-        this._elementWidth = element.offsetWidth;
-        this._elementHeight = element.offsetHeight;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpatialDataComponent = void 0;
+var geohash = require("latlon-geohash");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var Render_1 = require("../../Render");
+var PlayService_1 = require("../../viewer/PlayService");
+var State_1 = require("../../state/State");
+var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
+var SpatialDataComponent = /** @class */ (function (_super) {
+    __extends(SpatialDataComponent, _super);
+    function SpatialDataComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._cache = new Component_1.SpatialDataCache(navigator.graphService);
+        _this._scene = new Component_1.SpatialDataScene(_this._getDefaultConfiguration());
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._geoCoords = new Geo_1.GeoCoords();
+        return _this;
+    }
+    SpatialDataComponent.prototype._activate = function () {
+        var _this = this;
+        this._earthControlsSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.earthControls;
+        }), operators_1.distinctUntilChanged(), operators_1.withLatestFrom(this._navigator.stateService.state$))
+            .subscribe(function (_a) {
+            var earth = _a[0], state = _a[1];
+            if (earth && state !== State_1.default.Earth) {
+                _this._navigator.stateService.earth();
+            }
+            else if (!earth && state === State_1.default.Earth) {
+                _this._navigator.stateService.traverse();
+            }
+        });
+        var direction$ = this._container.renderService.bearing$.pipe(operators_1.map(function (bearing) {
+            var direction = "";
+            if (bearing > 292.5 || bearing <= 67.5) {
+                direction += "n";
+            }
+            if (bearing > 112.5 && bearing <= 247.5) {
+                direction += "s";
+            }
+            if (bearing > 22.5 && bearing <= 157.5) {
+                direction += "e";
+            }
+            if (bearing > 202.5 && bearing <= 337.5) {
+                direction += "w";
+            }
+            return direction;
+        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        var hash$ = this._navigator.stateService.reference$.pipe(operators_1.tap(function () {
+            _this._scene.uncache();
+        }), operators_1.switchMap(function () {
+            return _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
+                return geohash.encode(node.latLon.lat, node.latLon.lon, 8);
+            }), operators_1.distinctUntilChanged());
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var sequencePlay$ = rxjs_1.combineLatest(this._navigator.playService.playing$, this._navigator.playService.speed$).pipe(operators_1.map(function (_a) {
+            var playing = _a[0], speed = _a[1];
+            return playing && speed > PlayService_1.default.sequenceSpeed;
+        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        var hashes$ = rxjs_1.combineLatest(this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
+            return state === State_1.default.Earth;
+        }), operators_1.distinctUntilChanged()), hash$, sequencePlay$, direction$).pipe(operators_1.distinctUntilChanged(function (_a, _b) {
+            var e1 = _a[0], h1 = _a[1], s1 = _a[2], d1 = _a[3];
+            var e2 = _b[0], h2 = _b[1], s2 = _b[2], d2 = _b[3];
+            if (e1 !== e2) {
+                return false;
+            }
+            if (e1) {
+                return h1 === h2 && s1 === s2;
+            }
+            return h1 === h2 && s1 === s2 && d1 === d2;
+        }), operators_1.concatMap(function (_a) {
+            var earth = _a[0], hash = _a[1], sequencePlay = _a[2], direction = _a[3];
+            if (earth) {
+                return sequencePlay ?
+                    rxjs_1.of([hash]) :
+                    rxjs_1.of(_this._adjacentComponent(hash, 4));
+            }
+            return sequencePlay ?
+                rxjs_1.of([hash, geohash.neighbours(hash)[direction]]) :
+                rxjs_1.of(_this._computeTiles(hash, direction));
+        }), operators_1.publish(), operators_1.refCount());
+        var tile$ = hashes$.pipe(operators_1.switchMap(function (hashes) {
+            return rxjs_1.from(hashes).pipe(operators_1.mergeMap(function (h) {
+                var t$ = _this._cache.hasTile(h) ?
+                    rxjs_1.of(_this._cache.getTile(h)) :
+                    _this._cache.cacheTile$(h);
+                return rxjs_1.combineLatest(rxjs_1.of(h), t$);
+            }, 6));
+        }), operators_1.publish(), operators_1.refCount());
+        this._addTileSubscription = tile$.pipe(operators_1.withLatestFrom(this._navigator.stateService.reference$))
+            .subscribe(function (_a) {
+            var hash = _a[0][0], reference = _a[1];
+            if (_this._scene.hasTile(hash)) {
+                return;
+            }
+            _this._scene.addTile(_this._computeTileBBox(hash, reference), hash);
+        });
+        this._addNodeSubscription = tile$.pipe(operators_1.withLatestFrom(this._navigator.stateService.reference$))
+            .subscribe(function (_a) {
+            var _b = _a[0], hash = _b[0], datas = _b[1], reference = _a[1];
+            for (var _i = 0, datas_1 = datas; _i < datas_1.length; _i++) {
+                var data = datas_1[_i];
+                if (_this._scene.hasNode(data.key, hash)) {
+                    continue;
+                }
+                _this._scene.addNode(data, _this._createTransform(data, reference), _this._computeOriginalPosition(data, reference), hash);
+            }
+        });
+        this._addReconstructionSubscription = tile$.pipe(operators_1.concatMap(function (_a) {
+            var hash = _a[0];
+            var reconstructions$;
+            if (_this._cache.hasClusterReconstructions(hash)) {
+                reconstructions$ = rxjs_1.from(_this._cache.getClusterReconstructions(hash));
+            }
+            else if (_this._cache.isCachingClusterReconstructions(hash)) {
+                reconstructions$ = _this._cache.cacheClusterReconstructions$(hash).pipe(operators_1.last(null, {}), operators_1.switchMap(function () {
+                    return rxjs_1.from(_this._cache.getClusterReconstructions(hash));
+                }));
+            }
+            else if (_this._cache.hasTile(hash)) {
+                reconstructions$ = _this._cache.cacheClusterReconstructions$(hash);
+            }
+            else {
+                reconstructions$ = rxjs_1.empty();
+            }
+            return rxjs_1.combineLatest(rxjs_1.of(hash), reconstructions$);
+        }), operators_1.withLatestFrom(this._navigator.stateService.reference$))
+            .subscribe(function (_a) {
+            var _b = _a[0], hash = _b[0], reconstruction = _b[1], reference = _a[1];
+            if (_this._scene.hasClusterReconstruction(reconstruction.key, hash)) {
+                return;
+            }
+            _this._scene.addClusterReconstruction(reconstruction, _this._computeTranslation(reconstruction, reference), hash);
+        });
+        this._cameraVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.camerasVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setCameraVisibility(visible);
+        });
+        this._pointVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.pointsVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setPointVisibility(visible);
+        });
+        this._positionVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.positionsVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setPositionVisibility(visible);
+        });
+        this._tileVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.tilesVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setTileVisibility(visible);
+        });
+        this._ccToModeSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.connectedComponents === true ?
+                CameraVisualizationMode_1.default.ConnectedComponent :
+                CameraVisualizationMode_1.default.Default;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (mode) {
+            _this.configure({ cameraVisualizationMode: mode });
+        });
+        this._cameraVisualizationModeSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.cameraVisualizationMode;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (mode) {
+            _this._scene.setCameraVisualizationMode(mode);
+        });
+        this._uncacheSubscription = hash$
+            .subscribe(function (hash) {
+            var keepHashes = _this._adjacentComponent(hash, 4);
+            _this._scene.uncache(keepHashes);
+            _this._cache.uncache(keepHashes);
+        });
+        this._moveSubscription = this._navigator.playService.playing$.pipe(operators_1.switchMap(function (playing) {
+            return playing ?
+                rxjs_1.empty() :
+                _this._container.mouseService.dblClick$;
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$), operators_1.switchMap(function (_a) {
+            var event = _a[0], render = _a[1];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
+            var key = _this._scene.intersectObjects(viewport, render.perspective);
+            return !!key ?
+                _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function () {
+                    return rxjs_1.empty();
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe();
+        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            var scene = _this._scene;
+            return {
+                name: _this._name,
+                render: {
+                    frameId: frame.id,
+                    needsRender: scene.needsRender,
+                    render: scene.render.bind(scene),
+                    stage: Render_1.GLRenderStage.Foreground,
+                },
+            };
+        }))
+            .subscribe(this._container.glRenderer.render$);
     };
-    DirectionDOMCalculator.prototype._reset = function () {
-        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);
-        this._containerHeight = this._getContainerHeight(this.containerWidth);
-        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);
-        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);
-        this._outerRadius = this._getOuterRadius(this._containerHeight);
-        this._innerRadius = this._getInnerRadius(this._containerHeight);
-        this._shadowOffset = 3;
-        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);
-        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);
-        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));
-        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);
-        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));
-        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);
-        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);
-        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);
+    SpatialDataComponent.prototype._deactivate = function () {
+        var _this = this;
+        this._cache.uncache();
+        this._scene.uncache();
+        this._addNodeSubscription.unsubscribe();
+        this._addReconstructionSubscription.unsubscribe();
+        this._addTileSubscription.unsubscribe();
+        this._cameraVisibilitySubscription.unsubscribe();
+        this._earthControlsSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._pointVisibilitySubscription.unsubscribe();
+        this._positionVisibilitySubscription.unsubscribe();
+        this._renderSubscription.unsubscribe();
+        this._tileVisibilitySubscription.unsubscribe();
+        this._uncacheSubscription.unsubscribe();
+        this._cameraVisualizationModeSubscription.unsubscribe();
+        this._ccToModeSubscription.unsubscribe();
+        this._navigator.stateService.state$.pipe(operators_1.first())
+            .subscribe(function (state) {
+            if (state === State_1.default.Earth) {
+                _this._navigator.stateService.traverse();
+            }
+        });
     };
-    DirectionDOMCalculator.prototype._getContainerWidth = function (elementWidth, elementHeight) {
-        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        coeff = 0.04 * Math.round(25 * coeff);
-        return this._minWidth + coeff * (this._maxWidth - this._minWidth);
+    SpatialDataComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            cameraVisualizationMode: CameraVisualizationMode_1.default.Default,
+            camerasVisible: false,
+            connectedComponents: false,
+            pointsVisible: true,
+            positionsVisible: false,
+            tilesVisible: false,
+        };
     };
-    DirectionDOMCalculator.prototype._getContainerHeight = function (containerWidth) {
-        return 0.77 * containerWidth;
+    SpatialDataComponent.prototype._adjacentComponent = function (hash, depth) {
+        var hashSet = new Set();
+        hashSet.add(hash);
+        this._adjacentComponentRecursive(hashSet, [hash], 0, depth);
+        return this._setToArray(hashSet);
     };
-    DirectionDOMCalculator.prototype._getStepCircleDiameter = function (containerHeight) {
-        return 0.34 * containerHeight;
+    SpatialDataComponent.prototype._adjacentComponentRecursive = function (hashSet, currentHashes, currentDepth, maxDepth) {
+        if (currentDepth === maxDepth) {
+            return;
+        }
+        var neighbours = [];
+        for (var _i = 0, currentHashes_1 = currentHashes; _i < currentHashes_1.length; _i++) {
+            var hash = currentHashes_1[_i];
+            var hashNeighbours = geohash.neighbours(hash);
+            for (var direction in hashNeighbours) {
+                if (!hashNeighbours.hasOwnProperty(direction)) {
+                    continue;
+                }
+                neighbours.push(hashNeighbours[direction]);
+            }
+        }
+        var newHashes = [];
+        for (var _a = 0, neighbours_1 = neighbours; _a < neighbours_1.length; _a++) {
+            var neighbour = neighbours_1[_a];
+            if (!hashSet.has(neighbour)) {
+                hashSet.add(neighbour);
+                newHashes.push(neighbour);
+            }
+        }
+        this._adjacentComponentRecursive(hashSet, newHashes, currentDepth + 1, maxDepth);
     };
-    DirectionDOMCalculator.prototype._getTurnCircleDiameter = function (containerHeight) {
-        return 0.3 * containerHeight;
+    SpatialDataComponent.prototype._computeOriginalPosition = function (data, reference) {
+        return this._geoCoords.geodeticToEnu(data.originalLat, data.originalLon, data.alt, reference.lat, reference.lon, reference.alt);
     };
-    DirectionDOMCalculator.prototype._getOuterRadius = function (containerHeight) {
-        return 0.31 * containerHeight;
+    SpatialDataComponent.prototype._computeTileBBox = function (hash, reference) {
+        var bounds = geohash.bounds(hash);
+        var sw = this._geoCoords.geodeticToEnu(bounds.sw.lat, bounds.sw.lon, 0, reference.lat, reference.lon, reference.alt);
+        var ne = this._geoCoords.geodeticToEnu(bounds.ne.lat, bounds.ne.lon, 0, reference.lat, reference.lon, reference.alt);
+        return [sw, ne];
     };
-    DirectionDOMCalculator.prototype._getInnerRadius = function (containerHeight) {
-        return 0.125 * containerHeight;
+    SpatialDataComponent.prototype._createTransform = function (data, reference) {
+        var translation = Geo_1.Geo.computeTranslation({ alt: data.alt, lat: data.lat, lon: data.lon }, data.rotation, reference);
+        var transform = new Geo_1.Transform(data.orientation, data.width, data.height, data.focal, data.scale, data.gpano, data.rotation, translation, undefined, undefined, data.k1, data.k2, data.cameraProjection);
+        return transform;
     };
-    DirectionDOMCalculator.prototype._numberToCssPixels = function (value) {
-        return value + "px";
+    SpatialDataComponent.prototype._computeTiles = function (hash, direction) {
+        var hashSet = new Set();
+        var directions = ["n", "ne", "e", "se", "s", "sw", "w", "nw"];
+        this._computeTilesRecursive(hashSet, hash, direction, directions, 0, 2);
+        return this._setToArray(hashSet);
     };
-    DirectionDOMCalculator.prototype._getMaxWidth = function (value, minWidth) {
-        return value > minWidth ? value : minWidth;
+    SpatialDataComponent.prototype._computeTilesRecursive = function (hashSet, currentHash, direction, directions, currentDepth, maxDepth) {
+        hashSet.add(currentHash);
+        if (currentDepth === maxDepth) {
+            return;
+        }
+        var neighbours = geohash.neighbours(currentHash);
+        var directionIndex = directions.indexOf(direction);
+        var length = directions.length;
+        var directionNeighbours = [
+            neighbours[directions[this._modulo((directionIndex - 1), length)]],
+            neighbours[direction],
+            neighbours[directions[this._modulo((directionIndex + 1), length)]],
+        ];
+        for (var _i = 0, directionNeighbours_1 = directionNeighbours; _i < directionNeighbours_1.length; _i++) {
+            var directionNeighbour = directionNeighbours_1[_i];
+            this._computeTilesRecursive(hashSet, directionNeighbour, direction, directions, currentDepth + 1, maxDepth);
+        }
     };
-    return DirectionDOMCalculator;
-}());
-exports.DirectionDOMCalculator = DirectionDOMCalculator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DirectionDOMCalculator;
+    SpatialDataComponent.prototype._computeTranslation = function (reconstruction, reference) {
+        return this._geoCoords.geodeticToEnu(reconstruction.reference_lla.latitude, reconstruction.reference_lla.longitude, reconstruction.reference_lla.altitude, reference.lat, reference.lon, reference.alt);
+    };
+    SpatialDataComponent.prototype._modulo = function (a, n) {
+        return ((a % n) + n) % n;
+    };
+    SpatialDataComponent.prototype._setToArray = function (s) {
+        var a = [];
+        s.forEach(function (value) {
+            a.push(value);
+        });
+        return a;
+    };
+    SpatialDataComponent.componentName = "spatialData";
+    return SpatialDataComponent;
+}(Component_1.Component));
+exports.SpatialDataComponent = SpatialDataComponent;
+Component_1.ComponentService.register(SpatialDataComponent);
+exports.default = SpatialDataComponent;
 
-},{"../../Geo":210}],235:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../state/State":449,"../../viewer/PlayService":481,"./CameraVisualizationMode":360,"latlon-geohash":21,"rxjs":43,"rxjs/operators":241}],364:[function(require,module,exports){
 "use strict";
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMRenderer
- * @classdesc DOM renderer for direction arrows.
- */
-var DirectionDOMRenderer = (function () {
-    function DirectionDOMRenderer(configuration, element) {
-        this._isEdge = false;
-        this._spatial = new Geo_1.Spatial();
-        this._calculator = new Component_1.DirectionDOMCalculator(configuration, element);
-        this._node = null;
-        this._rotation = { phi: 0, theta: 0 };
-        this._epsilon = 0.5 * Math.PI / 180;
-        this._highlightKey = null;
-        this._distinguishSequence = false;
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpatialDataScene = void 0;
+var THREE = require("three");
+var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
+var SpatialDataScene = /** @class */ (function () {
+    function SpatialDataScene(configuration, scene, raycaster) {
+        this._scene = !!scene ? scene : new THREE.Scene();
+        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(undefined, undefined, 0.8);
+        this._cameraColors = {};
         this._needsRender = false;
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        this._stepDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-        ];
-        this._turnDirections = [
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
-        this._turnNames = {};
-        this._turnNames[Edge_1.EdgeDirection.TurnLeft] = "TurnLeft";
-        this._turnNames[Edge_1.EdgeDirection.TurnRight] = "TurnRight";
-        this._turnNames[Edge_1.EdgeDirection.TurnU] = "TurnAround";
-        // detects IE 8-11, then Edge 20+.
-        var isIE = !!document.documentMode;
-        this._isEdge = !isIE && !!window.StyleMedia;
-    }
-    Object.defineProperty(DirectionDOMRenderer.prototype, "needsRender", {
-        /**
-         * Get needs render.
-         *
-         * @returns {boolean} Value indicating whether render should be called.
-         */
+        this._interactiveObjects = [];
+        this._nodes = {};
+        this._tiles = {};
+        this._tileClusterReconstructions = {};
+        this._clusterReconstructions = {};
+        this._cameraVisualizationMode = !!configuration.cameraVisualizationMode ?
+            configuration.cameraVisualizationMode :
+            CameraVisualizationMode_1.default.Default;
+        if (this._cameraVisualizationMode === CameraVisualizationMode_1.default.Default &&
+            configuration.connectedComponents === true) {
+            this._cameraVisualizationMode = CameraVisualizationMode_1.default.ConnectedComponent;
+        }
+        this._camerasVisible = configuration.camerasVisible;
+        this._pointsVisible = configuration.pointsVisible;
+        this._positionsVisible = configuration.positionsVisible;
+        this._tilesVisible = configuration.tilesVisible;
+    }
+    Object.defineProperty(SpatialDataScene.prototype, "needsRender", {
         get: function () {
             return this._needsRender;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Renders virtual DOM elements.
-     *
-     * @description Calling render resets the needs render property.
-     */
-    DirectionDOMRenderer.prototype.render = function (navigator) {
-        this._needsRender = false;
-        var rotation = this._rotation;
-        var steps = [];
-        var turns = [];
-        if (this._node.pano) {
-            steps = steps.concat(this._createPanoArrows(navigator, rotation));
+    SpatialDataScene.prototype.addClusterReconstruction = function (reconstruction, translation, hash) {
+        if (this.hasClusterReconstruction(reconstruction.key, hash)) {
+            return;
+        }
+        var key = reconstruction.key;
+        if (!(key in this._clusterReconstructions)) {
+            this._clusterReconstructions[key] = {
+                points: new THREE.Object3D(),
+                tiles: [],
+            };
+            this._clusterReconstructions[key].points.visible = this._pointsVisible;
+            this._clusterReconstructions[key].points.add(this._createClusterPoints(reconstruction, translation));
+            this._scene.add(this._clusterReconstructions[key].points);
+        }
+        if (this._clusterReconstructions[key].tiles.indexOf(hash) === -1) {
+            this._clusterReconstructions[key].tiles.push(hash);
+        }
+        if (!(hash in this._tileClusterReconstructions)) {
+            this._tileClusterReconstructions[hash] = {
+                keys: [],
+            };
+        }
+        if (this._tileClusterReconstructions[hash].keys.indexOf(key) === -1) {
+            this._tileClusterReconstructions[hash].keys.push(key);
+        }
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.addNode = function (data, transform, originalPosition, hash) {
+        var key = data.key;
+        var clusterKey = data.clusterKey;
+        var sequenceKey = data.sequenceKey;
+        var connectedComponent = !!data.mergeCC ? data.mergeCC.toString() : "";
+        if (this.hasNode(key, hash)) {
+            return;
+        }
+        if (!(hash in this._nodes)) {
+            this._nodes[hash] = {
+                cameraKeys: {},
+                cameras: new THREE.Object3D(),
+                clusters: {},
+                connectedComponents: {},
+                keys: [],
+                positions: new THREE.Object3D(),
+                sequences: {},
+            };
+            this._nodes[hash].cameras.visible = this._camerasVisible;
+            this._nodes[hash].positions.visible = this._positionsVisible;
+            this._scene.add(this._nodes[hash].cameras, this._nodes[hash].positions);
+        }
+        if (!(connectedComponent in this._nodes[hash].connectedComponents)) {
+            this._nodes[hash].connectedComponents[connectedComponent] = [];
+        }
+        if (!(clusterKey in this._nodes[hash].clusters)) {
+            this._nodes[hash].clusters[clusterKey] = [];
+        }
+        if (!(sequenceKey in this._nodes[hash].sequences)) {
+            this._nodes[hash].sequences[sequenceKey] = [];
+        }
+        var camera = this._createCamera(transform);
+        this._nodes[hash].cameras.add(camera);
+        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
+            var child = _a[_i];
+            this._nodes[hash].cameraKeys[child.uuid] = key;
+            this._interactiveObjects.push(child);
+        }
+        this._nodes[hash].connectedComponents[connectedComponent].push(camera);
+        this._nodes[hash].clusters[clusterKey].push(camera);
+        this._nodes[hash].sequences[sequenceKey].push(camera);
+        var id = this._getId(clusterKey, connectedComponent, sequenceKey, this._cameraVisualizationMode);
+        var color = this._getColor(id, this._cameraVisualizationMode);
+        this._setCameraColor(color, camera);
+        this._nodes[hash].positions.add(this._createPosition(transform, originalPosition));
+        this._nodes[hash].keys.push(key);
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.addTile = function (tileBBox, hash) {
+        if (this.hasTile(hash)) {
+            return;
+        }
+        var sw = tileBBox[0];
+        var ne = tileBBox[1];
+        var geometry = new THREE.Geometry();
+        geometry.vertices.push(new THREE.Vector3().fromArray(sw), new THREE.Vector3(sw[0], ne[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(ne), new THREE.Vector3(ne[0], sw[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(sw));
+        var tile = new THREE.Line(geometry, new THREE.LineBasicMaterial());
+        this._tiles[hash] = new THREE.Object3D();
+        this._tiles[hash].visible = this._tilesVisible;
+        this._tiles[hash].add(tile);
+        this._scene.add(this._tiles[hash]);
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.uncache = function (keepHashes) {
+        for (var _i = 0, _a = Object.keys(this._tileClusterReconstructions); _i < _a.length; _i++) {
+            var hash = _a[_i];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            this._disposeReconstruction(hash);
+        }
+        for (var _b = 0, _c = Object.keys(this._nodes); _b < _c.length; _b++) {
+            var hash = _c[_b];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            this._disposeNodes(hash);
+        }
+        for (var _d = 0, _e = Object.keys(this._tiles); _d < _e.length; _d++) {
+            var hash = _e[_d];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            this._disposeTile(hash);
+        }
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.hasClusterReconstruction = function (key, hash) {
+        return key in this._clusterReconstructions &&
+            this._clusterReconstructions[key].tiles.indexOf(hash) !== -1;
+    };
+    SpatialDataScene.prototype.hasTile = function (hash) {
+        return hash in this._tiles;
+    };
+    SpatialDataScene.prototype.hasNode = function (key, hash) {
+        return hash in this._nodes && this._nodes[hash].keys.indexOf(key) !== -1;
+    };
+    SpatialDataScene.prototype.intersectObjects = function (_a, camera) {
+        var viewportX = _a[0], viewportY = _a[1];
+        if (!this._camerasVisible) {
+            return null;
+        }
+        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
+        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
+        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
+            var intersect = intersects_1[_i];
+            for (var hash in this._nodes) {
+                if (!this._nodes.hasOwnProperty(hash)) {
+                    continue;
+                }
+                if (intersect.object.uuid in this._nodes[hash].cameraKeys) {
+                    return this._nodes[hash].cameraKeys[intersect.object.uuid];
+                }
+            }
         }
-        else {
-            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));
-            steps = steps.concat(this._createStepArrows(navigator, rotation));
-            turns = turns.concat(this._createTurnArrows(navigator));
+        return null;
+    };
+    SpatialDataScene.prototype.setCameraVisibility = function (visible) {
+        if (visible === this._camerasVisible) {
+            return;
         }
-        return this._getContainer(steps, turns, rotation);
+        for (var hash in this._nodes) {
+            if (!this._nodes.hasOwnProperty(hash)) {
+                continue;
+            }
+            this._nodes[hash].cameras.visible = visible;
+        }
+        this._camerasVisible = visible;
+        this._needsRender = true;
     };
-    DirectionDOMRenderer.prototype.setEdges = function (edgeStatus, sequence) {
-        this._setEdges(edgeStatus, sequence);
-        this._setNeedsRender();
+    SpatialDataScene.prototype.setPointVisibility = function (visible) {
+        if (visible === this._pointsVisible) {
+            return;
+        }
+        for (var key in this._clusterReconstructions) {
+            if (!this._clusterReconstructions.hasOwnProperty(key)) {
+                continue;
+            }
+            this._clusterReconstructions[key].points.visible = visible;
+        }
+        this._pointsVisible = visible;
+        this._needsRender = true;
     };
-    /**
-     * Set node for which to show edges.
-     *
-     * @param {Node} node
-     */
-    DirectionDOMRenderer.prototype.setNode = function (node) {
-        this._node = node;
-        this._clearEdges();
-        this._setNeedsRender();
+    SpatialDataScene.prototype.setPositionVisibility = function (visible) {
+        if (visible === this._positionsVisible) {
+            return;
+        }
+        for (var hash in this._nodes) {
+            if (!this._nodes.hasOwnProperty(hash)) {
+                continue;
+            }
+            this._nodes[hash].positions.visible = visible;
+        }
+        this._positionsVisible = visible;
+        this._needsRender = true;
     };
-    /**
-     * Set the render camera to use for calculating rotations.
-     *
-     * @param {RenderCamera} renderCamera
-     */
-    DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) {
-        var camera = renderCamera.camera;
-        var direction = this._directionFromCamera(camera);
-        var rotation = this._getRotation(direction, camera.up);
-        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {
+    SpatialDataScene.prototype.setTileVisibility = function (visible) {
+        if (visible === this._tilesVisible) {
             return;
         }
-        this._rotation = rotation;
-        this._setNeedsRender();
+        for (var hash in this._tiles) {
+            if (!this._tiles.hasOwnProperty(hash)) {
+                continue;
+            }
+            this._tiles[hash].visible = visible;
+        }
+        this._tilesVisible = visible;
+        this._needsRender = true;
     };
-    /**
-     * Set configuration values.
-     *
-     * @param {IDirectionConfiguration} configuration
-     */
-    DirectionDOMRenderer.prototype.setConfiguration = function (configuration) {
-        var needsRender = false;
-        if (this._highlightKey !== configuration.highlightKey ||
-            this._distinguishSequence !== configuration.distinguishSequence) {
-            this._highlightKey = configuration.highlightKey;
-            this._distinguishSequence = configuration.distinguishSequence;
-            needsRender = true;
+    SpatialDataScene.prototype.setCameraVisualizationMode = function (mode) {
+        if (mode === this._cameraVisualizationMode) {
+            return;
         }
-        if (this._calculator.minWidth !== configuration.minWidth ||
-            this._calculator.maxWidth !== configuration.maxWidth) {
-            this._calculator.configure(configuration);
-            needsRender = true;
+        for (var hash in this._nodes) {
+            if (!this._nodes.hasOwnProperty(hash)) {
+                continue;
+            }
+            var cameras = undefined;
+            if (mode === CameraVisualizationMode_1.default.Cluster) {
+                cameras = this._nodes[hash].clusters;
+            }
+            else if (mode === CameraVisualizationMode_1.default.ConnectedComponent) {
+                cameras = this._nodes[hash].connectedComponents;
+            }
+            else if (mode === CameraVisualizationMode_1.default.Sequence) {
+                cameras = this._nodes[hash].sequences;
+            }
+            else {
+                for (var _i = 0, _a = this._nodes[hash].cameras.children; _i < _a.length; _i++) {
+                    var child = _a[_i];
+                    var color = this._getColor("", mode);
+                    this._setCameraColor(color, child);
+                }
+                continue;
+            }
+            for (var id in cameras) {
+                if (!cameras.hasOwnProperty(id)) {
+                    continue;
+                }
+                var color = this._getColor(id, mode);
+                for (var _b = 0, _c = cameras[id]; _b < _c.length; _b++) {
+                    var camera = _c[_b];
+                    this._setCameraColor(color, camera);
+                }
+            }
         }
-        if (needsRender) {
-            this._setNeedsRender();
+        this._cameraVisualizationMode = mode;
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.render = function (perspectiveCamera, renderer) {
+        renderer.render(this._scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    SpatialDataScene.prototype._arrayToFloatArray = function (a, columns) {
+        var n = a.length;
+        var f = new Float32Array(n * columns);
+        for (var i = 0; i < n; i++) {
+            var item = a[i];
+            var index = 3 * i;
+            f[index + 0] = item[0];
+            f[index + 1] = item[1];
+            f[index + 2] = item[2];
+        }
+        return f;
+    };
+    SpatialDataScene.prototype._createAxis = function (transform) {
+        var north = transform.unprojectBasic([0.5, 0], 0.22);
+        var south = transform.unprojectBasic([0.5, 1], 0.16);
+        var axis = new THREE.BufferGeometry();
+        axis.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray([north, south], 3), 3));
+        return new THREE.Line(axis, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createCamera = function (transform) {
+        return !!transform.gpano ?
+            this._createPanoCamera(transform) :
+            this._createPrespectiveCamera(transform);
+    };
+    SpatialDataScene.prototype._createDiagonals = function (transform, depth) {
+        var origin = transform.unprojectBasic([0, 0], 0, true);
+        var topLeft = transform.unprojectBasic([0, 0], depth, true);
+        var topRight = transform.unprojectBasic([1, 0], depth, true);
+        var bottomRight = transform.unprojectBasic([1, 1], depth, true);
+        var bottomLeft = transform.unprojectBasic([0, 1], depth, true);
+        var vertices = [
+            origin, topLeft,
+            origin, topRight,
+            origin, bottomRight,
+            origin, bottomLeft,
+        ];
+        var diagonals = new THREE.BufferGeometry();
+        diagonals.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
+        return new THREE.LineSegments(diagonals, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createFrame = function (transform, depth) {
+        var vertices2d = [];
+        vertices2d.push.apply(vertices2d, this._subsample([0, 1], [0, 0], 20));
+        vertices2d.push.apply(vertices2d, this._subsample([0, 0], [1, 0], 20));
+        vertices2d.push.apply(vertices2d, this._subsample([1, 0], [1, 1], 20));
+        var vertices3d = vertices2d
+            .map(function (basic) {
+            return transform.unprojectBasic(basic, depth, true);
+        });
+        var frame = new THREE.BufferGeometry();
+        frame.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices3d, 3), 3));
+        return new THREE.Line(frame, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createLatitude = function (basicY, numVertices, transform) {
+        var positions = new Float32Array((numVertices + 1) * 3);
+        for (var i = 0; i <= numVertices; i++) {
+            var position = transform.unprojectBasic([i / numVertices, basicY], 0.16);
+            var index = 3 * i;
+            positions[index + 0] = position[0];
+            positions[index + 1] = position[1];
+            positions[index + 2] = position[2];
         }
+        var latitude = new THREE.BufferGeometry();
+        latitude.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
     };
-    /**
-     * Detect the element's width and height and resize
-     * elements accordingly.
-     *
-     * @param {HTMLElement} element Viewer container element.
-     */
-    DirectionDOMRenderer.prototype.resize = function (element) {
-        this._calculator.resize(element);
-        this._setNeedsRender();
+    SpatialDataScene.prototype._createLongitude = function (basicX, numVertices, transform) {
+        var positions = new Float32Array((numVertices + 1) * 3);
+        for (var i = 0; i <= numVertices; i++) {
+            var position = transform.unprojectBasic([basicX, i / numVertices], 0.16);
+            var index = 3 * i;
+            positions[index + 0] = position[0];
+            positions[index + 1] = position[1];
+            positions[index + 2] = position[2];
+        }
+        var latitude = new THREE.BufferGeometry();
+        latitude.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createPanoCamera = function (transform) {
+        var camera = new THREE.Object3D();
+        camera.children.push(this._createAxis(transform));
+        camera.children.push(this._createLatitude(0.5, 10, transform));
+        camera.children.push(this._createLongitude(0, 6, transform));
+        camera.children.push(this._createLongitude(0.25, 6, transform));
+        camera.children.push(this._createLongitude(0.5, 6, transform));
+        camera.children.push(this._createLongitude(0.75, 6, transform));
+        return camera;
     };
-    DirectionDOMRenderer.prototype._setNeedsRender = function () {
-        if (this._node != null) {
-            this._needsRender = true;
+    SpatialDataScene.prototype._createClusterPoints = function (reconstruction, translation) {
+        var points = Object
+            .keys(reconstruction.points)
+            .map(function (key) {
+            return reconstruction.points[key];
+        });
+        var numPoints = points.length;
+        var positions = new Float32Array(numPoints * 3);
+        var colors = new Float32Array(numPoints * 3);
+        for (var i = 0; i < numPoints; i++) {
+            var index = 3 * i;
+            var coords = points[i].coordinates;
+            var point = new THREE.Vector3(coords[0], coords[1], coords[2])
+                .add(new THREE.Vector3().fromArray(translation));
+            positions[index + 0] = point.x;
+            positions[index + 1] = point.y;
+            positions[index + 2] = point.z;
+            var color = points[i].color;
+            colors[index + 0] = color[0] / 255.0;
+            colors[index + 1] = color[1] / 255.0;
+            colors[index + 2] = color[2] / 255.0;
         }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
+        var material = new THREE.PointsMaterial({
+            size: 0.1,
+            vertexColors: true,
+        });
+        return new THREE.Points(geometry, material);
     };
-    DirectionDOMRenderer.prototype._clearEdges = function () {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
+    SpatialDataScene.prototype._createPosition = function (transform, originalPosition) {
+        var computedPosition = transform.unprojectBasic([0, 0], 0);
+        var vertices = [originalPosition, computedPosition];
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
+        return new THREE.Line(geometry, new THREE.LineBasicMaterial({ color: new THREE.Color(1, 0, 0) }));
+    };
+    SpatialDataScene.prototype._createPrespectiveCamera = function (transform) {
+        var depth = 0.2;
+        var camera = new THREE.Object3D();
+        camera.children.push(this._createDiagonals(transform, depth));
+        camera.children.push(this._createFrame(transform, depth));
+        return camera;
     };
-    DirectionDOMRenderer.prototype._setEdges = function (edgeStatus, sequence) {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            var direction = edge.data.direction;
-            if (this._stepDirections.indexOf(direction) > -1) {
-                this._stepEdges.push(edge);
-                continue;
+    SpatialDataScene.prototype._disposeCameras = function (hash) {
+        var tileCameras = this._nodes[hash].cameras;
+        for (var _i = 0, _a = tileCameras.children.slice(); _i < _a.length; _i++) {
+            var camera = _a[_i];
+            for (var _b = 0, _c = camera.children; _b < _c.length; _b++) {
+                var child = _c[_b];
+                child.geometry.dispose();
+                child.material.dispose();
+                var index = this._interactiveObjects.indexOf(child);
+                if (index !== -1) {
+                    this._interactiveObjects.splice(index, 1);
+                }
+                else {
+                    console.warn("Object does not exist (" + child.id + ") for " + hash);
+                }
             }
-            if (this._turnDirections.indexOf(direction) > -1) {
-                this._turnEdges.push(edge);
+            tileCameras.remove(camera);
+        }
+        this._scene.remove(tileCameras);
+    };
+    SpatialDataScene.prototype._disposePoints = function (hash) {
+        for (var _i = 0, _a = this._tileClusterReconstructions[hash].keys; _i < _a.length; _i++) {
+            var key = _a[_i];
+            if (!(key in this._clusterReconstructions)) {
                 continue;
             }
-            if (edge.data.direction === Edge_1.EdgeDirection.Pano) {
-                this._panoEdges.push(edge);
+            var index = this._clusterReconstructions[key].tiles.indexOf(hash);
+            if (index === -1) {
+                continue;
             }
-        }
-        if (this._distinguishSequence && sequence != null) {
-            var edges = this._panoEdges
-                .concat(this._stepEdges)
-                .concat(this._turnEdges);
-            for (var _b = 0, edges_1 = edges; _b < edges_1.length; _b++) {
-                var edge = edges_1[_b];
-                var edgeKey = edge.to;
-                for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
-                    var sequenceKey = _d[_c];
-                    if (sequenceKey === edgeKey) {
-                        this._sequenceEdgeKeys.push(edgeKey);
-                        break;
-                    }
-                }
+            this._clusterReconstructions[key].tiles.splice(index, 1);
+            if (this._clusterReconstructions[key].tiles.length > 0) {
+                continue;
             }
+            for (var _b = 0, _c = this._clusterReconstructions[key].points.children.slice(); _b < _c.length; _b++) {
+                var points = _c[_b];
+                points.geometry.dispose();
+                points.material.dispose();
+            }
+            this._scene.remove(this._clusterReconstructions[key].points);
+            delete this._clusterReconstructions[key];
+        }
+    };
+    SpatialDataScene.prototype._disposePositions = function (hash) {
+        var tilePositions = this._nodes[hash].positions;
+        for (var _i = 0, _a = tilePositions.children.slice(); _i < _a.length; _i++) {
+            var position = _a[_i];
+            position.geometry.dispose();
+            position.material.dispose();
+            tilePositions.remove(position);
+        }
+        this._scene.remove(tilePositions);
+    };
+    SpatialDataScene.prototype._disposeNodes = function (hash) {
+        this._disposeCameras(hash);
+        this._disposePositions(hash);
+        delete this._nodes[hash];
+    };
+    SpatialDataScene.prototype._disposeReconstruction = function (hash) {
+        this._disposePoints(hash);
+        delete this._tileClusterReconstructions[hash];
+    };
+    SpatialDataScene.prototype._disposeTile = function (hash) {
+        var tile = this._tiles[hash];
+        for (var _i = 0, _a = tile.children.slice(); _i < _a.length; _i++) {
+            var line = _a[_i];
+            line.geometry.dispose();
+            line.material.dispose();
+            tile.remove(line);
+        }
+        this._scene.remove(tile);
+        delete this._tiles[hash];
+    };
+    SpatialDataScene.prototype._getColor = function (id, mode) {
+        return mode !== CameraVisualizationMode_1.default.Default && id.length > 0 ?
+            this._getCameraColor(id) :
+            "#FFFFFF";
+    };
+    SpatialDataScene.prototype._getCameraColor = function (id) {
+        if (!(id in this._cameraColors)) {
+            this._cameraColors[id] = this._randomColor();
+        }
+        return this._cameraColors[id];
+    };
+    SpatialDataScene.prototype._getId = function (clusterKey, connectedComponent, sequenceKey, mode) {
+        switch (mode) {
+            case CameraVisualizationMode_1.default.Cluster:
+                return clusterKey;
+            case CameraVisualizationMode_1.default.ConnectedComponent:
+                return connectedComponent;
+            case CameraVisualizationMode_1.default.Sequence:
+                return sequenceKey;
+            default:
+                return "";
         }
     };
-    DirectionDOMRenderer.prototype._directionFromCamera = function (camera) {
-        return camera.lookat.clone().sub(camera.position);
+    SpatialDataScene.prototype._interpolate = function (a, b, alpha) {
+        return a + alpha * (b - a);
     };
-    DirectionDOMRenderer.prototype._getRotation = function (direction, up) {
-        var upProjection = direction.clone().dot(up);
-        var planeProjection = direction.clone().sub(up.clone().multiplyScalar(upProjection));
-        var phi = Math.atan2(planeProjection.y, planeProjection.x);
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
+    SpatialDataScene.prototype._randomColor = function () {
+        return "hsl(" + Math.floor(360 * Math.random()) + ", 100%, 65%)";
     };
-    DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.outerRadius, "DirectionsArrowPano"));
+    SpatialDataScene.prototype._setCameraColor = function (color, camera) {
+        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
+            var child = _a[_i];
+            child.material.color = new THREE.Color(color);
         }
-        for (var _b = 0, _c = this._stepEdges; _b < _c.length; _b++) {
-            var stepEdge = _c[_b];
-            arrows.push(this._createPanoToPerspectiveArrow(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
+    };
+    SpatialDataScene.prototype._subsample = function (p1, p2, subsamples) {
+        if (subsamples < 1) {
+            return [p1, p2];
         }
-        return arrows;
+        var samples = [];
+        for (var i = 0; i <= subsamples + 1; i++) {
+            var p = [];
+            for (var j = 0; j < 3; j++) {
+                p.push(this._interpolate(p1[j], p2[j], i / (subsamples + 1)));
+            }
+            samples.push(p);
+        }
+        return samples;
     };
-    DirectionDOMRenderer.prototype._createPanoToPerspectiveArrow = function (navigator, key, azimuth, rotation, direction) {
-        var threshold = Math.PI / 8;
-        var relativePhi = rotation.phi;
-        switch (direction) {
-            case Edge_1.EdgeDirection.StepBackward:
-                relativePhi = rotation.phi - Math.PI;
-                break;
-            case Edge_1.EdgeDirection.StepLeft:
-                relativePhi = rotation.phi + Math.PI / 2;
-                break;
-            case Edge_1.EdgeDirection.StepRight:
-                relativePhi = rotation.phi - Math.PI / 2;
-                break;
-            default:
-                break;
+    return SpatialDataScene;
+}());
+exports.SpatialDataScene = SpatialDataScene;
+exports.default = SpatialDataScene;
+
+},{"./CameraVisualizationMode":360,"three":242}],365:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],366:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var GeometryTagError_1 = require("./error/GeometryTagError");
+Object.defineProperty(exports, "GeometryTagError", { enumerable: true, get: function () { return GeometryTagError_1.GeometryTagError; } });
+var PointGeometry_1 = require("./geometry/PointGeometry");
+Object.defineProperty(exports, "PointGeometry", { enumerable: true, get: function () { return PointGeometry_1.PointGeometry; } });
+var PointsGeometry_1 = require("./geometry/PointsGeometry");
+Object.defineProperty(exports, "PointsGeometry", { enumerable: true, get: function () { return PointsGeometry_1.PointsGeometry; } });
+var RectGeometry_1 = require("./geometry/RectGeometry");
+Object.defineProperty(exports, "RectGeometry", { enumerable: true, get: function () { return RectGeometry_1.RectGeometry; } });
+var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
+Object.defineProperty(exports, "PolygonGeometry", { enumerable: true, get: function () { return PolygonGeometry_1.PolygonGeometry; } });
+var OutlineTag_1 = require("./tag/OutlineTag");
+Object.defineProperty(exports, "OutlineTag", { enumerable: true, get: function () { return OutlineTag_1.OutlineTag; } });
+var ExtremePointTag_1 = require("./tag/ExtremePointTag");
+Object.defineProperty(exports, "ExtremePointTag", { enumerable: true, get: function () { return ExtremePointTag_1.ExtremePointTag; } });
+var SpotTag_1 = require("./tag/SpotTag");
+Object.defineProperty(exports, "SpotTag", { enumerable: true, get: function () { return SpotTag_1.SpotTag; } });
+var TagDomain_1 = require("./tag/TagDomain");
+Object.defineProperty(exports, "TagDomain", { enumerable: true, get: function () { return TagDomain_1.TagDomain; } });
+var TagComponent_1 = require("./TagComponent");
+Object.defineProperty(exports, "TagComponent", { enumerable: true, get: function () { return TagComponent_1.TagComponent; } });
+var TagMode_1 = require("./TagMode");
+Object.defineProperty(exports, "TagMode", { enumerable: true, get: function () { return TagMode_1.TagMode; } });
+
+},{"./TagComponent":367,"./TagMode":370,"./error/GeometryTagError":374,"./geometry/PointGeometry":376,"./geometry/PointsGeometry":377,"./geometry/PolygonGeometry":378,"./geometry/RectGeometry":379,"./tag/ExtremePointTag":394,"./tag/OutlineTag":398,"./tag/SpotTag":401,"./tag/TagDomain":403}],367:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var when = require("when");
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var Render_1 = require("../../Render");
+/**
+ * @class TagComponent
+ *
+ * @classdesc Component for showing and editing tags with different
+ * geometries composed from 2D basic image coordinates (see the
+ * {@link Viewer} class documentation for more information about coordinate
+ * systems).
+ *
+ * The `add` method is used for adding new tags or replacing
+ * tags already in the set. Tags are removed by id.
+ *
+ * If a tag already in the set has the same
+ * id as one of the tags added, the old tag will be removed and
+ * the added tag will take its place.
+ *
+ * The tag component mode can be set to either be non interactive or
+ * to be in creating mode of a certain geometry type.
+ *
+ * The tag properties can be updated at any time and the change will
+ * be visibile immediately.
+ *
+ * Tags are only relevant to a single image because they are based on
+ * 2D basic image coordinates. Tags related to a certain image should
+ * be removed when the viewer is moved to another node.
+ *
+ * To retrive and use the tag component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>",
+ *     { component: { tag: true } });
+ *
+ * var tagComponent = viewer.getComponent("tag");
+ * ```
+ */
+var TagComponent = /** @class */ (function (_super) {
+    __extends(TagComponent, _super);
+    /** @ignore */
+    function TagComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._tagDomRenderer = new Component_1.TagDOMRenderer();
+        _this._tagScene = new Component_1.TagScene();
+        _this._tagSet = new Component_1.TagSet();
+        _this._tagCreator = new Component_1.TagCreator(_this, navigator);
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._createHandlers = {
+            "CreatePoint": new Component_1.CreatePointHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreatePoints": new Component_1.CreatePointsHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreatePolygon": new Component_1.CreatePolygonHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreateRect": new Component_1.CreateRectHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreateRectDrag": new Component_1.CreateRectDragHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "Default": undefined,
+        };
+        _this._editVertexHandler = new Component_1.EditVertexHandler(_this, container, navigator, _this._viewportCoords, _this._tagSet);
+        _this._renderTags$ = _this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
+            var tags = tagSet.getAll();
+            // ensure that tags are always rendered in the same order
+            // to avoid hover tracking problems on first resize.
+            tags.sort(function (t1, t2) {
+                var id1 = t1.tag.id;
+                var id2 = t2.tag.id;
+                if (id1 < id2) {
+                    return -1;
+                }
+                if (id1 > id2) {
+                    return 1;
+                }
+                return 0;
+            });
+            return tags;
+        }), operators_1.share());
+        _this._tagChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
+            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
+                return rxjs_1.merge(tag.tag.changed$, tag.tag.geometryChanged$);
+            }));
+        }), operators_1.share());
+        _this._renderTagGLChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
+            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
+                return tag.glObjectsChanged$;
+            }));
+        }), operators_1.share());
+        _this._createGeometryChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return tag != null ?
+                tag.geometryChanged$ :
+                rxjs_1.empty();
+        }), operators_1.share());
+        _this._createGLObjectsChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return tag != null ?
+                tag.glObjectsChanged$ :
+                rxjs_1.empty();
+        }), operators_1.share());
+        _this._creatingConfiguration$ = _this._configuration$.pipe(operators_1.distinctUntilChanged(function (c1, c2) {
+            return c1.mode === c2.mode;
+        }, function (configuration) {
+            return {
+                createColor: configuration.createColor,
+                mode: configuration.mode,
+            };
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        _this._creatingConfiguration$
+            .subscribe(function (configuration) {
+            _this.fire(TagComponent.modechanged, configuration.mode);
+        });
+        return _this;
+    }
+    /**
+     * Add tags to the tag set or replace tags in the tag set.
+     *
+     * @description If a tag already in the set has the same
+     * id as one of the tags added, the old tag will be removed
+     * the added tag will take its place.
+     *
+     * @param {Array<Tag>} tags - Tags to add.
+     *
+     * @example ```tagComponent.add([tag1, tag2]);```
+     */
+    TagComponent.prototype.add = function (tags) {
+        var _this = this;
+        if (this._activated) {
+            this._navigator.stateService.currentTransform$.pipe(operators_1.first())
+                .subscribe(function (transform) {
+                _this._tagSet.add(tags, transform);
+                var renderTags = tags
+                    .map(function (tag) {
+                    return _this._tagSet.get(tag.id);
+                });
+                _this._tagScene.add(renderTags);
+            });
         }
-        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {
-            return this._createVNodeByKey(navigator, key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep");
+        else {
+            this._tagSet.addDeactivated(tags);
         }
-        return this._createVNodeDisabled(key, azimuth, rotation);
     };
-    DirectionDOMRenderer.prototype._createPerspectiveToPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.innerRadius, "DirectionsArrowPano", true));
-        }
-        return arrows;
+    /**
+     * Calculate the smallest rectangle containing all the points
+     * in the points geometry.
+     *
+     * @description The result may be different depending on if the
+     * current node is an equirectangular panorama or not. If the
+     * current node is an equirectangular panorama the rectangle may
+     * wrap the horizontal border of the image.
+     *
+     * @returns {Promise<Array<number>>} Promise to the rectangle
+     * on the format specified for the {@link RectGeometry} in basic
+     * coordinates.
+     */
+    TagComponent.prototype.calculateRect = function (geometry) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._navigator.stateService.currentTransform$.pipe(operators_1.first(), operators_1.map(function (transform) {
+                return geometry.getRect2d(transform);
+            }))
+                .subscribe(function (rect) {
+                resolve(rect);
+            }, function (error) {
+                reject(error);
+            });
+        });
     };
-    DirectionDOMRenderer.prototype._createStepArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._stepEdges; _i < _a.length; _i++) {
-            var stepEdge = _a[_i];
-            arrows.push(this._createVNodeByDirection(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
+    /**
+     * Force the creation of a geometry programatically using its
+     * current vertices.
+     *
+     * @description The method only has an effect when the tag
+     * mode is either of the following modes:
+     *
+     * TagMode.CreatePoints
+     * TagMode.CreatePolygon
+     * TagMode.CreateRect
+     * TagMode.CreateRectDrag
+     *
+     * In the case of points or polygon creation, only the created
+     * vertices are used, i.e. the mouse position is disregarded.
+     *
+     * In the case of rectangle creation the position of the mouse
+     * at the time of the method call is used as one of the vertices
+     * defining the rectangle.
+     *
+     * @fires TagComponent.geometrycreated
+     *
+     * @example
+     * ```
+     * tagComponent.on("geometrycreated", function(geometry) {
+     *     console.log(geometry);
+     * });
+     *
+     * tagComponent.create();
+     * ```
+     */
+    TagComponent.prototype.create = function () {
+        this._tagCreator.replayedTag$.pipe(operators_1.first(), operators_1.filter(function (tag) {
+            return !!tag;
+        }))
+            .subscribe(function (tag) {
+            tag.create();
+        });
+    };
+    /**
+     * Change the current tag mode.
+     *
+     * @description Change the tag mode to one of the create modes for creating new geometries.
+     *
+     * @param {TagMode} mode - New tag mode.
+     *
+     * @fires TagComponent#modechanged
+     *
+     * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);```
+     */
+    TagComponent.prototype.changeMode = function (mode) {
+        this.configure({ mode: mode });
+    };
+    /**
+     * Returns the tag in the tag set with the specified id, or
+     * undefined if the id matches no tag.
+     *
+     * @param {string} tagId - Id of the tag.
+     *
+     * @example ```var tag = tagComponent.get("tagId");```
+     */
+    TagComponent.prototype.get = function (tagId) {
+        if (this._activated) {
+            var renderTag = this._tagSet.get(tagId);
+            return renderTag !== undefined ? renderTag.tag : undefined;
+        }
+        else {
+            return this._tagSet.getDeactivated(tagId);
         }
-        return arrows;
     };
-    DirectionDOMRenderer.prototype._createTurnArrows = function (navigator) {
-        var turns = [];
-        for (var _i = 0, _a = this._turnEdges; _i < _a.length; _i++) {
-            var turnEdge = _a[_i];
-            var direction = turnEdge.data.direction;
-            var name_1 = this._turnNames[direction];
-            turns.push(this._createVNodeByTurn(navigator, turnEdge.to, name_1, direction));
+    /**
+     * Returns an array of all tags.
+     *
+     * @example ```var tags = tagComponent.getAll();```
+     */
+    TagComponent.prototype.getAll = function () {
+        if (this.activated) {
+            return this._tagSet
+                .getAll()
+                .map(function (renderTag) {
+                return renderTag.tag;
+            });
+        }
+        else {
+            return this._tagSet.getAllDeactivated();
         }
-        return turns;
     };
-    DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) {
-        var onClick = function (e) {
-            navigator.moveToKey$(key)
-                .subscribe(function (node) { return; }, function (error) { console.error(error); });
-        };
-        return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically);
+    /**
+     * Returns an array of tag ids for tags that contain the specified point.
+     *
+     * @description The pixel point must lie inside the polygon or rectangle
+     * of an added tag for the tag id to be returned. Tag ids for
+     * tags that do not have a fill will also be returned if the point is inside
+     * the geometry of the tag. Tags with point geometries can not be retrieved.
+     *
+     * No tag ids will be returned for polygons rendered in cropped panoramas or
+     * rectangles rendered in panoramas.
+     *
+     * Notice that the pixelPoint argument requires x, y coordinates from pixel space.
+     *
+     * With this function, you can use the coordinates provided by mouse
+     * events to get information out of the tag component.
+     *
+     * If no tag at exist the pixel point, an empty array will be returned.
+     *
+     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
+     * @returns {Promise<Array<string>>} Promise to the ids of the tags that
+     * contain the specified pixel point.
+     *
+     * @example
+     * ```
+     * tagComponent.getTagIdsAt([100, 100])
+     *     .then((tagIds) => { console.log(tagIds); });
+     * ```
+     */
+    TagComponent.prototype.getTagIdsAt = function (pixelPoint) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
+                var viewport = _this._viewportCoords
+                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
+                var ids = _this._tagScene.intersectObjects(viewport, render.perspective);
+                return ids;
+            }))
+                .subscribe(function (ids) {
+                resolve(ids);
+            }, function (error) {
+                reject(error);
+            });
+        });
     };
-    DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(function (node) { return; }, function (error) { console.error(error); });
-        };
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick);
+    /**
+     * Check if a tag exist in the tag set.
+     *
+     * @param {string} tagId - Id of the tag.
+     *
+     * @example ```var tagExists = tagComponent.has("tagId");```
+     */
+    TagComponent.prototype.has = function (tagId) {
+        return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId);
     };
-    DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(function (node) { return; }, function (error) { console.error(error); });
-        };
-        var style = {
-            height: this._calculator.turnCircleSizeCss,
-            transform: "rotate(0)",
-            width: this._calculator.turnCircleSizeCss,
-        };
-        switch (direction) {
-            case Edge_1.EdgeDirection.TurnLeft:
-                style.left = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnRight:
-                style.right = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnU:
-                style.left = "5px";
-                style.bottom = "5px";
-                break;
-            default:
-                break;
-        }
-        var circleProperties = {
-            attributes: {
-                "data-key": key,
-            },
-            onclick: onClick,
-            style: style,
-        };
-        var circleClassName = "TurnCircle";
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
+    /**
+     * Remove tags with the specified ids from the tag set.
+     *
+     * @param {Array<string>} tagIds - Ids for tags to remove.
+     *
+     * @example ```tagComponent.remove(["id-1", "id-2"]);```
+     */
+    TagComponent.prototype.remove = function (tagIds) {
+        if (this._activated) {
+            this._tagSet.remove(tagIds);
+            this._tagScene.remove(tagIds);
         }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
+        else {
+            this._tagSet.removeDeactivated(tagIds);
         }
-        var turn = vd.h("div." + className, {}, []);
-        return vd.h("div." + circleClassName, circleProperties, [turn]);
-    };
-    DirectionDOMRenderer.prototype._createVNodeDisabled = function (key, azimuth, rotation) {
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowDisabled", "DirectionsCircleDisabled");
     };
-    DirectionDOMRenderer.prototype._createVNode = function (key, azimuth, rotation, radius, className, circleClassName, onClick, shiftVertically) {
-        var translation = this._calculator.angleToCoordinates(azimuth - rotation.phi);
-        // rotate 90 degrees clockwise and flip over X-axis
-        var translationX = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);
-        var translationY = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);
-        var shadowTranslation = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);
-        var shadowOffset = this._calculator.shadowOffset;
-        var shadowTranslationX = -shadowOffset * shadowTranslation[1];
-        var shadowTranslationY = shadowOffset * shadowTranslation[0];
-        var filter = "drop-shadow(" + shadowTranslationX + "px " + shadowTranslationY + "px 1px rgba(0,0,0,0.8))";
-        var properties = {
-            style: {
-                "-webkit-filter": filter,
-                filter: filter,
-            },
-        };
-        var chevron = vd.h("div." + className, properties, []);
-        var azimuthDeg = -this._spatial.radToDeg(azimuth - rotation.phi);
-        var circleTransform = shiftVertically ?
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg) translateZ(-0.01px)" :
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg)";
-        var circleProperties = {
-            attributes: { "data-key": key },
-            onclick: onClick,
-            style: {
-                height: this._calculator.stepCircleSizeCss,
-                marginLeft: this._calculator.stepCircleMarginCss,
-                marginTop: this._calculator.stepCircleMarginCss,
-                transform: circleTransform,
-                width: this._calculator.stepCircleSizeCss,
-            },
-        };
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
+    /**
+     * Remove all tags from the tag set.
+     *
+     * @example ```tagComponent.removeAll();```
+     */
+    TagComponent.prototype.removeAll = function () {
+        if (this._activated) {
+            this._tagSet.removeAll();
+            this._tagScene.removeAll();
         }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
+        else {
+            this._tagSet.removeAllDeactivated();
         }
-        return vd.h("div." + circleClassName, circleProperties, [chevron]);
-    };
-    DirectionDOMRenderer.prototype._getContainer = function (steps, turns, rotation) {
-        // edge does not handle hover on perspective transforms.
-        var transform = this._isEdge ?
-            "rotateX(60deg)" :
-            "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)";
-        var perspectiveStyle = {
-            bottom: this._calculator.containerBottomCss,
-            height: this._calculator.containerHeightCss,
-            left: this._calculator.containerLeftCss,
-            marginLeft: this._calculator.containerMarginCss,
-            transform: transform,
-            width: this._calculator.containerWidthCss,
-        };
-        return vd.h("div.DirectionsPerspective", { style: perspectiveStyle }, turns.concat(steps));
     };
-    return DirectionDOMRenderer;
-}());
-exports.DirectionDOMRenderer = DirectionDOMRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DirectionDOMRenderer;
-
-},{"../../Component":207,"../../Edge":208,"../../Geo":210,"virtual-dom":163}],236:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Graph_1 = require("../../Graph");
-var Utils_1 = require("../../Utils");
-var ImagePlaneComponent = (function (_super) {
-    __extends(ImagePlaneComponent, _super);
-    function ImagePlaneComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._rendererOperation$ = new Subject_1.Subject();
-        this._rendererCreator$ = new Subject_1.Subject();
-        this._rendererDisposer$ = new Subject_1.Subject();
-        this._renderer$ = this._rendererOperation$
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, null)
-            .filter(function (renderer) {
-            return renderer != null;
-        })
-            .distinctUntilChanged(undefined, function (renderer) {
-            return renderer.frameId;
+    TagComponent.prototype._activate = function () {
+        var _this = this;
+        this._editVertexHandler.enable();
+        var handlerGeometryCreated$ = rxjs_1.from(Object.keys(this._createHandlers)).pipe(operators_1.map(function (key) {
+            return _this._createHandlers[key];
+        }), operators_1.filter(function (handler) {
+            return !!handler;
+        }), operators_1.mergeMap(function (handler) {
+            return handler.geometryCreated$;
+        }), operators_1.share());
+        this._fireGeometryCreatedSubscription = handlerGeometryCreated$
+            .subscribe(function (geometry) {
+            _this.fire(TagComponent.geometrycreated, geometry);
         });
-        this._rendererCreator$
-            .map(function () {
-            return function (renderer) {
-                if (renderer != null) {
-                    throw new Error("Multiple image plane states can not be created at the same time");
-                }
-                return new Component_1.ImagePlaneGLRenderer();
-            };
-        })
-            .subscribe(this._rendererOperation$);
-        this._rendererDisposer$
-            .map(function () {
-            return function (renderer) {
-                renderer.dispose();
-                return null;
+        this._fireCreateGeometryEventSubscription = this._tagCreator.tag$.pipe(operators_1.skipWhile(function (tag) {
+            return tag == null;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (tag) {
+            var eventType = tag != null ?
+                TagComponent.creategeometrystart :
+                TagComponent.creategeometryend;
+            _this.fire(eventType, _this);
+        });
+        this._handlerStopCreateSubscription = handlerGeometryCreated$
+            .subscribe(function () {
+            _this.changeMode(Component_1.TagMode.Default);
+        });
+        this._handlerEnablerSubscription = this._creatingConfiguration$
+            .subscribe(function (configuration) {
+            _this._disableCreateHandlers();
+            var mode = Component_1.TagMode[configuration.mode];
+            var handler = _this._createHandlers[mode];
+            if (!!handler) {
+                handler.enable();
+            }
+        });
+        this._fireTagsChangedSubscription = this._renderTags$
+            .subscribe(function () {
+            _this.fire(TagComponent.tagschanged, _this);
+        });
+        this._stopCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return tag != null ?
+                tag.aborted$.pipe(operators_1.map(function () { return null; })) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); });
+        this._setGLCreateTagSubscription = this._tagCreator.tag$
+            .subscribe(function (tag) {
+            if (_this._tagScene.hasCreateTag()) {
+                _this._tagScene.removeCreateTag();
+            }
+            if (tag != null) {
+                _this._tagScene.addCreateTag(tag);
+            }
+        });
+        this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$
+            .subscribe(function (tag) {
+            _this._tagScene.updateCreateTagObjects(tag);
+        });
+        this._updateGLObjectsSubscription = this._renderTagGLChanged$
+            .subscribe(function (tag) {
+            _this._tagScene.updateObjects(tag);
+        });
+        this._updateTagSceneSubscription = this._tagChanged$
+            .subscribe(function () {
+            _this._tagScene.update();
+        });
+        this._domSubscription = rxjs_1.combineLatest(this._renderTags$.pipe(operators_1.startWith([]), operators_1.tap(function () {
+            _this._container.domRenderer.render$.next({
+                name: _this._name,
+                vnode: _this._tagDomRenderer.clear(),
+            });
+        })), this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._container.renderService.size$, this._tagChanged$.pipe(operators_1.startWith(null)), rxjs_1.merge(this._tagCreator.tag$, this._createGeometryChanged$).pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
+            var renderTags = _a[0], rc = _a[1], atlas = _a[2], size = _a[3], ct = _a[5];
+            return {
+                name: _this._name,
+                vnode: _this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size),
             };
-        })
-            .subscribe(this._rendererOperation$);
-    }
-    ImagePlaneComponent.prototype._activate = function () {
-        var _this = this;
-        this._rendererSubscription = this._renderer$
-            .map(function (renderer) {
-            var renderHash = {
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._glSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            var tagScene = _this._tagScene;
+            return {
                 name: _this._name,
                 render: {
-                    frameId: renderer.frameId,
-                    needsRender: renderer.needsRender,
-                    render: renderer.render.bind(renderer),
-                    stage: Render_1.GLRenderStage.Background,
+                    frameId: frame.id,
+                    needsRender: tagScene.needsRender,
+                    render: tagScene.render.bind(tagScene),
+                    stage: Render_1.GLRenderStage.Foreground,
                 },
             };
-            renderer.clearNeedsRender();
-            return renderHash;
-        })
+        }))
             .subscribe(this._container.glRenderer.render$);
-        this._rendererCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return function (renderer) {
-                renderer.updateFrame(frame);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
-        this._nodeSubscription = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.currentNode$, this._configuration$)
-            .debounceTime(1000)
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (nc, t) {
-            return [nc[0], nc[1], t];
-        })
-            .map(function (params) {
-            var node = params[0];
-            var configuration = params[1];
-            var transform = params[2];
-            var imageSize = Utils_1.Settings.maxImageSize;
-            if (node.pano) {
-                if (configuration.maxPanoramaResolution === "high") {
-                    imageSize = Math.max(imageSize, Math.min(4096, Math.max(transform.width, transform.height)));
-                }
-                else if (configuration.maxPanoramaResolution === "full") {
-                    imageSize = Math.max(imageSize, transform.width, transform.height);
-                }
-            }
-            return [node, imageSize];
-        })
-            .filter(function (params) {
-            var node = params[0];
-            var imageSize = params[1];
-            return node.pano ?
-                imageSize > Utils_1.Settings.basePanoramaSize :
-                imageSize > Utils_1.Settings.baseImageSize;
-        })
-            .switchMap(function (params) {
-            var node = params[0];
-            var imageSize = params[1];
-            var image$ = node.pano && imageSize > Utils_1.Settings.maxImageSize ?
-                Graph_1.ImageLoader.loadDynamic(node.key, imageSize) :
-                Graph_1.ImageLoader.loadThumbnail(node.key, imageSize);
-            return image$
-                .filter(function (statusObject) {
-                return statusObject.object != null;
-            })
-                .first()
-                .map(function (statusObject) {
-                return statusObject.object;
-            })
-                .zip(Observable_1.Observable.of(node), function (i, n) {
-                return [i, n];
-            })
-                .catch(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .map(function (imn) {
-            return function (renderer) {
-                renderer.updateTexture(imn[0], imn[1]);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
+        this._navigator.stateService.currentTransform$.pipe(operators_1.first())
+            .subscribe(function (transform) {
+            _this._tagSet.activate(transform);
+            _this._tagScene.add(_this._tagSet.getAll());
+        });
     };
-    ImagePlaneComponent.prototype._deactivate = function () {
-        this._rendererDisposer$.next(null);
-        this._rendererSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
+    TagComponent.prototype._deactivate = function () {
+        this._editVertexHandler.disable();
+        this._disableCreateHandlers();
+        this._tagScene.clear();
+        this._tagSet.deactivate();
+        this._tagCreator.delete$.next(null);
+        this._updateGLObjectsSubscription.unsubscribe();
+        this._updateTagSceneSubscription.unsubscribe();
+        this._stopCreateSubscription.unsubscribe();
+        this._setGLCreateTagSubscription.unsubscribe();
+        this._createGLObjectsChangedSubscription.unsubscribe();
+        this._domSubscription.unsubscribe();
+        this._glSubscription.unsubscribe();
+        this._fireCreateGeometryEventSubscription.unsubscribe();
+        this._fireGeometryCreatedSubscription.unsubscribe();
+        this._fireTagsChangedSubscription.unsubscribe();
+        this._handlerStopCreateSubscription.unsubscribe();
+        this._handlerEnablerSubscription.unsubscribe();
+        this._container.element.classList.remove("component-tag-create");
     };
-    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
-        return { maxPanoramaResolution: "auto" };
+    TagComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            createColor: 0xFFFFFF,
+            indicatePointsCompleter: true,
+            mode: Component_1.TagMode.Default,
+        };
     };
-    ImagePlaneComponent.componentName = "imagePlane";
-    return ImagePlaneComponent;
+    TagComponent.prototype._disableCreateHandlers = function () {
+        var createHandlers = this._createHandlers;
+        for (var key in createHandlers) {
+            if (!createHandlers.hasOwnProperty(key)) {
+                continue;
+            }
+            var handler = createHandlers[key];
+            if (!!handler) {
+                handler.disable();
+            }
+        }
+    };
+    /** @inheritdoc */
+    TagComponent.componentName = "tag";
+    /**
+     * Event fired when an interaction to create a geometry ends.
+     *
+     * @description A create interaction can by a geometry being created
+     * or by the creation being aborted.
+     *
+     * @event TagComponent#creategeometryend
+     * @type {TagComponent} Tag component.
+     * @example
+     * ```
+     * tagComponent.on("creategeometryend", function(component) {
+     *     console.log(component);
+     * });
+     * ```
+     */
+    TagComponent.creategeometryend = "creategeometryend";
+    /**
+     * Event fired when an interaction to create a geometry starts.
+     *
+     * @description A create interaction starts when the first vertex
+     * is created in the geometry.
+     *
+     * @event TagComponent#creategeometrystart
+     * @type {TagComponent} Tag component.
+     * @example
+     * ```
+     * tagComponent.on("creategeometrystart", function(component) {
+     *     console.log(component);
+     * });
+     * ```
+     */
+    TagComponent.creategeometrystart = "creategeometrystart";
+    /**
+     * Event fired when the create mode is changed.
+     *
+     * @event TagComponent#modechanged
+     * @type {TagMode} Tag mode
+     * @example
+     * ```
+     * tagComponent.on("modechanged", function(mode) {
+     *     console.log(mode);
+     * });
+     * ```
+     */
+    TagComponent.modechanged = "modechanged";
+    /**
+     * Event fired when a geometry has been created.
+     *
+     * @event TagComponent#geometrycreated
+     * @type {Geometry} Created geometry.
+     * @example
+     * ```
+     * tagComponent.on("geometrycreated", function(geometry) {
+     *     console.log(geometry);
+     * });
+     * ```
+     */
+    TagComponent.geometrycreated = "geometrycreated";
+    /**
+     * Event fired when the tags collection has changed.
+     *
+     * @event TagComponent#tagschanged
+     * @type {TagComponent} Tag component.
+     * @example
+     * ```
+     * tagComponent.on("tagschanged", function(component) {
+     *     console.log(component.getAll());
+     * });
+     * ```
+     */
+    TagComponent.tagschanged = "tagschanged";
+    return TagComponent;
 }(Component_1.Component));
-exports.ImagePlaneComponent = ImagePlaneComponent;
-Component_1.ComponentService.register(ImagePlaneComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneComponent;
+exports.TagComponent = TagComponent;
+Component_1.ComponentService.register(TagComponent);
+exports.default = TagComponent;
 
-},{"../../Component":207,"../../Graph":211,"../../Render":213,"../../Utils":215,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/of":44,"rxjs/add/operator/debounceTime":51,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76}],237:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../Component":291,"../../Geo":294,"../../Render":297,"rxjs":43,"rxjs/operators":241,"when":288}],368:[function(require,module,exports){
 "use strict";
-var THREE = require("three");
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagCreator = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
 var Component_1 = require("../../Component");
-var ImagePlaneFactory = (function () {
-    function ImagePlaneFactory(imagePlaneDepth, imageSphereRadius) {
-        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
-        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
+var TagCreator = /** @class */ (function () {
+    function TagCreator(component, navigator) {
+        this._component = component;
+        this._navigator = navigator;
+        this._tagOperation$ = new rxjs_1.Subject();
+        this._createPoints$ = new rxjs_1.Subject();
+        this._createPolygon$ = new rxjs_1.Subject();
+        this._createRect$ = new rxjs_1.Subject();
+        this._delete$ = new rxjs_1.Subject();
+        this._tag$ = this._tagOperation$.pipe(operators_1.scan(function (tag, operation) {
+            return operation(tag);
+        }, null), operators_1.share());
+        this._replayedTag$ = this._tag$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._replayedTag$.subscribe();
+        this._createPoints$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var coord = _a[0], conf = _a[1], transform = _a[2];
+            return function () {
+                var geometry = new Component_1.PointsGeometry([
+                    [coord[0], coord[1]],
+                    [coord[0], coord[1]],
+                ]);
+                return new Component_1.ExtremePointCreateTag(geometry, {
+                    color: conf.createColor,
+                    indicateCompleter: conf.indicatePointsCompleter,
+                }, transform);
+            };
+        }))
+            .subscribe(this._tagOperation$);
+        this._createRect$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var coord = _a[0], conf = _a[1], transform = _a[2];
+            return function () {
+                var geometry = new Component_1.RectGeometry([
+                    coord[0],
+                    coord[1],
+                    coord[0],
+                    coord[1],
+                ]);
+                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
+            };
+        }))
+            .subscribe(this._tagOperation$);
+        this._createPolygon$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var coord = _a[0], conf = _a[1], transform = _a[2];
+            return function () {
+                var geometry = new Component_1.PolygonGeometry([
+                    [coord[0], coord[1]],
+                    [coord[0], coord[1]],
+                    [coord[0], coord[1]],
+                ]);
+                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
+            };
+        }))
+            .subscribe(this._tagOperation$);
+        this._delete$.pipe(operators_1.map(function () {
+            return function () {
+                return null;
+            };
+        }))
+            .subscribe(this._tagOperation$);
     }
-    ImagePlaneFactory.prototype.createMesh = function (node, transform) {
-        var mesh = node.pano ?
-            this._createImageSphere(node, transform) :
-            this._createImagePlane(node, transform);
-        return mesh;
-    };
-    ImagePlaneFactory.prototype._createImageSphere = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createSphereMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var mesh = this._useMesh(transform, node) ?
-            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
-            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
-        return mesh;
-    };
-    ImagePlaneFactory.prototype._createImagePlane = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeo(transform, node) :
-            this._getFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    ImagePlaneFactory.prototype._createSphereMaterialParameters = function (transform, texture) {
-        var gpano = transform.gpano;
-        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
-        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
-        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.ImagePlaneShaders.equirectangular.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                phiLength: {
-                    type: "f",
-                    value: phiLength,
-                },
-                phiShift: {
-                    type: "f",
-                    value: phiShift,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.rt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                thetaLength: {
-                    type: "f",
-                    value: thetaLength,
-                },
-                thetaShift: {
-                    type: "f",
-                    value: thetaShift,
-                },
-            },
-            vertexShader: Component_1.ImagePlaneShaders.equirectangular.vertex,
-        };
-        return materialParameters;
-    };
-    ImagePlaneFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.ImagePlaneShaders.perspective.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                bbox: {
-                    type: "v4",
-                    value: new THREE.Vector4(0, 0, 1, 1),
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.projectorMatrix(),
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-            },
-            vertexShader: Component_1.ImagePlaneShaders.perspective.vertex,
-        };
-        return materialParameters;
-    };
-    ImagePlaneFactory.prototype._createTexture = function (image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        return texture;
-    };
-    ImagePlaneFactory.prototype._useMesh = function (transform, node) {
-        return node.mesh.vertices.length &&
-            transform.scale > 1e-2 &&
-            transform.scale < 50;
-    };
-    ImagePlaneFactory.prototype._getImageSphereGeo = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imageSphereRadius * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var l = Math.sqrt(x * x + y * y + z * z);
-            var boundedL = Math.max(minZ, Math.min(l, maxZ));
-            var factor = boundedL / l;
-            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getImagePlaneGeo = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imagePlaneDepth * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var boundedZ = Math.max(minZ, Math.min(z, maxZ));
-            var factor = boundedZ / z;
-            var p = new THREE.Vector3(x * factor, y * factor, boundedZ);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
+    Object.defineProperty(TagCreator.prototype, "createRect$", {
+        get: function () {
+            return this._createRect$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "createPolygon$", {
+        get: function () {
+            return this._createPolygon$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "createPoints$", {
+        get: function () {
+            return this._createPoints$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "delete$", {
+        get: function () {
+            return this._delete$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "tag$", {
+        get: function () {
+            return this._tag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "replayedTag$", {
+        get: function () {
+            return this._replayedTag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return TagCreator;
+}());
+exports.TagCreator = TagCreator;
+exports.default = TagCreator;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],369:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagDOMRenderer = void 0;
+var vd = require("virtual-dom");
+var TagDOMRenderer = /** @class */ (function () {
+    function TagDOMRenderer() {
+    }
+    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) {
+        var vNodes = [];
+        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
+            var tag = tags_1[_i];
+            vNodes = vNodes.concat(tag.getDOMObjects(atlas, camera, size));
         }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
+        if (createTag != null) {
+            vNodes = vNodes.concat(createTag.getDOMObjects(camera, size));
         }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getFlatImageSphereGeo = function (transform) {
-        var gpano = transform.gpano;
-        var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var thetaStart = Math.PI *
-            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /
-            gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength);
-        geometry.applyMatrix(new THREE.Matrix4().getInverse(transform.rt));
-        return geometry;
+        return vd.h("div.TagContainer", {}, vNodes);
     };
-    ImagePlaneFactory.prototype._getFlatImagePlaneGeo = function (transform) {
-        var width = transform.width;
-        var height = transform.height;
-        var size = Math.max(width, height);
-        var dx = width / 2.0 / size;
-        var dy = height / 2.0 / size;
-        var vertices = [];
-        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
-        var positions = new Float32Array(12);
-        for (var i = 0; i < vertices.length; i++) {
-            var index = 3 * i;
-            positions[index + 0] = vertices[i][0];
-            positions[index + 1] = vertices[i][1];
-            positions[index + 2] = vertices[i][2];
-        }
-        var indices = new Uint16Array(6);
-        indices[0] = 0;
-        indices[1] = 1;
-        indices[2] = 3;
-        indices[3] = 1;
-        indices[4] = 2;
-        indices[5] = 3;
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
+    TagDOMRenderer.prototype.clear = function () {
+        return vd.h("div", {}, []);
     };
-    return ImagePlaneFactory;
+    return TagDOMRenderer;
 }());
-exports.ImagePlaneFactory = ImagePlaneFactory;
+exports.TagDOMRenderer = TagDOMRenderer;
+
+},{"virtual-dom":247}],370:[function(require,module,exports){
+"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneFactory;
+exports.TagMode = void 0;
+/**
+ * Enumeration for tag modes
+ * @enum {number}
+ * @readonly
+ * @description Modes for the interaction in the tag component.
+ */
+var TagMode;
+(function (TagMode) {
+    /**
+     * Disables creating tags.
+     */
+    TagMode[TagMode["Default"] = 0] = "Default";
+    /**
+     * Create a point geometry through a click.
+     */
+    TagMode[TagMode["CreatePoint"] = 1] = "CreatePoint";
+    /**
+     * Create a points geometry through clicks.
+     */
+    TagMode[TagMode["CreatePoints"] = 2] = "CreatePoints";
+    /**
+     * Create a polygon geometry through clicks.
+     */
+    TagMode[TagMode["CreatePolygon"] = 3] = "CreatePolygon";
+    /**
+     * Create a rect geometry through clicks.
+     */
+    TagMode[TagMode["CreateRect"] = 4] = "CreateRect";
+    /**
+     * Create a rect geometry through drag.
+     *
+     * @description Claims the mouse which results in mouse handlers like
+     * drag pan and scroll zoom becoming inactive.
+     */
+    TagMode[TagMode["CreateRectDrag"] = 5] = "CreateRectDrag";
+})(TagMode = exports.TagMode || (exports.TagMode = {}));
+exports.default = TagMode;
 
-},{"../../Component":207,"three":157}],238:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{}],371:[function(require,module,exports){
 "use strict";
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var ImagePlaneGLRenderer = (function () {
-    function ImagePlaneGLRenderer() {
-        this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
-        this._imagePlaneScene = new Component_1.ImagePlaneScene();
-        this._alpha = 0;
-        this._alphaOld = 0;
-        this._fadeOutSpeed = 0.05;
-        this._lastCamera = new Geo_1.Camera();
-        this._epsilon = 0.000001;
-        this._currentKey = null;
-        this._previousKey = null;
-        this._frameId = 0;
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagOperation = void 0;
+var TagOperation;
+(function (TagOperation) {
+    TagOperation[TagOperation["None"] = 0] = "None";
+    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
+    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
+})(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
+exports.default = TagOperation;
+
+},{}],372:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagScene = void 0;
+var THREE = require("three");
+var TagScene = /** @class */ (function () {
+    function TagScene(scene, raycaster) {
+        this._createTag = null;
         this._needsRender = false;
+        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
+        this._scene = !!scene ? scene : new THREE.Scene();
+        this._objectTags = {};
+        this._retrievableObjects = [];
+        this._tags = {};
     }
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
+    Object.defineProperty(TagScene.prototype, "needsRender", {
         get: function () {
             return this._needsRender;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    ImagePlaneGLRenderer.prototype.updateFrame = function (frame) {
-        this._updateFrameId(frame.id);
-        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;
-    };
-    ImagePlaneGLRenderer.prototype.updateTexture = function (image, node) {
-        if (this._currentKey !== node.key) {
-            return;
+    TagScene.prototype.add = function (tags) {
+        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
+            var tag = tags_1[_i];
+            if (tag.tag.id in this._tags) {
+                this._remove(tag.tag.id);
+            }
+            this._add(tag);
         }
         this._needsRender = true;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
     };
-    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        var planeAlpha = this._imagePlaneScene.imagePlanesOld.length ? 1 : this._alpha;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            plane.material.uniforms.opacity.value = planeAlpha;
-        }
-        for (var _b = 0, _c = this._imagePlaneScene.imagePlanesOld; _b < _c.length; _b++) {
-            var plane = _c[_b];
-            plane.material.uniforms.opacity.value = this._alphaOld;
-        }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
-        renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);
-        for (var _d = 0, _e = this._imagePlaneScene.imagePlanes; _d < _e.length; _d++) {
-            var plane = _e[_d];
-            plane.material.uniforms.opacity.value = this._alpha;
+    TagScene.prototype.addCreateTag = function (tag) {
+        for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.add(object);
         }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
+        this._createTag = { tag: tag, objects: tag.glObjects };
+        this._needsRender = true;
     };
-    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
+    TagScene.prototype.clear = function () {
+        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
+            var id = _a[_i];
+            this._remove(id);
+        }
         this._needsRender = false;
     };
-    ImagePlaneGLRenderer.prototype.dispose = function () {
-        this._imagePlaneScene.clear();
+    TagScene.prototype.get = function (id) {
+        return this.has(id) ? this._tags[id].tag : undefined;
     };
-    ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
+    TagScene.prototype.has = function (id) {
+        return id in this._tags;
     };
-    ImagePlaneGLRenderer.prototype._updateAlpha = function (alpha) {
-        if (alpha === this._alpha) {
-            return false;
-        }
-        this._alpha = alpha;
-        return true;
+    TagScene.prototype.hasCreateTag = function () {
+        return this._createTag != null;
     };
-    ImagePlaneGLRenderer.prototype._updateAlphaOld = function (alpha) {
-        if (alpha < 1 || this._alphaOld === 0) {
-            return false;
+    TagScene.prototype.intersectObjects = function (_a, camera) {
+        var viewportX = _a[0], viewportY = _a[1];
+        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
+        var intersects = this._raycaster.intersectObjects(this._retrievableObjects);
+        var intersectedIds = [];
+        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
+            var intersect = intersects_1[_i];
+            if (intersect.object.uuid in this._objectTags) {
+                intersectedIds.push(this._objectTags[intersect.object.uuid]);
+            }
         }
-        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);
-        return true;
+        return intersectedIds;
     };
-    ImagePlaneGLRenderer.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null || state.currentNode.key === this._currentKey) {
-            return false;
+    TagScene.prototype.remove = function (ids) {
+        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
+            var id = ids_1[_i];
+            this._remove(id);
         }
-        this._previousKey = state.previousNode != null ? state.previousNode.key : null;
-        if (this._previousKey != null) {
-            if (this._previousKey !== this._currentKey) {
-                var previousMesh = this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform);
-                this._imagePlaneScene.updateImagePlanes([previousMesh]);
-            }
+        this._needsRender = true;
+    };
+    TagScene.prototype.removeAll = function () {
+        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
+            var id = _a[_i];
+            this._remove(id);
         }
-        this._currentKey = state.currentNode.key;
-        var currentMesh = this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform);
-        this._imagePlaneScene.updateImagePlanes([currentMesh]);
-        this._alphaOld = 1;
-        return true;
+        this._needsRender = true;
     };
-    return ImagePlaneGLRenderer;
-}());
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneGLRenderer;
-
-},{"../../Component":207,"../../Geo":210}],239:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var ImagePlaneScene = (function () {
-    function ImagePlaneScene() {
-        this.scene = new THREE.Scene();
-        this.sceneOld = new THREE.Scene();
-        this.imagePlanes = [];
-        this.imagePlanesOld = [];
-    }
-    ImagePlaneScene.prototype.updateImagePlanes = function (planes) {
-        this._dispose(this.imagePlanesOld, this.sceneOld);
-        for (var _i = 0, _a = this.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            this.scene.remove(plane);
-            this.sceneOld.add(plane);
-        }
-        for (var _b = 0, planes_1 = planes; _b < planes_1.length; _b++) {
-            var plane = planes_1[_b];
-            this.scene.add(plane);
-        }
-        this.imagePlanesOld = this.imagePlanes;
-        this.imagePlanes = planes;
-    };
-    ImagePlaneScene.prototype.addImagePlanes = function (planes) {
-        for (var _i = 0, planes_2 = planes; _i < planes_2.length; _i++) {
-            var plane = planes_2[_i];
-            this.scene.add(plane);
-            this.imagePlanes.push(plane);
-        }
-    };
-    ImagePlaneScene.prototype.addImagePlanesOld = function (planes) {
-        for (var _i = 0, planes_3 = planes; _i < planes_3.length; _i++) {
-            var plane = planes_3[_i];
-            this.sceneOld.add(plane);
-            this.imagePlanesOld.push(plane);
-        }
-    };
-    ImagePlaneScene.prototype.setImagePlanes = function (planes) {
-        this._clear();
-        this.addImagePlanes(planes);
+    TagScene.prototype.removeCreateTag = function () {
+        if (this._createTag == null) {
+            return;
+        }
+        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.remove(object);
+        }
+        this._createTag.tag.dispose();
+        this._createTag = null;
+        this._needsRender = true;
     };
-    ImagePlaneScene.prototype.setImagePlanesOld = function (planes) {
-        this._clearOld();
-        this.addImagePlanesOld(planes);
+    TagScene.prototype.render = function (perspectiveCamera, renderer) {
+        renderer.render(this._scene, perspectiveCamera);
+        this._needsRender = false;
     };
-    ImagePlaneScene.prototype.clear = function () {
-        this._clear();
-        this._clearOld();
+    TagScene.prototype.update = function () {
+        this._needsRender = true;
     };
-    ImagePlaneScene.prototype._clear = function () {
-        this._dispose(this.imagePlanes, this.scene);
-        this.imagePlanes.length = 0;
+    TagScene.prototype.updateCreateTagObjects = function (tag) {
+        if (this._createTag.tag !== tag) {
+            throw new Error("Create tags do not have the same reference.");
+        }
+        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.remove(object);
+        }
+        for (var _b = 0, _c = tag.glObjects; _b < _c.length; _b++) {
+            var object = _c[_b];
+            this._scene.add(object);
+        }
+        this._createTag.objects = tag.glObjects;
+        this._needsRender = true;
     };
-    ImagePlaneScene.prototype._clearOld = function () {
-        this._dispose(this.imagePlanesOld, this.sceneOld);
-        this.imagePlanesOld.length = 0;
+    TagScene.prototype.updateObjects = function (tag) {
+        var id = tag.tag.id;
+        if (this._tags[id].tag !== tag) {
+            throw new Error("Tags do not have the same reference.");
+        }
+        var tagObjects = this._tags[id];
+        this._removeObjects(tagObjects);
+        delete this._tags[id];
+        this._add(tag);
+        this._needsRender = true;
     };
-    ImagePlaneScene.prototype._dispose = function (planes, scene) {
-        for (var _i = 0, planes_4 = planes; _i < planes_4.length; _i++) {
-            var plane = planes_4[_i];
-            scene.remove(plane);
-            plane.geometry.dispose();
-            plane.material.dispose();
-            var texture = plane.material.uniforms.projectorTex.value;
-            if (texture != null) {
-                texture.dispose();
-            }
+    TagScene.prototype._add = function (tag) {
+        var id = tag.tag.id;
+        var tagObjects = { tag: tag, objects: [], retrievableObjects: [] };
+        this._tags[id] = tagObjects;
+        for (var _i = 0, _a = tag.getGLObjects(); _i < _a.length; _i++) {
+            var object = _a[_i];
+            tagObjects.objects.push(object);
+            this._scene.add(object);
+        }
+        for (var _b = 0, _c = tag.getRetrievableObjects(); _b < _c.length; _b++) {
+            var retrievableObject = _c[_b];
+            tagObjects.retrievableObjects.push(retrievableObject);
+            this._retrievableObjects.push(retrievableObject);
+            this._objectTags[retrievableObject.uuid] = tag.tag.id;
         }
     };
-    return ImagePlaneScene;
-}());
-exports.ImagePlaneScene = ImagePlaneScene;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneScene;
-
-},{"three":157}],240:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-
-var path = require("path");
-var ImagePlaneShaders = (function () {
-    function ImagePlaneShaders() {
-    }
-    ImagePlaneShaders.equirectangular = {
-        fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    TagScene.prototype._remove = function (id) {
+        var tagObjects = this._tags[id];
+        this._removeObjects(tagObjects);
+        tagObjects.tag.dispose();
+        delete this._tags[id];
     };
-    ImagePlaneShaders.perspective = {
-        fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
+    TagScene.prototype._removeObjects = function (tagObjects) {
+        for (var _i = 0, _a = tagObjects.objects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.remove(object);
+        }
+        for (var _b = 0, _c = tagObjects.retrievableObjects; _b < _c.length; _b++) {
+            var retrievableObject = _c[_b];
+            var index = this._retrievableObjects.indexOf(retrievableObject);
+            if (index !== -1) {
+                this._retrievableObjects.splice(index, 1);
+            }
+        }
     };
-    return ImagePlaneShaders;
+    return TagScene;
 }());
-exports.ImagePlaneShaders = ImagePlaneShaders;
+exports.TagScene = TagScene;
+exports.default = TagScene;
 
-},{"path":21}],241:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"three":242}],373:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/observable/of");
-require("rxjs/add/observable/zip");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-require("rxjs/add/operator/zip");
-var Graph_1 = require("../../Graph");
-var State_1 = require("../../State");
-var Render_1 = require("../../Render");
-var Utils_1 = require("../../Utils");
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagSet = void 0;
+var rxjs_1 = require("rxjs");
 var Component_1 = require("../../Component");
-var SliderState = (function () {
-    function SliderState() {
-        this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
-        this._imagePlaneScene = new Component_1.ImagePlaneScene();
-        this._currentKey = null;
-        this._previousKey = null;
-        this._currentPano = false;
-        this._frameId = 0;
-        this._glNeedsRender = false;
-        this._domNeedsRender = true;
-        this._motionless = false;
-        this._curtain = 1;
+var ExtremePointTag_1 = require("./tag/ExtremePointTag");
+var ExtremePointRenderTag_1 = require("./tag/ExtremePointRenderTag");
+var TagSet = /** @class */ (function () {
+    function TagSet() {
+        this._active = false;
+        this._hash = {};
+        this._hashDeactivated = {};
+        this._notifyChanged$ = new rxjs_1.Subject();
     }
-    Object.defineProperty(SliderState.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "curtain", {
-        get: function () {
-            return this._curtain;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "glNeedsRender", {
-        get: function () {
-            return this._glNeedsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "domNeedsRender", {
-        get: function () {
-            return this._domNeedsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "sliderVisible", {
+    Object.defineProperty(TagSet.prototype, "active", {
         get: function () {
-            return this._sliderVisible;
-        },
-        set: function (value) {
-            this._sliderVisible = value;
-            this._domNeedsRender = true;
+            return this._active;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(SliderState.prototype, "disabled", {
+    Object.defineProperty(TagSet.prototype, "changed$", {
         get: function () {
-            return this._currentKey == null ||
-                this._previousKey == null ||
-                this._motionless ||
-                this._currentPano;
+            return this._notifyChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    SliderState.prototype.update = function (frame) {
-        this._updateFrameId(frame.id);
-        var needsRender = this._updateImagePlanes(frame.state);
-        needsRender = this._updateCurtain(frame.state.alpha) || needsRender;
-        this._glNeedsRender = needsRender || this._glNeedsRender;
-        this._domNeedsRender = needsRender || this._domNeedsRender;
-    };
-    SliderState.prototype.updateTexture = function (image, node) {
-        var imagePlanes = node.key === this._currentKey ?
-            this._imagePlaneScene.imagePlanes :
-            node.key === this._previousKey ?
-                this._imagePlaneScene.imagePlanesOld :
-                [];
-        if (imagePlanes.length === 0) {
+    TagSet.prototype.activate = function (transform) {
+        if (this._active) {
             return;
         }
-        this._glNeedsRender = true;
-        for (var _i = 0, imagePlanes_1 = imagePlanes; _i < imagePlanes_1.length; _i++) {
-            var plane = imagePlanes_1[_i];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    SliderState.prototype.render = function (perspectiveCamera, renderer) {
-        if (!this.disabled) {
-            renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);
+        for (var id in this._hashDeactivated) {
+            if (!this._hashDeactivated.hasOwnProperty(id)) {
+                continue;
+            }
+            var tag = this._hashDeactivated[id];
+            this._add(tag, transform);
         }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
-    };
-    SliderState.prototype.dispose = function () {
-        this._imagePlaneScene.clear();
-    };
-    SliderState.prototype.clearGLNeedsRender = function () {
-        this._glNeedsRender = false;
-    };
-    SliderState.prototype.clearDomNeedsRender = function () {
-        this._domNeedsRender = false;
-    };
-    SliderState.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
+        this._hashDeactivated = {};
+        this._active = true;
+        this._notifyChanged$.next(this);
     };
-    SliderState.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null) {
+    TagSet.prototype.deactivate = function () {
+        if (!this._active) {
             return;
         }
-        var needsRender = false;
-        if (state.previousNode != null && this._previousKey !== state.previousNode.key) {
-            needsRender = true;
-            this._previousKey = state.previousNode.key;
-            this._motionless = state.motionless;
-            this._imagePlaneScene.setImagePlanesOld([
-                this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform),
-            ]);
-        }
-        if (this._currentKey !== state.currentNode.key) {
-            needsRender = true;
-            this._currentKey = state.currentNode.key;
-            this._currentPano = state.currentNode.pano;
-            this._motionless = state.motionless;
-            this._imagePlaneScene.setImagePlanes([
-                this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform),
-            ]);
-            if (!this.disabled) {
-                this._updateBbox();
+        for (var id in this._hash) {
+            if (!this._hash.hasOwnProperty(id)) {
+                continue;
             }
+            this._hashDeactivated[id] = this._hash[id].tag;
         }
-        return needsRender;
+        this._hash = {};
+        this._active = false;
     };
-    SliderState.prototype._updateCurtain = function (alpha) {
-        if (this.disabled ||
-            Math.abs(this._curtain - alpha) < 0.001) {
-            return false;
+    TagSet.prototype.add = function (tags, transform) {
+        this._assertActivationState(true);
+        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
+            var tag = tags_1[_i];
+            this._add(tag, transform);
         }
-        this._curtain = alpha;
-        this._updateBbox();
-        return true;
+        this._notifyChanged$.next(this);
     };
-    SliderState.prototype._updateBbox = function () {
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var shaderMaterial = plane.material;
-            var bbox = shaderMaterial.uniforms.bbox.value;
-            bbox.z = this._curtain;
+    TagSet.prototype.addDeactivated = function (tags) {
+        this._assertActivationState(false);
+        for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) {
+            var tag = tags_2[_i];
+            if (!(tag instanceof Component_1.OutlineTag ||
+                tag instanceof Component_1.SpotTag ||
+                tag instanceof ExtremePointTag_1.default)) {
+                throw new Error("Tag type not supported");
+            }
+            this._hashDeactivated[tag.id] = tag;
         }
     };
-    return SliderState;
-}());
-var SliderComponent = (function (_super) {
-    __extends(SliderComponent, _super);
-    /**
-     * Create a new slider component instance.
-     * @class SliderComponent
-     */
-    function SliderComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._sliderStateOperation$ = new Subject_1.Subject();
-        this._sliderStateCreator$ = new Subject_1.Subject();
-        this._sliderStateDisposer$ = new Subject_1.Subject();
-        this._sliderState$ = this._sliderStateOperation$
-            .scan(function (sliderState, operation) {
-            return operation(sliderState);
-        }, null)
-            .filter(function (sliderState) {
-            return sliderState != null;
-        })
-            .distinctUntilChanged(undefined, function (sliderState) {
-            return sliderState.frameId;
+    TagSet.prototype.get = function (id) {
+        return this.has(id) ? this._hash[id] : undefined;
+    };
+    TagSet.prototype.getAll = function () {
+        var hash = this._hash;
+        return Object.keys(hash)
+            .map(function (id) {
+            return hash[id];
         });
-        this._sliderStateCreator$
-            .map(function () {
-            return function (sliderState) {
-                if (sliderState != null) {
-                    throw new Error("Multiple slider states can not be created at the same time");
-                }
-                return new SliderState();
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._sliderStateDisposer$
-            .map(function () {
-            return function (sliderState) {
-                sliderState.dispose();
-                return null;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-    }
-    /**
-     * Set the image keys.
-     *
-     * Configures the component to show the image planes for the supplied image keys.
-     *
-     * @param {keys} ISliderKeys - Slider keys object specifying the images to be shown in the foreground and the background.
-     */
-    SliderComponent.prototype.setKeys = function (keys) {
-        this.configure({ keys: keys });
     };
-    /**
-     * Set the initial position.
-     *
-     * Configures the intial position of the slider. The inital position value will be used when the component is activated.
-     *
-     * @param {number} initialPosition - Initial slider position.
-     */
-    SliderComponent.prototype.setInitialPosition = function (initialPosition) {
-        this.configure({ initialPosition: initialPosition });
+    TagSet.prototype.getAllDeactivated = function () {
+        var hashDeactivated = this._hashDeactivated;
+        return Object.keys(hashDeactivated)
+            .map(function (id) {
+            return hashDeactivated[id];
+        });
     };
-    /**
-     * Set the value controlling if the slider is visible.
-     *
-     * @param {boolean} sliderVisible - Value indicating if the slider should be visible or not.
-     */
-    SliderComponent.prototype.setSliderVisible = function (sliderVisible) {
-        this.configure({ sliderVisible: sliderVisible });
+    TagSet.prototype.getDeactivated = function (id) {
+        return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined;
     };
-    SliderComponent.prototype._activate = function () {
-        var _this = this;
-        this._container.mouseService.preventDefaultMouseDown$.next(false);
-        this._container.touchService.preventDefaultTouchMove$.next(false);
-        Observable_1.Observable
-            .combineLatest(this._navigator.stateService.state$, this._configuration$)
-            .first()
-            .subscribe(function (stateConfig) {
-            if (stateConfig[0] === State_1.State.Traversing) {
-                _this._navigator.stateService.wait();
-                var position = stateConfig[1].initialPosition;
-                _this._navigator.stateService.moveTo(position != null ? position : 1);
-            }
-        });
-        this._glRenderSubscription = this._sliderState$
-            .map(function (sliderState) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: sliderState.frameId,
-                    needsRender: sliderState.glNeedsRender,
-                    render: sliderState.render.bind(sliderState),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            sliderState.clearGLNeedsRender();
-            return renderHash;
-        })
-            .subscribe(this._container.glRenderer.render$);
-        this._domRenderSubscription = this._sliderState$
-            .filter(function (sliderState) {
-            return sliderState.domNeedsRender;
-        })
-            .map(function (sliderState) {
-            var sliderInput = vd.h("input.SliderControl", {
-                max: 1000,
-                min: 0,
-                type: "range",
-                value: 1000 * sliderState.curtain,
-            }, []);
-            var vNode = sliderState.disabled || !sliderState.sliderVisible ?
-                null :
-                vd.h("div.SliderWrapper", {}, [sliderInput]);
-            var hash = {
-                name: _this._name,
-                vnode: vNode,
-            };
-            sliderState.clearDomNeedsRender();
-            return hash;
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._elementSubscription = this._container.domRenderer.element$
-            .map(function (e) {
-            var nodeList = e.getElementsByClassName("SliderControl");
-            var slider = nodeList.length > 0 ? nodeList[0] : null;
-            return slider;
-        })
-            .filter(function (input) {
-            return input != null;
-        })
-            .switchMap(function (input) {
-            return Observable_1.Observable.fromEvent(input, "input");
-        })
-            .map(function (e) {
-            return Number(e.target.value) / 1000;
-        })
-            .subscribe(function (curtain) {
-            _this._navigator.stateService.moveTo(curtain);
-        });
-        this._sliderStateCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return function (sliderState) {
-                sliderState.update(frame);
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._setSliderVisibleSubscription = this._configuration$
-            .map(function (configuration) {
-            return configuration.sliderVisible == null || configuration.sliderVisible;
-        })
-            .distinctUntilChanged()
-            .map(function (sliderVisible) {
-            return function (sliderState) {
-                sliderState.sliderVisible = sliderVisible;
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._setKeysSubscription = this._configuration$
-            .filter(function (configuration) {
-            return configuration.keys != null;
-        })
-            .switchMap(function (configuration) {
-            return Observable_1.Observable
-                .zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground))
-                .map(function (nodes) {
-                return { background: nodes[0], foreground: nodes[1] };
-            })
-                .zip(_this._navigator.stateService.currentState$.first())
-                .map(function (nf) {
-                return { nodes: nf[0], state: nf[1].state };
-            });
-        })
-            .subscribe(function (co) {
-            if (co.state.currentNode != null &&
-                co.state.previousNode != null &&
-                co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.previousNode.key === co.nodes.background.key) {
-                return;
-            }
-            if (co.state.currentNode.key === co.nodes.background.key) {
-                _this._navigator.stateService.setNodes([co.nodes.foreground]);
-                return;
-            }
-            if (co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.trajectory.length === 1) {
-                _this._navigator.stateService.prependNodes([co.nodes.background]);
-                return;
+    TagSet.prototype.has = function (id) {
+        return id in this._hash;
+    };
+    TagSet.prototype.hasDeactivated = function (id) {
+        return id in this._hashDeactivated;
+    };
+    TagSet.prototype.remove = function (ids) {
+        this._assertActivationState(true);
+        var hash = this._hash;
+        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
+            var id = ids_1[_i];
+            if (!(id in hash)) {
+                continue;
             }
-            _this._navigator.stateService.setNodes([co.nodes.background]);
-            _this._navigator.stateService.setNodes([co.nodes.foreground]);
-        }, function (e) {
-            console.log(e);
-        });
-        var previousNode$ = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return frame.state.previousNode;
-        })
-            .filter(function (node) {
-            return node != null;
-        })
-            .distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        });
-        this._nodeSubscription = Observable_1.Observable
-            .merge(previousNode$, this._navigator.stateService.currentNode$)
-            .filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        })
-            .mergeMap(function (node) {
-            return Graph_1.ImageLoader.loadThumbnail(node.key, Utils_1.Settings.maxImageSize)
-                .filter(function (statusObject) {
-                return statusObject.object != null;
-            })
-                .first()
-                .map(function (statusObject) {
-                return statusObject.object;
-            })
-                .zip(Observable_1.Observable.of(node), function (t, n) {
-                return [t, n];
-            })
-                .catch(function (error, caught) {
-                console.error("Failed to fetch high res slider image (" + node.key + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .map(function (imn) {
-            return function (sliderState) {
-                sliderState.updateTexture(imn[0], imn[1]);
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
+            delete hash[id];
+        }
+        this._notifyChanged$.next(this);
     };
-    SliderComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._container.mouseService.preventDefaultMouseDown$.next(true);
-        this._container.touchService.preventDefaultTouchMove$.next(true);
-        this._navigator.stateService.state$
-            .first()
-            .subscribe(function (state) {
-            if (state === State_1.State.Waiting) {
-                _this._navigator.stateService.traverse();
+    TagSet.prototype.removeAll = function () {
+        this._assertActivationState(true);
+        this._hash = {};
+        this._notifyChanged$.next(this);
+    };
+    TagSet.prototype.removeAllDeactivated = function () {
+        this._assertActivationState(false);
+        this._hashDeactivated = {};
+    };
+    TagSet.prototype.removeDeactivated = function (ids) {
+        this._assertActivationState(false);
+        var hashDeactivated = this._hashDeactivated;
+        for (var _i = 0, ids_2 = ids; _i < ids_2.length; _i++) {
+            var id = ids_2[_i];
+            if (!(id in hashDeactivated)) {
+                continue;
             }
-        });
-        this._sliderStateDisposer$.next(null);
-        this._setKeysSubscription.unsubscribe();
-        this._setSliderVisibleSubscription.unsubscribe();
-        this._elementSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._glRenderSubscription.unsubscribe();
-        this._domRenderSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this.configure({ keys: null });
+            delete hashDeactivated[id];
+        }
     };
-    SliderComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    TagSet.prototype._add = function (tag, transform) {
+        if (tag instanceof Component_1.OutlineTag) {
+            this._hash[tag.id] = new Component_1.OutlineRenderTag(tag, transform);
+        }
+        else if (tag instanceof Component_1.SpotTag) {
+            this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform);
+        }
+        else if (tag instanceof ExtremePointTag_1.default) {
+            this._hash[tag.id] = new ExtremePointRenderTag_1.default(tag, transform);
+        }
+        else {
+            throw new Error("Tag type not supported");
+        }
     };
-    SliderComponent.prototype._catchCacheNode$ = function (key) {
-        return this._navigator.graphService.cacheNode$(key)
-            .catch(function (error, caught) {
-            console.log("Failed to cache slider node (" + key + ")", error);
-            return Observable_1.Observable.empty();
-        });
+    TagSet.prototype._assertActivationState = function (should) {
+        if (should !== this._active) {
+            throw new Error("Tag set not in correct state for operation.");
+        }
     };
-    SliderComponent.componentName = "slider";
-    return SliderComponent;
-}(Component_1.Component));
-exports.SliderComponent = SliderComponent;
-Component_1.ComponentService.register(SliderComponent);
+    return TagSet;
+}());
+exports.TagSet = TagSet;
+exports.default = TagSet;
+
+},{"../../Component":291,"./tag/ExtremePointRenderTag":393,"./tag/ExtremePointTag":394,"rxjs":43}],374:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SliderComponent;
+exports.GeometryTagError = void 0;
+var Error_1 = require("../../../Error");
+var GeometryTagError = /** @class */ (function (_super) {
+    __extends(GeometryTagError, _super);
+    function GeometryTagError(message) {
+        var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
+        Object.setPrototypeOf(_this, GeometryTagError.prototype);
+        _this.name = "GeometryTagError";
+        return _this;
+    }
+    return GeometryTagError;
+}(Error_1.MapillaryError));
+exports.GeometryTagError = GeometryTagError;
+exports.default = Error_1.MapillaryError;
 
-},{"../../Component":207,"../../Graph":211,"../../Render":213,"../../State":214,"../../Utils":215,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/fromEvent":41,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76,"rxjs/add/operator/zip":77,"virtual-dom":163}],242:[function(require,module,exports){
+},{"../../../Error":293}],375:[function(require,module,exports){
 "use strict";
-var Marker = (function () {
-    function Marker(latLonAlt, markerOptions) {
-        this.visibleInKeys = [];
-        this._id = markerOptions.id;
-        this._latLonAlt = latLonAlt;
-        this._markerOptions = markerOptions;
-        this._type = markerOptions.type;
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Geometry = void 0;
+var rxjs_1 = require("rxjs");
+/**
+ * @class Geometry
+ * @abstract
+ * @classdesc Represents a geometry.
+ */
+var Geometry = /** @class */ (function () {
+    /**
+     * Create a geometry.
+     *
+     * @constructor
+     * @ignore
+     */
+    function Geometry() {
+        this._notifyChanged$ = new rxjs_1.Subject();
     }
-    Object.defineProperty(Marker.prototype, "id", {
-        get: function () {
-            return this._id;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "type", {
+    Object.defineProperty(Geometry.prototype, "changed$", {
+        /**
+         * Get changed observable.
+         *
+         * @description Emits the geometry itself every time the geometry
+         * has changed.
+         *
+         * @returns {Observable<Geometry>} Observable emitting the geometry instance.
+         * @ignore
+         */
         get: function () {
-            return this._type;
+            return this._notifyChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Marker.prototype, "latLonAlt", {
+    return Geometry;
+}());
+exports.Geometry = Geometry;
+exports.default = Geometry;
+
+},{"rxjs":43}],376:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PointGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class PointGeometry
+ *
+ * @classdesc Represents a point geometry in the 2D basic image coordinate system.
+ *
+ * @example
+ * ```
+ * var basicPoint = [0.5, 0.7];
+ * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);
+ * ```
+ */
+var PointGeometry = /** @class */ (function (_super) {
+    __extends(PointGeometry, _super);
+    /**
+     * Create a point geometry.
+     *
+     * @constructor
+     * @param {Array<number>} point - An array representing the basic coordinates of
+     * the point.
+     *
+     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
+     */
+    function PointGeometry(point) {
+        var _this = _super.call(this) || this;
+        var x = point[0];
+        var y = point[1];
+        if (x < 0 || x > 1 || y < 0 || y > 1) {
+            throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
+        }
+        _this._point = point.slice();
+        return _this;
+    }
+    Object.defineProperty(PointGeometry.prototype, "point", {
+        /**
+         * Get point property.
+         * @returns {Array<number>} Array representing the basic coordinates of the point.
+         */
         get: function () {
-            return this._latLonAlt;
+            return this._point;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return Marker;
-}());
-exports.Marker = Marker;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Marker;
+    /**
+     * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D
+     * basic coordinates of the point itself.
+     *
+     * @returns {Array<number>} 2D basic coordinates representing the centroid.
+     * @ignore
+     */
+    PointGeometry.prototype.getCentroid2d = function () {
+        return this._point.slice();
+    };
+    /**
+     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
+     * world coordinates of the point itself.
+     *
+     * @param {Transform} transform - The transform of the node related to the point.
+     * @returns {Array<number>} 3D world coordinates representing the centroid.
+     * @ignore
+     */
+    PointGeometry.prototype.getCentroid3d = function (transform) {
+        return transform.unprojectBasic(this._point, 200);
+    };
+    /**
+     * Set the centroid of the point, i.e. the point coordinates.
+     *
+     * @param {Array<number>} value - The new value of the centroid.
+     * @param {Transform} transform - The transform of the node related to the point.
+     * @ignore
+     */
+    PointGeometry.prototype.setCentroid2d = function (value, transform) {
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        this._point[0] = changed[0];
+        this._point[1] = changed[1];
+        this._notifyChanged$.next(this);
+    };
+    return PointGeometry;
+}(Component_1.Geometry));
+exports.PointGeometry = PointGeometry;
+exports.default = PointGeometry;
 
-},{}],243:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../../Component":291}],377:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var THREE = require("three");
-var rbush = require("rbush");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Geo_1 = require("../../Geo");
-var MarkerSet = (function () {
-    function MarkerSet() {
-        this._create$ = new Subject_1.Subject();
-        this._remove$ = new Subject_1.Subject();
-        this._update$ = new Subject_1.Subject();
-        // markers list stream is the result of applying marker updates.
-        this._markers$ = this._update$
-            .scan(function (markers, operation) {
-            return operation(markers);
-        }, { hash: {}, spatial: rbush(16, [".lon", ".lat", ".lon", ".lat"]) })
-            .map(function (markers) {
-            return markers.spatial;
-        })
-            .publishReplay(1)
-            .refCount();
-        // creation stream generate creation updates from given markers.
-        this._create$
-            .map(function (marker) {
-            return function (markers) {
-                if (markers.hash[marker.id]) {
-                    markers.spatial.remove(markers.hash[marker.id]);
-                }
-                var rbushObj = {
-                    id: marker.id,
-                    lat: marker.latLonAlt.lat,
-                    lon: marker.latLonAlt.lon,
-                    marker: marker,
-                };
-                markers.spatial.insert(rbushObj);
-                markers.hash[marker.id] = rbushObj;
-                return markers;
-            };
-        })
-            .subscribe(this._update$);
-        // remove stream generates remove updates from given markers
-        this._remove$
-            .map(function (id) {
-            return function (markers) {
-                var rbushObj = markers.hash[id];
-                markers.spatial.remove(rbushObj);
-                delete markers.hash[id];
-                return markers;
-            };
-        })
-            .subscribe(this._update$);
-    }
-    MarkerSet.prototype.addMarker = function (marker) {
-        this._create$.next(marker);
-    };
-    MarkerSet.prototype.removeMarker = function (id) {
-        this._remove$.next(id);
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    Object.defineProperty(MarkerSet.prototype, "markers$", {
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PointsGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class PointsGeometry
+ *
+ * @classdesc Represents a point set in the 2D basic image coordinate system.
+ *
+ * @example
+ * ```
+ * var points = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5]];
+ * var pointsGeometry = new Mapillary.TagComponent.PointsGeometry(points);
+ * ```
+ */
+var PointsGeometry = /** @class */ (function (_super) {
+    __extends(PointsGeometry, _super);
+    /**
+     * Create a points geometry.
+     *
+     * @constructor
+     * @param {Array<Array<number>>} points - Array of 2D points on the basic coordinate
+     * system. The number of points must be greater than or equal to two.
+     *
+     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
+     */
+    function PointsGeometry(points) {
+        var _this = _super.call(this) || this;
+        var pointsLength = points.length;
+        if (pointsLength < 2) {
+            throw new Component_1.GeometryTagError("A points geometry must have two or more positions.");
+        }
+        _this._points = [];
+        for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {
+            var point = points_1[_i];
+            if (point[0] < 0 || point[0] > 1 ||
+                point[1] < 0 || point[1] > 1) {
+                throw new Component_1.GeometryTagError("Basic coordinates of points must be on the interval [0, 1].");
+            }
+            _this._points.push(point.slice());
+        }
+        return _this;
+    }
+    Object.defineProperty(PointsGeometry.prototype, "points", {
+        /**
+         * Get points property.
+         * @returns {Array<Array<number>>} Array of 2d points.
+         */
         get: function () {
-            return this._markers$;
+            return this._points;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return MarkerSet;
-}());
-exports.MarkerSet = MarkerSet;
-var MarkerComponent = (function (_super) {
-    __extends(MarkerComponent, _super);
-    function MarkerComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-    }
-    MarkerComponent.prototype._activate = function () {
-        var _this = this;
-        this._scene = new THREE.Scene();
-        this._markerSet = new MarkerSet();
-        this._markerObjects = {};
-        this._disposable = Observable_1.Observable
-            .combineLatest([
-            this._navigator.stateService.currentState$,
-            this._markerSet.markers$,
-        ], function (frame, markers) {
-            return { frame: frame, markers: markers };
-        })
-            .distinctUntilChanged(undefined, function (args) {
-            return args.frame.id;
-        })
-            .map(function (args) {
-            return _this._renderHash(args);
-        })
-            .subscribe(this._container.glRenderer.render$);
-    };
-    MarkerComponent.prototype._deactivate = function () {
-        // release memory
-        this._disposeScene();
-        this._disposable.unsubscribe();
+    /**
+     * Add a point to the point set.
+     *
+     * @param {Array<number>} point - Point to add.
+     * @ignore
+     */
+    PointsGeometry.prototype.addPoint2d = function (point) {
+        var clamped = [
+            Math.max(0, Math.min(1, point[0])),
+            Math.max(0, Math.min(1, point[1])),
+        ];
+        this._points.push(clamped);
+        this._notifyChanged$.next(this);
     };
-    MarkerComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    /**
+     * Get the coordinates of a point from the point set representation of the geometry.
+     *
+     * @param {number} index - Point index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the point.
+     * @ignore
+     */
+    PointsGeometry.prototype.getPoint2d = function (index) {
+        return this._points[index].slice();
     };
-    MarkerComponent.prototype.createMarker = function (latLonAlt, markerOptions) {
-        if (markerOptions.type === "marker") {
-            return new Component_1.SimpleMarker(latLonAlt, markerOptions);
+    /**
+     * Remove a point from the point set.
+     *
+     * @param {number} index - The index of the point to remove.
+     * @ignore
+     */
+    PointsGeometry.prototype.removePoint2d = function (index) {
+        if (index < 0 ||
+            index >= this._points.length ||
+            this._points.length < 3) {
+            throw new Component_1.GeometryTagError("Index for removed point must be valid.");
         }
-        return null;
+        this._points.splice(index, 1);
+        this._notifyChanged$.next(this);
     };
-    MarkerComponent.prototype.addMarker = function (marker) {
-        this._markerSet.addMarker(marker);
+    /** @ignore */
+    PointsGeometry.prototype.setVertex2d = function (index, value, transform) {
+        this.setPoint2d(index, value, transform);
     };
-    Object.defineProperty(MarkerComponent.prototype, "markers$", {
-        get: function () {
-            return this._markerSet.markers$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MarkerComponent.prototype.removeMarker = function (id) {
-        this._markerSet.removeMarker(id);
+    /** @ignore */
+    PointsGeometry.prototype.setPoint2d = function (index, value, transform) {
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        this._points[index] = changed;
+        this._notifyChanged$.next(this);
     };
-    MarkerComponent.prototype._renderHash = function (args) {
-        // determine if render is needed while updating scene
-        // specific properies.
-        var needsRender = this._updateScene(args);
-        // return render hash with render function and
-        // render in foreground.
-        return {
-            name: this._name,
-            render: {
-                frameId: args.frame.id,
-                needsRender: needsRender,
-                render: this._render.bind(this),
-                stage: Render_1.GLRenderStage.Foreground,
-            },
-        };
+    /** @ignore */
+    PointsGeometry.prototype.getPoints3d = function (transform) {
+        return this._getPoints3d(this._points, transform);
     };
-    MarkerComponent.prototype._updateScene = function (args) {
-        if (!args.frame ||
-            !args.markers ||
-            !args.frame.state.currentNode) {
-            return false;
-        }
-        var needRender = false;
-        var oldObjects = this._markerObjects;
-        var node = args.frame.state.currentNode;
-        this._markerObjects = {};
-        var boxWidth = 0.001;
-        var minLon = node.latLon.lon - boxWidth / 2;
-        var minLat = node.latLon.lat - boxWidth / 2;
-        var maxLon = node.latLon.lon + boxWidth / 2;
-        var maxLat = node.latLon.lat + boxWidth / 2;
-        var markers = _.map(args.markers.search({ maxX: maxLon, maxY: maxLat, minX: minLon, minY: minLat }), function (item) {
-            return item.marker;
-        }).filter(function (marker) {
-            return marker.visibleInKeys.length === 0 || _.contains(marker.visibleInKeys, node.key);
-        });
-        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-            var marker = markers_1[_i];
-            if (marker.id in oldObjects) {
-                this._markerObjects[marker.id] = oldObjects[marker.id];
-                delete oldObjects[marker.id];
-            }
-            else {
-                var reference = args.frame.state.reference;
-                var p = (new Geo_1.GeoCoords).geodeticToEnu(marker.latLonAlt.lat, marker.latLonAlt.lon, marker.latLonAlt.alt, reference.lat, reference.lon, reference.alt);
-                var o = marker.createGeometry();
-                o.position.set(p[0], p[1], p[2]);
-                this._scene.add(o);
-                this._markerObjects[marker.id] = o;
-                needRender = true;
-            }
-        }
-        for (var i in oldObjects) {
-            if (oldObjects.hasOwnProperty(i)) {
-                this._disposeObject(oldObjects[i]);
-                needRender = true;
-            }
-        }
-        return needRender;
+    /** @ignore */
+    PointsGeometry.prototype.getPoint3d = function (index, transform) {
+        return transform.unprojectBasic(this._points[index], 200);
     };
-    MarkerComponent.prototype._render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
+    /** @ignore */
+    PointsGeometry.prototype.getPoints2d = function () {
+        return this._points.slice();
     };
-    MarkerComponent.prototype._disposeObject = function (object) {
-        this._scene.remove(object);
-        for (var i = 0; i < object.children.length; ++i) {
-            var c = object.children[i];
-            c.geometry.dispose();
-            c.material.dispose();
+    /** @ignore */
+    PointsGeometry.prototype.getCentroid2d = function (transform) {
+        if (!transform) {
+            throw new Component_1.GeometryTagError("Get centroid must be called with a transform for points geometries.");
         }
+        var _a = this.getRect2d(transform), minX = _a[0], minY = _a[1], maxX = _a[2], maxY = _a[3];
+        var centroidX = minX < maxX ?
+            (minX + maxX) / 2 :
+            ((minX + maxX + 1) / 2) % 1;
+        var centroidY = (minY + maxY) / 2;
+        return [centroidX, centroidY];
     };
-    MarkerComponent.prototype._disposeScene = function () {
-        for (var i in this._markerObjects) {
-            if (this._markerObjects.hasOwnProperty(i)) {
-                this._disposeObject(this._markerObjects[i]);
+    /** @ignore */
+    PointsGeometry.prototype.getCentroid3d = function (transform) {
+        var centroid2d = this.getCentroid2d();
+        return transform.unprojectBasic(centroid2d, 200);
+    };
+    /** @ignore */
+    PointsGeometry.prototype.getRect2d = function (transform) {
+        var minX = 1;
+        var maxX = 0;
+        var minY = 1;
+        var maxY = 0;
+        var points = this._points;
+        for (var _i = 0, points_2 = points; _i < points_2.length; _i++) {
+            var point = points_2[_i];
+            if (point[0] < minX) {
+                minX = point[0];
+            }
+            if (point[0] > maxX) {
+                maxX = point[0];
+            }
+            if (point[1] < minY) {
+                minY = point[1];
+            }
+            if (point[1] > maxY) {
+                maxY = point[1];
+            }
+        }
+        if (transform.fullPano) {
+            var indices = [];
+            for (var i = 0; i < points.length; i++) {
+                indices[i] = i;
+            }
+            indices.sort(function (a, b) {
+                return points[a][0] < points[b][0] ?
+                    -1 :
+                    points[a][0] > points[b][0] ?
+                        1 :
+                        a < b ? -1 : 1;
+            });
+            var maxDistanceX = points[indices[0]][0] + 1 - points[indices[indices.length - 1]][0];
+            var leftMostIndex = 0;
+            for (var i = 0; i < indices.length - 1; i++) {
+                var index1 = indices[i];
+                var index2 = indices[i + 1];
+                var distanceX = points[index2][0] - points[index1][0];
+                if (distanceX > maxDistanceX) {
+                    maxDistanceX = distanceX;
+                    leftMostIndex = i + 1;
+                }
+            }
+            if (leftMostIndex > 0) {
+                minX = points[indices[leftMostIndex]][0];
+                maxX = points[indices[leftMostIndex - 1]][0];
             }
         }
-        this._markerObjects = {};
+        return [minX, minY, maxX, maxY];
     };
-    MarkerComponent.componentName = "marker";
-    return MarkerComponent;
-}(Component_1.Component));
-exports.MarkerComponent = MarkerComponent;
-Component_1.ComponentService.register(MarkerComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MarkerComponent;
+    /** @ignore */
+    PointsGeometry.prototype.setCentroid2d = function (value, transform) {
+        throw new Error("Not implemented");
+    };
+    PointsGeometry.prototype._getPoints3d = function (points2d, transform) {
+        return points2d
+            .map(function (point) {
+            return transform.unprojectBasic(point, 200);
+        });
+    };
+    return PointsGeometry;
+}(Component_1.Geometry));
+exports.PointsGeometry = PointsGeometry;
+exports.default = PointsGeometry;
 
-},{"../../Component":207,"../../Geo":210,"../../Render":213,"rbush":24,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"three":157,"underscore":158}],244:[function(require,module,exports){
+},{"../../../Component":291}],378:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var Component_1 = require("../../Component");
-var SimpleMarker = (function (_super) {
-    __extends(SimpleMarker, _super);
-    function SimpleMarker(latLonAlt, markerOptions) {
-        _super.call(this, latLonAlt, markerOptions);
-        this._circleToRayAngle = 2.0;
-        this._simpleMarkerStyle = markerOptions.style;
-    }
-    SimpleMarker.prototype.createGeometry = function () {
-        var radius = 2;
-        var cone = new THREE.Mesh(this._markerGeometry(radius, 16, 8), new THREE.MeshBasicMaterial({
-            color: this._stringToRBG(this._simpleMarkerStyle.color),
-            depthWrite: false,
-            opacity: this._simpleMarkerStyle.opacity,
-            shading: THREE.SmoothShading,
-            transparent: true,
-        }));
-        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 16, 8), new THREE.MeshBasicMaterial({
-            color: this._stringToRBG(this._simpleMarkerStyle.ballColor),
-            depthWrite: false,
-            opacity: this._simpleMarkerStyle.ballOpacity,
-            shading: THREE.SmoothShading,
-            transparent: true,
-        }));
-        ball.position.z = this._markerHeight(radius);
-        var group = new THREE.Object3D();
-        group.add(ball);
-        group.add(cone);
-        return group;
-    };
-    SimpleMarker.prototype._markerHeight = function (radius) {
-        var t = Math.tan(Math.PI - this._circleToRayAngle);
-        return radius * Math.sqrt(1 + t * t);
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    SimpleMarker.prototype._markerGeometry = function (radius, widthSegments, heightSegments) {
-        var geometry = new THREE.Geometry();
-        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
-        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
-        var height = this._markerHeight(radius);
-        var vertices = [];
-        for (var y = 0; y <= heightSegments; ++y) {
-            var verticesRow = [];
-            for (var x = 0; x <= widthSegments; ++x) {
-                var u = x / widthSegments * Math.PI * 2;
-                var v = y / heightSegments * Math.PI;
-                var r = void 0;
-                if (v < this._circleToRayAngle) {
-                    r = radius;
-                }
-                else {
-                    var t = Math.tan(v - this._circleToRayAngle);
-                    r = radius * Math.sqrt(1 + t * t);
-                }
-                var vertex = new THREE.Vector3();
-                vertex.x = r * Math.cos(u) * Math.sin(v);
-                vertex.y = r * Math.sin(u) * Math.sin(v);
-                vertex.z = r * Math.cos(v) + height;
-                geometry.vertices.push(vertex);
-                verticesRow.push(geometry.vertices.length - 1);
-            }
-            vertices.push(verticesRow);
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PolygonGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class PolygonGeometry
+ *
+ * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.
+ * All polygons and holes provided to the constructor needs to be closed.
+ *
+ * @example
+ * ```
+ * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];
+ * var polygonGeometry = new Mapillary.TagComponent.PolygonGeometry(basicPolygon);
+ * ```
+ */
+var PolygonGeometry = /** @class */ (function (_super) {
+    __extends(PolygonGeometry, _super);
+    /**
+     * Create a polygon geometry.
+     *
+     * @constructor
+     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
+     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
+     * Each array of holes vertices must be closed.
+     *
+     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
+     */
+    function PolygonGeometry(polygon, holes) {
+        var _this = _super.call(this) || this;
+        var polygonLength = polygon.length;
+        if (polygonLength < 3) {
+            throw new Component_1.GeometryTagError("A polygon must have three or more positions.");
         }
-        for (var y = 0; y < heightSegments; ++y) {
-            for (var x = 0; x < widthSegments; ++x) {
-                var v1 = vertices[y][x + 1];
-                var v2 = vertices[y][x];
-                var v3 = vertices[y + 1][x];
-                var v4 = vertices[y + 1][x + 1];
-                var n1 = geometry.vertices[v1].clone().normalize();
-                var n2 = geometry.vertices[v2].clone().normalize();
-                var n3 = geometry.vertices[v3].clone().normalize();
-                var n4 = geometry.vertices[v4].clone().normalize();
-                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));
-                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));
+        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||
+            polygon[0][1] !== polygon[polygonLength - 1][1]) {
+            throw new Component_1.GeometryTagError("First and last positions must be equivalent.");
+        }
+        _this._polygon = [];
+        for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) {
+            var vertex = polygon_1[_i];
+            if (vertex[0] < 0 || vertex[0] > 1 ||
+                vertex[1] < 0 || vertex[1] > 1) {
+                throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");
             }
+            _this._polygon.push(vertex.slice());
         }
-        geometry.computeFaceNormals();
-        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);
-        return geometry;
-    };
-    SimpleMarker.prototype._stringToRBG = function (str) {
-        var ret = 0;
-        for (var i = 0; i < str.length; i++) {
-            ret = str.charCodeAt(i) + ((ret << 5) - ret);
+        _this._holes = [];
+        if (holes == null) {
+            return _this;
         }
-        return ret;
-    };
-    return SimpleMarker;
-}(Component_1.Marker));
-exports.SimpleMarker = SimpleMarker;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SimpleMarker;
-
-},{"../../Component":207,"three":157}],245:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-/**
- * @class SequenceComponent
- * @classdesc Component showing navigation arrows for sequence directions
- * as well as playing button. Exposes an API to start and stop play.
- */
-var SequenceComponent = (function (_super) {
-    __extends(SequenceComponent, _super);
-    function SequenceComponent(name, container, navigator) {
-        _super.call(this, name, container, navigator);
-        this._nodesAhead = 5;
-        this._configurationOperation$ = new Subject_1.Subject();
-        this._sequenceDOMRenderer = new Component_1.SequenceDOMRenderer(container.element);
-        this._sequenceDOMInteraction = new Component_1.SequenceDOMInteraction();
-        this._containerWidth$ = new Subject_1.Subject();
-        this._hoveredKeySubject$ = new Subject_1.Subject();
-        this._hoveredKey$ = this._hoveredKeySubject$.share();
-        this._edgeStatus$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .publishReplay(1)
-            .refCount();
+        for (var i = 0; i < holes.length; i++) {
+            var hole = holes[i];
+            var holeLength = hole.length;
+            if (holeLength < 3) {
+                throw new Component_1.GeometryTagError("A polygon hole must have three or more positions.");
+            }
+            if (hole[0][0] !== hole[holeLength - 1][0] ||
+                hole[0][1] !== hole[holeLength - 1][1]) {
+                throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent.");
+            }
+            _this._holes.push([]);
+            for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) {
+                var vertex = hole_1[_a];
+                if (vertex[0] < 0 || vertex[0] > 1 ||
+                    vertex[1] < 0 || vertex[1] > 1) {
+                    throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");
+                }
+                _this._holes[i].push(vertex.slice());
+            }
+        }
+        return _this;
     }
-    Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
+    Object.defineProperty(PolygonGeometry.prototype, "polygon", {
         /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
+         * Get polygon property.
+         * @returns {Array<Array<number>>} Closed 2d polygon.
          */
         get: function () {
-            return this._hoveredKey$;
+            return this._polygon;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(PolygonGeometry.prototype, "holes", {
+        /**
+         * Get holes property.
+         * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
+         */
+        get: function () {
+            return this._holes;
+        },
+        enumerable: false,
         configurable: true
     });
     /**
-     * Start playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    /**
-     * Stop playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    /**
-     * Set the direction to follow when playing.
-     *
-     * @param {EdgeDirection} direction - The direction that will be followed when playing.
-     */
-    SequenceComponent.prototype.setDirection = function (direction) {
-        this.configure({ direction: direction });
-    };
-    /**
-     * Set highlight key.
-     *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
-     *
-     * @param {string} highlightKey Key of node to be highlighted if existing.
-     */
-    SequenceComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
-    };
-    /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * Add a vertex to the polygon by appending it after the last vertex.
      *
-     * @param {number} minWidth
+     * @param {Array<number>} vertex - Vertex to add.
+     * @ignore
      */
-    SequenceComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
+    PolygonGeometry.prototype.addVertex2d = function (vertex) {
+        var clamped = [
+            Math.max(0, Math.min(1, vertex[0])),
+            Math.max(0, Math.min(1, vertex[1])),
+        ];
+        this._polygon.splice(this._polygon.length - 1, 0, clamped);
+        this._notifyChanged$.next(this);
     };
     /**
-     * Set min width of container element.
-     *
-     * @description Set min width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * Get the coordinates of a vertex from the polygon representation of the geometry.
      *
-     * @param {number} minWidth
+     * @param {number} index - Vertex index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+     * @ignore
      */
-    SequenceComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
+    PolygonGeometry.prototype.getVertex2d = function (index) {
+        return this._polygon[index].slice();
     };
     /**
-     * Set the value indicating whether the sequence UI elements should be visible.
+     * Remove a vertex from the polygon.
      *
-     * @param {boolean} visible
+     * @param {number} index - The index of the vertex to remove.
+     * @ignore
      */
-    SequenceComponent.prototype.setVisible = function (visible) {
-        this.configure({ visible: visible });
-    };
-    /** @inheritdoc */
-    SequenceComponent.prototype.resize = function () {
-        var _this = this;
-        this._configuration$
-            .first()
-            .map(function (configuration) {
-            return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
-        })
-            .subscribe(function (containerWidth) {
-            _this._containerWidth$.next(containerWidth);
-        });
+    PolygonGeometry.prototype.removeVertex2d = function (index) {
+        if (index < 0 ||
+            index >= this._polygon.length ||
+            this._polygon.length < 4) {
+            throw new Component_1.GeometryTagError("Index for removed vertex must be valid.");
+        }
+        if (index > 0 && index < this._polygon.length - 1) {
+            this._polygon.splice(index, 1);
+        }
+        else {
+            this._polygon.splice(0, 1);
+            this._polygon.pop();
+            var closing = this._polygon[0].slice();
+            this._polygon.push(closing);
+        }
+        this._notifyChanged$.next(this);
     };
-    SequenceComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = Observable_1.Observable
-            .combineLatest(this._edgeStatus$, this._configuration$, this._containerWidth$)
-            .map(function (ec) {
-            var edgeStatus = ec[0];
-            var configuration = ec[1];
-            var containerWidth = ec[2];
-            var vNode = _this._sequenceDOMRenderer
-                .render(edgeStatus, configuration, containerWidth, _this, _this._sequenceDOMInteraction, _this._navigator);
-            return { name: _this._name, vnode: vNode };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._containerWidthSubscription = this._configuration$
-            .distinctUntilChanged(function (value1, value2) {
-            return value1[0] === value2[0] && value1[1] === value2[1];
-        }, function (configuration) {
-            return [configuration.minWidth, configuration.maxWidth];
-        })
-            .map(function (configuration) {
-            return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
-        })
-            .subscribe(this._containerWidth$);
-        this._configurationSubscription = this._configurationOperation$
-            .scan(function (configuration, operation) {
-            return operation(configuration);
-        }, { playing: false })
-            .finally(function () {
-            if (_this._playingSubscription != null) {
-                _this._navigator.stateService.cutNodes();
-                _this._stop();
-            }
-        })
-            .subscribe();
-        this._configuration$
-            .map(function (newConfiguration) {
-            return function (configuration) {
-                if (newConfiguration.playing !== configuration.playing) {
-                    _this._navigator.stateService.cutNodes();
-                    if (newConfiguration.playing) {
-                        _this._play();
-                    }
-                    else {
-                        _this._stop();
-                    }
-                }
-                configuration.playing = newConfiguration.playing;
-                return configuration;
-            };
-        })
-            .subscribe(this._configurationOperation$);
-        this._stopSubscription = this._configuration$
-            .switchMap(function (configuration) {
-            var edgeStatus$ = configuration.playing ?
-                _this._edgeStatus$ :
-                Observable_1.Observable.empty();
-            var edgeDirection$ = Observable_1.Observable
-                .of(configuration.direction);
-            return Observable_1.Observable
-                .combineLatest(edgeStatus$, edgeDirection$);
-        })
-            .map(function (ne) {
-            var edgeStatus = ne[0];
-            var direction = ne[1];
-            if (!edgeStatus.cached) {
-                return true;
-            }
-            for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return true;
-                }
-            }
-            return false;
-        })
-            .filter(function (hasEdge) {
-            return !hasEdge;
-        })
-            .map(function (hasEdge) {
-            return { playing: false };
-        })
-            .subscribe(this._configurationSubject$);
-        this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$
-            .switchMap(function (direction) {
-            return _this._edgeStatus$
-                .map(function (edgeStatus) {
-                for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            })
-                .takeUntil(_this._sequenceDOMInteraction.mouseLeaveDirection$)
-                .concat(Observable_1.Observable.of(null));
-        })
-            .distinctUntilChanged()
-            .subscribe(this._hoveredKeySubject$);
+    /** @ignore */
+    PolygonGeometry.prototype.setVertex2d = function (index, value, transform) {
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        if (index === 0 || index === this._polygon.length - 1) {
+            this._polygon[0] = changed.slice();
+            this._polygon[this._polygon.length - 1] = changed.slice();
+        }
+        else {
+            this._polygon[index] = changed.slice();
+        }
+        this._notifyChanged$.next(this);
     };
-    SequenceComponent.prototype._deactivate = function () {
-        this._stopSubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._configurationSubscription.unsubscribe();
-        this._containerWidthSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this.stop();
+    /** @ignore */
+    PolygonGeometry.prototype.setCentroid2d = function (value, transform) {
+        var xs = this._polygon.map(function (point) { return point[0]; });
+        var ys = this._polygon.map(function (point) { return point[1]; });
+        var minX = Math.min.apply(Math, xs);
+        var maxX = Math.max.apply(Math, xs);
+        var minY = Math.min.apply(Math, ys);
+        var maxY = Math.max.apply(Math, ys);
+        var centroid = this.getCentroid2d();
+        var minTranslationX = -minX;
+        var maxTranslationX = 1 - maxX;
+        var minTranslationY = -minY;
+        var maxTranslationY = 1 - maxY;
+        var translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));
+        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));
+        for (var _i = 0, _a = this._polygon; _i < _a.length; _i++) {
+            var point = _a[_i];
+            point[0] += translationX;
+            point[1] += translationY;
+        }
+        this._notifyChanged$.next(this);
     };
-    SequenceComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            direction: Edge_1.EdgeDirection.Next,
-            maxWidth: 117,
-            minWidth: 70,
-            playing: false,
-            visible: true,
-        };
+    /** @ignore */
+    PolygonGeometry.prototype.getPoints3d = function (transform) {
+        return this._getPoints3d(this._subsample(this._polygon), transform);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
+        return transform.unprojectBasic(this._polygon[index], 200);
     };
-    SequenceComponent.prototype._play = function () {
+    /** @ignore */
+    PolygonGeometry.prototype.getVertices2d = function () {
+        return this._polygon.slice();
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getVertices3d = function (transform) {
+        return this._getPoints3d(this._polygon, transform);
+    };
+    /**
+     * Get a polygon representation of the 3D coordinates for the vertices of each hole
+     * of the geometry. Line segments between vertices will possibly be subsampled
+     * resulting in a larger number of points than the total number of vertices.
+     *
+     * @param {Transform} transform - The transform of the node related to the geometry.
+     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
+     * representing the vertices of each hole of the geometry.
+     * @ignore
+     */
+    PolygonGeometry.prototype.getHolePoints3d = function (transform) {
         var _this = this;
-        this._playingSubscription = this._navigator.stateService.currentState$
-            .filter(function (frame) {
-            return frame.state.nodesAhead < _this._nodesAhead;
-        })
-            .map(function (frame) {
-            return frame.state.lastNode;
-        })
-            .distinctUntilChanged(undefined, function (lastNode) {
-            return lastNode.key;
-        })
-            .withLatestFrom(this._configuration$, function (lastNode, configuration) {
-            return [lastNode, configuration.direction];
-        })
-            .switchMap(function (nd) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(nd[1]) > -1 ?
-                nd[0].sequenceEdges$ :
-                nd[0].spatialEdges$)
-                .filter(function (status) {
-                return status.cached;
-            })
-                .zip(Observable_1.Observable.of(nd[1]), function (status, direction) {
-                return [status, direction];
-            });
-        })
-            .map(function (ed) {
-            var direction = ed[1];
-            for (var _i = 0, _a = ed[0].edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return edge.to;
-                }
-            }
-            return null;
-        })
-            .filter(function (key) {
-            return key != null;
-        })
-            .switchMap(function (key) {
-            return _this._navigator.graphService.cacheNode$(key);
-        })
-            .subscribe(function (node) {
-            _this._navigator.stateService.appendNodes([node]);
-        }, function (error) {
-            console.error(error);
-            _this.stop();
+        return this._holes
+            .map(function (hole2d) {
+            return _this._getPoints3d(_this._subsample(hole2d), transform);
         });
-        this.fire(SequenceComponent.playingchanged, true);
-    };
-    SequenceComponent.prototype._stop = function () {
-        this._playingSubscription.unsubscribe();
-        this._playingSubscription = null;
-        this.fire(SequenceComponent.playingchanged, false);
     };
-    /** @inheritdoc */
-    SequenceComponent.componentName = "sequence";
     /**
-     * Event fired when playing starts or stops.
+     * Get a polygon representation of the 3D coordinates for the vertices of each hole
+     * of the geometry.
      *
-     * @event PlayerComponent#playingchanged
-     * @type {boolean} Indicates whether the player is playing.
+     * @param {Transform} transform - The transform of the node related to the geometry.
+     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
+     * representing the vertices of each hole of the geometry.
+     * @ignore
      */
-    SequenceComponent.playingchanged = "playingchanged";
-    return SequenceComponent;
-}(Component_1.Component));
-exports.SequenceComponent = SequenceComponent;
-Component_1.ComponentService.register(SequenceComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SequenceComponent;
-
-},{"../../Component":207,"../../Edge":208,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/of":44,"rxjs/add/operator/concat":50,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/finally":57,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/takeUntil":75,"rxjs/add/operator/withLatestFrom":76}],246:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var SequenceDOMInteraction = (function () {
-    function SequenceDOMInteraction() {
-        this._mouseEnterDirection$ = new Subject_1.Subject();
-        this._mouseLeaveDirection$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(SequenceDOMInteraction.prototype, "mouseEnterDirection$", {
-        get: function () {
-            return this._mouseEnterDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMInteraction.prototype, "mouseLeaveDirection$", {
-        get: function () {
-            return this._mouseLeaveDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return SequenceDOMInteraction;
-}());
-exports.SequenceDOMInteraction = SequenceDOMInteraction;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SequenceDOMInteraction;
-
-},{"rxjs/Subject":33}],247:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var vd = require("virtual-dom");
-var Edge_1 = require("../../Edge");
-var SequenceDOMRenderer = (function () {
-    function SequenceDOMRenderer(element) {
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-    }
-    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, component, interaction, navigator) {
-        if (configuration.visible === false) {
-            return vd.h("div.SequenceContainer", {}, []);
-        }
-        var nextKey = null;
-        var prevKey = null;
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
-                nextKey = edge.to;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
-                prevKey = edge.to;
-            }
-        }
-        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
-        var arrows = this._createSequenceArrows(nextKey, prevKey, configuration, interaction, navigator);
-        var containerProperties = {
-            style: { height: (0.27 * containerWidth) + "px", width: containerWidth + "px" },
-        };
-        return vd.h("div.SequenceContainer", containerProperties, arrows.concat([playingButton]));
+    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
+        var _this = this;
+        return this._holes
+            .map(function (hole2d) {
+            return _this._getPoints3d(hole2d, transform);
+        });
     };
-    SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) {
-        var elementWidth = element.offsetWidth;
-        var elementHeight = element.offsetHeight;
-        var minWidth = configuration.minWidth;
-        var maxWidth = configuration.maxWidth;
-        if (maxWidth < minWidth) {
-            maxWidth = minWidth;
+    /** @ignore */
+    PolygonGeometry.prototype.getCentroid2d = function () {
+        var polygon = this._polygon;
+        var area = 0;
+        var centroidX = 0;
+        var centroidY = 0;
+        for (var i = 0; i < polygon.length - 1; i++) {
+            var xi = polygon[i][0];
+            var yi = polygon[i][1];
+            var xi1 = polygon[i + 1][0];
+            var yi1 = polygon[i + 1][1];
+            var a = xi * yi1 - xi1 * yi;
+            area += a;
+            centroidX += (xi + xi1) * a;
+            centroidY += (yi + yi1) * a;
         }
-        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        return minWidth + coeff * (maxWidth - minWidth);
+        area /= 2;
+        centroidX /= 6 * area;
+        centroidY /= 6 * area;
+        return [centroidX, centroidY];
     };
-    SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
-        var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
-            configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
-        var onclick = configuration.playing ?
-            function (e) { component.stop(); } :
-            canPlay ? function (e) { component.play(); } : null;
-        var buttonProperties = {
-            onclick: onclick,
-            style: {},
-        };
-        var iconClass = configuration.playing ?
-            "Stop" :
-            canPlay ? "Play" : "PlayDisabled";
-        var icon = vd.h("div.SequenceComponentIcon", { className: iconClass }, []);
-        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
-        return vd.h("div." + buttonClass, buttonProperties, [icon]);
+    /** @ignore */
+    PolygonGeometry.prototype.getCentroid3d = function (transform) {
+        var centroid2d = this.getCentroid2d();
+        return transform.unprojectBasic(centroid2d, 200);
     };
-    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, configuration, interaction, navigator) {
-        var nextProperties = {
-            onclick: nextKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
-                        .subscribe(function (node) { return; }, function (error) { console.error(error); });
-                } :
-                null,
-            onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
-            onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
-            style: {},
-        };
-        var prevProperties = {
-            onclick: prevKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
-                        .subscribe(function (node) { return; }, function (error) { console.error(error); });
-                } :
-                null,
-            onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
-            onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
-            style: {},
-        };
-        var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
-        var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
-        var nextIcon = vd.h("div.SequenceComponentIcon", []);
-        var prevIcon = vd.h("div.SequenceComponentIcon", []);
-        return [
-            vd.h("div." + nextClass, nextProperties, [nextIcon]),
-            vd.h("div." + prevClass, prevProperties, [prevIcon]),
-        ];
+    /** @ignore */
+    PolygonGeometry.prototype.get3dDomainTriangles3d = function (transform) {
+        var _this = this;
+        return this._triangulate(this._project(this._polygon, transform), this.getVertices3d(transform), this._holes
+            .map(function (hole2d) {
+            return _this._project(hole2d, transform);
+        }), this.getHoleVertices3d(transform));
     };
-    SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
-        var className = direction === Edge_1.EdgeDirection.Next ?
-            "SequenceStepNext" :
-            "SequenceStepPrev";
-        if (key == null) {
-            className += "Disabled";
-        }
-        else {
-            if (highlightKey === key) {
-                className += "Highlight";
-            }
-        }
-        return className;
+    /** @ignore */
+    PolygonGeometry.prototype.getTriangles3d = function (transform) {
+        var _this = this;
+        if (transform.fullPano) {
+            return this._triangulatePano(this._polygon.slice(), this.holes.slice(), transform);
+        }
+        var points2d = this._project(this._subsample(this._polygon), transform);
+        var points3d = this.getPoints3d(transform);
+        var holes2d = this._holes
+            .map(function (hole) {
+            return _this._project(_this._subsample(hole), transform);
+        });
+        var holes3d = this.getHolePoints3d(transform);
+        return this._triangulate(points2d, points3d, holes2d, holes3d);
     };
-    return SequenceDOMRenderer;
-}());
-exports.SequenceDOMRenderer = SequenceDOMRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SequenceDOMRenderer;
-
-},{"../../Edge":208,"virtual-dom":163}],248:[function(require,module,exports){
-"use strict";
-var GeometryTagError_1 = require("./error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
-var PointGeometry_1 = require("./geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var RectGeometry_1 = require("./geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var OutlineTag_1 = require("./tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var SpotTag_1 = require("./tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var Alignment_1 = require("./tag/Alignment");
-exports.Alignment = Alignment_1.Alignment;
-var TagComponent_1 = require("./TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
+    /** @ignore */
+    PolygonGeometry.prototype.getPoleOfInaccessibility2d = function () {
+        return this._getPoleOfInaccessibility2d(this._polygon.slice());
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
+        var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice());
+        return transform.unprojectBasic(pole2d, 200);
+    };
+    PolygonGeometry.prototype._getPoints3d = function (points2d, transform) {
+        return points2d
+            .map(function (point) {
+            return transform.unprojectBasic(point, 200);
+        });
+    };
+    return PolygonGeometry;
+}(Component_1.VertexGeometry));
+exports.PolygonGeometry = PolygonGeometry;
+exports.default = PolygonGeometry;
 
-},{"./TagComponent":249,"./error/GeometryTagError":255,"./geometry/PointGeometry":257,"./geometry/PolygonGeometry":258,"./geometry/RectGeometry":259,"./tag/Alignment":261,"./tag/OutlineTag":264,"./tag/SpotTag":267}],249:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../../Component":291}],379:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/empty");
-require("rxjs/add/observable/from");
-require("rxjs/add/observable/merge");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/skipUntil");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/take");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-/**
- * @class TagComponent
- * @classdesc Component for showing and editing tags with different geometries.
- */
-var TagComponent = (function (_super) {
-    __extends(TagComponent, _super);
-    function TagComponent(name, container, navigator) {
-        var _this = this;
-        _super.call(this, name, container, navigator);
-        this._tagDomRenderer = new Component_1.TagDOMRenderer();
-        this._tagSet = new Component_1.TagSet();
-        this._tagCreator = new Component_1.TagCreator();
-        this._tagGlRendererOperation$ = new Subject_1.Subject();
-        this._tagGlRenderer$ = this._tagGlRendererOperation$
-            .startWith(function (renderer) {
-            return renderer;
-        })
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, new Component_1.TagGLRenderer());
-        this._tags$ = this._tagSet.tagData$
-            .map(function (tagData) {
-            var tags = [];
-            // ensure that tags are always rendered in the same order
-            // to avoid hover tracking problems on first resize.
-            for (var _i = 0, _a = Object.keys(tagData).sort(); _i < _a.length; _i++) {
-                var key = _a[_i];
-                tags.push(tagData[key]);
-            }
-            return tags;
-        })
-            .share();
-        this._renderTags$ = this.tags$
-            .withLatestFrom(this._navigator.stateService.currentTransform$)
-            .map(function (args) {
-            var tags = args[0];
-            var transform = args[1];
-            var renderTags = tags
-                .map(function (tag) {
-                if (tag instanceof Component_1.OutlineTag) {
-                    return new Component_1.OutlineRenderTag(tag, transform);
-                }
-                else if (tag instanceof Component_1.SpotTag) {
-                    return new Component_1.SpotRenderTag(tag, transform);
-                }
-                throw new Error("Tag type not supported");
-            });
-            return renderTags;
-        })
-            .share();
-        this._tagChanged$ = this._tags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return Observable_1.Observable
-                    .merge(tag.changed$, tag.geometryChanged$);
-            });
-        })
-            .share();
-        this._renderTagGLChanged$ = this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.glObjectsChanged$;
-            });
-        })
-            .share();
-        this._tagInterationInitiated$ = this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.interact$
-                    .map(function (interaction) {
-                    return interaction.tag.id;
-                });
-            });
-        })
-            .share();
-        this._tagInteractionAbort$ = Observable_1.Observable
-            .merge(this._container.mouseService.mouseUp$, this._container.mouseService.mouseLeave$)
-            .map(function (e) {
-            return;
-        })
-            .share();
-        this._activeTag$ = this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.interact$;
-            });
-        })
-            .merge(this._tagInteractionAbort$
-            .map(function () {
-            return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
-        }))
-            .share();
-        this._createGeometryChanged$ = this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.geometryChanged$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        this._tagCreated$ = this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.created$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        this._vertexGeometryCreated$ = this._tagCreated$
-            .map(function (tag) {
-            return tag.geometry;
-        })
-            .share();
-        this._pointGeometryCreated$ = new Subject_1.Subject();
-        this._geometryCreated$ = Observable_1.Observable
-            .merge(this._vertexGeometryCreated$, this._pointGeometryCreated$)
-            .share();
-        this._basicClick$ = this._container.mouseService.staticClick$
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (event, renderCamera, transform) {
-            return [event, renderCamera, transform];
-        })
-            .map(function (ert) {
-            var event = ert[0];
-            var camera = ert[1];
-            var transform = ert[2];
-            var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            return basic;
-        })
-            .share();
-        this._validBasicClick$ = this._basicClick$
-            .filter(function (basic) {
-            var x = basic[0];
-            var y = basic[1];
-            return 0 <= x && x <= 1 && 0 <= y && y <= 1;
-        })
-            .share();
-        this._creatingConfiguration$ = this._configuration$
-            .distinctUntilChanged(function (c1, c2) {
-            return c1.creating === c2.creating && c1.createType === c2.createType;
-        }, function (configuration) {
-            return {
-                createColor: configuration.createColor,
-                createType: configuration.createType,
-                creating: configuration.creating,
-            };
-        })
-            .publishReplay(1)
-            .refCount();
-        this._creating$ = this._creatingConfiguration$
-            .map(function (configuration) {
-            return configuration.creating;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._creating$
-            .subscribe(function (creating) {
-            _this.fire(TagComponent.creatingchanged, creating);
-        });
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RectGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class RectGeometry
+ *
+ * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.
+ *
+ * @example
+ * ```
+ * var basicRect = [0.5, 0.3, 0.7, 0.4];
+ * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);
+ * ```
+ */
+var RectGeometry = /** @class */ (function (_super) {
+    __extends(RectGeometry, _super);
+    /**
+     * Create a rectangle geometry.
+     *
+     * @constructor
+     * @param {Array<number>} rect - An array representing the top-left and bottom-right
+     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
+     *
+     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
+     */
+    function RectGeometry(rect) {
+        var _this = _super.call(this) || this;
+        if (rect[1] > rect[3]) {
+            throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted.");
+        }
+        for (var _i = 0, rect_1 = rect; _i < rect_1.length; _i++) {
+            var coord = rect_1[_i];
+            if (coord < 0 || coord > 1) {
+                throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
+            }
+        }
+        _this._anchorIndex = undefined;
+        _this._rect = rect.slice(0, 4);
+        _this._inverted = _this._rect[0] > _this._rect[2];
+        return _this;
     }
-    Object.defineProperty(TagComponent.prototype, "tags$", {
+    Object.defineProperty(RectGeometry.prototype, "anchorIndex", {
         /**
-         * Get tags observable.
-         *
-         * @description An observable emitting every time the items in the
-         * tag array changes.
+         * Get anchor index property.
          *
-         * @returns {Observable<Tag[]>}
+         * @returns {number} Index representing the current anchor property if
+         * achoring indexing has been initialized. If anchor indexing has not been
+         * initialized or has been terminated undefined will be returned.
+         * @ignore
          */
         get: function () {
-            return this._tags$;
+            return this._anchorIndex;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(TagComponent.prototype, "geometryCreated$", {
+    Object.defineProperty(RectGeometry.prototype, "inverted", {
         /**
-         * Get geometry created observable.
+         * Get inverted property.
          *
-         * @description An observable emitting every time a geometry
-         * has been created.
+         * @returns {boolean} Boolean determining whether the rect geometry is
+         * inverted. For panoramas the rect geometrye may be inverted.
+         * @ignore
+         */
+        get: function () {
+            return this._inverted;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RectGeometry.prototype, "rect", {
+        /**
+         * Get rect property.
          *
-         * @returns {Observable<Geometry>}
+         * @returns {Array<number>} Array representing the top-left and bottom-right
+         * corners of the rectangle in basic coordinates.
          */
         get: function () {
-            return this._geometryCreated$;
+            return this._rect;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
-     * Set the tags to display.
+     * Initialize anchor indexing to enable setting opposite vertex.
+     *
+     * @param {number} [index] - The index of the vertex to use as anchor.
+     *
+     * @throws {Error} If anchor indexing has already been initialized.
+     * @throws {Error} If index is not valid (0 to 3).
+     * @ignore
+     */
+    RectGeometry.prototype.initializeAnchorIndexing = function (index) {
+        if (this._anchorIndex !== undefined) {
+            throw new Error("Anchor indexing is already initialized.");
+        }
+        if (index < 0 || index > 3) {
+            throw new Error("Invalid anchor index: " + index + ".");
+        }
+        this._anchorIndex = index === undefined ? 0 : index;
+    };
+    /**
+     * Terminate anchor indexing to disable setting pposite vertex.
+     * @ignore
+     */
+    RectGeometry.prototype.terminateAnchorIndexing = function () {
+        this._anchorIndex = undefined;
+    };
+    /**
+     * Set the value of the vertex opposite to the anchor in the polygon
+     * representation of the rectangle.
+     *
+     * @description Setting the opposite vertex may change the anchor index.
+     *
+     * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.
+     * @param {Transform} transform - The transform of the node related to the rectangle.
+     *
+     * @throws {Error} When anchor indexing has not been initialized.
+     * @ignore
+     */
+    RectGeometry.prototype.setOppositeVertex2d = function (opposite, transform) {
+        if (this._anchorIndex === undefined) {
+            throw new Error("Anchor indexing needs to be initialized.");
+        }
+        var changed = [
+            Math.max(0, Math.min(1, opposite[0])),
+            Math.max(0, Math.min(1, opposite[1])),
+        ];
+        var original = this._rect.slice();
+        var anchor = this._anchorIndex === 0 ? [original[0], original[3]] :
+            this._anchorIndex === 1 ? [original[0], original[1]] :
+                this._anchorIndex === 2 ? [original[2], original[1]] :
+                    [original[2], original[3]];
+        if (transform.fullPano) {
+            var deltaX = this._anchorIndex < 2 ?
+                changed[0] - original[2] :
+                changed[0] - original[0];
+            if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
+                // right side passes boundary rightward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+            }
+            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
+                // left side passes right side and boundary rightward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+            }
+            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) {
+                this._inverted = false;
+                if (anchor[0] > changed[0]) {
+                    // left side passes boundary rightward
+                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+                }
+                else {
+                    // left side passes right side and boundary rightward
+                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+                }
+            }
+            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
+                // left side passes boundary leftward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+            }
+            else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
+                // right side passes left side and boundary leftward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+            }
+            else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) {
+                this._inverted = false;
+                if (anchor[0] > changed[0]) {
+                    // right side passes boundary leftward
+                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+                }
+                else {
+                    // right side passes left side and boundary leftward
+                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+                }
+            }
+            else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) {
+                // inverted and right side passes left side completing a loop
+                this._inverted = false;
+                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+            }
+            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) {
+                // inverted and left side passes right side completing a loop
+                this._inverted = false;
+                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+            }
+            else if (this._inverted) {
+                // if still inverted only top and bottom can switch
+                if (this._anchorIndex < 2) {
+                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+                }
+                else {
+                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+                }
+            }
+            else {
+                // if still not inverted treat as non full pano
+                if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
+                    this._anchorIndex = 0;
+                }
+                else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
+                    this._anchorIndex = 1;
+                }
+                else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
+                    this._anchorIndex = 2;
+                }
+                else {
+                    this._anchorIndex = 3;
+                }
+            }
+            var rect = [];
+            if (this._anchorIndex === 0) {
+                rect[0] = anchor[0];
+                rect[1] = changed[1];
+                rect[2] = changed[0];
+                rect[3] = anchor[1];
+            }
+            else if (this._anchorIndex === 1) {
+                rect[0] = anchor[0];
+                rect[1] = anchor[1];
+                rect[2] = changed[0];
+                rect[3] = changed[1];
+            }
+            else if (this._anchorIndex === 2) {
+                rect[0] = changed[0];
+                rect[1] = anchor[1];
+                rect[2] = anchor[0];
+                rect[3] = changed[1];
+            }
+            else {
+                rect[0] = changed[0];
+                rect[1] = changed[1];
+                rect[2] = anchor[0];
+                rect[3] = anchor[1];
+            }
+            if (!this._inverted && rect[0] > rect[2] ||
+                this._inverted && rect[0] < rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+            if (rect[1] > rect[3]) {
+                rect[1] = original[1];
+                rect[3] = original[3];
+            }
+            this._rect[0] = rect[0];
+            this._rect[1] = rect[1];
+            this._rect[2] = rect[2];
+            this._rect[3] = rect[3];
+        }
+        else {
+            if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
+                this._anchorIndex = 0;
+            }
+            else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
+                this._anchorIndex = 1;
+            }
+            else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
+                this._anchorIndex = 2;
+            }
+            else {
+                this._anchorIndex = 3;
+            }
+            var rect = [];
+            if (this._anchorIndex === 0) {
+                rect[0] = anchor[0];
+                rect[1] = changed[1];
+                rect[2] = changed[0];
+                rect[3] = anchor[1];
+            }
+            else if (this._anchorIndex === 1) {
+                rect[0] = anchor[0];
+                rect[1] = anchor[1];
+                rect[2] = changed[0];
+                rect[3] = changed[1];
+            }
+            else if (this._anchorIndex === 2) {
+                rect[0] = changed[0];
+                rect[1] = anchor[1];
+                rect[2] = anchor[0];
+                rect[3] = changed[1];
+            }
+            else {
+                rect[0] = changed[0];
+                rect[1] = changed[1];
+                rect[2] = anchor[0];
+                rect[3] = anchor[1];
+            }
+            if (rect[0] > rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+            if (rect[1] > rect[3]) {
+                rect[1] = original[1];
+                rect[3] = original[3];
+            }
+            this._rect[0] = rect[0];
+            this._rect[1] = rect[1];
+            this._rect[2] = rect[2];
+            this._rect[3] = rect[3];
+        }
+        this._notifyChanged$.next(this);
+    };
+    /**
+     * Set the value of a vertex in the polygon representation of the rectangle.
+     *
+     * @description The polygon is defined to have the first vertex at the
+     * bottom-left corner with the rest of the vertices following in clockwise order.
+     *
+     * @param {number} index - The index of the vertex to be set.
+     * @param {Array<number>} value - The new value of the vertex.
+     * @param {Transform} transform - The transform of the node related to the rectangle.
+     * @ignore
+     */
+    RectGeometry.prototype.setVertex2d = function (index, value, transform) {
+        var original = this._rect.slice();
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        var rect = [];
+        if (index === 0) {
+            rect[0] = changed[0];
+            rect[1] = original[1];
+            rect[2] = original[2];
+            rect[3] = changed[1];
+        }
+        else if (index === 1) {
+            rect[0] = changed[0];
+            rect[1] = changed[1];
+            rect[2] = original[2];
+            rect[3] = original[3];
+        }
+        else if (index === 2) {
+            rect[0] = original[0];
+            rect[1] = changed[1];
+            rect[2] = changed[0];
+            rect[3] = original[3];
+        }
+        else if (index === 3) {
+            rect[0] = original[0];
+            rect[1] = original[1];
+            rect[2] = changed[0];
+            rect[3] = changed[1];
+        }
+        if (transform.fullPano) {
+            var passingBoundaryLeftward = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
+                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
+            var passingBoundaryRightward = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
+                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
+            if (passingBoundaryLeftward || passingBoundaryRightward) {
+                this._inverted = !this._inverted;
+            }
+            else {
+                if (rect[0] - original[0] < -0.25) {
+                    rect[0] = original[0];
+                }
+                if (rect[2] - original[2] > 0.25) {
+                    rect[2] = original[2];
+                }
+            }
+            if (!this._inverted && rect[0] > rect[2] ||
+                this._inverted && rect[0] < rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+        }
+        else {
+            if (rect[0] > rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+        }
+        if (rect[1] > rect[3]) {
+            rect[1] = original[1];
+            rect[3] = original[3];
+        }
+        this._rect[0] = rect[0];
+        this._rect[1] = rect[1];
+        this._rect[2] = rect[2];
+        this._rect[3] = rect[3];
+        this._notifyChanged$.next(this);
+    };
+    /** @ignore */
+    RectGeometry.prototype.setCentroid2d = function (value, transform) {
+        var original = this._rect.slice();
+        var x0 = original[0];
+        var x1 = this._inverted ? original[2] + 1 : original[2];
+        var y0 = original[1];
+        var y1 = original[3];
+        var centerX = x0 + (x1 - x0) / 2;
+        var centerY = y0 + (y1 - y0) / 2;
+        var translationX = 0;
+        if (transform.gpano != null &&
+            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {
+            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;
+        }
+        else {
+            var minTranslationX = -x0;
+            var maxTranslationX = 1 - x1;
+            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));
+        }
+        var minTranslationY = -y0;
+        var maxTranslationY = 1 - y1;
+        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));
+        this._rect[0] = original[0] + translationX;
+        this._rect[1] = original[1] + translationY;
+        this._rect[2] = original[2] + translationX;
+        this._rect[3] = original[3] + translationY;
+        if (this._rect[0] < 0) {
+            this._rect[0] += 1;
+            this._inverted = !this._inverted;
+        }
+        else if (this._rect[0] > 1) {
+            this._rect[0] -= 1;
+            this._inverted = !this._inverted;
+        }
+        if (this._rect[2] < 0) {
+            this._rect[2] += 1;
+            this._inverted = !this._inverted;
+        }
+        else if (this._rect[2] > 1) {
+            this._rect[2] -= 1;
+            this._inverted = !this._inverted;
+        }
+        this._notifyChanged$.next(this);
+    };
+    /**
+     * Get the 3D coordinates for the vertices of the rectangle with
+     * interpolated points along the lines.
+     *
+     * @param {Transform} transform - The transform of the node related to
+     * the rectangle.
+     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
+     * representing the rectangle.
+     * @ignore
+     */
+    RectGeometry.prototype.getPoints3d = function (transform) {
+        return this._getPoints2d()
+            .map(function (point) {
+            return transform.unprojectBasic(point, 200);
+        });
+    };
+    /**
+     * Get the coordinates of a vertex from the polygon representation of the geometry.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order. The method shifts the right side
+     * coordinates of the rectangle by one unit to ensure that the vertices are ordered
+     * clockwise.
+     *
+     * @param {number} index - Vertex index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+     * @ignore
+     */
+    RectGeometry.prototype.getVertex2d = function (index) {
+        return this._rectToVertices2d(this._rect)[index];
+    };
+    /**
+     * Get the coordinates of a vertex from the polygon representation of the geometry.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order. The coordinates will not be shifted
+     * so they may not appear in clockwise order when layed out on the plane.
+     *
+     * @param {number} index - Vertex index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+     * @ignore
+     */
+    RectGeometry.prototype.getNonAdjustedVertex2d = function (index) {
+        return this._rectToNonAdjustedVertices2d(this._rect)[index];
+    };
+    /**
+     * Get a vertex from the polygon representation of the 3D coordinates for the
+     * vertices of the geometry.
      *
-     * @param {Tag[]} tags - The tags.
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order.
+     *
+     * @param {number} index - Vertex index.
+     * @param {Transform} transform - The transform of the node related to the geometry.
+     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+     * the vertices of the geometry.
+     * @ignore
      */
-    TagComponent.prototype.setTags = function (tags) {
-        this._tagSet.set$.next(tags);
+    RectGeometry.prototype.getVertex3d = function (index, transform) {
+        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
     };
     /**
-     * Configure the component to enter create mode for
-     * creating a geometry of a certain type.
+     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.
      *
-     * @description Supported geometry types are: rect
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order.
      *
-     * @param {string} geometryType - String specifying the geometry type.
+     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
+     * the rectangle vertices.
+     * @ignore
      */
-    TagComponent.prototype.startCreate = function (geometryType) {
-        this.configure({ createType: geometryType, creating: true });
+    RectGeometry.prototype.getVertices2d = function () {
+        return this._rectToVertices2d(this._rect);
     };
     /**
-     * Configure the component to leave create mode.
+     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order.
      *
-     * @description A non completed geometry will be removed.
+     * @param {Transform} transform - The transform of the node related to the rectangle.
+     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+     * the rectangle vertices.
+     * @ignore
      */
-    TagComponent.prototype.stopCreate = function () {
-        this.configure({ createType: null, creating: false });
-    };
-    TagComponent.prototype._activate = function () {
-        var _this = this;
-        this._geometryCreatedEventSubscription = this._geometryCreated$
-            .subscribe(function (geometry) {
-            _this.fire(TagComponent.geometrycreated, geometry);
-        });
-        this._tagsChangedEventSubscription = this._tags$
-            .subscribe(function (tags) {
-            _this.fire(TagComponent.tagschanged, tags);
-        });
-        var nodeChanged$ = this.configuration$
-            .switchMap(function (configuration) {
-            return configuration.creating ?
-                _this._navigator.stateService.currentNode$
-                    .skip(1)
-                    .take(1)
-                    .map(function (n) { return null; }) :
-                Observable_1.Observable.empty();
-        });
-        var tagAborted$ = this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.aborted$
-                    .map(function (t) { return null; }) :
-                Observable_1.Observable.empty();
-        });
-        var tagCreated$ = this._tagCreated$
-            .map(function (t) { return null; });
-        var pointGeometryCreated$ = this._pointGeometryCreated$
-            .map(function (p) { return null; });
-        this._stopCreateSubscription = Observable_1.Observable
-            .merge(nodeChanged$, tagAborted$, tagCreated$, pointGeometryCreated$)
-            .subscribe(function () { _this.stopCreate(); });
-        this._creatorConfigurationSubscription = this._configuration$
-            .subscribe(this._tagCreator.configuration$);
-        this._createSubscription = this._creatingConfiguration$
-            .switchMap(function (configuration) {
-            return configuration.creating &&
-                configuration.createType === "rect" ||
-                configuration.createType === "polygon" ?
-                _this._validBasicClick$.take(1) :
-                Observable_1.Observable.empty();
-        })
-            .subscribe(this._tagCreator.create$);
-        this._createPointSubscription = this._creatingConfiguration$
-            .switchMap(function (configuration) {
-            return configuration.creating &&
-                configuration.createType === "point" ?
-                _this._validBasicClick$.take(1) :
-                Observable_1.Observable.empty();
-        })
-            .map(function (basic) {
-            return new Component_1.PointGeometry(basic);
-        })
-            .subscribe(this._pointGeometryCreated$);
-        this._setCreateVertexSubscription = Observable_1.Observable
-            .combineLatest(this._container.mouseService.mouseMove$, this._tagCreator.tag$, this._container.renderService.renderCamera$)
-            .filter(function (etr) {
-            return etr[1] != null;
-        })
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (etr, transform) {
-            return [etr[0], etr[1], etr[2], transform];
-        })
-            .subscribe(function (etrt) {
-            var event = etrt[0];
-            var tag = etrt[1];
-            var camera = etrt[2];
-            var transform = etrt[3];
-            var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            if (tag.geometry instanceof Component_1.RectGeometry) {
-                tag.geometry.setVertex2d(3, basic, transform);
-            }
-            else if (tag.geometry instanceof Component_1.PolygonGeometry) {
-                tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basic, transform);
-            }
-        });
-        this._addPointSubscription = this._creatingConfiguration$
-            .switchMap(function (configuration) {
-            var createType = configuration.createType;
-            return configuration.creating &&
-                (createType === "rect" || createType === "polygon") ?
-                _this._basicClick$.skipUntil(_this._validBasicClick$).skip(1) :
-                Observable_1.Observable.empty();
-        })
-            .withLatestFrom(this._tagCreator.tag$, function (basic, tag) {
-            return [basic, tag];
-        })
-            .subscribe(function (bt) {
-            var basic = bt[0];
-            var tag = bt[1];
-            tag.addPoint(basic);
-        });
-        this._deleteCreatedSubscription = this._creating$
-            .subscribe(function (creating) {
-            _this._tagCreator.delete$.next(null);
-        });
-        this._setGLCreateTagSubscription = Observable_1.Observable
-            .merge(this._tagCreator.tag$, this._createGeometryChanged$)
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (tag, transform) {
-            return [tag, transform];
-        })
-            .map(function (tt) {
-            return function (renderer) {
-                var tag = tt[0];
-                var transform = tt[1];
-                if (tag == null) {
-                    renderer.removeCreateTag();
-                }
-                else {
-                    renderer.setCreateTag(tag, transform);
-                }
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._claimMouseSubscription = this._tagInterationInitiated$
-            .switchMap(function (id) {
-            return _this._container.mouseService.mouseMove$
-                .takeUntil(_this._tagInteractionAbort$)
-                .take(1);
-        })
-            .subscribe(function (e) {
-            _this._container.mouseService.claimMouse(_this._name, 1);
-        });
-        this._mouseDragSubscription = this._activeTag$
-            .withLatestFrom(this._container.mouseService.mouseMove$, function (a, e) {
-            return [a, e];
-        })
-            .switchMap(function (args) {
-            var activeTag = args[0];
-            var mouseMove = args[1];
-            if (activeTag.operation === Component_1.TagOperation.None) {
-                return Observable_1.Observable.empty();
-            }
-            var mouseDrag$ = Observable_1.Observable
-                .of(mouseMove)
-                .concat(_this._container.mouseService.filtered$(_this._name, _this._container.mouseService.mouseDrag$));
-            return Observable_1.Observable
-                .combineLatest(mouseDrag$, _this._container.renderService.renderCamera$)
-                .withLatestFrom(Observable_1.Observable.of(activeTag), _this._navigator.stateService.currentTransform$, function (ec, a, t) {
-                return [ec[0], ec[1], a, t];
-            });
-        })
-            .subscribe(function (args) {
-            var mouseEvent = args[0];
-            var renderCamera = args[1];
-            var activeTag = args[2];
-            var transform = args[3];
-            if (activeTag.operation === Component_1.TagOperation.None) {
-                return;
-            }
-            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, activeTag.offsetX, activeTag.offsetY);
-            if (activeTag.operation === Component_1.TagOperation.Centroid) {
-                activeTag.tag.geometry.setCentroid2d(basic, transform);
-            }
-            else if (activeTag.operation === Component_1.TagOperation.Vertex) {
-                var vertexGeometry = activeTag.tag.geometry;
-                vertexGeometry.setVertex2d(activeTag.vertexIndex, basic, transform);
-            }
-        });
-        this._unclaimMouseSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$)
-            .subscribe(function (e) {
-            _this._container.mouseService.unclaimMouse(_this._name);
-        });
-        this._setTagsSubscription = this._renderTags$
-            .map(function (tags) {
-            return function (renderer) {
-                renderer.setTags(tags);
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._updateGLTagSubscription = this._renderTagGLChanged$
-            .map(function (tag) {
-            return function (renderer) {
-                renderer.updateTag(tag);
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._setNeedsRenderSubscription = this._tagChanged$
-            .map(function (tag) {
-            return function (renderer) {
-                renderer.setNeedsRender();
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._domSubscription = this._renderTags$
-            .startWith([])
-            .do(function (tags) {
-            _this._container.domRenderer.render$.next({
-                name: _this._name,
-                vnode: _this._tagDomRenderer.clear(),
-            });
-        })
-            .combineLatest(this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._tagChanged$.startWith(null), this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null), this._configuration$, function (renderTags, rc, atlas, tag, ct, c) {
-            return [rc, atlas, renderTags, tag, ct, c];
-        })
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (args, transform) {
-            return [args[0], args[1], args[2], args[3], args[4], args[5], transform];
-        })
-            .map(function (args) {
-            return {
-                name: _this._name,
-                vnode: _this._tagDomRenderer.render(args[2], args[4], args[1], args[0].perspective, args[6], args[5]),
-            };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._glSubscription = this._navigator.stateService.currentState$
-            .withLatestFrom(this._tagGlRenderer$, function (frame, renderer) {
-            return [frame, renderer];
-        })
-            .map(function (fr) {
-            var frame = fr[0];
-            var renderer = fr[1];
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: renderer.needsRender,
-                    render: renderer.render.bind(renderer),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        })
-            .subscribe(this._container.glRenderer.render$);
-    };
-    TagComponent.prototype._deactivate = function () {
-        this._tagGlRendererOperation$
-            .next(function (renderer) {
-            renderer.dispose();
-            return renderer;
+    RectGeometry.prototype.getVertices3d = function (transform) {
+        return this._rectToVertices2d(this._rect)
+            .map(function (vertex) {
+            return transform.unprojectBasic(vertex, 200);
         });
-        this._tagSet.set$.next([]);
-        this._tagCreator.delete$.next(null);
-        this._claimMouseSubscription.unsubscribe();
-        this._mouseDragSubscription.unsubscribe();
-        this._unclaimMouseSubscription.unsubscribe();
-        this._setTagsSubscription.unsubscribe();
-        this._updateGLTagSubscription.unsubscribe();
-        this._setNeedsRenderSubscription.unsubscribe();
-        this._stopCreateSubscription.unsubscribe();
-        this._creatorConfigurationSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._createPointSubscription.unsubscribe();
-        this._setCreateVertexSubscription.unsubscribe();
-        this._addPointSubscription.unsubscribe();
-        this._deleteCreatedSubscription.unsubscribe();
-        this._setGLCreateTagSubscription.unsubscribe();
-        this._domSubscription.unsubscribe();
-        this._glSubscription.unsubscribe();
-        this._geometryCreatedEventSubscription.unsubscribe();
-        this._tagsChangedEventSubscription.unsubscribe();
     };
-    TagComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            createColor: 0xFFFFFF,
-            creating: false,
-        };
+    /** @ignore */
+    RectGeometry.prototype.getCentroid2d = function () {
+        var rect = this._rect;
+        var x0 = rect[0];
+        var x1 = this._inverted ? rect[2] + 1 : rect[2];
+        var y0 = rect[1];
+        var y1 = rect[3];
+        var centroidX = (x0 + x1) / 2;
+        var centroidY = (y0 + y1) / 2;
+        return [centroidX, centroidY];
     };
-    TagComponent.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
-        offsetX = offsetX != null ? offsetX : 0;
-        offsetY = offsetY != null ? offsetY : 0;
-        var clientRect = element.getBoundingClientRect();
-        var canvasX = event.clientX - clientRect.left - offsetX;
-        var canvasY = event.clientY - clientRect.top - offsetY;
-        var projectedX = 2 * canvasX / element.offsetWidth - 1;
-        var projectedY = 1 - 2 * canvasY / element.offsetHeight;
-        var unprojected = new THREE.Vector3(projectedX, projectedY, 1).unproject(camera.perspective);
-        var basic = transform.projectBasic(unprojected.toArray());
-        return basic;
+    /** @ignore */
+    RectGeometry.prototype.getCentroid3d = function (transform) {
+        var centroid2d = this.getCentroid2d();
+        return transform.unprojectBasic(centroid2d, 200);
     };
-    /** @inheritdoc */
-    TagComponent.componentName = "tag";
     /**
-     * Event fired when creation starts and stops.
-     *
-     * @event TagComponent#creatingchanged
-     * @type {boolean} Indicates whether the component is creating a tag.
+     * @ignore
      */
-    TagComponent.creatingchanged = "creatingchanged";
+    RectGeometry.prototype.getPoleOfInaccessibility2d = function () {
+        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
+    };
+    /** @ignore */
+    RectGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
+        var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
+        return transform.unprojectBasic(pole2d, 200);
+    };
+    /** @ignore */
+    RectGeometry.prototype.getTriangles3d = function (transform) {
+        return transform.fullPano ?
+            [] :
+            this._triangulate(this._project(this._getPoints2d(), transform), this.getPoints3d(transform));
+    };
     /**
-     * Event fired when a geometry has been created.
+     * Check if a particular bottom-right value is valid according to the current
+     * rectangle coordinates.
      *
-     * @event TagComponent#geometrycreated
-     * @type {Geometry} Created geometry.
+     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
+     * @returns {boolean} Value indicating whether the provided bottom-right coordinates
+     * are valid.
+     * @ignore
      */
-    TagComponent.geometrycreated = "geometrycreated";
+    RectGeometry.prototype.validate = function (bottomRight) {
+        var rect = this._rect;
+        if (!this._inverted && bottomRight[0] < rect[0] ||
+            bottomRight[0] - rect[2] > 0.25 ||
+            bottomRight[1] < rect[1]) {
+            return false;
+        }
+        return true;
+    };
     /**
-     * Event fired when the tags collection has changed.
+     * Get the 2D coordinates for the vertices of the rectangle with
+     * interpolated points along the lines.
      *
-     * @event TagComponent#tagschanged
-     * @type {Array<Tag>} Current array of tags.
+     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
+     * representing the rectangle.
      */
-    TagComponent.tagschanged = "tagschanged";
-    return TagComponent;
-}(Component_1.Component));
-exports.TagComponent = TagComponent;
-Component_1.ComponentService.register(TagComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagComponent;
-
-},{"../../Component":207,"../../Render":213,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/empty":39,"rxjs/add/observable/from":40,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":49,"rxjs/add/operator/concat":50,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/skip":70,"rxjs/add/operator/skipUntil":71,"rxjs/add/operator/startWith":72,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/take":74,"rxjs/add/operator/takeUntil":75,"rxjs/add/operator/withLatestFrom":76,"three":157}],250:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var TagCreator = (function () {
-    function TagCreator() {
-        this._tagOperation$ = new Subject_1.Subject();
-        this._create$ = new Subject_1.Subject();
-        this._delete$ = new Subject_1.Subject();
-        this._configuration$ = new Subject_1.Subject();
-        this._tag$ = this._tagOperation$
-            .scan(function (tag, operation) {
-            return operation(tag);
-        }, null)
-            .share();
-        this._create$
-            .withLatestFrom(this._configuration$, function (coordinate, type) {
-            return [coordinate, type];
-        })
-            .map(function (ct) {
-            return function (tag) {
-                var coordinate = ct[0];
-                var configuration = ct[1];
-                if (configuration.createType === "rect") {
-                    var geometry = new Component_1.RectGeometry([
-                        coordinate[0],
-                        coordinate[1],
-                        coordinate[0],
-                        coordinate[1],
-                    ]);
-                    return new Component_1.OutlineCreateTag(geometry, { color: configuration.createColor });
-                }
-                else if (configuration.createType === "polygon") {
-                    var geometry = new Component_1.PolygonGeometry([
-                        [coordinate[0], coordinate[1]],
-                        [coordinate[0], coordinate[1]],
-                        [coordinate[0], coordinate[1]],
-                    ]);
-                    return new Component_1.OutlineCreateTag(geometry, { color: configuration.createColor });
-                }
-                return null;
-            };
-        })
-            .subscribe(this._tagOperation$);
-        this._delete$
-            .map(function () {
-            return function (tag) {
-                return null;
-            };
-        })
-            .subscribe(this._tagOperation$);
-    }
-    Object.defineProperty(TagCreator.prototype, "create$", {
-        get: function () {
-            return this._create$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "delete$", {
-        get: function () {
-            return this._delete$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "configuration$", {
-        get: function () {
-            return this._configuration$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "tag$", {
-        get: function () {
-            return this._tag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TagCreator;
-}());
-exports.TagCreator = TagCreator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagCreator;
-
-},{"../../Component":207,"rxjs/Subject":33,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/withLatestFrom":76}],251:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var vd = require("virtual-dom");
-var TagDOMRenderer = (function () {
-    function TagDOMRenderer() {
-    }
-    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, transform, configuration) {
-        var matrixWorldInverse = new THREE.Matrix4().getInverse(camera.matrixWorld);
-        var projectionMatrix = camera.projectionMatrix;
-        var vNodes = [];
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            vNodes = vNodes.concat(tag.getDOMObjects(atlas, matrixWorldInverse, projectionMatrix));
-        }
-        if (createTag != null) {
-            vNodes = vNodes.concat(createTag.getDOMObjects(transform, matrixWorldInverse, projectionMatrix));
+    RectGeometry.prototype._getPoints2d = function () {
+        var vertices2d = this._rectToVertices2d(this._rect);
+        var sides = vertices2d.length - 1;
+        var sections = 10;
+        var points2d = [];
+        for (var i = 0; i < sides; ++i) {
+            var startX = vertices2d[i][0];
+            var startY = vertices2d[i][1];
+            var endX = vertices2d[i + 1][0];
+            var endY = vertices2d[i + 1][1];
+            var intervalX = (endX - startX) / (sections - 1);
+            var intervalY = (endY - startY) / (sections - 1);
+            for (var j = 0; j < sections; ++j) {
+                var point = [
+                    startX + j * intervalX,
+                    startY + j * intervalY,
+                ];
+                points2d.push(point);
+            }
         }
-        var properties = {
-            style: {
-                "pointer-events": configuration.creating ? "all" : "none",
-            },
-        };
-        return vd.h("div.TagContainer", properties, vNodes);
+        return points2d;
+    };
+    /**
+     * Convert the top-left, bottom-right representation of a rectangle to a polygon
+     * representation of the vertices starting at the bottom-left corner going
+     * clockwise.
+     *
+     * @description The method shifts the right side coordinates of the rectangle
+     * by one unit to ensure that the vertices are ordered clockwise.
+     *
+     * @param {Array<number>} rect - Top-left, bottom-right representation of a
+     * rectangle.
+     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
+     * rectangle.
+     */
+    RectGeometry.prototype._rectToVertices2d = function (rect) {
+        return [
+            [rect[0], rect[3]],
+            [rect[0], rect[1]],
+            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],
+            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],
+            [rect[0], rect[3]],
+        ];
     };
-    TagDOMRenderer.prototype.clear = function () {
-        return vd.h("div", {}, []);
+    /**
+     * Convert the top-left, bottom-right representation of a rectangle to a polygon
+     * representation of the vertices starting at the bottom-left corner going
+     * clockwise.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order. The coordinates will not be shifted
+     * to ensure that the vertices are ordered clockwise when layed out on the plane.
+     *
+     * @param {Array<number>} rect - Top-left, bottom-right representation of a
+     * rectangle.
+     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
+     * rectangle.
+     */
+    RectGeometry.prototype._rectToNonAdjustedVertices2d = function (rect) {
+        return [
+            [rect[0], rect[3]],
+            [rect[0], rect[1]],
+            [rect[2], rect[1]],
+            [rect[2], rect[3]],
+            [rect[0], rect[3]],
+        ];
     };
-    return TagDOMRenderer;
-}());
-exports.TagDOMRenderer = TagDOMRenderer;
+    return RectGeometry;
+}(Component_1.VertexGeometry));
+exports.RectGeometry = RectGeometry;
+exports.default = RectGeometry;
 
-},{"three":157,"virtual-dom":163}],252:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../../Component":291}],380:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.VertexGeometry = void 0;
+var earcut_1 = require("earcut");
+var martinez = require("martinez-polygon-clipping");
+var polylabel = require("@mapbox/polylabel");
 var THREE = require("three");
-var TagGLRenderer = (function () {
-    function TagGLRenderer() {
-        this._scene = new THREE.Scene();
-        this._tags = {};
-        this._createTag = null;
-        this._needsRender = false;
+var Component_1 = require("../../../Component");
+/**
+ * @class VertexGeometry
+ * @abstract
+ * @classdesc Represents a vertex geometry.
+ */
+var VertexGeometry = /** @class */ (function (_super) {
+    __extends(VertexGeometry, _super);
+    /**
+     * Create a vertex geometry.
+     *
+     * @constructor
+     * @ignore
+     */
+    function VertexGeometry() {
+        var _this = _super.call(this) || this;
+        _this._subsampleThreshold = 0.005;
+        return _this;
     }
-    Object.defineProperty(TagGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    TagGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    TagGLRenderer.prototype.setCreateTag = function (tag, transform) {
-        this._disposeCreateTag();
-        this._addCreateTag(tag, transform);
-        this._needsRender = true;
-    };
-    TagGLRenderer.prototype.removeCreateTag = function () {
-        this._disposeCreateTag();
-        this._needsRender = true;
-    };
-    TagGLRenderer.prototype.setTags = function (tags) {
-        this._disposeTags();
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            this._addTag(tag);
+    /**
+     * Finds the polygon pole of inaccessibility, the most distant internal
+     * point from the polygon outline.
+     *
+     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
+     * @returns {Array<number>} Point of inaccessibility.
+     * @ignore
+     */
+    VertexGeometry.prototype._getPoleOfInaccessibility2d = function (points2d) {
+        var pole2d = polylabel([points2d], 3e-2);
+        return pole2d;
+    };
+    VertexGeometry.prototype._project = function (points2d, transform) {
+        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectSfM([0, 0], 10));
+        return this._deunproject(points2d, transform, camera);
+    };
+    VertexGeometry.prototype._subsample = function (points2d, threshold) {
+        if (threshold === void 0) { threshold = this._subsampleThreshold; }
+        var subsampled = [];
+        var length = points2d.length;
+        for (var index = 0; index < length; index++) {
+            var p1 = points2d[index];
+            var p2 = points2d[(index + 1) % length];
+            subsampled.push(p1);
+            var dist = Math.sqrt(Math.pow((p2[0] - p1[0]), 2) + Math.pow((p2[1] - p1[1]), 2));
+            var subsamples = Math.floor(dist / threshold);
+            var coeff = 1 / (subsamples + 1);
+            for (var i = 1; i <= subsamples; i++) {
+                var alpha = i * coeff;
+                var subsample = [
+                    (1 - alpha) * p1[0] + alpha * p2[0],
+                    (1 - alpha) * p1[1] + alpha * p2[1],
+                ];
+                subsampled.push(subsample);
+            }
         }
-        this._needsRender = true;
+        return subsampled;
     };
-    TagGLRenderer.prototype.updateTag = function (tag) {
-        for (var _i = 0, _a = this._tags[tag.tag.id][1]; _i < _a.length; _i++) {
-            var object3d = _a[_i];
-            this._scene.remove(object3d);
+    /**
+     * Triangulates a 2d polygon and returns the triangle
+     * representation as a flattened array of 3d points.
+     *
+     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
+     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
+     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
+     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
+     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
+     * @ignore
+     */
+    VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) {
+        var data = [points2d.slice(0, -1)];
+        for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) {
+            var hole2d = _a[_i];
+            data.push(hole2d.slice(0, -1));
+        }
+        var points = points3d.slice(0, -1);
+        for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) {
+            var hole3d = _c[_b];
+            points = points.concat(hole3d.slice(0, -1));
+        }
+        var flattened = earcut_1.default.flatten(data);
+        var indices = earcut_1.default(flattened.vertices, flattened.holes, flattened.dimensions);
+        var triangles = [];
+        for (var i = 0; i < indices.length; ++i) {
+            var point = points[indices[i]];
+            triangles.push(point[0]);
+            triangles.push(point[1]);
+            triangles.push(point[2]);
         }
-        this._addTag(tag);
+        return triangles;
     };
-    TagGLRenderer.prototype.setNeedsRender = function () {
-        this._needsRender = true;
+    VertexGeometry.prototype._triangulatePano = function (points2d, holes2d, transform) {
+        var triangles = [];
+        var epsilon = 1e-9;
+        var subareasX = 3;
+        var subareasY = 3;
+        for (var x = 0; x < subareasX; x++) {
+            for (var y = 0; y < subareasY; y++) {
+                var epsilonX0 = x === 0 ? -epsilon : epsilon;
+                var epsilonY0 = y === 0 ? -epsilon : epsilon;
+                var x0 = x / subareasX + epsilonX0;
+                var y0 = y / subareasY + epsilonY0;
+                var x1 = (x + 1) / subareasX + epsilon;
+                var y1 = (y + 1) / subareasY + epsilon;
+                var bbox2d = [
+                    [x0, y0],
+                    [x0, y1],
+                    [x1, y1],
+                    [x1, y0],
+                    [x0, y0],
+                ];
+                var lookat2d = [
+                    (2 * x + 1) / (2 * subareasX),
+                    (2 * y + 1) / (2 * subareasY),
+                ];
+                triangles.push.apply(triangles, this._triangulateSubarea(points2d, holes2d, bbox2d, lookat2d, transform));
+            }
+        }
+        return triangles;
     };
-    TagGLRenderer.prototype.dispose = function () {
-        this._disposeTags();
-        this._disposeCreateTag();
-        this._needsRender = false;
+    VertexGeometry.prototype._unproject = function (points2d, transform, distance) {
+        if (distance === void 0) { distance = 200; }
+        return points2d
+            .map(function (point) {
+            return transform.unprojectBasic(point, distance);
+        });
     };
-    TagGLRenderer.prototype._addTag = function (tag) {
-        var objects = tag.glObjects;
-        this._tags[tag.tag.id] = [tag, []];
-        for (var _i = 0, objects_1 = objects; _i < objects_1.length; _i++) {
-            var object = objects_1[_i];
-            this._tags[tag.tag.id][1].push(object);
-            this._scene.add(object);
-        }
+    VertexGeometry.prototype._createCamera = function (upVector, position, lookAt) {
+        var camera = new THREE.Camera();
+        camera.up.copy(new THREE.Vector3().fromArray(upVector));
+        camera.position.copy(new THREE.Vector3().fromArray(position));
+        camera.lookAt(new THREE.Vector3().fromArray(lookAt));
+        camera.updateMatrix();
+        camera.updateMatrixWorld(true);
+        return camera;
     };
-    TagGLRenderer.prototype._addCreateTag = function (tag, transform) {
-        var object = tag.getGLObject(transform);
-        this._createTag = object;
-        this._scene.add(object);
+    VertexGeometry.prototype._deunproject = function (points2d, transform, camera) {
+        return points2d
+            .map(function (point2d) {
+            var pointWorld = transform.unprojectBasic(point2d, 10000);
+            var pointCamera = new THREE.Vector3(pointWorld[0], pointWorld[1], pointWorld[2])
+                .applyMatrix4(camera.matrixWorldInverse);
+            return [pointCamera.x / pointCamera.z, pointCamera.y / pointCamera.z];
+        });
     };
-    TagGLRenderer.prototype._disposeTags = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            for (var _b = 0, _c = this._tags[id][1]; _b < _c.length; _b++) {
-                var object = _c[_b];
-                this._scene.remove(object);
-            }
-            this._tags[id][0].dispose();
-            delete this._tags[id];
+    VertexGeometry.prototype._triangulateSubarea = function (points2d, holes2d, bbox2d, lookat2d, transform) {
+        var intersections = martinez.intersection(__spreadArrays([points2d], holes2d), [bbox2d]);
+        if (!intersections) {
+            return [];
         }
-    };
-    TagGLRenderer.prototype._disposeCreateTag = function () {
-        if (this._createTag == null) {
-            return;
+        var triangles = [];
+        var threshold = this._subsampleThreshold;
+        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectBasic(lookat2d, 10));
+        for (var _i = 0, intersections_1 = intersections; _i < intersections_1.length; _i++) {
+            var intersection = intersections_1[_i];
+            var subsampledPolygon2d = this._subsample(intersection[0], threshold);
+            var polygon2d = this._deunproject(subsampledPolygon2d, transform, camera);
+            var polygon3d = this._unproject(subsampledPolygon2d, transform);
+            var polygonHoles2d = [];
+            var polygonHoles3d = [];
+            for (var i = 1; i < intersection.length; i++) {
+                var subsampledHole2d = this._subsample(intersection[i], threshold);
+                var hole2d = this._deunproject(subsampledHole2d, transform, camera);
+                var hole3d = this._unproject(subsampledHole2d, transform);
+                polygonHoles2d.push(hole2d);
+                polygonHoles3d.push(hole3d);
+            }
+            triangles.push.apply(triangles, this._triangulate(polygon2d, polygon3d, polygonHoles2d, polygonHoles3d));
         }
-        var mesh = this._createTag;
-        this._scene.remove(mesh);
-        mesh.geometry.dispose();
-        mesh.material.dispose();
-        this._createTag = null;
+        return triangles;
     };
-    return TagGLRenderer;
-}());
-exports.TagGLRenderer = TagGLRenderer;
+    return VertexGeometry;
+}(Component_1.Geometry));
+exports.VertexGeometry = VertexGeometry;
+exports.default = VertexGeometry;
 
-},{"three":157}],253:[function(require,module,exports){
+},{"../../../Component":291,"@mapbox/polylabel":1,"earcut":8,"martinez-polygon-clipping":22,"three":242}],381:[function(require,module,exports){
 "use strict";
-(function (TagOperation) {
-    TagOperation[TagOperation["None"] = 0] = "None";
-    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
-    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
-})(exports.TagOperation || (exports.TagOperation = {}));
-var TagOperation = exports.TagOperation;
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagOperation;
-
-},{}],254:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-var TagSet = (function () {
-    function TagSet() {
-        this._tagDataOperation$ = new Subject_1.Subject();
-        this._set$ = new Subject_1.Subject();
-        this._tagData$ = this._tagDataOperation$
-            .scan(function (tagData, operation) {
-            return operation(tagData);
-        }, {})
-            .share();
-        this._set$
-            .map(function (tags) {
-            return function (tagData) {
-                for (var _i = 0, _a = Object.keys(tagData); _i < _a.length; _i++) {
-                    var key = _a[_i];
-                    delete tagData[key];
-                }
-                for (var _b = 0, tags_1 = tags; _b < tags_1.length; _b++) {
-                    var tag = tags_1[_b];
-                    tagData[tag.id] = tag;
-                }
-                return tagData;
-            };
-        })
-            .subscribe(this._tagDataOperation$);
-    }
-    Object.defineProperty(TagSet.prototype, "tagData$", {
-        get: function () {
-            return this._tagData$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagSet.prototype, "set$", {
+exports.CreateHandlerBase = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Component_1 = require("../../../Component");
+var CreateHandlerBase = /** @class */ (function (_super) {
+    __extends(CreateHandlerBase, _super);
+    function CreateHandlerBase(component, container, navigator, viewportCoords, tagCreator) {
+        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
+        _this._tagCreator = tagCreator;
+        _this._geometryCreated$ = new rxjs_1.Subject();
+        return _this;
+    }
+    Object.defineProperty(CreateHandlerBase.prototype, "geometryCreated$", {
         get: function () {
-            return this._set$;
+            return this._geometryCreated$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return TagSet;
-}());
-exports.TagSet = TagSet;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagSet;
-
-},{"rxjs/Subject":33,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69}],255:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Error_1 = require("../../../Error");
-var GeometryTagError = (function (_super) {
-    __extends(GeometryTagError, _super);
-    function GeometryTagError(message) {
-        _super.call(this);
-        this.name = "GeometryTagError";
-        this.message = message != null ? message : "The provided geometry value is incorrect";
-    }
-    return GeometryTagError;
-}(Error_1.MapillaryError));
-exports.GeometryTagError = GeometryTagError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Error_1.MapillaryError;
+    CreateHandlerBase.prototype._enable = function () {
+        this._enableCreate();
+        this._container.element.classList.add("component-tag-create");
+    };
+    CreateHandlerBase.prototype._disable = function () {
+        this._container.element.classList.remove("component-tag-create");
+        this._disableCreate();
+    };
+    CreateHandlerBase.prototype._validateBasic = function (basic) {
+        var x = basic[0];
+        var y = basic[1];
+        return 0 <= x && x <= 1 && 0 <= y && y <= 1;
+    };
+    CreateHandlerBase.prototype._mouseEventToBasic$ = function (mouseEvent$) {
+        var _this = this;
+        return mouseEvent$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var event = _a[0], camera = _a[1], transform = _a[2];
+            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
+        }));
+    };
+    return CreateHandlerBase;
+}(Component_1.TagHandlerBase));
+exports.CreateHandlerBase = CreateHandlerBase;
+exports.default = CreateHandlerBase;
 
-},{"../../../Error":209}],256:[function(require,module,exports){
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],382:[function(require,module,exports){
 "use strict";
-var Subject_1 = require("rxjs/Subject");
-/**
- * @class Geometry
- * @abstract
- * @classdesc Represents a geometry.
- */
-var Geometry = (function () {
-    /**
-     * Create a geometry.
-     *
-     * @constructor
-     */
-    function Geometry() {
-        this._notifyChanged$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(Geometry.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         *
-         * @description Emits the geometry itself every time the geometry
-         * has changed.
-         *
-         * @returns {Observable<Geometry>} Observable emitting the geometry instance.
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Geometry;
-}());
-exports.Geometry = Geometry;
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Geometry;
+exports.CreatePointHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreatePointHandler = /** @class */ (function (_super) {
+    __extends(CreatePointHandler, _super);
+    function CreatePointHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    CreatePointHandler.prototype._enableCreate = function () {
+        this._container.mouseService.deferPixels(this._name, 4);
+        this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.filter(this._validateBasic), operators_1.map(function (basic) {
+            return new Component_1.PointGeometry(basic);
+        }))
+            .subscribe(this._geometryCreated$);
+    };
+    CreatePointHandler.prototype._disableCreate = function () {
+        this._container.mouseService.undeferPixels(this._name);
+        this._geometryCreatedSubscription.unsubscribe();
+    };
+    CreatePointHandler.prototype._getNameExtension = function () {
+        return "create-point";
+    };
+    return CreatePointHandler;
+}(Component_1.CreateHandlerBase));
+exports.CreatePointHandler = CreatePointHandler;
+exports.default = CreatePointHandler;
 
-},{"rxjs/Subject":33}],257:[function(require,module,exports){
+},{"../../../Component":291,"rxjs/operators":241}],383:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class PointGeometry
- * @classdesc Represents a point geometry in the basic coordinate system.
- */
-var PointGeometry = (function (_super) {
-    __extends(PointGeometry, _super);
-    /**
-     * Create a point geometry.
-     *
-     * @constructor
-     * @param {Array<number>} point - An array representing the basic coordinates of
-     * the point.
-     *
-     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
-     */
-    function PointGeometry(point) {
-        _super.call(this);
-        var x = point[0];
-        var y = point[1];
-        if (x < 0 || x > 1 || y < 0 || y > 1) {
-            throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-        }
-        this._point = point.slice();
-    }
-    Object.defineProperty(PointGeometry.prototype, "point", {
-        /**
-         * Get point property.
-         * @returns {Array<number>} Array representing the basic coordinates of the point.
-         */
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreatePointsHandler = void 0;
+var Component_1 = require("../../../Component");
+var CreatePointsHandler = /** @class */ (function (_super) {
+    __extends(CreatePointsHandler, _super);
+    function CreatePointsHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    Object.defineProperty(CreatePointsHandler.prototype, "_create$", {
         get: function () {
-            return this._point;
+            return this._tagCreator.createPoints$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
-     * world coordinates of the point itself.
-     *
-     * @param {Transform} transform - The transform of the node related to the point.
-     * @returns {Array<number>} 3D world coordinates representing the centroid.
-     */
-    PointGeometry.prototype.getCentroid3d = function (transform) {
-        return transform.unprojectBasic(this._point, 200);
+    CreatePointsHandler.prototype._addPoint = function (tag, basicPoint) {
+        tag.geometry.addPoint2d(basicPoint);
     };
-    /**
-     * Set the centroid of the point, i.e. the point coordinates.
-     *
-     * @param {Array<number>} value - The new value of the centroid.
-     * @param {Transform} transform - The transform of the node related to the point.
-     */
-    PointGeometry.prototype.setCentroid2d = function (value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        this._point[0] = changed[0];
-        this._point[1] = changed[1];
-        this._notifyChanged$.next(this);
+    CreatePointsHandler.prototype._getNameExtension = function () {
+        return "create-points";
     };
-    return PointGeometry;
-}(Component_1.Geometry));
-exports.PointGeometry = PointGeometry;
+    CreatePointsHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
+        tag.geometry.setPoint2d((tag.geometry).points.length - 1, basicPoint, transform);
+    };
+    return CreatePointsHandler;
+}(Component_1.CreateVertexHandler));
+exports.CreatePointsHandler = CreatePointsHandler;
+exports.default = CreatePointsHandler;
 
-},{"../../../Component":207}],258:[function(require,module,exports){
+},{"../../../Component":291}],384:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreatePolygonHandler = void 0;
 var Component_1 = require("../../../Component");
-/**
- * @class PolygonGeometry
- * @classdesc Represents a polygon geometry in the basic coordinate system.
- */
-var PolygonGeometry = (function (_super) {
-    __extends(PolygonGeometry, _super);
-    /**
-     * Create a polygon geometry.
-     *
-     * @constructor
-     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
-     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
-     * Each array of holes vertices must be closed.
-     *
-     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
-     */
-    function PolygonGeometry(polygon, holes) {
-        _super.call(this);
-        var polygonLength = polygon.length;
-        if (polygonLength < 3) {
-            throw new Component_1.GeometryTagError("A polygon must have three or more positions.");
-        }
-        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||
-            polygon[0][1] !== polygon[polygonLength - 1][1]) {
-            throw new Component_1.GeometryTagError("First and last positions must be equivalent.");
-        }
-        this._polygon = [];
-        for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) {
-            var vertex = polygon_1[_i];
-            if (vertex[0] < 0 || vertex[0] > 1 ||
-                vertex[1] < 0 || vertex[1] > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");
-            }
-            this._polygon.push(vertex.slice());
-        }
-        this._holes = [];
-        if (holes == null) {
-            return;
-        }
-        for (var i = 0; i < holes.length; i++) {
-            var hole = holes[i];
-            var holeLength = hole.length;
-            if (holeLength < 3) {
-                throw new Component_1.GeometryTagError("A polygon hole must have three or more positions.");
-            }
-            if (hole[0][0] !== hole[holeLength - 1][0] ||
-                hole[0][1] !== hole[holeLength - 1][1]) {
-                throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent.");
-            }
-            this._holes.push([]);
-            for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) {
-                var vertex = hole_1[_a];
-                if (vertex[0] < 0 || vertex[0] > 1 ||
-                    vertex[1] < 0 || vertex[1] > 1) {
-                    throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");
-                }
-                this._holes[i].push(vertex.slice());
-            }
-        }
+var CreatePolygonHandler = /** @class */ (function (_super) {
+    __extends(CreatePolygonHandler, _super);
+    function CreatePolygonHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    Object.defineProperty(PolygonGeometry.prototype, "polygon", {
-        /**
-         * Get polygon property.
-         * @returns {Array<Array<number>>} Closed 2d polygon.
-         */
+    Object.defineProperty(CreatePolygonHandler.prototype, "_create$", {
         get: function () {
-            return this._polygon;
+            return this._tagCreator.createPolygon$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(PolygonGeometry.prototype, "holes", {
-        /**
-         * Get holes property.
-         * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
-         */
+    CreatePolygonHandler.prototype._addPoint = function (tag, basicPoint) {
+        tag.addPoint(basicPoint);
+    };
+    CreatePolygonHandler.prototype._getNameExtension = function () {
+        return "create-polygon";
+    };
+    CreatePolygonHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
+        tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basicPoint, transform);
+    };
+    return CreatePolygonHandler;
+}(Component_1.CreateVertexHandler));
+exports.CreatePolygonHandler = CreatePolygonHandler;
+exports.default = CreatePolygonHandler;
+
+},{"../../../Component":291}],385:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateRectDragHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreateRectDragHandler = /** @class */ (function (_super) {
+    __extends(CreateRectDragHandler, _super);
+    function CreateRectDragHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    CreateRectDragHandler.prototype._enableCreate = function () {
+        var _this = this;
+        this._container.mouseService.claimMouse(this._name, 2);
+        this._deleteSubscription = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function (transform) { return null; }), operators_1.skip(1))
+            .subscribe(this._tagCreator.delete$);
+        this._createSubscription = this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDragStart$)).pipe(operators_1.filter(this._validateBasic))
+            .subscribe(this._tagCreator.createRect$);
+        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
+            return !!tag;
+        }))
+            .subscribe(function (tag) {
+            tag.geometry.initializeAnchorIndexing();
+        });
+        var basicMouse$ = rxjs_1.combineLatest(rxjs_1.merge(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseMove$), this._container.mouseService.filtered$(this._name, this._container.mouseService.domMouseMove$)), this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var _b = _a[0], event = _b[0], camera = _b[1], transform = _a[1];
+            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
+        }));
+        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouse$, _this._navigator.stateService.currentTransform$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], basicPoint = _a[1], transform = _a[2];
+            tag.geometry.setOppositeVertex2d(basicPoint, transform);
+        });
+        var basicMouseDragEnd$ = this._container.mouseService.mouseDragEnd$.pipe(operators_1.withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDrag$)).pipe(operators_1.filter(this._validateBasic)), function (event, basicPoint) {
+            return basicPoint;
+        }), operators_1.share());
+        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouseDragEnd$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], basicPoint = _a[1];
+            var rectGeometry = tag.geometry;
+            if (!rectGeometry.validate(basicPoint)) {
+                basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
+            }
+            tag.addPoint(basicPoint);
+        });
+        this._geometryCreatedSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                tag.created$.pipe(operators_1.map(function (t) {
+                    return t.geometry;
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe(this._geometryCreated$);
+    };
+    CreateRectDragHandler.prototype._disableCreate = function () {
+        this._container.mouseService.unclaimMouse(this._name);
+        this._tagCreator.delete$.next(null);
+        this._addPointSubscription.unsubscribe();
+        this._createSubscription.unsubscribe();
+        this._deleteSubscription.unsubscribe();
+        this._geometryCreatedSubscription.unsubscribe();
+        this._initializeAnchorIndexingSubscription.unsubscribe();
+        this._setVertexSubscription.unsubscribe();
+    };
+    CreateRectDragHandler.prototype._getNameExtension = function () {
+        return "create-rect-drag";
+    };
+    return CreateRectDragHandler;
+}(Component_1.CreateHandlerBase));
+exports.CreateRectDragHandler = CreateRectDragHandler;
+exports.default = CreateRectDragHandler;
+
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],386:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateRectHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreateRectHandler = /** @class */ (function (_super) {
+    __extends(CreateRectHandler, _super);
+    function CreateRectHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    Object.defineProperty(CreateRectHandler.prototype, "_create$", {
         get: function () {
-            return this._holes;
+            return this._tagCreator.createRect$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Add a vertex to the polygon by appending it after the last vertex.
-     *
-     * @param {Array<number>} vertex - Vertex to add.
-     */
-    PolygonGeometry.prototype.addVertex2d = function (vertex) {
-        var clamped = [
-            Math.max(0, Math.min(1, vertex[0])),
-            Math.max(0, Math.min(1, vertex[1])),
-        ];
-        this._polygon.splice(this._polygon.length - 1, 0, clamped);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Remove a vertex from the polygon.
-     *
-     * @param {number} index - The index of the vertex to remove.
-     */
-    PolygonGeometry.prototype.removeVertex2d = function (index) {
-        if (index < 0 ||
-            index >= this._polygon.length ||
-            this._polygon.length < 4) {
-            throw new Component_1.GeometryTagError("Index for removed vertex must be valid.");
+    CreateRectHandler.prototype._addPoint = function (tag, basicPoint) {
+        var rectGeometry = tag.geometry;
+        if (!rectGeometry.validate(basicPoint)) {
+            basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
         }
-        if (index > 0 && index < this._polygon.length - 1) {
-            this._polygon.splice(index, 1);
-        }
-        else {
-            this._polygon.splice(0, 1);
-            this._polygon.pop();
-            var closing = this._polygon[0].slice();
-            this._polygon.push(closing);
-        }
-        this._notifyChanged$.next(this);
+        tag.addPoint(basicPoint);
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        if (index === 0 || index === this._polygon.length - 1) {
-            this._polygon[0] = changed.slice();
-            this._polygon[this._polygon.length - 1] = changed.slice();
-        }
-        else {
-            this._polygon[index] = changed.slice();
-        }
-        this._notifyChanged$.next(this);
+    CreateRectHandler.prototype._enable = function () {
+        _super.prototype._enable.call(this);
+        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
+            return !!tag;
+        }))
+            .subscribe(function (tag) {
+            tag.geometry.initializeAnchorIndexing();
+        });
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.setCentroid2d = function (value, transform) {
-        var xs = this._polygon.map(function (point) { return point[0]; });
-        var ys = this._polygon.map(function (point) { return point[1]; });
-        var minX = Math.min.apply(Math, xs);
-        var maxX = Math.max.apply(Math, xs);
-        var minY = Math.min.apply(Math, ys);
-        var maxY = Math.max.apply(Math, ys);
-        var centroid = this._getCentroid2d();
-        var minTranslationX = -minX;
-        var maxTranslationX = 1 - maxX;
-        var minTranslationY = -minY;
-        var maxTranslationY = 1 - maxY;
-        var translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));
-        for (var _i = 0, _a = this._polygon; _i < _a.length; _i++) {
-            var point = _a[_i];
-            point[0] += translationX;
-            point[1] += translationY;
-        }
-        this._notifyChanged$.next(this);
+    CreateRectHandler.prototype._disable = function () {
+        _super.prototype._disable.call(this);
+        this._initializeAnchorIndexingSubscription.unsubscribe();
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getPoints3d = function (transform) {
-        return this.getVertices3d(transform);
+    CreateRectHandler.prototype._getNameExtension = function () {
+        return "create-rect";
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._polygon[index], 200);
+    CreateRectHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
+        tag.geometry.setOppositeVertex2d(basicPoint, transform);
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertices3d = function (transform) {
-        return this._polygon
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
+    return CreateRectHandler;
+}(Component_1.CreateVertexHandler));
+exports.CreateRectHandler = CreateRectHandler;
+exports.default = CreateRectHandler;
+
+},{"../../../Component":291,"rxjs/operators":241}],387:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateVertexHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreateVertexHandler = /** @class */ (function (_super) {
+    __extends(CreateVertexHandler, _super);
+    function CreateVertexHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    CreateVertexHandler.prototype._enableCreate = function () {
+        var _this = this;
+        this._container.mouseService.deferPixels(this._name, 4);
+        var transformChanged$ = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
+        this._deleteSubscription = transformChanged$.pipe(operators_1.skip(1))
+            .subscribe(this._tagCreator.delete$);
+        var basicClick$ = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.share());
+        this._createSubscription = transformChanged$.pipe(operators_1.switchMap(function () {
+            return basicClick$.pipe(operators_1.filter(_this._validateBasic), operators_1.take(1));
+        }))
+            .subscribe(this._create$);
+        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), rxjs_1.merge(_this._container.mouseService.mouseMove$, _this._container.mouseService.domMouseMove$), _this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], event = _a[1], camera = _a[2], transform = _a[3];
+            var basicPoint = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
+            _this._setVertex2d(tag, basicPoint, transform);
+        });
+        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), basicClick$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], basicPoint = _a[1];
+            _this._addPoint(tag, basicPoint);
+        });
+        this._geometryCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                tag.created$.pipe(operators_1.map(function (t) {
+                    return t.geometry;
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe(this._geometryCreated$);
+    };
+    CreateVertexHandler.prototype._disableCreate = function () {
+        this._container.mouseService.undeferPixels(this._name);
+        this._tagCreator.delete$.next(null);
+        this._addPointSubscription.unsubscribe();
+        this._createSubscription.unsubscribe();
+        this._deleteSubscription.unsubscribe();
+        this._geometryCreateSubscription.unsubscribe();
+        this._setVertexSubscription.unsubscribe();
+    };
+    return CreateVertexHandler;
+}(Component_1.CreateHandlerBase));
+exports.CreateVertexHandler = CreateVertexHandler;
+exports.default = CreateVertexHandler;
+
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],388:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EditVertexHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var EditVertexHandler = /** @class */ (function (_super) {
+    __extends(EditVertexHandler, _super);
+    function EditVertexHandler(component, container, navigator, viewportCoords, tagSet) {
+        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
+        _this._tagSet = tagSet;
+        return _this;
+    }
+    EditVertexHandler.prototype._enable = function () {
+        var _this = this;
+        var interaction$ = this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
+            return tagSet.getAll();
+        }), operators_1.switchMap(function (tags) {
+            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
+                return tag.interact$;
+            }));
+        }), operators_1.switchMap(function (interaction) {
+            return rxjs_1.concat(rxjs_1.of(interaction), _this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function () {
+                return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
+            }), operators_1.first()));
+        }), operators_1.share());
+        var mouseMove$ = rxjs_1.merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$).pipe(operators_1.share());
+        this._claimMouseSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
+            return !!interaction.tag ? _this._container.mouseService.domMouseDragStart$ : rxjs_1.empty();
+        }))
+            .subscribe(function () {
+            _this._container.mouseService.claimMouse(_this._name, 3);
+        });
+        this._cursorSubscription = interaction$.pipe(operators_1.map(function (interaction) {
+            return interaction.cursor;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (cursor) {
+            var interactionCursors = ["crosshair", "move", "nesw-resize", "nwse-resize"];
+            for (var _i = 0, interactionCursors_1 = interactionCursors; _i < interactionCursors_1.length; _i++) {
+                var interactionCursor = interactionCursors_1[_i];
+                _this._container.element.classList.remove("component-tag-edit-" + interactionCursor);
+            }
+            if (!!cursor) {
+                _this._container.element.classList.add("component-tag-edit-" + cursor);
+            }
+        });
+        this._unclaimMouseSubscription = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.domMouseDragEnd$)
+            .subscribe(function (e) {
+            _this._container.mouseService.unclaimMouse(_this._name);
+        });
+        this._preventDefaultSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
+            return !!interaction.tag ?
+                _this._container.mouseService.documentMouseMove$ :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (event) {
+            event.preventDefault(); // prevent selection of content outside the viewer
+        });
+        this._updateGeometrySubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
+            if (interaction.operation === Component_1.TagOperation.None || !interaction.tag) {
+                return rxjs_1.empty();
+            }
+            var mouseDrag$ = _this._container.mouseService
+                .filtered$(_this._name, _this._container.mouseService.domMouseDrag$).pipe(operators_1.filter(function (event) {
+                return _this._viewportCoords.insideElement(event, _this._container.element);
+            }));
+            return rxjs_1.combineLatest(mouseDrag$, _this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(rxjs_1.of(interaction), _this._navigator.stateService.currentTransform$, function (_a, i, transform) {
+                var event = _a[0], render = _a[1];
+                return [event, render, i, transform];
+            }));
+        }))
+            .subscribe(function (_a) {
+            var mouseEvent = _a[0], renderCamera = _a[1], interaction = _a[2], transform = _a[3];
+            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, interaction.offsetX, interaction.offsetY);
+            var geometry = interaction.tag.geometry;
+            if (interaction.operation === Component_1.TagOperation.Centroid) {
+                geometry.setCentroid2d(basic, transform);
+            }
+            else if (interaction.operation === Component_1.TagOperation.Vertex) {
+                geometry.setVertex2d(interaction.vertexIndex, basic, transform);
+            }
         });
     };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of each hole
-     * of the geometry.
-     *
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
-     * representing the vertices of each hole of the geometry.
-     */
-    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
-        var holes3d = [];
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            var hole3d = hole
-                .map(function (point) {
-                return transform.unprojectBasic(point, 200);
-            });
-            holes3d.push(hole3d);
-        }
-        return holes3d;
+    EditVertexHandler.prototype._disable = function () {
+        this._claimMouseSubscription.unsubscribe();
+        this._cursorSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._unclaimMouseSubscription.unsubscribe();
+        this._updateGeometrySubscription.unsubscribe();
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this._getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
+    EditVertexHandler.prototype._getNameExtension = function () {
+        return "edit-vertex";
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getTriangles3d = function (transform) {
-        return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(transform));
+    return EditVertexHandler;
+}(Component_1.TagHandlerBase));
+exports.EditVertexHandler = EditVertexHandler;
+exports.default = EditVertexHandler;
+
+
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],389:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    PolygonGeometry.prototype._getCentroid2d = function () {
-        var polygon = this._polygon;
-        var area = 0;
-        var centroidX = 0;
-        var centroidY = 0;
-        for (var i = 0; i < polygon.length - 1; i++) {
-            var xi = polygon[i][0];
-            var yi = polygon[i][1];
-            var xi1 = polygon[i + 1][0];
-            var yi1 = polygon[i + 1][1];
-            var a = xi * yi1 - xi1 * yi;
-            area += a;
-            centroidX += (xi + xi1) * a;
-            centroidY += (yi + yi1) * a;
-        }
-        area /= 2;
-        centroidX /= 6 * area;
-        centroidY /= 6 * area;
-        return [centroidX, centroidY];
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagHandlerBase = void 0;
+var Component_1 = require("../../../Component");
+var TagHandlerBase = /** @class */ (function (_super) {
+    __extends(TagHandlerBase, _super);
+    function TagHandlerBase(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._name = _this._component.name + "-" + _this._getNameExtension();
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    TagHandlerBase.prototype._getConfiguration = function (enable) {
+        return {};
     };
-    return PolygonGeometry;
-}(Component_1.VertexGeometry));
-exports.PolygonGeometry = PolygonGeometry;
+    TagHandlerBase.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
+        offsetX = offsetX != null ? offsetX : 0;
+        offsetY = offsetY != null ? offsetY : 0;
+        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
+        var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective);
+        return basic;
+    };
+    return TagHandlerBase;
+}(Component_1.HandlerBase));
+exports.TagHandlerBase = TagHandlerBase;
+exports.default = TagHandlerBase;
+
+
+},{"../../../Component":291}],390:[function(require,module,exports){
+"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = PolygonGeometry;
 
-},{"../../../Component":207}],259:[function(require,module,exports){
+},{}],391:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class RectGeometry
- * @classdesc Represents a rectangle geometry in the basic coordinate system.
- */
-var RectGeometry = (function (_super) {
-    __extends(RectGeometry, _super);
-    /**
-     * Create a rectangle geometry.
-     *
-     * @constructor
-     * @param {Array<number>} rect - An array representing the top-left and bottom-right
-     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
-     *
-     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
-     */
-    function RectGeometry(rect) {
-        _super.call(this);
-        if (rect[1] > rect[3]) {
-            throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted.");
-        }
-        for (var _i = 0, rect_1 = rect; _i < rect_1.length; _i++) {
-            var coord = rect_1[_i];
-            if (coord < 0 || coord > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-            }
-        }
-        this._rect = rect.slice(0, 4);
-        if (this._rect[0] > this._rect[2]) {
-            this._inverted = true;
-        }
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateTag = void 0;
+var operators_1 = require("rxjs/operators");
+var THREE = require("three");
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../../Geo");
+var CreateTag = /** @class */ (function () {
+    function CreateTag(geometry, transform, viewportCoords) {
+        var _this = this;
+        this._geometry = geometry;
+        this._transform = transform;
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        this._aborted$ = new rxjs_1.Subject();
+        this._created$ = new rxjs_1.Subject();
+        this._glObjectsChanged$ = new rxjs_1.Subject();
+        this._geometryChangedSubscription = this._geometry.changed$
+            .subscribe(function () {
+            _this._onGeometryChanged();
+            _this._glObjectsChanged$.next(_this);
+        });
     }
-    Object.defineProperty(RectGeometry.prototype, "rect", {
-        /**
-         * Get rect property.
-         * @returns {Array<number>} Array representing the top-left and bottom-right
-         * corners of the rectangle in basic coordinates.
-         */
+    Object.defineProperty(CreateTag.prototype, "geometry", {
         get: function () {
-            return this._rect;
+            return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Set the value of a vertex in the polygon representation of the rectangle.
-     *
-     * @description The polygon is defined to have the first vertex at the
-     * bottom-left corner with the rest of the vertices following in clockwise order.
-     *
-     * @param {number} index - The index of the vertex to be set.
-     * @param {Array<number>} value - The new value of the vertex.
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     */
-    RectGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var original = this._rect.slice();
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        var rect = [];
-        if (index === 0) {
-            rect[0] = changed[0];
-            rect[1] = original[1];
-            rect[2] = original[2];
-            rect[3] = changed[1];
-        }
-        else if (index === 1) {
-            rect[0] = changed[0];
-            rect[1] = changed[1];
-            rect[2] = original[2];
-            rect[3] = original[3];
-        }
-        else if (index === 2) {
-            rect[0] = original[0];
-            rect[1] = changed[1];
-            rect[2] = changed[0];
-            rect[3] = original[3];
-        }
-        else if (index === 3) {
-            rect[0] = original[0];
-            rect[1] = original[1];
-            rect[2] = changed[0];
-            rect[3] = changed[1];
-        }
-        if (transform.gpano) {
-            var passingBoundaryLeft = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
-                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
-            var passingBoundaryRight = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
-                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
-            if (passingBoundaryLeft || passingBoundaryRight) {
-                this._inverted = !this._inverted;
-            }
-            else {
-                if (rect[0] - original[0] < -0.25) {
-                    rect[0] = original[0];
-                }
-                if (rect[2] - original[2] > 0.25) {
-                    rect[2] = original[2];
-                }
-            }
-            if (!this._inverted && rect[0] > rect[2] ||
-                this._inverted && rect[0] < rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        else {
-            if (rect[0] > rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        if (rect[1] > rect[3]) {
-            rect[1] = original[1];
-            rect[3] = original[3];
-        }
-        this._rect[0] = rect[0];
-        this._rect[1] = rect[1];
-        this._rect[2] = rect[2];
-        this._rect[3] = rect[3];
-        this._notifyChanged$.next(this);
-    };
-    /** @inheritdoc */
-    RectGeometry.prototype.setCentroid2d = function (value, transform) {
-        var original = this._rect.slice();
-        var x0 = original[0];
-        var x1 = this._inverted ? original[2] + 1 : original[2];
-        var y0 = original[1];
-        var y1 = original[3];
-        var centerX = x0 + (x1 - x0) / 2;
-        var centerY = y0 + (y1 - y0) / 2;
-        var translationX = 0;
-        if (transform.gpano != null &&
-            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {
-            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;
-        }
-        else {
-            var minTranslationX = -x0;
-            var maxTranslationX = 1 - x1;
-            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));
-        }
-        var minTranslationY = -y0;
-        var maxTranslationY = 1 - y1;
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));
-        this._rect[0] = original[0] + translationX;
-        this._rect[1] = original[1] + translationY;
-        this._rect[2] = original[2] + translationX;
-        this._rect[3] = original[3] + translationY;
-        if (this._rect[0] < 0) {
-            this._rect[0] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[0] > 1) {
-            this._rect[0] -= 1;
-            this._inverted = !this._inverted;
-        }
-        if (this._rect[2] < 0) {
-            this._rect[2] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[2] > 1) {
-            this._rect[2] -= 1;
-            this._inverted = !this._inverted;
-        }
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the 3D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints2d(transform)
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
+    Object.defineProperty(CreateTag.prototype, "glObjects", {
+        get: function () {
+            return this._glObjects;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "aborted$", {
+        get: function () {
+            return this._aborted$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "created$", {
+        get: function () {
+            return this._created$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "glObjectsChanged$", {
+        get: function () {
+            return this._glObjectsChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "geometryChanged$", {
+        get: function () {
+            var _this = this;
+            return this._geometry.changed$.pipe(operators_1.map(function () {
+                return _this;
+            }));
+        },
+        enumerable: false,
+        configurable: true
+    });
+    CreateTag.prototype.dispose = function () {
+        this._geometryChangedSubscription.unsubscribe();
     };
-    /**
-     * Get a vertex from the polygon representation of the 3D coordinates for the
-     * vertices of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the vertices of the geometry.
-     */
-    RectGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
+    CreateTag.prototype._canvasToTransform = function (canvas) {
+        var canvasX = Math.round(canvas[0]);
+        var canvasY = Math.round(canvas[1]);
+        var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
+        return transform;
     };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the rectangle vertices.
-     */
-    RectGeometry.prototype.getVertices3d = function (transform) {
-        return this._rectToVertices2d(this._rect)
-            .map(function (vertex) {
-            return transform.unprojectBasic(vertex, 200);
+    CreateTag.prototype._colorToBackground = function (color) {
+        return "#" + ("000000" + color.toString(16)).substr(-6);
+    };
+    CreateTag.prototype._createOutine = function (polygon3d, color) {
+        var positions = this._getLinePositions(polygon3d);
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        var material = new THREE.LineBasicMaterial({
+            color: color,
+            linewidth: 1,
         });
+        return new THREE.Line(geometry, material);
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getCentroid3d = function (transform) {
-        var rect = this._rect;
-        var x0 = rect[0];
-        var x1 = this._inverted ? rect[2] + 1 : rect[2];
-        var y0 = rect[1];
-        var y1 = rect[3];
-        var centroidX = x0 + (x1 - x0) / 2;
-        var centroidY = y0 + (y1 - y0) / 2;
-        return transform.unprojectBasic([centroidX, centroidY], 200);
+    CreateTag.prototype._disposeLine = function (line) {
+        if (line == null) {
+            return;
+        }
+        line.geometry.dispose();
+        line.material.dispose();
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getTriangles3d = function (transform) {
-        return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(transform));
+    CreateTag.prototype._getLinePositions = function (polygon3d) {
+        var length = polygon3d.length;
+        var positions = new Float32Array(length * 3);
+        for (var i = 0; i < length; ++i) {
+            var index = 3 * i;
+            var position = polygon3d[i];
+            positions[index] = position[0];
+            positions[index + 1] = position[1];
+            positions[index + 2] = position[2];
+        }
+        return positions;
     };
-    /**
-     * Check if a particular bottom-right value is valid according to the current
-     * rectangle coordinates.
-     *
-     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
-     * @returns {boolean} Value indicating whether the provided bottom-right coordinates
-     * are valid.
-     */
-    RectGeometry.prototype.validate = function (bottomRight) {
-        var rect = this._rect;
-        if (!this._inverted && bottomRight[0] < rect[0] ||
-            bottomRight[0] - rect[2] > 0.25 ||
-            bottomRight[1] < rect[1]) {
-            return false;
+    return CreateTag;
+}());
+exports.CreateTag = CreateTag;
+exports.default = CreateTag;
+
+},{"../../../Geo":294,"rxjs":43,"rxjs/operators":241,"three":242}],392:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ExtremePointCreateTag = void 0;
+var vd = require("virtual-dom");
+var Tag_1 = require("../Tag");
+var Component_1 = require("../../../Component");
+var ExtremePointCreateTag = /** @class */ (function (_super) {
+    __extends(ExtremePointCreateTag, _super);
+    function ExtremePointCreateTag(geometry, options, transform, viewportCoords) {
+        var _this = _super.call(this, geometry, transform, viewportCoords) || this;
+        _this._options = {
+            color: options.color == null ? 0xFFFFFF : options.color,
+            indicateCompleter: options.indicateCompleter == null ? true : options.indicateCompleter,
+        };
+        _this._rectGeometry = new Tag_1.RectGeometry(_this._geometry.getRect2d(transform));
+        _this._createGlObjects();
+        return _this;
+    }
+    ExtremePointCreateTag.prototype.create = function () {
+        if (this._geometry.points.length < 3) {
+            return;
         }
-        return true;
+        this._geometry.removePoint2d(this._geometry.points.length - 1);
+        this._created$.next(this);
     };
-    /**
-     * Get the 2D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype._getPoints2d = function (transform) {
-        var vertices2d = this._rectToVertices2d(this._rect);
-        var sides = vertices2d.length - 1;
-        var sections = 10;
-        var points2d = [];
-        for (var i = 0; i < sides; ++i) {
-            var startX = vertices2d[i][0];
-            var startY = vertices2d[i][1];
-            var endX = vertices2d[i + 1][0];
-            var endY = vertices2d[i + 1][1];
-            var intervalX = (endX - startX) / (sections - 1);
-            var intervalY = (endY - startY) / (sections - 1);
-            for (var j = 0; j < sections; ++j) {
-                var point = [
-                    startX + j * intervalX,
-                    startY + j * intervalY,
-                ];
-                points2d.push(point);
+    ExtremePointCreateTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
+        this._disposeObjects();
+    };
+    ExtremePointCreateTag.prototype.getDOMObjects = function (camera, size) {
+        var _this = this;
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        var vNodes = [];
+        var points2d = this._geometry.getPoints2d();
+        var length = points2d.length;
+        var _loop_1 = function (index) {
+            var nonModifiedIndex = index;
+            var _a = points2d[index], pointX = _a[0], pointY = _a[1];
+            var pointCanvas = this_1._viewportCoords.basicToCanvasSafe(pointX, pointY, container, this_1._transform, camera);
+            if (!pointCanvas) {
+                return "continue";
+            }
+            var abort = function (e) {
+                e.stopPropagation();
+                _this._aborted$.next(_this);
+            };
+            var remove = function (e) {
+                e.stopPropagation();
+                _this._geometry.removePoint2d(nonModifiedIndex);
+            };
+            var transform = this_1._canvasToTransform(pointCanvas);
+            var completerProperties = {
+                onclick: index === 0 && length < 3 ? abort : remove,
+                style: { transform: transform },
+            };
+            vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
+            var background = this_1._colorToBackground(this_1._options.color);
+            var pointProperties = {
+                style: {
+                    background: background,
+                    transform: transform,
+                },
+            };
+            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+        };
+        var this_1 = this;
+        for (var index = 0; index < length - 1; index++) {
+            _loop_1(index);
+        }
+        if (length > 2 && this._options.indicateCompleter === true) {
+            var _a = this._geometry.getCentroid2d(this._transform), centroidX = _a[0], centroidY = _a[1];
+            var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidX, centroidY, container, this._transform, camera);
+            if (!!centroidCanvas) {
+                var complete = function (e) {
+                    e.stopPropagation();
+                    _this._geometry.removePoint2d(_this._geometry.points.length - 1);
+                    _this._created$.next(_this);
+                };
+                var transform = this._canvasToTransform(centroidCanvas);
+                var completerProperties = {
+                    onclick: complete,
+                    style: { transform: transform },
+                };
+                vNodes.push(vd.h("div.TagCompleter.TagLarger", completerProperties, []));
+                var pointProperties = {
+                    style: {
+                        background: this._colorToBackground(this._options.color),
+                        transform: transform,
+                    },
+                };
+                vNodes.push(vd.h("div.TagVertex.TagLarger", pointProperties, []));
+                var dotProperties = {
+                    style: {
+                        transform: transform,
+                    },
+                };
+                vNodes.push(vd.h("div.TagDot", dotProperties, []));
             }
         }
-        return points2d;
+        return vNodes;
     };
-    /**
-     * Convert the top-left, bottom-right representation of a rectangle to a polygon
-     * representation of the vertices starting at the bottom-right corner going
-     * clockwise.
-     *
-     * @param {Array<number>} rect - Top-left, bottom-right representation of a
-     * rectangle.
-     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
-     * rectangle.
-     */
-    RectGeometry.prototype._rectToVertices2d = function (rect) {
-        return [
-            [rect[0], rect[3]],
-            [rect[0], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],
-            [rect[0], rect[3]],
-        ];
+    ExtremePointCreateTag.prototype._onGeometryChanged = function () {
+        this._disposeObjects();
+        this._rectGeometry = new Tag_1.RectGeometry(this._geometry.getRect2d(this._transform));
+        this._createGlObjects();
     };
-    return RectGeometry;
-}(Component_1.VertexGeometry));
-exports.RectGeometry = RectGeometry;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RectGeometry;
+    ExtremePointCreateTag.prototype._createGlObjects = function () {
+        this._glObjects = [];
+        var polygon3d = this._rectGeometry.getPoints3d(this._transform);
+        this._outline = this._createOutine(polygon3d, this._options.color);
+        this._glObjects.push(this._outline);
+    };
+    ExtremePointCreateTag.prototype._disposeObjects = function () {
+        this._disposeLine(this._outline);
+        this._outline = null;
+        this._glObjects = null;
+    };
+    return ExtremePointCreateTag;
+}(Component_1.CreateTag));
+exports.ExtremePointCreateTag = ExtremePointCreateTag;
+
 
-},{"../../../Component":207}],260:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
+},{"../../../Component":291,"../Tag":366,"virtual-dom":247}],393:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var earcut = require("earcut");
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ExtremePointRenderTag = void 0;
+var THREE = require("three");
+var vd = require("virtual-dom");
 var Component_1 = require("../../../Component");
 /**
- * @class VertexGeometry
- * @abstract
- * @classdesc Represents a vertex geometry.
+ * @class OutlineRenderTag
+ * @classdesc Tag visualizing the properties of an OutlineTag.
  */
-var VertexGeometry = (function (_super) {
-    __extends(VertexGeometry, _super);
-    /**
-     * Create a vertex geometry.
-     *
-     * @constructor
-     */
-    function VertexGeometry() {
-        _super.call(this);
+var ExtremePointRenderTag = /** @class */ (function (_super) {
+    __extends(ExtremePointRenderTag, _super);
+    function ExtremePointRenderTag(tag, transform) {
+        var _this = _super.call(this, tag, transform) || this;
+        _this._rectGeometry = new Component_1.RectGeometry(_this._tag.geometry.getRect2d(transform));
+        _this._fill = !transform.gpano ?
+            _this._createFill() : null;
+        _this._outline = _this._tag.lineWidth >= 1 ?
+            _this._createOutline() :
+            null;
+        return _this;
     }
-    /**
-     * Triangulates a 2d polygon and returns the triangle
-     * representation as a flattened array of 3d points.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
-     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
-     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
-     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
-     */
-    VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) {
-        var data = [points2d.slice(0, -1)];
-        for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) {
-            var hole2d = _a[_i];
-            data.push(hole2d.slice(0, -1));
+    ExtremePointRenderTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
+        this._disposeFill();
+        this._disposeOutline();
+    };
+    ExtremePointRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
+        var vNodes = [];
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        if (!this._tag.editable) {
+            return vNodes;
         }
-        var points = points3d.slice(0, -1);
-        for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) {
-            var hole3d = _c[_b];
-            points = points.concat(hole3d.slice(0, -1));
+        var lineColor = this._colorToCss(this._tag.lineColor);
+        var points2d = this._tag.geometry.getPoints2d();
+        for (var i = 0; i < points2d.length; i++) {
+            var _a = points2d[i], vertexBasicX = _a[0], vertexBasicY = _a[1];
+            var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera);
+            if (vertexCanvas == null) {
+                continue;
+            }
+            var cursor = "crosshair";
+            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
+            var vertexCanvasX = Math.round(vertexCanvas[0]);
+            var vertexCanvasY = Math.round(vertexCanvas[1]);
+            var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
+            var properties = {
+                onmousedown: interact,
+                style: { background: lineColor, transform: transform, cursor: cursor },
+            };
+            vNodes.push(vd.h("div.TagResizer", properties, []));
+            if (!this._tag.indicateVertices) {
+                continue;
+            }
+            var pointProperties = {
+                style: { background: lineColor, transform: transform },
+            };
+            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
         }
-        var flattened = earcut.flatten(data);
-        var indices = earcut(flattened.vertices, flattened.holes, flattened.dimensions);
-        var triangles = [];
-        for (var i = 0; i < indices.length; ++i) {
-            var point = points[indices[i]];
-            triangles.push(point[0]);
-            triangles.push(point[1]);
-            triangles.push(point[2]);
+        return vNodes;
+    };
+    ExtremePointRenderTag.prototype.getGLObjects = function () {
+        var glObjects = [];
+        if (this._fill != null) {
+            glObjects.push(this._fill);
         }
-        return triangles;
+        if (this._outline != null) {
+            glObjects.push(this._outline);
+        }
+        return glObjects;
+    };
+    ExtremePointRenderTag.prototype.getRetrievableObjects = function () {
+        return this._fill != null ? [this._fill] : [];
+    };
+    ExtremePointRenderTag.prototype._onGeometryChanged = function () {
+        this._rectGeometry = new Component_1.RectGeometry(this._tag.geometry.getRect2d(this._transform));
+        if (this._fill != null) {
+            this._updateFillGeometry();
+        }
+        if (this._outline != null) {
+            this._updateOulineGeometry();
+        }
+    };
+    ExtremePointRenderTag.prototype._onTagChanged = function () {
+        var glObjectsChanged = false;
+        if (this._fill != null) {
+            this._updateFillMaterial(this._fill.material);
+        }
+        if (this._outline == null) {
+            if (this._tag.lineWidth >= 1) {
+                this._outline = this._createOutline();
+                glObjectsChanged = true;
+            }
+        }
+        else {
+            this._updateOutlineMaterial();
+        }
+        return glObjectsChanged;
+    };
+    ExtremePointRenderTag.prototype._getPoints3d = function () {
+        return this._rectGeometry.getPoints3d(this._transform);
+    };
+    ExtremePointRenderTag.prototype._getTriangles = function () {
+        return this._rectGeometry.getTriangles3d(this._transform);
+    };
+    ExtremePointRenderTag.prototype._updateFillMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.fillColor);
+        material.opacity = this._tag.fillOpacity;
+        material.needsUpdate = true;
+    };
+    ExtremePointRenderTag.prototype._updateLineBasicMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.lineColor);
+        material.linewidth = Math.max(this._tag.lineWidth, 1);
+        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
+        material.opacity = this._tag.lineOpacity;
+        material.transparent = this._tag.lineOpacity < 1;
+        material.needsUpdate = true;
     };
-    return VertexGeometry;
-}(Component_1.Geometry));
-exports.VertexGeometry = VertexGeometry;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = VertexGeometry;
+    ExtremePointRenderTag.prototype._updateOutlineMaterial = function () {
+        var material = this._outline.material;
+        this._updateLineBasicMaterial(material);
+    };
+    return ExtremePointRenderTag;
+}(Component_1.OutlineRenderTagBase));
+exports.ExtremePointRenderTag = ExtremePointRenderTag;
+exports.default = ExtremePointRenderTag;
 
-},{"../../../Component":207,"earcut":6}],261:[function(require,module,exports){
-"use strict";
-(function (Alignment) {
-    Alignment[Alignment["Center"] = 0] = "Center";
-    Alignment[Alignment["Outer"] = 1] = "Outer";
-})(exports.Alignment || (exports.Alignment = {}));
-var Alignment = exports.Alignment;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Alignment;
 
-},{}],262:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
+},{"../../../Component":291,"three":242,"virtual-dom":247}],394:[function(require,module,exports){
 "use strict";
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ExtremePointTag = void 0;
 var Component_1 = require("../../../Component");
-var OutlineCreateTag = (function () {
-    function OutlineCreateTag(geometry, options) {
-        this._geometry = geometry;
-        this._options = { color: options.color == null ? 0xFFFFFF : options.color };
-        this._created$ = new Subject_1.Subject();
-        this._aborted$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(OutlineCreateTag.prototype, "geometry", {
+/**
+ * @class ExtremePointTag
+ *
+ * @classdesc Tag holding properties for visualizing a extreme points
+ * and their outline.
+ *
+ * @example
+ * ```
+ * var geometry = new Mapillary.TagComponent.PointsGeometry([[0.3, 0.3], [0.5, 0.4]]);
+ * var tag = new Mapillary.TagComponent.ExtremePointTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, lineColor: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
+ */
+var ExtremePointTag = /** @class */ (function (_super) {
+    __extends(ExtremePointTag, _super);
+    /**
+     * Create an extreme point tag.
+     *
+     * @override
+     * @constructor
+     * @param {string} id - Unique identifier of the tag.
+     * @param {PointsGeometry} geometry - Geometry defining points of tag.
+     * @param {IExtremePointTagOptions} options - Options defining the visual appearance and
+     * behavior of the extreme point tag.
+     */
+    function ExtremePointTag(id, geometry, options) {
+        var _this = _super.call(this, id, geometry) || this;
+        options = !!options ? options : {};
+        _this._editable = options.editable == null ? false : options.editable;
+        _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
+        _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
+        _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
+        _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
+        _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;
+        _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
+        return _this;
+    }
+    Object.defineProperty(ExtremePointTag.prototype, "editable", {
+        /**
+         * Get editable property.
+         * @returns {boolean} Value indicating if tag is editable.
+         */
+        get: function () {
+            return this._editable;
+        },
+        /**
+         * Set editable property.
+         * @param {boolean}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._editable = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ExtremePointTag.prototype, "fillColor", {
+        /**
+         * Get fill color property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._fillColor;
+        },
+        /**
+         * Set fill color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._fillColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ExtremePointTag.prototype, "fillOpacity", {
+        /**
+         * Get fill opacity property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._fillOpacity;
+        },
+        /**
+         * Set fill opacity property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._fillOpacity = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ExtremePointTag.prototype, "geometry", {
+        /** @inheritdoc */
         get: function () {
             return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "created$", {
+    Object.defineProperty(ExtremePointTag.prototype, "indicateVertices", {
+        /**
+         * Get indicate vertices property.
+         * @returns {boolean} Value indicating if vertices should be indicated
+         * when tag is editable.
+         */
         get: function () {
-            return this._created$;
+            return this._indicateVertices;
         },
-        enumerable: true,
+        /**
+         * Set indicate vertices property.
+         * @param {boolean}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._indicateVertices = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "aborted$", {
+    Object.defineProperty(ExtremePointTag.prototype, "lineColor", {
+        /**
+         * Get line color property.
+         * @returns {number}
+         */
         get: function () {
-            return this._aborted$;
+            return this._lineColor;
         },
-        enumerable: true,
+        /**
+         * Set line color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ExtremePointTag.prototype, "lineOpacity", {
+        /**
+         * Get line opacity property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._lineOpacity;
+        },
+        /**
+         * Set line opacity property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineOpacity = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", {
+    Object.defineProperty(ExtremePointTag.prototype, "lineWidth", {
+        /**
+         * Get line width property.
+         * @returns {number}
+         */
         get: function () {
-            var _this = this;
-            return this._geometry.changed$
-                .map(function (geometry) {
-                return _this;
-            });
+            return this._lineWidth;
         },
-        enumerable: true,
+        /**
+         * Set line width property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineWidth = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    OutlineCreateTag.prototype.getGLObject = function (transform) {
-        var polygon3d = this._geometry.getPoints3d(transform);
-        var positions = this._getPositions(polygon3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        var material = new THREE.LineBasicMaterial({
-            color: this._options.color,
-            linewidth: 1,
-        });
-        return new THREE.Line(geometry, material);
+    /**
+     * Set options for tag.
+     *
+     * @description Sets all the option properties provided and keeps
+     * the rest of the values as is.
+     *
+     * @param {IExtremePointTagOptions} options - Extreme point tag options
+     *
+     * @fires {Tag#changed}
+     */
+    ExtremePointTag.prototype.setOptions = function (options) {
+        this._editable = options.editable == null ? this._editable : options.editable;
+        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
+        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
+        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
+        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
+        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
+        this._notifyChanged$.next(this);
+    };
+    return ExtremePointTag;
+}(Component_1.Tag));
+exports.ExtremePointTag = ExtremePointTag;
+exports.default = ExtremePointTag;
+
+},{"../../../Component":291}],395:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineCreateTag = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../../../Component");
+var OutlineCreateTag = /** @class */ (function (_super) {
+    __extends(OutlineCreateTag, _super);
+    function OutlineCreateTag(geometry, options, transform, viewportCoords) {
+        var _this = _super.call(this, geometry, transform, viewportCoords) || this;
+        _this._options = { color: options.color == null ? 0xFFFFFF : options.color };
+        _this._createGlObjects();
+        return _this;
+    }
+    OutlineCreateTag.prototype.create = function () {
+        if (this._geometry instanceof Component_1.RectGeometry) {
+            this._created$.next(this);
+        }
+        else if (this._geometry instanceof Component_1.PolygonGeometry) {
+            var polygonGeometry = this._geometry;
+            polygonGeometry.removeVertex2d(polygonGeometry.polygon.length - 2);
+            this._created$.next(this);
+        }
+    };
+    OutlineCreateTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
+        this._disposeLine(this._outline);
+        this._disposeObjects();
     };
-    OutlineCreateTag.prototype.getDOMObjects = function (transform, matrixWorldInverse, projectionMatrix) {
+    OutlineCreateTag.prototype.getDOMObjects = function (camera, size) {
         var _this = this;
         var vNodes = [];
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
         var abort = function (e) {
             e.stopPropagation();
             _this._aborted$.next(_this);
         };
         if (this._geometry instanceof Component_1.RectGeometry) {
-            var topLeftPoint3d = this._geometry.getVertex3d(1, transform);
-            var topLeftCameraSpace = this._convertToCameraSpace(topLeftPoint3d, matrixWorldInverse);
-            if (topLeftCameraSpace.z < 0) {
-                var centerCanvas = this._projectToCanvas(topLeftCameraSpace, projectionMatrix);
-                var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
+            var anchorIndex = this._geometry.anchorIndex;
+            var vertexIndex = anchorIndex === undefined ? 1 : anchorIndex;
+            var _a = this._geometry.getVertex2d(vertexIndex), basicX = _a[0], basicY = _a[1];
+            var canvasPoint = this._viewportCoords.basicToCanvasSafe(basicX, basicY, container, this._transform, camera);
+            if (canvasPoint != null) {
+                var background = this._colorToBackground(this._options.color);
+                var transform = this._canvasToTransform(canvasPoint);
                 var pointProperties = {
-                    style: {
-                        background: "#" + ("000000" + this._options.color.toString(16)).substr(-6),
-                        left: centerCss[0],
-                        position: "absolute",
-                        top: centerCss[1],
-                    },
+                    style: { background: background, transform: transform },
                 };
                 var completerProperties = {
                     onclick: abort,
-                    style: { left: centerCss[0], position: "absolute", top: centerCss[1] },
+                    style: { transform: transform },
                 };
                 vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
                 vNodes.push(vd.h("div.TagVertex", pointProperties, []));
@@ -24348,11 +43291,9 @@ var OutlineCreateTag = (function () {
         }
         else if (this._geometry instanceof Component_1.PolygonGeometry) {
             var polygonGeometry_1 = this._geometry;
-            var firstVertex3d = this._geometry.getVertex3d(0, transform);
-            var firstCameraSpace = this._convertToCameraSpace(firstVertex3d, matrixWorldInverse);
-            if (firstCameraSpace.z < 0) {
-                var centerCanvas = this._projectToCanvas(firstCameraSpace, projectionMatrix);
-                var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
+            var _b = polygonGeometry_1.getVertex2d(0), firstVertexBasicX = _b[0], firstVertexBasicY = _b[1];
+            var firstVertexCanvas = this._viewportCoords.basicToCanvasSafe(firstVertexBasicX, firstVertexBasicY, container, this._transform, camera);
+            if (firstVertexCanvas != null) {
                 var firstOnclick = polygonGeometry_1.polygon.length > 4 ?
                     function (e) {
                         e.stopPropagation();
@@ -24360,9 +43301,10 @@ var OutlineCreateTag = (function () {
                         _this._created$.next(_this);
                     } :
                     abort;
+                var transform = this._canvasToTransform(firstVertexCanvas);
                 var completerProperties = {
                     onclick: firstOnclick,
-                    style: { left: centerCss[0], position: "absolute", top: centerCss[1] },
+                    style: { transform: transform },
                 };
                 var firstClass = polygonGeometry_1.polygon.length > 4 ?
                     "TagCompleter" :
@@ -24370,36 +43312,33 @@ var OutlineCreateTag = (function () {
                 vNodes.push(vd.h("div." + firstClass, completerProperties, []));
             }
             if (polygonGeometry_1.polygon.length > 3) {
-                var lastVertex3d = this._geometry.getVertex3d(polygonGeometry_1.polygon.length - 3, transform);
-                var lastCameraSpace = this._convertToCameraSpace(lastVertex3d, matrixWorldInverse);
-                if (lastCameraSpace.z < 0) {
-                    var centerCanvas = this._projectToCanvas(lastCameraSpace, projectionMatrix);
-                    var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
+                var _c = polygonGeometry_1.getVertex2d(polygonGeometry_1.polygon.length - 3), lastVertexBasicX = _c[0], lastVertexBasicY = _c[1];
+                var lastVertexCanvas = this._viewportCoords.basicToCanvasSafe(lastVertexBasicX, lastVertexBasicY, container, this._transform, camera);
+                if (lastVertexCanvas != null) {
                     var remove = function (e) {
                         e.stopPropagation();
                         polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 3);
                     };
+                    var transform = this._canvasToTransform(lastVertexCanvas);
                     var completerProperties = {
                         onclick: remove,
-                        style: { left: centerCss[0], position: "absolute", top: centerCss[1] },
+                        style: { transform: transform },
                     };
                     vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
                 }
             }
-            var vertices3d = this._geometry.getVertices3d(transform);
-            vertices3d.splice(-2, 2);
-            for (var _i = 0, vertices3d_1 = vertices3d; _i < vertices3d_1.length; _i++) {
-                var vertex = vertices3d_1[_i];
-                var vertexCameraSpace = this._convertToCameraSpace(vertex, matrixWorldInverse);
-                if (vertexCameraSpace.z < 0) {
-                    var centerCanvas = this._projectToCanvas(vertexCameraSpace, projectionMatrix);
-                    var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
+            var verticesBasic = polygonGeometry_1.polygon.slice();
+            verticesBasic.splice(-2, 2);
+            for (var _i = 0, verticesBasic_1 = verticesBasic; _i < verticesBasic_1.length; _i++) {
+                var vertexBasic = verticesBasic_1[_i];
+                var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasic[0], vertexBasic[1], container, this._transform, camera);
+                if (vertexCanvas != null) {
+                    var background = this._colorToBackground(this._options.color);
+                    var transform = this._canvasToTransform(vertexCanvas);
                     var pointProperties = {
                         style: {
-                            background: "#" + ("000000" + this._options.color.toString(16)).substr(-6),
-                            left: centerCss[0],
-                            position: "absolute",
-                            top: centerCss[1],
+                            background: background,
+                            transform: transform,
                         },
                     };
                     vNodes.push(vd.h("div.TagVertex", pointProperties, []));
@@ -24421,243 +43360,191 @@ var OutlineCreateTag = (function () {
             polygonGeometry.addVertex2d(point);
         }
     };
-    OutlineCreateTag.prototype._getPositions = function (polygon3d) {
-        var length = polygon3d.length;
-        var positions = new Float32Array(length * 3);
-        for (var i = 0; i < length; ++i) {
-            var index = 3 * i;
-            var position = polygon3d[i];
-            positions[index] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        return positions;
+    OutlineCreateTag.prototype._onGeometryChanged = function () {
+        this._disposeLine(this._outline);
+        this._disposeObjects();
+        this._createGlObjects();
     };
-    OutlineCreateTag.prototype._projectToCanvas = function (point, projectionMatrix) {
-        var projected = new THREE.Vector3(point.x, point.y, point.z)
-            .applyProjection(projectionMatrix);
-        return [(projected.x + 1) / 2, (-projected.y + 1) / 2];
+    OutlineCreateTag.prototype._disposeObjects = function () {
+        this._outline = null;
+        this._glObjects = [];
     };
-    OutlineCreateTag.prototype._convertToCameraSpace = function (point, matrixWorldInverse) {
-        return new THREE.Vector3(point[0], point[1], point[2]).applyMatrix4(matrixWorldInverse);
+    OutlineCreateTag.prototype._createGlObjects = function () {
+        var polygon3d = this._geometry instanceof Component_1.RectGeometry ?
+            this._geometry.getPoints3d(this._transform) :
+            this._geometry.getVertices3d(this._transform);
+        this._outline = this._createOutine(polygon3d, this._options.color);
+        this._glObjects = [this._outline];
     };
     return OutlineCreateTag;
-}());
+}(Component_1.CreateTag));
 exports.OutlineCreateTag = OutlineCreateTag;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = OutlineCreateTag;
 
-},{"../../../Component":207,"rxjs/Subject":33,"three":157,"virtual-dom":163}],263:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
+
+},{"../../../Component":291,"virtual-dom":247}],396:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineRenderTag = void 0;
 var THREE = require("three");
 var vd = require("virtual-dom");
 var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
 /**
  * @class OutlineRenderTag
  * @classdesc Tag visualizing the properties of an OutlineTag.
  */
-var OutlineRenderTag = (function (_super) {
+var OutlineRenderTag = /** @class */ (function (_super) {
     __extends(OutlineRenderTag, _super);
     function OutlineRenderTag(tag, transform) {
-        var _this = this;
-        _super.call(this, tag, transform);
-        this._fill = this._tag.fillOpacity > 0 && !transform.gpano ?
-            this._createFill() :
-            null;
-        this._holes = this._tag.lineWidth >= 1 ?
-            this._createHoles() :
+        var _this = _super.call(this, tag, transform) || this;
+        _this._fill = !transform.gpano ?
+            _this._createFill() :
+            transform.fullPano &&
+                tag.domain === Component_1.TagDomain.TwoDimensional &&
+                tag.geometry instanceof Component_1.PolygonGeometry ?
+                _this._createFill() :
+                null;
+        _this._holes = _this._tag.lineWidth >= 1 ?
+            _this._createHoles() :
             [];
-        this._outline = this._tag.lineWidth >= 1 ?
-            this._createOutline() :
+        _this._outline = _this._tag.lineWidth >= 1 ?
+            _this._createOutline() :
             null;
-        this._glObjects = this._createGLObjects();
-        this._tag.geometry.changed$
-            .subscribe(function (geometry) {
-            if (_this._fill != null) {
-                _this._updateFillGeometry();
-            }
-            if (_this._holes.length > 0) {
-                _this._updateHoleGeometries();
-            }
-            if (_this._outline != null) {
-                _this._updateOulineGeometry();
-            }
-        });
-        this._tag.changed$
-            .subscribe(function (changedTag) {
-            var glObjectsChanged = false;
-            if (_this._fill == null) {
-                if (_this._tag.fillOpacity > 0 && !_this._transform.gpano) {
-                    _this._fill = _this._createFill();
-                    glObjectsChanged = true;
-                }
-            }
-            else {
-                _this._updateFillMaterial();
-            }
-            if (_this._outline == null) {
-                if (_this._tag.lineWidth > 0) {
-                    _this._holes = _this._createHoles();
-                    _this._outline = _this._createOutline();
-                    glObjectsChanged = true;
-                }
-            }
-            else {
-                _this._updateHoleMaterials();
-                _this._updateOutlineMaterial();
-            }
-            if (glObjectsChanged) {
-                _this._glObjects = _this._createGLObjects();
-                _this._glObjectsChanged$.next(_this);
-            }
-        });
+        return _this;
     }
     OutlineRenderTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
         this._disposeFill();
         this._disposeHoles();
         this._disposeOutline();
     };
-    OutlineRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) {
+    OutlineRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
         var _this = this;
         var vNodes = [];
-        if (this._tag.geometry instanceof Component_1.RectGeometry) {
-            if (this._tag.icon != null) {
-                var iconVertex = this._tag.geometry.getVertex3d(this._tag.iconIndex, this._transform);
-                var iconCameraSpace = this._convertToCameraSpace(iconVertex, matrixWorldInverse);
-                if (iconCameraSpace.z < 0) {
-                    var interact = function (e) {
-                        _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                    };
-                    if (atlas.loaded) {
-                        var spriteAlignments = this._getSpriteAlignment(this._tag.iconIndex, this._tag.iconAlignment);
-                        var sprite = atlas.getDOMSprite(this._tag.icon, spriteAlignments[0], spriteAlignments[1]);
-                        var click = function (e) {
-                            e.stopPropagation();
-                            _this._tag.click$.next(_this._tag);
-                        };
-                        var iconCanvas = this._projectToCanvas(iconCameraSpace, projectionMatrix);
-                        var iconCss = iconCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                        var properties = {
-                            onclick: click,
-                            onmousedown: interact,
-                            style: {
-                                left: iconCss[0],
-                                pointerEvents: "all",
-                                position: "absolute",
-                                top: iconCss[1],
-                            },
-                        };
-                        vNodes.push(vd.h("div.TagSymbol", properties, [sprite]));
-                    }
-                }
-            }
-            else if (this._tag.text != null) {
-                var textVertex = this._tag.geometry.getVertex3d(3, this._transform);
-                var textCameraSpace = this._convertToCameraSpace(textVertex, matrixWorldInverse);
-                if (textCameraSpace.z < 0) {
-                    var interact = function (e) {
-                        _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
+        var isRect = this._tag.geometry instanceof Component_1.RectGeometry;
+        var isPerspective = !this._transform.gpano;
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        if (this._tag.icon != null && (isRect || isPerspective)) {
+            var _a = this._tag.geometry instanceof Component_1.RectGeometry ?
+                this._tag.geometry.getVertex2d(this._tag.iconIndex) :
+                this._tag.geometry.getPoleOfInaccessibility2d(), iconBasicX = _a[0], iconBasicY = _a[1];
+            var iconCanvas = this._viewportCoords.basicToCanvasSafe(iconBasicX, iconBasicY, container, this._transform, camera);
+            if (iconCanvas != null) {
+                var interact = function () {
+                    _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
+                };
+                if (atlas.loaded) {
+                    var sprite = atlas.getDOMSprite(this._tag.icon, this._tag.iconFloat);
+                    var iconCanvasX = Math.round(iconCanvas[0]);
+                    var iconCanvasY = Math.round(iconCanvas[1]);
+                    var transform = "translate(" + iconCanvasX + "px," + iconCanvasY + "px)";
+                    var click = function (e) {
+                        e.stopPropagation();
+                        _this._tag.click$.next(_this._tag);
                     };
-                    var labelCanvas = this._projectToCanvas(textCameraSpace, projectionMatrix);
-                    var labelCss = labelCanvas.map(function (coord) { return (100 * coord) + "%"; });
                     var properties = {
+                        onclick: click,
                         onmousedown: interact,
-                        style: {
-                            color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6),
-                            left: labelCss[0],
-                            pointerEvents: "all",
-                            position: "absolute",
-                            top: labelCss[1],
-                        },
-                        textContent: this._tag.text,
+                        style: { transform: transform },
                     };
-                    vNodes.push(vd.h("span.TagSymbol", properties, []));
+                    vNodes.push(vd.h("div.TagSymbol", properties, [sprite]));
                 }
             }
         }
+        else if (this._tag.text != null && (isRect || isPerspective)) {
+            var _b = this._tag.geometry instanceof Component_1.RectGeometry ?
+                this._tag.geometry.getVertex2d(3) :
+                this._tag.geometry.getPoleOfInaccessibility2d(), textBasicX = _b[0], textBasicY = _b[1];
+            var textCanvas = this._viewportCoords.basicToCanvasSafe(textBasicX, textBasicY, container, this._transform, camera);
+            if (textCanvas != null) {
+                var textCanvasX = Math.round(textCanvas[0]);
+                var textCanvasY = Math.round(textCanvas[1]);
+                var transform = this._tag.geometry instanceof Component_1.RectGeometry ?
+                    "translate(" + textCanvasX + "px," + textCanvasY + "px)" :
+                    "translate(-50%, -50%) translate(" + textCanvasX + "px," + textCanvasY + "px)";
+                var interact = function () {
+                    _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
+                };
+                var properties = {
+                    onmousedown: interact,
+                    style: {
+                        color: this._colorToCss(this._tag.textColor),
+                        transform: transform,
+                    },
+                    textContent: this._tag.text,
+                };
+                vNodes.push(vd.h("span.TagSymbol", properties, []));
+            }
+        }
         if (!this._tag.editable) {
             return vNodes;
         }
-        var lineColor = "#" + ("000000" + this._tag.lineColor.toString(16)).substr(-6);
+        var lineColor = this._colorToCss(this._tag.lineColor);
         if (this._tag.geometry instanceof Component_1.RectGeometry) {
-            var centroid3d = this._tag.geometry.getCentroid3d(this._transform);
-            var centroidCameraSpace = this._convertToCameraSpace(centroid3d, matrixWorldInverse);
-            if (centroidCameraSpace.z < 0) {
-                var interact = this._interact(Component_1.TagOperation.Centroid);
-                var centerCanvas = this._projectToCanvas(centroidCameraSpace, projectionMatrix);
-                var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
+            var _c = this._tag.geometry.getCentroid2d(), centroidBasicX = _c[0], centroidBasicY = _c[1];
+            var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
+            if (centroidCanvas != null) {
+                var interact = this._interact(Component_1.TagOperation.Centroid, "move");
+                var centroidCanvasX = Math.round(centroidCanvas[0]);
+                var centroidCanvasY = Math.round(centroidCanvas[1]);
+                var transform = "translate(-50%, -50%) translate(" + centroidCanvasX + "px," + centroidCanvasY + "px)";
                 var properties = {
                     onmousedown: interact,
-                    style: { background: lineColor, left: centerCss[0], position: "absolute", top: centerCss[1] },
+                    style: { background: lineColor, transform: transform },
                 };
                 vNodes.push(vd.h("div.TagMover", properties, []));
             }
         }
-        var vertices3d = this._tag.geometry.getVertices3d(this._transform);
-        for (var i = 0; i < vertices3d.length - 1; i++) {
-            var isRectGeometry = this._tag.geometry instanceof Component_1.RectGeometry;
-            if (isRectGeometry &&
+        var vertices2d = this._tag.geometry.getVertices2d();
+        for (var i = 0; i < vertices2d.length - 1; i++) {
+            if (isRect &&
                 ((this._tag.icon != null && i === this._tag.iconIndex) ||
                     (this._tag.icon == null && this._tag.text != null && i === 3))) {
                 continue;
             }
-            var vertexCameraSpace = this._convertToCameraSpace(vertices3d[i], matrixWorldInverse);
-            if (vertexCameraSpace.z > 0) {
+            var _d = vertices2d[i], vertexBasicX = _d[0], vertexBasicY = _d[1];
+            var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera);
+            if (vertexCanvas == null) {
                 continue;
             }
-            var interact = this._interact(Component_1.TagOperation.Vertex, i);
-            var vertexCanvas = this._projectToCanvas(vertexCameraSpace, projectionMatrix);
-            var vertexCss = vertexCanvas.map(function (coord) { return (100 * coord) + "%"; });
+            var cursor = isRect ?
+                i % 2 === 0 ? "nesw-resize" : "nwse-resize" :
+                "crosshair";
+            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
+            var vertexCanvasX = Math.round(vertexCanvas[0]);
+            var vertexCanvasY = Math.round(vertexCanvas[1]);
+            var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
             var properties = {
                 onmousedown: interact,
-                style: {
-                    background: lineColor,
-                    left: vertexCss[0],
-                    position: "absolute",
-                    top: vertexCss[1],
-                },
+                style: { background: lineColor, transform: transform, cursor: cursor },
             };
-            if (isRectGeometry) {
-                properties.style.cursor = i % 2 === 0 ? "nesw-resize" : "nwse-resize";
-            }
             vNodes.push(vd.h("div.TagResizer", properties, []));
             if (!this._tag.indicateVertices) {
                 continue;
             }
             var pointProperties = {
-                style: {
-                    background: lineColor,
-                    left: vertexCss[0],
-                    position: "absolute",
-                    top: vertexCss[1],
-                },
+                style: { background: lineColor, transform: transform },
             };
             vNodes.push(vd.h("div.TagVertex", pointProperties, []));
         }
         return vNodes;
     };
-    OutlineRenderTag.prototype._createFill = function () {
-        var triangles = this._tag.geometry.getTriangles3d(this._transform);
-        var positions = new Float32Array(triangles);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.MeshBasicMaterial({
-            color: this._tag.fillColor,
-            opacity: this._tag.fillOpacity,
-            side: THREE.DoubleSide,
-            transparent: true,
-        });
-        return new THREE.Mesh(geometry, material);
-    };
-    OutlineRenderTag.prototype._createGLObjects = function () {
+    OutlineRenderTag.prototype.getGLObjects = function () {
         var glObjects = [];
         if (this._fill != null) {
             glObjects.push(this._fill);
@@ -24671,11 +43558,65 @@ var OutlineRenderTag = (function (_super) {
         }
         return glObjects;
     };
+    OutlineRenderTag.prototype.getRetrievableObjects = function () {
+        return this._fill != null ? [this._fill] : [];
+    };
+    OutlineRenderTag.prototype._onGeometryChanged = function () {
+        if (this._fill != null) {
+            this._updateFillGeometry();
+        }
+        if (this._holes.length > 0) {
+            this._updateHoleGeometries();
+        }
+        if (this._outline != null) {
+            this._updateOulineGeometry();
+        }
+    };
+    OutlineRenderTag.prototype._onTagChanged = function () {
+        var glObjectsChanged = false;
+        if (this._fill != null) {
+            this._updateFillMaterial(this._fill.material);
+        }
+        if (this._outline == null) {
+            if (this._tag.lineWidth >= 1) {
+                this._holes = this._createHoles();
+                this._outline = this._createOutline();
+                glObjectsChanged = true;
+            }
+        }
+        else {
+            this._updateHoleMaterials();
+            this._updateOutlineMaterial();
+        }
+        return glObjectsChanged;
+    };
+    OutlineRenderTag.prototype._getPoints3d = function () {
+        return this._in3dDomain() ?
+            this._tag.geometry.getVertices3d(this._transform) :
+            this._tag.geometry.getPoints3d(this._transform);
+    };
+    OutlineRenderTag.prototype._getTriangles = function () {
+        return this._in3dDomain() ?
+            this._tag.geometry.get3dDomainTriangles3d(this._transform) :
+            this._tag.geometry.getTriangles3d(this._transform);
+    };
+    OutlineRenderTag.prototype._updateFillMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.fillColor);
+        material.opacity = this._tag.fillOpacity;
+        material.needsUpdate = true;
+    };
+    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.lineColor);
+        material.linewidth = Math.max(this._tag.lineWidth, 1);
+        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
+        material.opacity = this._tag.lineOpacity;
+        material.transparent = this._tag.lineOpacity < 1;
+        material.needsUpdate = true;
+    };
     OutlineRenderTag.prototype._createHoles = function () {
         var holes = [];
         if (this._tag.geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry = this._tag.geometry;
-            var holes3d = polygonGeometry.getHoleVertices3d(this._transform);
+            var holes3d = this._getHoles3d();
             for (var _i = 0, holes3d_1 = holes3d; _i < holes3d_1.length; _i++) {
                 var holePoints3d = holes3d_1[_i];
                 var hole = this._createLine(holePoints3d);
@@ -24684,22 +43625,116 @@ var OutlineRenderTag = (function (_super) {
         }
         return holes;
     };
-    OutlineRenderTag.prototype._createLine = function (points3d) {
+    OutlineRenderTag.prototype._disposeHoles = function () {
+        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
+            var hole = _a[_i];
+            hole.geometry.dispose();
+            hole.material.dispose();
+        }
+        this._holes = [];
+    };
+    OutlineRenderTag.prototype._getHoles3d = function () {
+        var polygonGeometry = this._tag.geometry;
+        return this._in3dDomain() ?
+            polygonGeometry.getHoleVertices3d(this._transform) :
+            polygonGeometry.getHolePoints3d(this._transform);
+    };
+    OutlineRenderTag.prototype._in3dDomain = function () {
+        return this._tag.geometry instanceof Component_1.PolygonGeometry && this._tag.domain === Component_1.TagDomain.ThreeDimensional;
+    };
+    OutlineRenderTag.prototype._updateHoleGeometries = function () {
+        var holes3d = this._getHoles3d();
+        if (holes3d.length !== this._holes.length) {
+            throw new Error("Changing the number of holes is not supported.");
+        }
+        for (var i = 0; i < this._holes.length; i++) {
+            var holePoints3d = holes3d[i];
+            var hole = this._holes[i];
+            this._updateLine(hole, holePoints3d);
+        }
+    };
+    OutlineRenderTag.prototype._updateHoleMaterials = function () {
+        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
+            var hole = _a[_i];
+            this._updateLineBasicMaterial(hole.material);
+        }
+    };
+    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
+        this._updateLineBasicMaterial(this._outline.material);
+    };
+    return OutlineRenderTag;
+}(Component_1.OutlineRenderTagBase));
+exports.OutlineRenderTag = OutlineRenderTag;
+
+
+},{"../../../Component":291,"three":242,"virtual-dom":247}],397:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineRenderTagBase = void 0;
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+var OutlineRenderTagBase = /** @class */ (function (_super) {
+    __extends(OutlineRenderTagBase, _super);
+    function OutlineRenderTagBase(tag, transform) {
+        var _this = _super.call(this, tag, transform) || this;
+        _this._geometryChangedSubscription = _this._tag.geometry.changed$
+            .subscribe(function () {
+            _this._onGeometryChanged();
+        });
+        _this._changedSubscription = _this._tag.changed$
+            .subscribe(function () {
+            var glObjectsChanged = _this._onTagChanged();
+            if (glObjectsChanged) {
+                _this._glObjectsChanged$.next(_this);
+            }
+        });
+        return _this;
+    }
+    OutlineRenderTagBase.prototype.dispose = function () {
+        this._changedSubscription.unsubscribe();
+        this._geometryChangedSubscription.unsubscribe();
+    };
+    OutlineRenderTagBase.prototype._colorToCss = function (color) {
+        return "#" + ("000000" + color.toString(16)).substr(-6);
+    };
+    OutlineRenderTagBase.prototype._createFill = function () {
+        var triangles = this._getTriangles();
+        var positions = new Float32Array(triangles);
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.computeBoundingSphere();
+        var material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true });
+        this._updateFillMaterial(material);
+        return new THREE.Mesh(geometry, material);
+    };
+    OutlineRenderTagBase.prototype._createLine = function (points3d) {
         var positions = this._getLinePositions(points3d);
         var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
         geometry.computeBoundingSphere();
-        var material = new THREE.LineBasicMaterial({
-            color: this._tag.lineColor,
-            linewidth: this._tag.lineWidth,
-        });
-        return new THREE.Line(geometry, material);
+        var material = new THREE.LineBasicMaterial();
+        this._updateLineBasicMaterial(material);
+        var line = new THREE.Line(geometry, material);
+        line.renderOrder = 1;
+        return line;
     };
-    OutlineRenderTag.prototype._createOutline = function () {
-        var points3d = this._tag.geometry.getPoints3d(this._transform);
-        return this._createLine(points3d);
+    OutlineRenderTagBase.prototype._createOutline = function () {
+        return this._createLine(this._getPoints3d());
     };
-    OutlineRenderTag.prototype._disposeFill = function () {
+    OutlineRenderTagBase.prototype._disposeFill = function () {
         if (this._fill == null) {
             return;
         }
@@ -24707,15 +43742,7 @@ var OutlineRenderTag = (function (_super) {
         this._fill.material.dispose();
         this._fill = null;
     };
-    OutlineRenderTag.prototype._disposeHoles = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            hole.geometry.dispose();
-            hole.material.dispose();
-        }
-        this._holes = [];
-    };
-    OutlineRenderTag.prototype._disposeOutline = function () {
+    OutlineRenderTagBase.prototype._disposeOutline = function () {
         if (this._outline == null) {
             return;
         }
@@ -24723,7 +43750,7 @@ var OutlineRenderTag = (function (_super) {
         this._outline.material.dispose();
         this._outline = null;
     };
-    OutlineRenderTag.prototype._getLinePositions = function (points3d) {
+    OutlineRenderTagBase.prototype._getLinePositions = function (points3d) {
         var length = points3d.length;
         var positions = new Float32Array(length * 3);
         for (var i = 0; i < length; ++i) {
@@ -24735,39 +43762,13 @@ var OutlineRenderTag = (function (_super) {
         }
         return positions;
     };
-    OutlineRenderTag.prototype._getSpriteAlignment = function (index, alignment) {
-        var horizontalAlignment = Viewer_1.SpriteAlignment.Center;
-        var verticalAlignment = Viewer_1.SpriteAlignment.Center;
-        if (alignment === Component_1.Alignment.Outer) {
-            switch (index) {
-                case 0:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.End;
-                    verticalAlignment = Viewer_1.SpriteAlignment.Start;
-                    break;
-                case 1:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.End;
-                    verticalAlignment = Viewer_1.SpriteAlignment.End;
-                    break;
-                case 2:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.Start;
-                    verticalAlignment = Viewer_1.SpriteAlignment.End;
-                    break;
-                case 3:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.Start;
-                    verticalAlignment = Viewer_1.SpriteAlignment.Start;
-                    break;
-                default:
-                    break;
-            }
-        }
-        return [horizontalAlignment, verticalAlignment];
-    };
-    OutlineRenderTag.prototype._interact = function (operation, vertexIndex) {
+    OutlineRenderTagBase.prototype._interact = function (operation, cursor, vertexIndex) {
         var _this = this;
         return function (e) {
             var offsetX = e.offsetX - e.target.offsetWidth / 2;
             var offsetY = e.offsetY - e.target.offsetHeight / 2;
             _this._interact$.next({
+                cursor: cursor,
                 offsetX: offsetX,
                 offsetY: offsetY,
                 operation: operation,
@@ -24776,8 +43777,8 @@ var OutlineRenderTag = (function (_super) {
             });
         };
     };
-    OutlineRenderTag.prototype._updateFillGeometry = function () {
-        var triangles = this._tag.geometry.getTriangles3d(this._transform);
+    OutlineRenderTagBase.prototype._updateFillGeometry = function () {
+        var triangles = this._getTriangles();
         var positions = new Float32Array(triangles);
         var geometry = this._fill.geometry;
         var attribute = geometry.getAttribute("position");
@@ -24787,36 +43788,11 @@ var OutlineRenderTag = (function (_super) {
         }
         else {
             geometry.removeAttribute("position");
-            geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
+            geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
         }
         geometry.computeBoundingSphere();
     };
-    OutlineRenderTag.prototype._updateFillMaterial = function () {
-        var material = this._fill.material;
-        material.color = new THREE.Color(this._tag.fillColor);
-        material.opacity = this._tag.fillOpacity;
-        material.needsUpdate = true;
-    };
-    OutlineRenderTag.prototype._updateHoleGeometries = function () {
-        var polygonGeometry = this._tag.geometry;
-        var holes3d = polygonGeometry.getHoleVertices3d(this._transform);
-        if (holes3d.length !== this._holes.length) {
-            throw new Error("Changing the number of holes is not supported.");
-        }
-        for (var i = 0; i < this._holes.length; i++) {
-            var holePoints3d = holes3d[i];
-            var hole = this._holes[i];
-            this._updateLine(hole, holePoints3d);
-        }
-    };
-    OutlineRenderTag.prototype._updateHoleMaterials = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            var material = hole.material;
-            this._updateLineBasicMaterial(material);
-        }
-    };
-    OutlineRenderTag.prototype._updateLine = function (line, points3d) {
+    OutlineRenderTagBase.prototype._updateLine = function (line, points3d) {
         var positions = this._getLinePositions(points3d);
         var geometry = line.geometry;
         var attribute = geometry.getAttribute("position");
@@ -24824,283 +43800,701 @@ var OutlineRenderTag = (function (_super) {
         attribute.needsUpdate = true;
         geometry.computeBoundingSphere();
     };
-    OutlineRenderTag.prototype._updateOulineGeometry = function () {
-        var points3d = this._tag.geometry.getPoints3d(this._transform);
-        this._updateLine(this._outline, points3d);
-    };
-    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
-        var material = this._outline.material;
-        this._updateLineBasicMaterial(material);
-    };
-    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.lineColor);
-        material.linewidth = Math.max(this._tag.lineWidth, 1);
-        material.opacity = this._tag.lineWidth >= 1 ? 1 : 0;
-        material.transparent = this._tag.lineWidth <= 0;
-        material.needsUpdate = true;
+    OutlineRenderTagBase.prototype._updateOulineGeometry = function () {
+        this._updateLine(this._outline, this._getPoints3d());
     };
-    return OutlineRenderTag;
+    return OutlineRenderTagBase;
 }(Component_1.RenderTag));
-exports.OutlineRenderTag = OutlineRenderTag;
+exports.OutlineRenderTagBase = OutlineRenderTagBase;
+exports.default = OutlineRenderTagBase;
 
-},{"../../../Component":207,"../../../Viewer":216,"three":157,"virtual-dom":163}],264:[function(require,module,exports){
+
+},{"../../../Component":291,"three":242}],398:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require("rxjs/Subject");
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineTag = void 0;
+var rxjs_1 = require("rxjs");
 var Component_1 = require("../../../Component");
+var Viewer_1 = require("../../../Viewer");
 /**
  * @class OutlineTag
+ *
  * @classdesc Tag holding properties for visualizing a geometry outline.
+ *
+ * @example
+ * ```
+ * var geometry = new Mapillary.TagComponent.RectGeometry([0.3, 0.3, 0.5, 0.4]);
+ * var tag = new Mapillary.TagComponent.OutlineTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, lineColor: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
  */
-var OutlineTag = (function (_super) {
+var OutlineTag = /** @class */ (function (_super) {
     __extends(OutlineTag, _super);
     /**
      * Create an outline tag.
      *
      * @override
      * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
+     * @param {string} id - Unique identifier of the tag.
+     * @param {VertexGeometry} geometry - Geometry defining vertices of tag.
      * @param {IOutlineTagOptions} options - Options defining the visual appearance and
      * behavior of the outline tag.
      */
     function OutlineTag(id, geometry, options) {
-        var _this = this;
-        _super.call(this, id, geometry);
-        this._editable = options.editable == null ? false : options.editable;
-        this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
-        this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
-        this._icon = options.icon === undefined ? null : options.icon;
-        this._iconAlignment = options.iconAlignment == null ? Component_1.Alignment.Outer : options.iconAlignment;
-        this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex;
-        this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
-        this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
-        this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
-        this._text = options.text === undefined ? null : options.text;
-        this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-        this._click$ = new Subject_1.Subject();
-        this._click$
+        var _this = _super.call(this, id, geometry) || this;
+        options = !!options ? options : {};
+        var domain = options.domain != null && geometry instanceof Component_1.PolygonGeometry ?
+            options.domain : Component_1.TagDomain.TwoDimensional;
+        var twoDimensionalPolygon = _this._twoDimensionalPolygon(domain, geometry);
+        _this._domain = domain;
+        _this._editable = options.editable == null || twoDimensionalPolygon ? false : options.editable;
+        _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
+        _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
+        _this._icon = options.icon === undefined ? null : options.icon;
+        _this._iconFloat = options.iconFloat == null ? Viewer_1.Alignment.Center : options.iconFloat;
+        _this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex;
+        _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
+        _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
+        _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;
+        _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
+        _this._text = options.text === undefined ? null : options.text;
+        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
+        _this._click$ = new rxjs_1.Subject();
+        _this._click$
             .subscribe(function (t) {
             _this.fire(OutlineTag.click, _this);
         });
+        return _this;
     }
     Object.defineProperty(OutlineTag.prototype, "click$", {
         /**
-         * Click observable.
+         * Click observable.
+         *
+         * @description An observable emitting the tag when the icon of the
+         * tag has been clicked.
+         *
+         * @returns {Observable<Tag>}
+         */
+        get: function () {
+            return this._click$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "domain", {
+        /**
+         * Get domain property.
+         *
+         * @description Readonly property that can only be set in constructor.
+         *
+         * @returns Value indicating the domain of the tag.
+         */
+        get: function () {
+            return this._domain;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "editable", {
+        /**
+         * Get editable property.
+         * @returns {boolean} Value indicating if tag is editable.
+         */
+        get: function () {
+            return this._editable;
+        },
+        /**
+         * Set editable property.
+         * @param {boolean}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            if (this._twoDimensionalPolygon(this._domain, this._geometry)) {
+                return;
+            }
+            this._editable = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "fillColor", {
+        /**
+         * Get fill color property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._fillColor;
+        },
+        /**
+         * Set fill color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._fillColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "fillOpacity", {
+        /**
+         * Get fill opacity property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._fillOpacity;
+        },
+        /**
+         * Set fill opacity property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._fillOpacity = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "geometry", {
+        /** @inheritdoc */
+        get: function () {
+            return this._geometry;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "icon", {
+        /**
+         * Get icon property.
+         * @returns {string}
+         */
+        get: function () {
+            return this._icon;
+        },
+        /**
+         * Set icon property.
+         * @param {string}
          *
-         * @description An observable emitting the tag when the icon of the
-         * tag has been clicked.
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._icon = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "iconFloat", {
+        /**
+         * Get icon float property.
+         * @returns {Alignment}
+         */
+        get: function () {
+            return this._iconFloat;
+        },
+        /**
+         * Set icon float property.
+         * @param {Alignment}
          *
-         * @returns {Observable<Tag>}
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._iconFloat = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "iconIndex", {
+        /**
+         * Get icon index property.
+         * @returns {number}
          */
         get: function () {
-            return this._click$;
+            return this._iconIndex;
         },
-        enumerable: true,
+        /**
+         * Set icon index property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._iconIndex = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "editable", {
+    Object.defineProperty(OutlineTag.prototype, "indicateVertices", {
         /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
+         * Get indicate vertices property.
+         * @returns {boolean} Value indicating if vertices should be indicated
+         * when tag is editable.
          */
         get: function () {
-            return this._editable;
+            return this._indicateVertices;
         },
         /**
-         * Set editable property.
+         * Set indicate vertices property.
          * @param {boolean}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._editable = value;
+            this._indicateVertices = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "fillColor", {
+    Object.defineProperty(OutlineTag.prototype, "lineColor", {
         /**
-         * Get fill color property.
+         * Get line color property.
          * @returns {number}
          */
         get: function () {
-            return this._fillColor;
+            return this._lineColor;
         },
         /**
-         * Set fill color property.
+         * Set line color property.
          * @param {number}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._fillColor = value;
+            this._lineColor = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "fillOpacity", {
+    Object.defineProperty(OutlineTag.prototype, "lineOpacity", {
         /**
-         * Get fill opacity property.
+         * Get line opacity property.
          * @returns {number}
          */
         get: function () {
-            return this._fillOpacity;
+            return this._lineOpacity;
         },
         /**
-         * Set fill opacity property.
+         * Set line opacity property.
          * @param {number}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._fillOpacity = value;
+            this._lineOpacity = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "geometry", {
+    Object.defineProperty(OutlineTag.prototype, "lineWidth", {
+        /**
+         * Get line width property.
+         * @returns {number}
+         */
         get: function () {
-            return this._geometry;
+            return this._lineWidth;
         },
-        enumerable: true,
+        /**
+         * Set line width property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineWidth = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "icon", {
+    Object.defineProperty(OutlineTag.prototype, "text", {
         /**
-         * Get icon property.
+         * Get text property.
          * @returns {string}
          */
         get: function () {
-            return this._icon;
+            return this._text;
         },
         /**
-         * Set icon property.
+         * Set text property.
          * @param {string}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._icon = value;
+            this._text = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "iconAlignment", {
+    Object.defineProperty(OutlineTag.prototype, "textColor", {
         /**
-         * Get icon alignment property.
-         * @returns {Alignment}
+         * Get text color property.
+         * @returns {number}
          */
         get: function () {
-            return this._iconAlignment;
+            return this._textColor;
         },
         /**
-         * Set icon alignment property.
-         * @param {Alignment}
+         * Set text color property.
+         * @param {number}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._iconAlignment = value;
+            this._textColor = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "iconIndex", {
+    /**
+     * Set options for tag.
+     *
+     * @description Sets all the option properties provided and keeps
+     * the rest of the values as is.
+     *
+     * @param {IOutlineTagOptions} options - Outline tag options
+     *
+     * @fires {Tag#changed}
+     */
+    OutlineTag.prototype.setOptions = function (options) {
+        var twoDimensionalPolygon = this._twoDimensionalPolygon(this._domain, this._geometry);
+        this._editable = twoDimensionalPolygon || options.editable == null ? this._editable : options.editable;
+        this._icon = options.icon === undefined ? this._icon : options.icon;
+        this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat;
+        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;
+        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
+        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
+        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
+        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
+        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
+        this._text = options.text === undefined ? this._text : options.text;
+        this._textColor = options.textColor == null ? this._textColor : options.textColor;
+        this._notifyChanged$.next(this);
+    };
+    OutlineTag.prototype._twoDimensionalPolygon = function (domain, geometry) {
+        return domain !== Component_1.TagDomain.ThreeDimensional && geometry instanceof Component_1.PolygonGeometry;
+    };
+    /**
+     * Event fired when the icon of the outline tag is clicked.
+     *
+     * @event OutlineTag#click
+     * @type {OutlineTag} The tag instance that was clicked.
+     */
+    OutlineTag.click = "click";
+    return OutlineTag;
+}(Component_1.Tag));
+exports.OutlineTag = OutlineTag;
+exports.default = OutlineTag;
+
+},{"../../../Component":291,"../../../Viewer":302,"rxjs":43}],399:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderTag = void 0;
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../../Geo");
+var RenderTag = /** @class */ (function () {
+    function RenderTag(tag, transform, viewportCoords) {
+        this._tag = tag;
+        this._transform = transform;
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        this._glObjectsChanged$ = new rxjs_1.Subject();
+        this._interact$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
+        get: function () {
+            return this._glObjectsChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderTag.prototype, "interact$", {
+        get: function () {
+            return this._interact$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderTag.prototype, "tag", {
+        get: function () {
+            return this._tag;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return RenderTag;
+}());
+exports.RenderTag = RenderTag;
+exports.default = RenderTag;
+
+},{"../../../Geo":294,"rxjs":43}],400:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpotRenderTag = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../../../Component");
+var Viewer_1 = require("../../../Viewer");
+/**
+ * @class SpotRenderTag
+ * @classdesc Tag visualizing the properties of a SpotTag.
+ */
+var SpotRenderTag = /** @class */ (function (_super) {
+    __extends(SpotRenderTag, _super);
+    function SpotRenderTag() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    SpotRenderTag.prototype.dispose = function () { };
+    SpotRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
+        var _this = this;
+        var tag = this._tag;
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        var vNodes = [];
+        var _a = tag.geometry.getCentroid2d(), centroidBasicX = _a[0], centroidBasicY = _a[1];
+        var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
+        if (centroidCanvas != null) {
+            var interactNone = function (e) {
+                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag });
+            };
+            var canvasX = Math.round(centroidCanvas[0]);
+            var canvasY = Math.round(centroidCanvas[1]);
+            if (tag.icon != null) {
+                if (atlas.loaded) {
+                    var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom);
+                    var iconTransform = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
+                    var properties = {
+                        onmousedown: interactNone,
+                        style: {
+                            pointerEvents: "all",
+                            transform: iconTransform,
+                        },
+                    };
+                    vNodes.push(vd.h("div", properties, [sprite]));
+                }
+            }
+            else if (tag.text != null) {
+                var textTransform = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
+                var properties = {
+                    onmousedown: interactNone,
+                    style: {
+                        color: this._colorToCss(tag.textColor),
+                        transform: textTransform,
+                    },
+                    textContent: tag.text,
+                };
+                vNodes.push(vd.h("span.TagSymbol", properties, []));
+            }
+            var interact = this._interact(Component_1.TagOperation.Centroid, tag, "move");
+            var background = this._colorToCss(tag.color);
+            var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
+            if (tag.editable) {
+                var interactorProperties = {
+                    onmousedown: interact,
+                    style: {
+                        background: background,
+                        transform: transform,
+                    },
+                };
+                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
+            }
+            var pointProperties = {
+                style: {
+                    background: background,
+                    transform: transform,
+                },
+            };
+            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+        }
+        return vNodes;
+    };
+    SpotRenderTag.prototype.getGLObjects = function () { return []; };
+    SpotRenderTag.prototype.getRetrievableObjects = function () { return []; };
+    SpotRenderTag.prototype._colorToCss = function (color) {
+        return "#" + ("000000" + color.toString(16)).substr(-6);
+    };
+    SpotRenderTag.prototype._interact = function (operation, tag, cursor, vertexIndex) {
+        var _this = this;
+        return function (e) {
+            var offsetX = e.offsetX - e.target.offsetWidth / 2;
+            var offsetY = e.offsetY - e.target.offsetHeight / 2;
+            _this._interact$.next({
+                cursor: cursor,
+                offsetX: offsetX,
+                offsetY: offsetY,
+                operation: operation,
+                tag: tag,
+                vertexIndex: vertexIndex,
+            });
+        };
+    };
+    return SpotRenderTag;
+}(Component_1.RenderTag));
+exports.SpotRenderTag = SpotRenderTag;
+
+
+},{"../../../Component":291,"../../../Viewer":302,"virtual-dom":247}],401:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpotTag = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class SpotTag
+ *
+ * @classdesc Tag holding properties for visualizing the centroid of a geometry.
+ *
+ * @example
+ * ```
+ * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]);
+ * var tag = new Mapillary.TagComponent.SpotTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, color: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
+ */
+var SpotTag = /** @class */ (function (_super) {
+    __extends(SpotTag, _super);
+    /**
+     * Create a spot tag.
+     *
+     * @override
+     * @constructor
+     * @param {string} id
+     * @param {Geometry} geometry
+     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
+     * behavior of the spot tag.
+     */
+    function SpotTag(id, geometry, options) {
+        var _this = _super.call(this, id, geometry) || this;
+        options = !!options ? options : {};
+        _this._color = options.color == null ? 0xFFFFFF : options.color;
+        _this._editable = options.editable == null ? false : options.editable;
+        _this._icon = options.icon === undefined ? null : options.icon;
+        _this._text = options.text === undefined ? null : options.text;
+        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
+        return _this;
+    }
+    Object.defineProperty(SpotTag.prototype, "color", {
         /**
-         * Get icon index property.
-         * @returns {number}
+         * Get color property.
+         * @returns {number} The color of the spot as a hexagonal number;
          */
         get: function () {
-            return this._iconIndex;
+            return this._color;
         },
         /**
-         * Set icon index property.
+         * Set color property.
          * @param {number}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._iconIndex = value;
+            this._color = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "indicateVertices", {
+    Object.defineProperty(SpotTag.prototype, "editable", {
         /**
-         * Get indicate vertices property.
-         * @returns {boolean} Value indicating if vertices should be indicated
-         * when tag is editable.
+         * Get editable property.
+         * @returns {boolean} Value indicating if tag is editable.
          */
         get: function () {
-            return this._indicateVertices;
+            return this._editable;
         },
         /**
-         * Set indicate vertices property.
+         * Set editable property.
          * @param {boolean}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._indicateVertices = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineColor", {
-        /**
-         * Get line color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineColor;
-        },
-        /**
-         * Set line color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineColor = value;
+            this._editable = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "lineWidth", {
+    Object.defineProperty(SpotTag.prototype, "icon", {
         /**
-         * Get line width property.
-         * @returns {number}
+         * Get icon property.
+         * @returns {string}
          */
         get: function () {
-            return this._lineWidth;
+            return this._icon;
         },
         /**
-         * Set line width property.
-         * @param {number}
+         * Set icon property.
+         * @param {string}
          *
          * @fires Tag#changed
          */
         set: function (value) {
-            this._lineWidth = value;
+            this._icon = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "text", {
+    Object.defineProperty(SpotTag.prototype, "text", {
         /**
          * Get text property.
          * @returns {string}
@@ -25118,10 +44512,10 @@ var OutlineTag = (function (_super) {
             this._text = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "textColor", {
+    Object.defineProperty(SpotTag.prototype, "textColor", {
         /**
          * Get text color property.
          * @returns {number}
@@ -25139,7 +44533,7 @@ var OutlineTag = (function (_super) {
             this._textColor = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -25148,631 +44542,1142 @@ var OutlineTag = (function (_super) {
      * @description Sets all the option properties provided and keps
      * the rest of the values as is.
      *
-     * @param {IOutlineTagOptions} options - Outline tag options
+     * @param {ISpotTagOptions} options - Spot tag options
      *
      * @fires {Tag#changed}
      */
-    OutlineTag.prototype.setOptions = function (options) {
+    SpotTag.prototype.setOptions = function (options) {
+        this._color = options.color == null ? this._color : options.color;
         this._editable = options.editable == null ? this._editable : options.editable;
         this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._iconAlignment = options.iconAlignment == null ? this._iconAlignment : options.iconAlignment;
-        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;
-        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
-        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
-        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
-        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
-        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
         this._text = options.text === undefined ? this._text : options.text;
         this._textColor = options.textColor == null ? this._textColor : options.textColor;
         this._notifyChanged$.next(this);
     };
-    /**
-     * Event fired when the icon of the outline tag is clicked.
-     *
-     * @event OutlineTag#click
-     * @type {OutlineTag} The tag instance that was clicked.
-     */
-    OutlineTag.click = "click";
-    return OutlineTag;
+    return SpotTag;
 }(Component_1.Tag));
-exports.OutlineTag = OutlineTag;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = OutlineTag;
+exports.SpotTag = SpotTag;
+exports.default = SpotTag;
 
-},{"../../../Component":207,"rxjs/Subject":33}],265:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
+},{"../../../Component":291}],402:[function(require,module,exports){
 "use strict";
-var THREE = require("three");
-var Subject_1 = require("rxjs/Subject");
-var RenderTag = (function () {
-    function RenderTag(tag, transform) {
-        this._tag = tag;
-        this._transform = transform;
-        this._glObjects = [];
-        this._glObjectsChanged$ = new Subject_1.Subject();
-        this._interact$ = new Subject_1.Subject();
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Tag = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Utils_1 = require("../../../Utils");
+/**
+ * @class Tag
+ * @abstract
+ * @classdesc Abstract class representing the basic functionality of for a tag.
+ */
+var Tag = /** @class */ (function (_super) {
+    __extends(Tag, _super);
+    /**
+     * Create a tag.
+     *
+     * @constructor
+     * @param {string} id
+     * @param {Geometry} geometry
+     */
+    function Tag(id, geometry) {
+        var _this = _super.call(this) || this;
+        _this._id = id;
+        _this._geometry = geometry;
+        _this._notifyChanged$ = new rxjs_1.Subject();
+        _this._notifyChanged$
+            .subscribe(function (t) {
+            _this.fire(Tag.changed, _this);
+        });
+        _this._geometry.changed$
+            .subscribe(function (g) {
+            _this.fire(Tag.geometrychanged, _this);
+        });
+        return _this;
     }
-    Object.defineProperty(RenderTag.prototype, "glObjects", {
+    Object.defineProperty(Tag.prototype, "id", {
         /**
-         * Get the GL objects for rendering of the tag.
-         * @return {Array<Object3D>}
+         * Get id property.
+         * @returns {string}
          */
         get: function () {
-            return this._glObjects;
+            return this._id;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
+    Object.defineProperty(Tag.prototype, "geometry", {
+        /**
+         * Get geometry property.
+         * @returns {Geometry} The geometry of the tag.
+         */
         get: function () {
-            return this._glObjectsChanged$;
+            return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderTag.prototype, "interact$", {
+    Object.defineProperty(Tag.prototype, "changed$", {
+        /**
+         * Get changed observable.
+         * @returns {Observable<Tag>}
+         * @ignore
+         */
         get: function () {
-            return this._interact$;
+            return this._notifyChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderTag.prototype, "tag", {
+    Object.defineProperty(Tag.prototype, "geometryChanged$", {
+        /**
+         * Get geometry changed observable.
+         * @returns {Observable<Tag>}
+         * @ignore
+         */
         get: function () {
-            return this._tag;
+            var _this = this;
+            return this._geometry.changed$.pipe(operators_1.map(function (geometry) {
+                return _this;
+            }), operators_1.share());
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    RenderTag.prototype._projectToCanvas = function (point3d, projectionMatrix) {
-        var projected = new THREE.Vector3(point3d.x, point3d.y, point3d.z)
-            .applyProjection(projectionMatrix);
-        return [(projected.x + 1) / 2, (-projected.y + 1) / 2];
-    };
-    RenderTag.prototype._convertToCameraSpace = function (point3d, matrixWorldInverse) {
-        return new THREE.Vector3(point3d[0], point3d[1], point3d[2]).applyMatrix4(matrixWorldInverse);
-    };
-    return RenderTag;
-}());
-exports.RenderTag = RenderTag;
+    /**
+     * Event fired when a property related to the visual appearance of the
+     * tag has changed.
+     *
+     * @event Tag#changed
+     * @type {Tag} The tag instance that has changed.
+     */
+    Tag.changed = "changed";
+    /**
+     * Event fired when the geometry of the tag has changed.
+     *
+     * @event Tag#geometrychanged
+     * @type {Tag} The tag instance whose geometry has changed.
+     */
+    Tag.geometrychanged = "geometrychanged";
+    return Tag;
+}(Utils_1.EventEmitter));
+exports.Tag = Tag;
+exports.default = Tag;
+
+},{"../../../Utils":301,"rxjs":43,"rxjs/operators":241}],403:[function(require,module,exports){
+"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderTag;
+exports.TagDomain = void 0;
+/**
+ * Enumeration for tag domains.
+ * @enum {number}
+ * @readonly
+ * @description Defines where lines between two vertices are treated
+ * as straight.
+ *
+ * Only applicable for polygons. For rectangles lines between
+ * vertices are always treated as straight in the distorted 2D
+ * projection and bended in the undistorted 3D space.
+ */
+var TagDomain;
+(function (TagDomain) {
+    /**
+     * Treats lines between two vertices as straight in the
+     * distorted 2D projection, i.e. on the image. If the image
+     * is distorted this will result in bended lines when rendered
+     * in the undistorted 3D space.
+     */
+    TagDomain[TagDomain["TwoDimensional"] = 0] = "TwoDimensional";
+    /**
+     * Treats lines as straight in the undistorted 3D space. If the
+     * image is distorted this will result in bended lines when rendered
+     * on the distorted 2D projection of the image.
+     */
+    TagDomain[TagDomain["ThreeDimensional"] = 1] = "ThreeDimensional";
+})(TagDomain = exports.TagDomain || (exports.TagDomain = {}));
+exports.default = TagDomain;
+
+},{}],404:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ComponentSize = void 0;
+/**
+ * Enumeration for component size.
+ * @enum {number}
+ * @readonly
+ * @description May be used by a component to allow for resizing
+ * of the UI elements rendered by the component.
+ */
+var ComponentSize;
+(function (ComponentSize) {
+    /**
+     * Automatic size. The size of the elements will automatically
+     * change at a predefined threshold.
+     */
+    ComponentSize[ComponentSize["Automatic"] = 0] = "Automatic";
+    /**
+     * Large size. The size of the elements will be fixed until another
+     * component size is configured.
+     */
+    ComponentSize[ComponentSize["Large"] = 1] = "Large";
+    /**
+     * Small size. The size of the elements will be fixed until another
+     * component size is configured.
+     */
+    ComponentSize[ComponentSize["Small"] = 2] = "Small";
+})(ComponentSize = exports.ComponentSize || (exports.ComponentSize = {}));
+exports.default = ComponentSize;
+
+},{}],405:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.HandlerBase = void 0;
+var HandlerBase = /** @class */ (function () {
+    /** @ignore */
+    function HandlerBase(component, container, navigator) {
+        this._component = component;
+        this._container = container;
+        this._navigator = navigator;
+        this._enabled = false;
+    }
+    Object.defineProperty(HandlerBase.prototype, "isEnabled", {
+        /**
+         * Returns a Boolean indicating whether the interaction is enabled.
+         *
+         * @returns {boolean} `true` if the interaction is enabled.
+         */
+        get: function () {
+            return this._enabled;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Enables the interaction.
+     *
+     * @example ```<component-name>.<handler-name>.enable();```
+     */
+    HandlerBase.prototype.enable = function () {
+        if (this._enabled || !this._component.activated) {
+            return;
+        }
+        this._enable();
+        this._enabled = true;
+        this._component.configure(this._getConfiguration(true));
+    };
+    /**
+     * Disables the interaction.
+     *
+     * @example ```<component-name>.<handler-name>.disable();```
+     */
+    HandlerBase.prototype.disable = function () {
+        if (!this._enabled) {
+            return;
+        }
+        this._disable();
+        this._enabled = false;
+        if (this._component.activated) {
+            this._component.configure(this._getConfiguration(false));
+        }
+    };
+    return HandlerBase;
+}());
+exports.HandlerBase = HandlerBase;
+exports.default = HandlerBase;
 
-},{"rxjs/Subject":33,"three":157}],266:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
+},{}],406:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class SpotRenderTag
- * @classdesc Tag visualizing the properties of a SpotTag.
- */
-var SpotRenderTag = (function (_super) {
-    __extends(SpotRenderTag, _super);
-    function SpotRenderTag() {
-        _super.apply(this, arguments);
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MeshFactory = void 0;
+var THREE = require("three");
+var Component_1 = require("../../Component");
+var MeshFactory = /** @class */ (function () {
+    function MeshFactory(imagePlaneDepth, imageSphereRadius) {
+        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
+        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
     }
-    SpotRenderTag.prototype.dispose = function () { return; };
-    SpotRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) {
-        var _this = this;
-        var vNodes = [];
-        var centroid3d = this._tag.geometry.getCentroid3d(this._transform);
-        var centroidCameraSpace = this._convertToCameraSpace(centroid3d, matrixWorldInverse);
-        if (centroidCameraSpace.z < 0) {
-            var centroidCanvas = this._projectToCanvas(centroidCameraSpace, projectionMatrix);
-            var centroidCss = centroidCanvas.map(function (coord) { return (100 * coord) + "%"; });
-            var interactNone = function (e) {
-                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-            };
-            if (this._tag.icon != null) {
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(this._tag.icon, Viewer_1.SpriteAlignment.Center, Viewer_1.SpriteAlignment.End);
-                    var properties = {
-                        onmousedown: interactNone,
-                        style: {
-                            bottom: 100 * (1 - centroidCanvas[1]) + "%",
-                            left: centroidCss[0],
-                            pointerEvents: "all",
-                            position: "absolute",
-                            transform: "translate(0px, -8px)",
-                        },
-                    };
-                    vNodes.push(vd.h("div", properties, [sprite]));
-                }
-            }
-            else if (this._tag.text != null) {
-                var properties = {
-                    onmousedown: interactNone,
-                    style: {
-                        bottom: 100 * (1 - centroidCanvas[1]) + "%",
-                        color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6),
-                        left: centroidCss[0],
-                        pointerEvents: "all",
-                        position: "absolute",
-                        transform: "translate(-50%, -7px)",
-                    },
-                    textContent: this._tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
-            }
-            var interact = this._interact(Component_1.TagOperation.Centroid);
-            var background = "#" + ("000000" + this._tag.color.toString(16)).substr(-6);
-            if (this._tag.editable) {
-                var interactorProperties = {
-                    onmousedown: interact,
-                    style: {
-                        background: background,
-                        left: centroidCss[0],
-                        pointerEvents: "all",
-                        position: "absolute",
-                        top: centroidCss[1],
-                    },
-                };
-                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
+    MeshFactory.prototype.createMesh = function (node, transform) {
+        if (node.pano) {
+            return this._createImageSphere(node, transform);
+        }
+        else if (transform.cameraProjection === "fisheye") {
+            return this._createImagePlaneFisheye(node, transform);
+        }
+        else {
+            return this._createImagePlane(node, transform);
+        }
+    };
+    MeshFactory.prototype.createFlatMesh = function (node, transform, basicX0, basicX1, basicY0, basicY1) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createDistortedPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._getFlatImagePlaneGeoFromBasic(transform, basicX0, basicX1, basicY0, basicY1);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype.createCurtainMesh = function (node, transform) {
+        if (node.pano && !node.fullPano) {
+            throw new Error("Cropped panoramas cannot have curtain.");
+        }
+        if (node.pano) {
+            return this._createSphereCurtainMesh(node, transform);
+        }
+        else if (transform.cameraProjection === "fisheye") {
+            return this._createCurtainMeshFisheye(node, transform);
+        }
+        else {
+            return this._createCurtainMesh(node, transform);
+        }
+    };
+    MeshFactory.prototype.createDistortedCurtainMesh = function (node, transform) {
+        if (node.pano) {
+            throw new Error("Cropped panoramas cannot have curtain.");
+        }
+        return this._createDistortedCurtainMesh(node, transform);
+    };
+    MeshFactory.prototype._createCurtainMesh = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createCurtainPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeo(transform, node) :
+            this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createCurtainMeshFisheye = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createCurtainPlaneMaterialParametersFisheye(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeoFisheye(transform, node) :
+            this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createDistortedCurtainMesh = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createDistortedCurtainPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createSphereCurtainMesh = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createCurtainSphereMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        return this._useMesh(transform, node) ?
+            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
+            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
+    };
+    MeshFactory.prototype._createImageSphere = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createSphereMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var mesh = this._useMesh(transform, node) ?
+            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
+            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
+        return mesh;
+    };
+    MeshFactory.prototype._createImagePlane = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeo(transform, node) :
+            this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createImagePlaneFisheye = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createPlaneMaterialParametersFisheye(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeoFisheye(transform, node) :
+            this._getRegularFlatImagePlaneGeoFisheye(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createSphereMaterialParameters = function (transform, texture) {
+        var gpano = transform.gpano;
+        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
+        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
+        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
+        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
+        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
+        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.equirectangular.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                opacity: { value: 1.0 },
+                phiLength: { value: phiLength },
+                phiShift: { value: phiShift },
+                projectorMat: { value: transform.rt },
+                projectorTex: { value: texture },
+                thetaLength: { value: thetaLength },
+                thetaShift: { value: thetaShift },
+            },
+            vertexShader: Component_1.Shaders.equirectangular.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createCurtainSphereMaterialParameters = function (transform, texture) {
+        var gpano = transform.gpano;
+        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
+        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
+        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
+        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
+        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
+        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.equirectangularCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                opacity: { value: 1.0 },
+                phiLength: { value: phiLength },
+                phiShift: { value: phiShift },
+                projectorMat: { value: transform.rt },
+                projectorTex: { value: texture },
+                thetaLength: { value: thetaLength },
+                thetaShift: { value: thetaShift },
+            },
+            vertexShader: Component_1.Shaders.equirectangularCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspective.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.perspective.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createPlaneMaterialParametersFisheye = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.fisheye.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.fisheye.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createCurtainPlaneMaterialParametersFisheye = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.fisheyeCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.fisheyeCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createCurtainPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspectiveCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.perspectiveCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createDistortedCurtainPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspectiveDistortedCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.projectorMatrix() },
+                projectorTex: { value: texture },
+            },
+            vertexShader: Component_1.Shaders.perspectiveDistortedCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createDistortedPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspectiveDistorted.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.projectorMatrix() },
+                projectorTex: { value: texture },
+            },
+            vertexShader: Component_1.Shaders.perspectiveDistorted.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createTexture = function (image) {
+        var texture = new THREE.Texture(image);
+        texture.minFilter = THREE.LinearFilter;
+        texture.needsUpdate = true;
+        return texture;
+    };
+    MeshFactory.prototype._useMesh = function (transform, node) {
+        return node.mesh.vertices.length && transform.hasValidScale;
+    };
+    MeshFactory.prototype._getImageSphereGeo = function (transform, node) {
+        var t = new THREE.Matrix4().getInverse(transform.srt);
+        // push everything at least 5 meters in front of the camera
+        var minZ = 5.0 * transform.scale;
+        var maxZ = this._imageSphereRadius * transform.scale;
+        var vertices = node.mesh.vertices;
+        var numVertices = vertices.length / 3;
+        var positions = new Float32Array(vertices.length);
+        for (var i = 0; i < numVertices; ++i) {
+            var index = 3 * i;
+            var x = vertices[index + 0];
+            var y = vertices[index + 1];
+            var z = vertices[index + 2];
+            var l = Math.sqrt(x * x + y * y + z * z);
+            var boundedL = Math.max(minZ, Math.min(l, maxZ));
+            var factor = boundedL / l;
+            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
+            p.applyMatrix4(t);
+            positions[index + 0] = p.x;
+            positions[index + 1] = p.y;
+            positions[index + 2] = p.z;
+        }
+        var faces = node.mesh.faces;
+        var indices = new Uint16Array(faces.length);
+        for (var i = 0; i < faces.length; ++i) {
+            indices[i] = faces[i];
+        }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
+    };
+    MeshFactory.prototype._getImagePlaneGeo = function (transform, node) {
+        var undistortionMarginFactor = 3;
+        var t = new THREE.Matrix4().getInverse(transform.srt);
+        // push everything at least 5 meters in front of the camera
+        var minZ = 5.0 * transform.scale;
+        var maxZ = this._imagePlaneDepth * transform.scale;
+        var vertices = node.mesh.vertices;
+        var numVertices = vertices.length / 3;
+        var positions = new Float32Array(vertices.length);
+        for (var i = 0; i < numVertices; ++i) {
+            var index = 3 * i;
+            var x = vertices[index + 0];
+            var y = vertices[index + 1];
+            var z = vertices[index + 2];
+            if (i < 4) {
+                x *= undistortionMarginFactor;
+                y *= undistortionMarginFactor;
             }
-            var pointProperties = {
-                style: {
-                    background: background,
-                    left: centroidCss[0],
-                    position: "absolute",
-                    top: centroidCss[1],
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+            var boundedZ = Math.max(minZ, Math.min(z, maxZ));
+            var factor = boundedZ / z;
+            var p = new THREE.Vector3(x * factor, y * factor, boundedZ);
+            p.applyMatrix4(t);
+            positions[index + 0] = p.x;
+            positions[index + 1] = p.y;
+            positions[index + 2] = p.z;
+        }
+        var faces = node.mesh.faces;
+        var indices = new Uint16Array(faces.length);
+        for (var i = 0; i < faces.length; ++i) {
+            indices[i] = faces[i];
         }
-        return vNodes;
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
     };
-    SpotRenderTag.prototype._interact = function (operation, vertexIndex) {
-        var _this = this;
-        return function (e) {
-            var offsetX = e.offsetX - e.target.offsetWidth / 2;
-            var offsetY = e.offsetY - e.target.offsetHeight / 2;
-            _this._interact$.next({
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: _this._tag,
-                vertexIndex: vertexIndex,
-            });
-        };
+    MeshFactory.prototype._getImagePlaneGeoFisheye = function (transform, node) {
+        var t = new THREE.Matrix4().getInverse(transform.srt);
+        // push everything at least 5 meters in front of the camera
+        var minZ = 5.0 * transform.scale;
+        var maxZ = this._imagePlaneDepth * transform.scale;
+        var vertices = node.mesh.vertices;
+        var numVertices = vertices.length / 3;
+        var positions = new Float32Array(vertices.length);
+        for (var i = 0; i < numVertices; ++i) {
+            var index = 3 * i;
+            var x = vertices[index + 0];
+            var y = vertices[index + 1];
+            var z = vertices[index + 2];
+            var l = Math.sqrt(x * x + y * y + z * z);
+            var boundedL = Math.max(minZ, Math.min(l, maxZ));
+            var factor = boundedL / l;
+            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
+            p.applyMatrix4(t);
+            positions[index + 0] = p.x;
+            positions[index + 1] = p.y;
+            positions[index + 2] = p.z;
+        }
+        var faces = node.mesh.faces;
+        var indices = new Uint16Array(faces.length);
+        for (var i = 0; i < faces.length; ++i) {
+            indices[i] = faces[i];
+        }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
     };
-    return SpotRenderTag;
-}(Component_1.RenderTag));
-exports.SpotRenderTag = SpotRenderTag;
-
-},{"../../../Component":207,"../../../Viewer":216,"virtual-dom":163}],267:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class SpotTag
- * @classdesc Tag holding properties for visualizing the centroid of a geometry.
- */
-var SpotTag = (function (_super) {
-    __extends(SpotTag, _super);
-    /**
-     * Create a spot tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
-     * behavior of the spot tag.
-     */
-    function SpotTag(id, geometry, options) {
-        _super.call(this, id, geometry);
-        this._color = options.color == null ? 0xFFFFFF : options.color;
-        this._editable = options.editable == null ? false : options.editable;
-        this._icon = options.icon === undefined ? null : options.icon;
-        this._text = options.text === undefined ? null : options.text;
-        this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-    }
-    Object.defineProperty(SpotTag.prototype, "color", {
-        /**
-         * Get color property.
-         * @returns {number} The color of the spot as a hexagonal number;
-         */
-        get: function () {
-            return this._color;
-        },
-        /**
-         * Set color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._color = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "icon", {
-        /**
-         * Get icon property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._icon;
-        },
-        /**
-         * Set icon property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._icon = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "text", {
-        /**
-         * Get text property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
-        /**
-         * Set text color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keps
-     * the rest of the values as is.
-     *
-     * @param {ISpotTagOptions} options - Spot tag options
-     *
-     * @fires {Tag#changed}
-     */
-    SpotTag.prototype.setOptions = function (options) {
-        this._color = options.color == null ? this._color : options.color;
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
+    MeshFactory.prototype._getFlatImageSphereGeo = function (transform) {
+        var gpano = transform.gpano;
+        var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;
+        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
+        var thetaStart = Math.PI *
+            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /
+            gpano.FullPanoHeightPixels;
+        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
+        var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength);
+        geometry.applyMatrix4(new THREE.Matrix4().getInverse(transform.rt));
+        return geometry;
     };
-    return SpotTag;
-}(Component_1.Tag));
-exports.SpotTag = SpotTag;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SpotTag;
-
-},{"../../../Component":207}],268:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/share");
-var Utils_1 = require("../../../Utils");
-/**
- * @class Tag
- * @abstract
- * @classdesc Abstract class representing the basic functionality of for a tag.
- */
-var Tag = (function (_super) {
-    __extends(Tag, _super);
-    /**
-     * Create a tag.
-     *
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     */
-    function Tag(id, geometry) {
-        var _this = this;
-        _super.call(this);
-        this._id = id;
-        this._geometry = geometry;
-        this._notifyChanged$ = new Subject_1.Subject();
-        this._notifyChanged$
-            .subscribe(function (t) {
-            _this.fire(Tag.changed, _this);
-        });
-        this._geometry.changed$
-            .subscribe(function (g) {
-            _this.fire(Tag.geometrychanged, _this);
-        });
+    MeshFactory.prototype._getRegularFlatImagePlaneGeo = function (transform) {
+        var width = transform.width;
+        var height = transform.height;
+        var size = Math.max(width, height);
+        var dx = width / 2.0 / size;
+        var dy = height / 2.0 / size;
+        return this._getFlatImagePlaneGeo(transform, dx, dy);
+    };
+    MeshFactory.prototype._getFlatImagePlaneGeo = function (transform, dx, dy) {
+        var vertices = [];
+        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
+        return this._createFlatGeometry(vertices);
+    };
+    MeshFactory.prototype._getRegularFlatImagePlaneGeoFisheye = function (transform) {
+        var width = transform.width;
+        var height = transform.height;
+        var size = Math.max(width, height);
+        var dx = width / 2.0 / size;
+        var dy = height / 2.0 / size;
+        return this._getFlatImagePlaneGeoFisheye(transform, dx, dy);
+    };
+    MeshFactory.prototype._getFlatImagePlaneGeoFisheye = function (transform, dx, dy) {
+        var vertices = [];
+        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
+        return this._createFlatGeometry(vertices);
+    };
+    MeshFactory.prototype._getFlatImagePlaneGeoFromBasic = function (transform, basicX0, basicX1, basicY0, basicY1) {
+        var vertices = [];
+        vertices.push(transform.unprojectBasic([basicX0, basicY0], this._imagePlaneDepth));
+        vertices.push(transform.unprojectBasic([basicX1, basicY0], this._imagePlaneDepth));
+        vertices.push(transform.unprojectBasic([basicX1, basicY1], this._imagePlaneDepth));
+        vertices.push(transform.unprojectBasic([basicX0, basicY1], this._imagePlaneDepth));
+        return this._createFlatGeometry(vertices);
+    };
+    MeshFactory.prototype._createFlatGeometry = function (vertices) {
+        var positions = new Float32Array(12);
+        for (var i = 0; i < vertices.length; i++) {
+            var index = 3 * i;
+            positions[index + 0] = vertices[i][0];
+            positions[index + 1] = vertices[i][1];
+            positions[index + 2] = vertices[i][2];
+        }
+        var indices = new Uint16Array(6);
+        indices[0] = 0;
+        indices[1] = 1;
+        indices[2] = 3;
+        indices[3] = 1;
+        indices[4] = 2;
+        indices[5] = 3;
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
+    };
+    return MeshFactory;
+}());
+exports.MeshFactory = MeshFactory;
+exports.default = MeshFactory;
+
+},{"../../Component":291,"three":242}],407:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MeshScene = void 0;
+var THREE = require("three");
+var MeshScene = /** @class */ (function () {
+    function MeshScene() {
+        this._planes = {};
+        this._planesOld = {};
+        this._planesPeriphery = {};
+        this._scene = new THREE.Scene();
+        this._sceneOld = new THREE.Scene();
+        this._scenePeriphery = new THREE.Scene();
     }
-    Object.defineProperty(Tag.prototype, "id", {
-        /**
-         * Get id property.
-         * @returns {string}
-         */
+    Object.defineProperty(MeshScene.prototype, "planes", {
         get: function () {
-            return this._id;
+            return this._planes;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Tag.prototype, "geometry", {
-        /**
-         * Get geometry property.
-         * @returns {Geometry}
-         */
+    Object.defineProperty(MeshScene.prototype, "planesOld", {
         get: function () {
-            return this._geometry;
+            return this._planesOld;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Tag.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         * @returns {Observable<Tag>}
-         */
+    Object.defineProperty(MeshScene.prototype, "planesPeriphery", {
         get: function () {
-            return this._notifyChanged$;
+            return this._planesPeriphery;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Tag.prototype, "geometryChanged$", {
-        /**
-         * Get geometry changed observable.
-         * @returns {Observable<Tag>}
-         */
+    Object.defineProperty(MeshScene.prototype, "scene", {
         get: function () {
-            var _this = this;
-            return this._geometry.changed$
-                .map(function (geometry) {
-                return _this;
-            })
-                .share();
+            return this._scene;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Event fired when a property related to the visual appearance of the
-     * tag has changed.
-     *
-     * @event Tag#changed
-     * @type {Tag} The tag instance that has changed.
-     */
-    Tag.changed = "changed";
-    /**
-     * Event fired when the geometry of the tag has changed.
-     *
-     * @event Tag#geometrychanged
-     * @type {Tag} The tag instance whose geometry has changed.
-     */
-    Tag.geometrychanged = "geometrychanged";
-    return Tag;
-}(Utils_1.EventEmitter));
-exports.Tag = Tag;
+    Object.defineProperty(MeshScene.prototype, "sceneOld", {
+        get: function () {
+            return this._sceneOld;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MeshScene.prototype, "scenePeriphery", {
+        get: function () {
+            return this._scenePeriphery;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    MeshScene.prototype.updateImagePlanes = function (planes) {
+        this._dispose(this._planesOld, this.sceneOld);
+        for (var key in this._planes) {
+            if (!this._planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = this._planes[key];
+            this._scene.remove(plane);
+            this._sceneOld.add(plane);
+        }
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            this._scene.add(planes[key]);
+        }
+        this._planesOld = this._planes;
+        this._planes = planes;
+    };
+    MeshScene.prototype.addImagePlanes = function (planes) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            this._scene.add(plane);
+            this._planes[key] = plane;
+        }
+    };
+    MeshScene.prototype.addImagePlanesOld = function (planes) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            this._sceneOld.add(plane);
+            this._planesOld[key] = plane;
+        }
+    };
+    MeshScene.prototype.setImagePlanes = function (planes) {
+        this._clear();
+        this.addImagePlanes(planes);
+    };
+    MeshScene.prototype.addPeripheryPlanes = function (planes) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            this._scenePeriphery.add(plane);
+            this._planesPeriphery[key] = plane;
+        }
+    };
+    MeshScene.prototype.setPeripheryPlanes = function (planes) {
+        this._clearPeriphery();
+        this.addPeripheryPlanes(planes);
+    };
+    MeshScene.prototype.setImagePlanesOld = function (planes) {
+        this._clearOld();
+        this.addImagePlanesOld(planes);
+    };
+    MeshScene.prototype.clear = function () {
+        this._clear();
+        this._clearOld();
+    };
+    MeshScene.prototype._clear = function () {
+        this._dispose(this._planes, this._scene);
+        this._planes = {};
+    };
+    MeshScene.prototype._clearOld = function () {
+        this._dispose(this._planesOld, this._sceneOld);
+        this._planesOld = {};
+    };
+    MeshScene.prototype._clearPeriphery = function () {
+        this._dispose(this._planesPeriphery, this._scenePeriphery);
+        this._planesPeriphery = {};
+    };
+    MeshScene.prototype._dispose = function (planes, scene) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            scene.remove(plane);
+            plane.geometry.dispose();
+            plane.material.dispose();
+            var texture = plane.material.uniforms.projectorTex.value;
+            if (texture != null) {
+                texture.dispose();
+            }
+        }
+    };
+    return MeshScene;
+}());
+exports.MeshScene = MeshScene;
+exports.default = MeshScene;
+
+},{"three":242}],408:[function(require,module,exports){
+"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Tag;
+exports.MouseOperator = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var MouseOperator = /** @class */ (function () {
+    function MouseOperator() {
+    }
+    MouseOperator.filteredPairwiseMouseDrag$ = function (name, mouseService) {
+        return mouseService
+            .filtered$(name, mouseService.mouseDragStart$).pipe(operators_1.switchMap(function (mouseDragStart) {
+            var mouseDragging$ = rxjs_1.concat(rxjs_1.of(mouseDragStart), mouseService
+                .filtered$(name, mouseService.mouseDrag$));
+            var mouseDragEnd$ = mouseService
+                .filtered$(name, mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
+                return null;
+            }));
+            return rxjs_1.merge(mouseDragging$, mouseDragEnd$).pipe(operators_1.takeWhile(function (e) {
+                return !!e;
+            }), operators_1.startWith(null));
+        }), operators_1.pairwise(), operators_1.filter(function (pair) {
+            return pair[0] != null && pair[1] != null;
+        }));
+    };
+    return MouseOperator;
+}());
+exports.MouseOperator = MouseOperator;
+exports.default = MouseOperator;
 
-},{"../../../Utils":215,"rxjs/Subject":33,"rxjs/add/operator/map":60,"rxjs/add/operator/share":69}],269:[function(require,module,exports){
+},{"rxjs":43,"rxjs/operators":241}],409:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ZoomComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var State_1 = require("../../State");
+var ComponentSize_1 = require("../utils/ComponentSize");
+/**
+ * @class ZoomComponent
+ *
+ * @classdesc Component rendering UI elements used for zooming.
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var zoomComponent = viewer.getComponent("zoom");
+ * zoomComponent.configure({ size: Mapillary.ComponentSize.Small });
+ * ```
+ */
+var ZoomComponent = /** @class */ (function (_super) {
+    __extends(ZoomComponent, _super);
+    function ZoomComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._zoomDelta$ = new rxjs_1.Subject();
+        return _this;
+    }
+    ZoomComponent.prototype._activate = function () {
+        var _this = this;
+        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], state = _a[1], configuration = _a[2], size = _a[3];
+            var zoom = frame.state.zoom;
+            var zoomInIcon = vd.h("div.ZoomInIcon", []);
+            var zoomInButton = zoom >= 3 || state === State_1.State.Waiting ?
+                vd.h("div.ZoomInButtonDisabled", [zoomInIcon]) :
+                vd.h("div.ZoomInButton", { onclick: function () { _this._zoomDelta$.next(1); } }, [zoomInIcon]);
+            var zoomOutIcon = vd.h("div.ZoomOutIcon", []);
+            var zoomOutButton = zoom <= 0 || state === State_1.State.Waiting ?
+                vd.h("div.ZoomOutButtonDisabled", [zoomOutIcon]) :
+                vd.h("div.ZoomOutButton", { onclick: function () { _this._zoomDelta$.next(-1); } }, [zoomOutIcon]);
+            var compact = configuration.size === ComponentSize_1.default.Small ||
+                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
+                ".ZoomCompact" : "";
+            return {
+                name: _this._name,
+                vnode: vd.h("div.ZoomContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._zoomSubscription = this._zoomDelta$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var zoomDelta = _a[0], render = _a[1], transform = _a[2];
+            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            _this._navigator.stateService.zoomIn(zoomDelta, reference);
+        });
+    };
+    ZoomComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+        this._zoomSubscription.unsubscribe();
+    };
+    ZoomComponent.prototype._getDefaultConfiguration = function () {
+        return { size: ComponentSize_1.default.Automatic };
+    };
+    ZoomComponent.componentName = "zoom";
+    return ZoomComponent;
+}(Component_1.Component));
+exports.ZoomComponent = ZoomComponent;
+Component_1.ComponentService.register(ZoomComponent);
+exports.default = ZoomComponent;
+
+},{"../../Component":291,"../../Geo":294,"../../State":298,"../utils/ComponentSize":404,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],410:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AbortMapillaryError = void 0;
+var MapillaryError_1 = require("./MapillaryError");
+/**
+ * @class AbortMapillaryError
+ *
+ * @classdesc Error thrown when a move to request has been
+ * aborted before completing because of a subsequent request.
+ */
+var AbortMapillaryError = /** @class */ (function (_super) {
+    __extends(AbortMapillaryError, _super);
+    function AbortMapillaryError(message) {
+        var _this = _super.call(this, message != null ? message : "The request was aborted.") || this;
+        Object.setPrototypeOf(_this, AbortMapillaryError.prototype);
+        _this.name = "AbortMapillaryError";
+        return _this;
+    }
+    return AbortMapillaryError;
+}(MapillaryError_1.MapillaryError));
+exports.AbortMapillaryError = AbortMapillaryError;
+exports.default = AbortMapillaryError;
+
+},{"./MapillaryError":413}],411:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ArgumentMapillaryError = void 0;
 var MapillaryError_1 = require("./MapillaryError");
-var ArgumentMapillaryError = (function (_super) {
+var ArgumentMapillaryError = /** @class */ (function (_super) {
     __extends(ArgumentMapillaryError, _super);
     function ArgumentMapillaryError(message) {
-        _super.call(this);
-        this.name = "ArgumentMapillaryError";
-        this.message = message != null ? message : "The argument is not valid.";
+        var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this;
+        Object.setPrototypeOf(_this, ArgumentMapillaryError.prototype);
+        _this.name = "ArgumentMapillaryError";
+        return _this;
     }
     return ArgumentMapillaryError;
 }(MapillaryError_1.MapillaryError));
 exports.ArgumentMapillaryError = ArgumentMapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = ArgumentMapillaryError;
 
-},{"./MapillaryError":272}],270:[function(require,module,exports){
+},{"./MapillaryError":413}],412:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphMapillaryError = void 0;
 var MapillaryError_1 = require("./MapillaryError");
-var GraphMapillaryError = (function (_super) {
+var GraphMapillaryError = /** @class */ (function (_super) {
     __extends(GraphMapillaryError, _super);
     function GraphMapillaryError(message) {
-        _super.call(this);
-        this.name = "GraphMapillaryError";
-        this.message = message;
+        var _this = _super.call(this, message) || this;
+        Object.setPrototypeOf(_this, GraphMapillaryError.prototype);
+        _this.name = "GraphMapillaryError";
+        return _this;
     }
     return GraphMapillaryError;
 }(MapillaryError_1.MapillaryError));
 exports.GraphMapillaryError = GraphMapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = GraphMapillaryError;
 
-},{"./MapillaryError":272}],271:[function(require,module,exports){
+},{"./MapillaryError":413}],413:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError_1 = require("./MapillaryError");
-var InitializationMapillaryError = (function (_super) {
-    __extends(InitializationMapillaryError, _super);
-    function InitializationMapillaryError() {
-        _super.call(this);
-        this.name = "InitializationMapillaryError";
-        this.message = "Could not initialize";
-    }
-    return InitializationMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.InitializationMapillaryError = InitializationMapillaryError;
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = InitializationMapillaryError;
-
-},{"./MapillaryError":272}],272:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError = (function (_super) {
+exports.MapillaryError = void 0;
+var MapillaryError = /** @class */ (function (_super) {
     __extends(MapillaryError, _super);
-    function MapillaryError() {
-        _super.call(this);
-        // fixme ERROR have not loaded correct props
-        // this.stack = (new Error()).stack;
+    function MapillaryError(message) {
+        var _this = _super.call(this, message) || this;
+        Object.setPrototypeOf(_this, MapillaryError.prototype);
+        _this.name = "MapillaryError";
+        return _this;
     }
     return MapillaryError;
 }(Error));
 exports.MapillaryError = MapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = MapillaryError;
 
-},{}],273:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError_1 = require("./MapillaryError");
-var MoveTypeMapillaryError = (function (_super) {
-    __extends(MoveTypeMapillaryError, _super);
-    function MoveTypeMapillaryError() {
-        _super.call(this);
-        this.name = "MoveTypeMapillaryError";
-        this.message = "The type of ui you use does not support this move";
-    }
-    return MoveTypeMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.MoveTypeMapillaryError = MoveTypeMapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MoveTypeMapillaryError;
-
-},{"./MapillaryError":272}],274:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError_1 = require("./MapillaryError");
-var NotImplementedMapillaryError = (function (_super) {
-    __extends(NotImplementedMapillaryError, _super);
-    function NotImplementedMapillaryError() {
-        _super.call(this);
-        this.name = "NotImplementedMapillaryError";
-        this.message = "This function has not yet been implemented";
-    }
-    return NotImplementedMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.NotImplementedMapillaryError = NotImplementedMapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = NotImplementedMapillaryError;
-
-},{"./MapillaryError":272}],275:[function(require,module,exports){
+},{}],414:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError_1 = require("./MapillaryError");
-var ParameterMapillaryError = (function (_super) {
-    __extends(ParameterMapillaryError, _super);
-    function ParameterMapillaryError(message) {
-        _super.call(this);
-        this.name = "ParameterMapillaryError";
-        this.message = message != null ? message : "The function was not called with correct parameters";
-    }
-    return ParameterMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.ParameterMapillaryError = ParameterMapillaryError;
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ParameterMapillaryError;
-
-},{"./MapillaryError":272}],276:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
+exports.Camera = void 0;
 var THREE = require("three");
 /**
  * @class Camera
  *
  * @classdesc Holds information about a camera.
  */
-var Camera = (function () {
+var Camera = /** @class */ (function () {
     /**
      * Create a new camera instance.
      * @param {Transform} [transform] - Optional transform instance.
@@ -25799,7 +45704,7 @@ var Camera = (function () {
         get: function () {
             return this._position;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Camera.prototype, "lookat", {
@@ -25810,7 +45715,7 @@ var Camera = (function () {
         get: function () {
             return this._lookat;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Camera.prototype, "up", {
@@ -25821,7 +45726,7 @@ var Camera = (function () {
         get: function () {
             return this._up;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Camera.prototype, "focal", {
@@ -25838,7 +45743,7 @@ var Camera = (function () {
         set: function (value) {
             this._focal = value;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -25894,20 +45799,72 @@ var Camera = (function () {
     /**
      * Get the focal length based on the transform.
      *
-     * @description Returns 0.5 focal length if transform has gpano
-     * information.
+     * @description Returns the focal length of the transform if gpano info is not available.
+     * Returns a focal length corresponding to a vertical fov clamped to [45, 90] degrees based on
+     * the gpano information if available.
      *
      * @returns {number} Focal length.
      */
     Camera.prototype._getFocal = function (transform) {
-        return transform.gpano == null ? transform.focal : 0.5;
+        if (transform.gpano == null) {
+            return transform.focal;
+        }
+        var vFov = Math.PI * transform.gpano.CroppedAreaImageHeightPixels / transform.gpano.FullPanoHeightPixels;
+        var focal = 0.5 / Math.tan(vFov / 2);
+        return Math.min(1 / (2 * (Math.sqrt(2) - 1)), Math.max(0.5, focal));
     };
     return Camera;
 }());
 exports.Camera = Camera;
 
-},{"three":157}],277:[function(require,module,exports){
+},{"three":242}],415:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.computeProjectedPoints = exports.computeTranslation = void 0;
+var THREE = require("three");
+var Geo_1 = require("../Geo");
+var geoCoords = new Geo_1.GeoCoords();
+var spatial = new Geo_1.Spatial();
+function computeTranslation(position, rotation, reference) {
+    var C = geoCoords.geodeticToEnu(position.lat, position.lon, position.alt, reference.lat, reference.lon, reference.alt);
+    var RC = spatial.rotate(C, rotation);
+    var translation = [-RC.x, -RC.y, -RC.z];
+    return translation;
+}
+exports.computeTranslation = computeTranslation;
+function computeProjectedPoints(transform, basicVertices, basicDirections, pointsPerLine, viewportCoords) {
+    var basicPoints = [];
+    for (var side = 0; side < basicVertices.length; ++side) {
+        var v = basicVertices[side];
+        var d = basicDirections[side];
+        for (var i = 0; i <= pointsPerLine; ++i) {
+            basicPoints.push([v[0] + d[0] * i / pointsPerLine,
+                v[1] + d[1] * i / pointsPerLine]);
+        }
+    }
+    var camera = new THREE.Camera();
+    camera.up.copy(transform.upVector());
+    camera.position.copy(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0)));
+    camera.lookAt(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10)));
+    camera.updateMatrix();
+    camera.updateMatrixWorld(true);
+    var projectedPoints = basicPoints
+        .map(function (basicPoint) {
+        var worldPoint = transform.unprojectBasic(basicPoint, 10000);
+        var cameraPoint = viewportCoords.worldToCamera(worldPoint, camera);
+        return [
+            Math.abs(cameraPoint[0] / cameraPoint[2]),
+            Math.abs(cameraPoint[1] / cameraPoint[2]),
+        ];
+    });
+    return projectedPoints;
+}
+exports.computeProjectedPoints = computeProjectedPoints;
+
+},{"../Geo":294,"three":242}],416:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GeoCoords = void 0;
 /**
  * @class GeoCoords
  *
@@ -25977,7 +45934,7 @@ exports.Camera = Camera;
  * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in
  * the first step for both conversions.
  */
-var GeoCoords = (function () {
+var GeoCoords = /** @class */ (function () {
     function GeoCoords() {
         this._wgs84a = 6378137.0;
         this._wgs84b = 6356752.31424518;
@@ -26127,26 +46084,144 @@ var GeoCoords = (function () {
     return GeoCoords;
 }());
 exports.GeoCoords = GeoCoords;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = GeoCoords;
 
-},{}],278:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{}],417:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GeoRBush = void 0;
+var RBush = require("rbush");
+var GeoRBush = /** @class */ (function (_super) {
+    __extends(GeoRBush, _super);
+    function GeoRBush() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    GeoRBush.prototype.compareMinX = function (a, b) { return a.lat - b.lat; };
+    GeoRBush.prototype.compareMinY = function (a, b) { return a.lon - b.lon; };
+    GeoRBush.prototype.toBBox = function (item) {
+        return { minX: item.lat, minY: item.lon, maxX: item.lat, maxY: item.lon };
+    };
+    return GeoRBush;
+}(RBush));
+exports.GeoRBush = GeoRBush;
+exports.default = GeoRBush;
+
+},{"rbush":42}],418:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.segmentIntersection = exports.segmentsIntersect = void 0;
+function sign(n) {
+    return n > 0 ? 1 : n < 0 ? -1 : 0;
+}
+function colinearPointOnSegment(p, s) {
+    return p.x <= Math.max(s.p1.x, s.p2.x) &&
+        p.x >= Math.min(s.p1.x, s.p2.x) &&
+        p.y >= Math.max(s.p1.y, s.p2.y) &&
+        p.y >= Math.min(s.p1.y, s.p2.y);
+}
+function parallel(s1, s2) {
+    var ux = s1.p2.x - s1.p1.x;
+    var uy = s1.p2.y - s1.p1.y;
+    var vx = s2.p2.x - s2.p1.x;
+    var vy = s2.p2.y - s2.p1.y;
+    var cross = ux * vy - uy * vx;
+    var u2 = ux * ux + uy * uy;
+    var v2 = vx * vx + vy * vy;
+    var epsilon2 = 1e-10;
+    return cross * cross < epsilon2 * u2 * v2;
+}
+function tripletOrientation(p1, p2, p3) {
+    var orientation = (p2.y - p1.y) * (p3.x - p2.x) -
+        (p3.y - p2.y) * (p2.x - p1.x);
+    return sign(orientation);
+}
+function segmentsIntersect(s1, s2) {
+    if (parallel(s1, s2)) {
+        return false;
+    }
+    var o1 = tripletOrientation(s1.p1, s1.p2, s2.p1);
+    var o2 = tripletOrientation(s1.p1, s1.p2, s2.p2);
+    var o3 = tripletOrientation(s2.p1, s2.p2, s1.p1);
+    var o4 = tripletOrientation(s2.p1, s2.p2, s1.p2);
+    if (o1 !== o2 && o3 !== o4) {
+        return true;
+    }
+    if (o1 === 0 && colinearPointOnSegment(s2.p1, s1)) {
+        return true;
+    }
+    if (o2 === 0 && colinearPointOnSegment(s2.p2, s1)) {
+        return true;
+    }
+    if (o3 === 0 && colinearPointOnSegment(s1.p1, s2)) {
+        return true;
+    }
+    if (o4 === 0 && colinearPointOnSegment(s1.p2, s2)) {
+        return true;
+    }
+    return false;
+}
+exports.segmentsIntersect = segmentsIntersect;
+function segmentIntersection(s1, s2) {
+    if (parallel(s1, s2)) {
+        return undefined;
+    }
+    var x1 = s1.p1.x;
+    var x2 = s1.p2.x;
+    var y1 = s1.p1.y;
+    var y2 = s1.p2.y;
+    var x3 = s2.p1.x;
+    var x4 = s2.p2.x;
+    var y3 = s2.p1.y;
+    var y4 = s2.p2.y;
+    var den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
+    var xNum = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
+    var yNum = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
+    return { x: xNum / den, y: yNum / den };
+}
+exports.segmentIntersection = segmentIntersection;
+
+},{}],419:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Spatial = void 0;
 var THREE = require("three");
 /**
  * @class Spatial
  *
  * @classdesc Provides methods for scalar, vector and matrix calculations.
  */
-var Spatial = (function () {
+var Spatial = /** @class */ (function () {
     function Spatial() {
         this._epsilon = 1e-9;
     }
+    /**
+     * Converts azimuthal phi rotation (counter-clockwise with origin on X-axis) to
+     * bearing (clockwise with origin at north or Y-axis).
+     *
+     * @param {number} phi - Azimuthal phi angle in radians.
+     * @returns {number} Bearing in radians.
+     */
+    Spatial.prototype.azimuthalToBearing = function (phi) {
+        return -phi + Math.PI / 2;
+    };
     /**
      * Converts degrees to radians.
      *
-     * @param {number} deg Degrees.
+     * @param {number} deg - Degrees.
+     * @returns {number} Radians.
      */
     Spatial.prototype.degToRad = function (deg) {
         return Math.PI * deg / 180;
@@ -26154,7 +46229,8 @@ var Spatial = (function () {
     /**
      * Converts radians to degrees.
      *
-     * @param {number} rad Radians.
+     * @param {number} rad - Radians.
+     * @returns {number} Degrees.
      */
     Spatial.prototype.radToDeg = function (rad) {
         return 180 * rad / Math.PI;
@@ -26162,19 +46238,23 @@ var Spatial = (function () {
     /**
      * Creates a rotation matrix from an angle-axis vector.
      *
-     * @param {Array<number>} angleAxis Angle-axis representation of a rotation.
+     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.
+     * @returns {THREE.Matrix4} Rotation matrix.
      */
     Spatial.prototype.rotationMatrix = function (angleAxis) {
         var axis = new THREE.Vector3(angleAxis[0], angleAxis[1], angleAxis[2]);
         var angle = axis.length();
-        axis.normalize();
+        if (angle > 0) {
+            axis.normalize();
+        }
         return new THREE.Matrix4().makeRotationAxis(axis, angle);
     };
     /**
      * Rotates a vector according to a angle-axis rotation vector.
      *
-     * @param {Array<number>} vector Vector to rotate.
-     * @param {Array<number>} angleAxis Angle-axis representation of a rotation.
+     * @param {Array<number>} vector - Vector to rotate.
+     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.
+     * @returns {THREE.Vector3} Rotated vector.
      */
     Spatial.prototype.rotate = function (vector, angleAxis) {
         var v = new THREE.Vector3(vector[0], vector[1], vector[2]);
@@ -26187,8 +46267,9 @@ var Spatial = (function () {
      * on the angle-axis representation and a translation vector
      * according to C = -R^T t.
      *
-     * @param {Array<number>} rotation Angle-axis representation of a rotation.
-     * @param {Array<number>} translation Translation vector.
+     * @param {Array<number>} rotation - Angle-axis representation of a rotation.
+     * @param {Array<number>} translation - Translation vector.
+     * @returns {THREE.Vector3} Optical center.
      */
     Spatial.prototype.opticalCenter = function (rotation, translation) {
         var angleAxis = [-rotation[0], -rotation[1], -rotation[2]];
@@ -26199,7 +46280,8 @@ var Spatial = (function () {
      * Calculates the viewing direction from a rotation vector
      * on the angle-axis representation.
      *
-     * @param {number[]} rotation Angle-axis representation of a rotation.
+     * @param {number[]} rotation - Angle-axis representation of a rotation.
+     * @returns {THREE.Vector3} Viewing direction.
      */
     Spatial.prototype.viewingDirection = function (rotation) {
         var angleAxis = [-rotation[0], -rotation[1], -rotation[2]];
@@ -26208,11 +46290,10 @@ var Spatial = (function () {
     /**
      * Wrap a number on the interval [min, max].
      *
-     * @param {number} value Value to wrap.
-     * @param {number} min Lower endpoint of interval.
-     * @param {number} max Upper endpoint of interval.
-     *
-     * @returs {number} The wrapped number.
+     * @param {number} value - Value to wrap.
+     * @param {number} min - Lower endpoint of interval.
+     * @param {number} max - Upper endpoint of interval.
+     * @returns {number} The wrapped number.
      */
     Spatial.prototype.wrap = function (value, min, max) {
         if (max < min) {
@@ -26232,9 +46313,8 @@ var Spatial = (function () {
     /**
      * Wrap an angle on the interval [-Pi, Pi].
      *
-     * @param {number} angle Value to wrap.
-     *
-     * @returs {number} The wrapped angle.
+     * @param {number} angle - Value to wrap.
+     * @returns {number} Wrapped angle.
      */
     Spatial.prototype.wrapAngle = function (angle) {
         return this.wrap(angle, -Math.PI, Math.PI);
@@ -26243,11 +46323,10 @@ var Spatial = (function () {
      * Limit the value to the interval [min, max] by changing the value to
      * the nearest available one when it is outside the interval.
      *
-     * @param {number} value Value to clamp.
-     * @param {number} min Minimum of the interval.
-     * @param {number} max Maximum of the interval.
-     *
-     * @returns {number} The clamped value.
+     * @param {number} value - Value to clamp.
+     * @param {number} min - Minimum of the interval.
+     * @param {number} max - Maximum of the interval.
+     * @returns {number} Clamped value.
      */
     Spatial.prototype.clamp = function (value, min, max) {
         if (value < min) {
@@ -26262,10 +46341,11 @@ var Spatial = (function () {
      * Calculates the counter-clockwise angle from the first
      * vector (x1, y1)^T to the second (x2, y2)^T.
      *
-     * @param {number} x1 X-value of first vector.
-     * @param {number} y1 Y-value of first vector.
-     * @param {number} x2 X-value of second vector.
-     * @param {number} y2 Y-value of second vector.
+     * @param {number} x1 - X coordinate of first vector.
+     * @param {number} y1 - Y coordinate of first vector.
+     * @param {number} x2 - X coordinate of second vector.
+     * @param {number} y2 - Y coordinate of second vector.
+     * @returns {number} Counter clockwise angle between the vectors.
      */
     Spatial.prototype.angleBetweenVector2 = function (x1, y1, x2, y2) {
         var angle = Math.atan2(y2, x2) - Math.atan2(y1, x1);
@@ -26275,8 +46355,9 @@ var Spatial = (function () {
      * Calculates the minimum (absolute) angle change for rotation
      * from one angle to another on the [-Pi, Pi] interval.
      *
-     * @param {number} angle1 The origin angle.
-     * @param {number} angle2 The destination angle.
+     * @param {number} angle1 - Start angle.
+     * @param {number} angle2 - Destination angle.
+     * @returns {number} Absolute angle change between angles.
      */
     Spatial.prototype.angleDifference = function (angle1, angle2) {
         var angle = angle2 - angle1;
@@ -26286,23 +46367,26 @@ var Spatial = (function () {
      * Calculates the relative rotation angle between two
      * angle-axis vectors.
      *
-     * @param {number} rotation1 First angle-axis vector.
-     * @param {number} rotation2 Second angle-axis vector.
+     * @param {number} rotation1 - First angle-axis vector.
+     * @param {number} rotation2 - Second angle-axis vector.
+     * @returns {number} Relative rotation angle.
      */
     Spatial.prototype.relativeRotationAngle = function (rotation1, rotation2) {
         var R1T = this.rotationMatrix([-rotation1[0], -rotation1[1], -rotation1[2]]);
         var R2 = this.rotationMatrix(rotation2);
         var R = R1T.multiply(R2);
         var elements = R.elements;
-        // from Tr(R) = 1 + 2*cos(theta)
-        var theta = Math.acos((elements[0] + elements[5] + elements[10] - 1) / 2);
+        // from Tr(R) = 1 + 2 * cos(theta)
+        var tr = elements[0] + elements[5] + elements[10];
+        var theta = Math.acos(Math.max(Math.min((tr - 1) / 2, 1), -1));
         return theta;
     };
     /**
      * Calculates the angle from a vector to a plane.
      *
-     * @param {Array<number>} vector The vector.
-     * @param {Array<number>} planeNormal Normal of the plane.
+     * @param {Array<number>} vector - The vector.
+     * @param {Array<number>} planeNormal - Normal of the plane.
+     * @returns {number} Angle from between plane and vector.
      */
     Spatial.prototype.angleToPlane = function (vector, planeNormal) {
         var v = new THREE.Vector3().fromArray(vector);
@@ -26313,22 +46397,30 @@ var Spatial = (function () {
         var projection = v.dot(new THREE.Vector3().fromArray(planeNormal));
         return Math.asin(projection / norm);
     };
+    Spatial.prototype.azimuthal = function (direction, up) {
+        var directionVector = new THREE.Vector3().fromArray(direction);
+        var upVector = new THREE.Vector3().fromArray(up);
+        var upProjection = directionVector.clone().dot(upVector);
+        var planeProjection = directionVector.clone().sub(upVector.clone().multiplyScalar(upProjection));
+        return Math.atan2(planeProjection.y, planeProjection.x);
+    };
     /**
      * Calculates the distance between two coordinates
      * (latitude longitude pairs) in meters according to
      * the haversine formula.
      *
-     * @param {number} lat1 The latitude of the first coordinate.
-     * @param {number} lon1 The longitude of the first coordinate.
-     * @param {number} lat2 The latitude of the second coordinate.
-     * @param {number} lon2 The longitude of the second coordinate.
+     * @param {number} lat1 - Latitude of the first coordinate in degrees.
+     * @param {number} lon1 - Longitude of the first coordinate in degrees.
+     * @param {number} lat2 - Latitude of the second coordinate in degrees.
+     * @param {number} lon2 - Longitude of the second coordinate in degrees.
+     * @returns {number} Distance between lat lon positions in meters.
      */
     Spatial.prototype.distanceFromLatLon = function (lat1, lon1, lat2, lon2) {
         var r = 6371000;
         var dLat = this.degToRad(lat2 - lat1);
         var dLon = this.degToRad(lon2 - lon1);
         var hav = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
-            Math.cos(lat1) * Math.cos(lat2) *
+            Math.cos(this.degToRad(lat1)) * Math.cos(this.degToRad(lat2)) *
                 Math.sin(dLon / 2) * Math.sin(dLon / 2);
         var d = 2 * r * Math.atan2(Math.sqrt(hav), Math.sqrt(1 - hav));
         return d;
@@ -26336,12 +46428,12 @@ var Spatial = (function () {
     return Spatial;
 }());
 exports.Spatial = Spatial;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Spatial;
 
-},{"three":157}],279:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{"three":242}],420:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Transform = void 0;
 var THREE = require("three");
 /**
  * @class Transform
@@ -26349,29 +46441,68 @@ var THREE = require("three");
  * @classdesc Class used for calculating coordinate transformations
  * and projections.
  */
-var Transform = (function () {
+var Transform = /** @class */ (function () {
     /**
      * Create a new transform instance.
-     * @param {Node} apiNavImIm - Node properties.
-     * @param {HTMLImageElement} image - Node image.
-     * @param {Array<number>} translation - Node translation vector in three dimensions.
+     * @param {number} orientation - Image orientation.
+     * @param {number} width - Image height.
+     * @param {number} height - Image width.
+     * @param {number} focal - Focal length.
+     * @param {number} scale - Atomic scale.
+     * @param {IGPano} gpano - Panorama properties.
+     * @param {Array<number>} rotation - Rotation vector in three dimensions.
+     * @param {Array<number>} translation - Translation vector in three dimensions.
+     * @param {HTMLImageElement} image - Image for fallback size calculations.
      */
-    function Transform(node, image, translation) {
-        this._orientation = this._getValue(node.orientation, 1);
+    function Transform(orientation, width, height, focal, scale, gpano, rotation, translation, image, textureScale, ck1, ck2, cameraProjection) {
+        this._orientation = this._getValue(orientation, 1);
         var imageWidth = image != null ? image.width : 4;
         var imageHeight = image != null ? image.height : 3;
         var keepOrientation = this._orientation < 5;
-        this._width = this._getValue(node.width, keepOrientation ? imageWidth : imageHeight);
-        this._height = this._getValue(node.height, keepOrientation ? imageHeight : imageWidth);
+        this._width = this._getValue(width, keepOrientation ? imageWidth : imageHeight);
+        this._height = this._getValue(height, keepOrientation ? imageHeight : imageWidth);
         this._basicAspect = keepOrientation ?
             this._width / this._height :
             this._height / this._width;
-        this._focal = this._getValue(node.focal, 1);
-        this._scale = this._getValue(node.scale, 0);
-        this._gpano = node.gpano != null ? node.gpano : null;
-        this._rt = this._getRt(node.rotation, translation);
+        this._basicWidth = keepOrientation ? width : height;
+        this._basicHeight = keepOrientation ? height : width;
+        this._focal = this._getValue(focal, 1);
+        this._scale = this._getValue(scale, 0);
+        this._gpano = gpano != null ? gpano : null;
+        this._rt = this._getRt(rotation, translation);
         this._srt = this._getSrt(this._rt, this._scale);
-    }
+        this._basicRt = this._getBasicRt(this._rt, orientation);
+        this._textureScale = !!textureScale ? textureScale : [1, 1];
+        this._ck1 = !!ck1 ? ck1 : 0;
+        this._ck2 = !!ck2 ? ck2 : 0;
+        this._cameraProjection = !!cameraProjection ?
+            cameraProjection :
+            !!gpano ?
+                "equirectangular" :
+                "perspective";
+        this._radialPeak = this._getRadialPeak(this._ck1, this._ck2);
+    }
+    Object.defineProperty(Transform.prototype, "ck1", {
+        get: function () {
+            return this._ck1;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "ck2", {
+        get: function () {
+            return this._ck2;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "cameraProjection", {
+        get: function () {
+            return this._cameraProjection;
+        },
+        enumerable: false,
+        configurable: true
+    });
     Object.defineProperty(Transform.prototype, "basicAspect", {
         /**
          * Get basic aspect.
@@ -26380,7 +46511,46 @@ var Transform = (function () {
         get: function () {
             return this._basicAspect;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "basicHeight", {
+        /**
+         * Get basic height.
+         *
+         * @description Does not fall back to node image height but
+         * uses original value from API so can be faulty.
+         *
+         * @returns {number} The height of the basic version image
+         * (adjusted for orientation).
+         */
+        get: function () {
+            return this._basicHeight;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "basicRt", {
+        get: function () {
+            return this._basicRt;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "basicWidth", {
+        /**
+         * Get basic width.
+         *
+         * @description Does not fall back to node image width but
+         * uses original value from API so can be faulty.
+         *
+         * @returns {number} The width of the basic version image
+         * (adjusted for orientation).
+         */
+        get: function () {
+            return this._basicWidth;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "focal", {
@@ -26391,7 +46561,24 @@ var Transform = (function () {
         get: function () {
             return this._focal;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "fullPano", {
+        /**
+         * Get fullPano.
+         *
+         * @returns {boolean} Value indicating whether the node is a complete
+         * 360 panorama.
+         */
+        get: function () {
+            return this._gpano != null &&
+                this._gpano.CroppedAreaLeftPixels === 0 &&
+                this._gpano.CroppedAreaTopPixels === 0 &&
+                this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels &&
+                this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "gpano", {
@@ -26402,18 +46589,22 @@ var Transform = (function () {
         get: function () {
             return this._gpano;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "height", {
         /**
          * Get height.
+         *
+         * @description Falls back to the node image height if
+         * the API data is faulty.
+         *
          * @returns {number} The orientation adjusted image height.
          */
         get: function () {
             return this._height;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "orientation", {
@@ -26424,7 +46615,7 @@ var Transform = (function () {
         get: function () {
             return this._orientation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "rt", {
@@ -26435,7 +46626,7 @@ var Transform = (function () {
         get: function () {
             return this._rt;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "srt", {
@@ -26446,7 +46637,7 @@ var Transform = (function () {
         get: function () {
             return this._srt;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "scale", {
@@ -26457,18 +46648,45 @@ var Transform = (function () {
         get: function () {
             return this._scale;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "hasValidScale", {
+        /**
+         * Get has valid scale.
+         * @returns {boolean} Value indicating if the scale of the transform is valid.
+         */
+        get: function () {
+            return this._scale > 1e-2 && this._scale < 50;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "radialPeak", {
+        /**
+         * Get radial peak.
+         * @returns {number} Value indicating the radius where the radial
+         * undistortion function peaks.
+         */
+        get: function () {
+            return this._radialPeak;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "width", {
         /**
          * Get width.
+         *
+         * @description Falls back to the node image width if
+         * the API data is faulty.
+         *
          * @returns {number} The orientation adjusted image width.
          */
         get: function () {
             return this._width;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -26520,12 +46738,15 @@ var Transform = (function () {
      * Unproject basic coordinates to 3D world coordinates.
      *
      * @param {Array<number>} basic - 2D basic coordinates.
-     * @param {Array<number>} distance - Depth to unproject from camera center.
+     * @param {Array<number>} distance - Distance to unproject from camera center.
+     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
+     *                            Only applicable for perspective images. Will be
+     *                            ignored for panoramas.
      * @returns {Array<number>} Unprojected 3D world coordinates.
      */
-    Transform.prototype.unprojectBasic = function (basic, distance) {
+    Transform.prototype.unprojectBasic = function (basic, distance, depth) {
         var sfm = this._basicToSfm(basic);
-        return this.unprojectSfM(sfm, distance);
+        return this.unprojectSfM(sfm, distance, depth);
     };
     /**
      * Project 3D world coordinates to SfM coordinates.
@@ -26542,12 +46763,17 @@ var Transform = (function () {
      * Unproject SfM coordinates to a 3D world coordinates.
      *
      * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @param {Array<number>} distance - Depth to unproject from camera center.
+     * @param {Array<number>} distance - Distance to unproject from camera center.
+     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
+     *                            Only applicable for perspective images. Will be
+     *                            ignored for panoramas.
      * @returns {Array<number>} Unprojected 3D world coordinates.
      */
-    Transform.prototype.unprojectSfM = function (sfm, distance) {
+    Transform.prototype.unprojectSfM = function (sfm, distance, depth) {
         var bearing = this._sfmToBearing(sfm);
-        var v = new THREE.Vector4(distance * bearing[0], distance * bearing[1], distance * bearing[2], 1);
+        var v = depth && !this.gpano ?
+            new THREE.Vector4(distance * bearing[0] / bearing[2], distance * bearing[1] / bearing[2], distance, 1) :
+            new THREE.Vector4(distance * bearing[0], distance * bearing[1], distance * bearing[2], 1);
         v.applyMatrix4(new THREE.Matrix4().getInverse(this._rt));
         return [v.x / v.w, v.y / v.w, v.z / v.w];
     };
@@ -26581,12 +46807,45 @@ var Transform = (function () {
             var z = Math.cos(lat) * Math.cos(lon);
             return [x, y, z];
         }
+        else if (this._cameraProjection === "fisheye") {
+            var _a = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _a[0], dyn = _a[1];
+            var dTheta = Math.sqrt(dxn * dxn + dyn * dyn);
+            var d = this._distortionFromDistortedRadius(dTheta, this._ck1, this._ck2, this._radialPeak);
+            var theta = dTheta / d;
+            var z = Math.cos(theta);
+            var r = Math.sin(theta);
+            var x = r * dxn / dTheta;
+            var y = r * dyn / dTheta;
+            return [x, y, z];
+        }
         else {
-            var v = new THREE.Vector3(sfm[0], sfm[1], this._focal);
+            var _b = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _b[0], dyn = _b[1];
+            var dr = Math.sqrt(dxn * dxn + dyn * dyn);
+            var d = this._distortionFromDistortedRadius(dr, this._ck1, this._ck2, this._radialPeak);
+            var xn = dxn / d;
+            var yn = dyn / d;
+            var v = new THREE.Vector3(xn, yn, 1);
             v.normalize();
             return [v.x, v.y, v.z];
         }
     };
+    /** Compute distortion given the distorted radius.
+     *
+     *  Solves for d in the equation
+     *    y = d(x, k1, k2) * x
+     * given the distorted radius, y.
+     */
+    Transform.prototype._distortionFromDistortedRadius = function (distortedRadius, k1, k2, radialPeak) {
+        var d = 1.0;
+        for (var i = 0; i < 10; i++) {
+            var radius = distortedRadius / d;
+            if (radius > radialPeak) {
+                radius = radialPeak;
+            }
+            d = 1 + k1 * Math.pow(radius, 2) + k2 * Math.pow(radius, 4);
+        }
+        return d;
+    };
     /**
      * Transform bearing vector (3D cartesian coordiantes on the unit sphere) to
      * SfM coordinates.
@@ -26620,11 +46879,45 @@ var Transform = (function () {
                 (fullPanoPixel[1] - this.gpano.CroppedAreaTopPixels - this.gpano.CroppedAreaImageHeightPixels / 2) / size,
             ];
         }
+        else if (this._cameraProjection === "fisheye") {
+            if (bearing[2] > 0) {
+                var x = bearing[0], y = bearing[1], z = bearing[2];
+                var r = Math.sqrt(x * x + y * y);
+                var theta = Math.atan2(r, z);
+                if (theta > this._radialPeak) {
+                    theta = this._radialPeak;
+                }
+                var distortion = 1.0 + Math.pow(theta, 2) * (this._ck1 + Math.pow(theta, 2) * this._ck2);
+                var s = this._focal * distortion * theta / r;
+                return [s * x, s * y];
+            }
+            else {
+                return [
+                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
+                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
+                ];
+            }
+        }
         else {
-            return [
-                bearing[0] * this._focal / bearing[2],
-                bearing[1] * this._focal / bearing[2],
-            ];
+            if (bearing[2] > 0) {
+                var _a = [bearing[0] / bearing[2], bearing[1] / bearing[2]], xn = _a[0], yn = _a[1];
+                var r2 = xn * xn + yn * yn;
+                var rp2 = Math.pow(this._radialPeak, 2);
+                if (r2 > rp2) {
+                    r2 = rp2;
+                }
+                var d = 1 + this._ck1 * r2 + this._ck2 * Math.pow(r2, 2);
+                return [
+                    this._focal * d * xn,
+                    this._focal * d * yn,
+                ];
+            }
+            else {
+                return [
+                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
+                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
+                ];
+            }
         }
     };
     /**
@@ -26701,112 +46994,656 @@ var Transform = (function () {
                 basicY = rotatedY;
                 break;
         }
-        return [basicX, basicY];
+        return [basicX, basicY];
+    };
+    /**
+     * Determines if the gpano information indicates a full panorama.
+     *
+     * @returns {boolean} Value determining if the gpano information indicates
+     * a full panorama.
+     */
+    Transform.prototype._fullPano = function () {
+        return this.gpano != null &&
+            this.gpano.CroppedAreaLeftPixels === 0 &&
+            this.gpano.CroppedAreaTopPixels === 0 &&
+            this.gpano.CroppedAreaImageWidthPixels === this.gpano.FullPanoWidthPixels &&
+            this.gpano.CroppedAreaImageHeightPixels === this.gpano.FullPanoHeightPixels;
+    };
+    /**
+     * Checks a value and returns it if it exists and is larger than 0.
+     * Fallbacks if it is null.
+     *
+     * @param {number} value - Value to check.
+     * @param {number} fallback - Value to fall back to.
+     * @returns {number} The value or its fallback value if it is not defined or negative.
+     */
+    Transform.prototype._getValue = function (value, fallback) {
+        return value != null && value > 0 ? value : fallback;
+    };
+    /**
+     * Creates the extrinsic camera matrix [ R | t ].
+     *
+     * @param {Array<number>} rotation - Rotation vector in angle axis representation.
+     * @param {Array<number>} translation - Translation vector.
+     * @returns {THREE.Matrix4} Extrisic camera matrix.
+     */
+    Transform.prototype._getRt = function (rotation, translation) {
+        var axis = new THREE.Vector3(rotation[0], rotation[1], rotation[2]);
+        var angle = axis.length();
+        if (angle > 0) {
+            axis.normalize();
+        }
+        var rt = new THREE.Matrix4();
+        rt.makeRotationAxis(axis, angle);
+        rt.setPosition(new THREE.Vector3(translation[0], translation[1], translation[2]));
+        return rt;
+    };
+    /**
+     * Calculates the scaled extrinsic camera matrix scale * [ R | t ].
+     *
+     * @param {THREE.Matrix4} rt - Extrisic camera matrix.
+     * @param {number} scale - Scale factor.
+     * @returns {THREE.Matrix4} Scaled extrisic camera matrix.
+     */
+    Transform.prototype._getSrt = function (rt, scale) {
+        var srt = rt.clone();
+        var elements = srt.elements;
+        elements[12] = scale * elements[12];
+        elements[13] = scale * elements[13];
+        elements[14] = scale * elements[14];
+        srt.scale(new THREE.Vector3(scale, scale, scale));
+        return srt;
+    };
+    Transform.prototype._getBasicRt = function (rt, orientation) {
+        var axis = new THREE.Vector3(0, 0, 1);
+        var angle = 0;
+        switch (orientation) {
+            case 3:
+                angle = Math.PI;
+                break;
+            case 6:
+                angle = Math.PI / 2;
+                break;
+            case 8:
+                angle = 3 * Math.PI / 2;
+                break;
+            default:
+                break;
+        }
+        return new THREE.Matrix4()
+            .makeRotationAxis(axis, angle)
+            .multiply(rt);
+    };
+    Transform.prototype._getRadialPeak = function (k1, k2) {
+        var a = 5 * k2;
+        var b = 3 * k1;
+        var c = 1;
+        var d = Math.pow(b, 2) - 4 * a * c;
+        if (d < 0) {
+            return undefined;
+        }
+        var root1 = (-b - Math.sqrt(d)) / 2 / a;
+        var root2 = (-b + Math.sqrt(d)) / 2 / a;
+        var minRoot = Math.min(root1, root2);
+        var maxRoot = Math.max(root1, root2);
+        return minRoot > 0 ?
+            Math.sqrt(minRoot) :
+            maxRoot > 0 ?
+                Math.sqrt(maxRoot) :
+                undefined;
+    };
+    /**
+     * Calculate a transformation matrix from normalized coordinates for
+     * texture map coordinates.
+     *
+     * @returns {THREE.Matrix4} Normalized coordinates to texture map
+     * coordinates transformation matrix.
+     */
+    Transform.prototype._normalizedToTextureMatrix = function () {
+        var size = Math.max(this._width, this._height);
+        var scaleX = this._orientation < 5 ? this._textureScale[0] : this._textureScale[1];
+        var scaleY = this._orientation < 5 ? this._textureScale[1] : this._textureScale[0];
+        var w = size / this._width * scaleX;
+        var h = size / this._height * scaleY;
+        switch (this._orientation) {
+            case 1:
+                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
+            case 3:
+                return new THREE.Matrix4().set(-w, 0, 0, 0.5, 0, h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
+            case 6:
+                return new THREE.Matrix4().set(0, -h, 0, 0.5, -w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
+            case 8:
+                return new THREE.Matrix4().set(0, h, 0, 0.5, w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
+            default:
+                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
+        }
+    };
+    return Transform;
+}());
+exports.Transform = Transform;
+
+},{"three":242}],421:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ViewportCoords = void 0;
+var THREE = require("three");
+/**
+ * @class ViewportCoords
+ *
+ * @classdesc Provides methods for calculating 2D coordinate conversions
+ * as well as 3D projection and unprojection.
+ *
+ * Basic coordinates are 2D coordinates on the [0, 1] interval and
+ * have the origin point, (0, 0), at the top left corner and the
+ * maximum value, (1, 1), at the bottom right corner of the original
+ * image.
+ *
+ * Viewport coordinates are 2D coordinates on the [-1, 1] interval and
+ * have the origin point in the center. The bottom left corner point is
+ * (-1, -1) and the top right corner point is (1, 1).
+ *
+ * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and
+ * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left
+ * corner and the maximum value is (canvasWidth, canvasHeight) is in the
+ * bottom right corner.
+ *
+ * 3D coordinates are in the topocentric world reference frame.
+ */
+var ViewportCoords = /** @class */ (function () {
+    function ViewportCoords() {
+        this._unprojectDepth = 200;
+    }
+    /**
+     * Convert basic coordinates to canvas coordinates.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} basicX - Basic X coordinate.
+     * @param {number} basicY - Basic Y coordinate.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D canvas coordinates.
+     */
+    ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, container, transform, camera) {
+        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
+        var canvas = this.projectToCanvas(point3d, container, camera);
+        return canvas;
+    };
+    /**
+     * Convert basic coordinates to canvas coordinates safely. If 3D point is
+     * behind camera null will be returned.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} basicX - Basic X coordinate.
+     * @param {number} basicY - Basic Y coordinate.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D canvas coordinates if the basic point represents a 3D point
+     * in front of the camera, otherwise null.
+     */
+    ViewportCoords.prototype.basicToCanvasSafe = function (basicX, basicY, container, transform, camera) {
+        var viewport = this.basicToViewportSafe(basicX, basicY, transform, camera);
+        if (viewport === null) {
+            return null;
+        }
+        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
+        return canvas;
+    };
+    /**
+     * Convert basic coordinates to viewport coordinates.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} basicX - Basic X coordinate.
+     * @param {number} basicY - Basic Y coordinate.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D viewport coordinates.
+     */
+    ViewportCoords.prototype.basicToViewport = function (basicX, basicY, transform, camera) {
+        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
+        var viewport = this.projectToViewport(point3d, camera);
+        return viewport;
+    };
+    /**
+     * Convert basic coordinates to viewport coordinates safely. If 3D point is
+     * behind camera null will be returned.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} basicX - Basic X coordinate.
+     * @param {number} basicY - Basic Y coordinate.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D viewport coordinates.
+     */
+    ViewportCoords.prototype.basicToViewportSafe = function (basicX, basicY, transform, camera) {
+        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
+        var pointCamera = this.worldToCamera(point3d, camera);
+        if (pointCamera[2] > 0) {
+            return null;
+        }
+        var viewport = this.projectToViewport(point3d, camera);
+        return viewport;
+    };
+    /**
+     * Convert camera 3D coordinates to viewport coordinates.
+     *
+     * @param {number} pointCamera - 3D point in camera coordinate system.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D viewport coordinates.
+     */
+    ViewportCoords.prototype.cameraToViewport = function (pointCamera, camera) {
+        var viewport = new THREE.Vector3().fromArray(pointCamera)
+            .applyMatrix4(camera.projectionMatrix);
+        return [viewport.x, viewport.y];
+    };
+    /**
+     * Get canvas pixel position from event.
+     *
+     * @param {Event} event - Event containing clientX and clientY properties.
+     * @param {HTMLElement} element - HTML element.
+     * @returns {Array<number>} 2D canvas coordinates.
+     */
+    ViewportCoords.prototype.canvasPosition = function (event, element) {
+        var clientRect = element.getBoundingClientRect();
+        var canvasX = event.clientX - clientRect.left - element.clientLeft;
+        var canvasY = event.clientY - clientRect.top - element.clientTop;
+        return [canvasX, canvasY];
+    };
+    /**
+     * Convert canvas coordinates to basic coordinates.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} canvasX - Canvas X coordinate.
+     * @param {number} canvasY - Canvas Y coordinate.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D basic coordinates.
+     */
+    ViewportCoords.prototype.canvasToBasic = function (canvasX, canvasY, container, transform, camera) {
+        var point3d = this.unprojectFromCanvas(canvasX, canvasY, container, camera)
+            .toArray();
+        var basic = transform.projectBasic(point3d);
+        return basic;
+    };
+    /**
+     * Convert canvas coordinates to viewport coordinates.
+     *
+     * @param {number} canvasX - Canvas X coordinate.
+     * @param {number} canvasY - Canvas Y coordinate.
+     * @param {HTMLElement} container - The viewer container.
+     * @returns {Array<number>} 2D viewport coordinates.
+     */
+    ViewportCoords.prototype.canvasToViewport = function (canvasX, canvasY, container) {
+        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
+        var viewportX = 2 * canvasX / canvasWidth - 1;
+        var viewportY = 1 - 2 * canvasY / canvasHeight;
+        return [viewportX, viewportY];
+    };
+    /**
+     * Determines the width and height of the container in canvas coordinates.
+     *
+     * @param {HTMLElement} container - The viewer container.
+     * @returns {Array<number>} 2D canvas coordinates.
+     */
+    ViewportCoords.prototype.containerToCanvas = function (container) {
+        return [container.offsetWidth, container.offsetHeight];
+    };
+    /**
+     * Determine basic distances from image to canvas corners.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * Determines the smallest basic distance for every side of the canvas.
+     *
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} Array of basic distances as [top, right, bottom, left].
+     */
+    ViewportCoords.prototype.getBasicDistances = function (transform, camera) {
+        var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera);
+        var topRightBasic = this.viewportToBasic(1, 1, transform, camera);
+        var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera);
+        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera);
+        var topBasicDistance = 0;
+        var rightBasicDistance = 0;
+        var bottomBasicDistance = 0;
+        var leftBasicDistance = 0;
+        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
+            topBasicDistance = topLeftBasic[1] > topRightBasic[1] ?
+                -topLeftBasic[1] :
+                -topRightBasic[1];
+        }
+        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {
+            rightBasicDistance = topRightBasic[0] < bottomRightBasic[0] ?
+                topRightBasic[0] - 1 :
+                bottomRightBasic[0] - 1;
+        }
+        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {
+            bottomBasicDistance = bottomRightBasic[1] < bottomLeftBasic[1] ?
+                bottomRightBasic[1] - 1 :
+                bottomLeftBasic[1] - 1;
+        }
+        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {
+            leftBasicDistance = bottomLeftBasic[0] > topLeftBasic[0] ?
+                -bottomLeftBasic[0] :
+                -topLeftBasic[0];
+        }
+        return [topBasicDistance, rightBasicDistance, bottomBasicDistance, leftBasicDistance];
+    };
+    /**
+     * Determine pixel distances from image to canvas corners.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * Determines the smallest pixel distance for every side of the canvas.
+     *
+     * @param {HTMLElement} container - The viewer container.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} Array of pixel distances as [top, right, bottom, left].
+     */
+    ViewportCoords.prototype.getPixelDistances = function (container, transform, camera) {
+        var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera);
+        var topRightBasic = this.viewportToBasic(1, 1, transform, camera);
+        var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera);
+        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera);
+        var topPixelDistance = 0;
+        var rightPixelDistance = 0;
+        var bottomPixelDistance = 0;
+        var leftPixelDistance = 0;
+        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
+        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
+            var basicX = topLeftBasic[1] > topRightBasic[1] ?
+                topLeftBasic[0] :
+                topRightBasic[0];
+            var canvas = this.basicToCanvas(basicX, 0, container, transform, camera);
+            topPixelDistance = canvas[1] > 0 ? canvas[1] : 0;
+        }
+        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {
+            var basicY = topRightBasic[0] < bottomRightBasic[0] ?
+                topRightBasic[1] :
+                bottomRightBasic[1];
+            var canvas = this.basicToCanvas(1, basicY, container, transform, camera);
+            rightPixelDistance = canvas[0] < canvasWidth ? canvasWidth - canvas[0] : 0;
+        }
+        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {
+            var basicX = bottomRightBasic[1] < bottomLeftBasic[1] ?
+                bottomRightBasic[0] :
+                bottomLeftBasic[0];
+            var canvas = this.basicToCanvas(basicX, 1, container, transform, camera);
+            bottomPixelDistance = canvas[1] < canvasHeight ? canvasHeight - canvas[1] : 0;
+        }
+        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {
+            var basicY = bottomLeftBasic[0] > topLeftBasic[0] ?
+                bottomLeftBasic[1] :
+                topLeftBasic[1];
+            var canvas = this.basicToCanvas(0, basicY, container, transform, camera);
+            leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0;
+        }
+        return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance];
+    };
+    /**
+     * Determine if an event occured inside an element.
+     *
+     * @param {Event} event - Event containing clientX and clientY properties.
+     * @param {HTMLElement} element - HTML element.
+     * @returns {boolean} Value indicating if the event occured inside the element or not.
+     */
+    ViewportCoords.prototype.insideElement = function (event, element) {
+        var clientRect = element.getBoundingClientRect();
+        var minX = clientRect.left + element.clientLeft;
+        var maxX = minX + element.clientWidth;
+        var minY = clientRect.top + element.clientTop;
+        var maxY = minY + element.clientHeight;
+        return event.clientX > minX &&
+            event.clientX < maxX &&
+            event.clientY > minY &&
+            event.clientY < maxY;
+    };
+    /**
+     * Project 3D world coordinates to canvas coordinates.
+     *
+     * @param {Array<number>} point3D - 3D world coordinates.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D canvas coordinates.
+     */
+    ViewportCoords.prototype.projectToCanvas = function (point3d, container, camera) {
+        var viewport = this.projectToViewport(point3d, camera);
+        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
+        return canvas;
+    };
+    /**
+     * Project 3D world coordinates to canvas coordinates safely. If 3D
+     * point is behind camera null will be returned.
+     *
+     * @param {Array<number>} point3D - 3D world coordinates.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D canvas coordinates.
+     */
+    ViewportCoords.prototype.projectToCanvasSafe = function (point3d, container, camera) {
+        var pointCamera = this.worldToCamera(point3d, camera);
+        if (pointCamera[2] > 0) {
+            return null;
+        }
+        var viewport = this.projectToViewport(point3d, camera);
+        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
+        return canvas;
     };
     /**
-     * Determines if the gpano information indicates a full panorama.
+     * Project 3D world coordinates to viewport coordinates.
      *
-     * @returns {boolean} Value determining if the gpano information indicates
-     * a full panorama.
+     * @param {Array<number>} point3D - 3D world coordinates.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D viewport coordinates.
      */
-    Transform.prototype._fullPano = function () {
-        return this.gpano != null &&
-            this.gpano.CroppedAreaLeftPixels === 0 &&
-            this.gpano.CroppedAreaTopPixels === 0 &&
-            this.gpano.CroppedAreaImageWidthPixels === this.gpano.FullPanoWidthPixels &&
-            this.gpano.CroppedAreaImageHeightPixels === this.gpano.FullPanoHeightPixels;
+    ViewportCoords.prototype.projectToViewport = function (point3d, camera) {
+        var viewport = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
+            .project(camera);
+        return [viewport.x, viewport.y];
     };
     /**
-     * Checks a value and returns it if it exists and is larger than 0.
-     * Fallbacks if it is null.
+     * Uproject canvas coordinates to 3D world coordinates.
      *
-     * @param {number} value - Value to check.
-     * @param {number} fallback - Value to fall back to.
-     * @returns {number} The value or its fallback value if it is not defined or negative.
+     * @param {number} canvasX - Canvas X coordinate.
+     * @param {number} canvasY - Canvas Y coordinate.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 3D world coordinates.
      */
-    Transform.prototype._getValue = function (value, fallback) {
-        return value != null && value > 0 ? value : fallback;
+    ViewportCoords.prototype.unprojectFromCanvas = function (canvasX, canvasY, container, camera) {
+        var viewport = this.canvasToViewport(canvasX, canvasY, container);
+        var point3d = this.unprojectFromViewport(viewport[0], viewport[1], camera);
+        return point3d;
     };
     /**
-     * Creates the extrinsic camera matrix [ R | t ].
+     * Unproject viewport coordinates to 3D world coordinates.
      *
-     * @param {Array<number>} rotation - Rotation vector in angle axis representation.
-     * @param {Array<number>} translation - Translation vector.
-     * @returns {THREE.Matrix4} Extrisic camera matrix.
+     * @param {number} viewportX - Viewport X coordinate.
+     * @param {number} viewportY - Viewport Y coordinate.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 3D world coordinates.
      */
-    Transform.prototype._getRt = function (rotation, translation) {
-        var axis = new THREE.Vector3(rotation[0], rotation[1], rotation[2]);
-        var angle = axis.length();
-        axis.normalize();
-        var rt = new THREE.Matrix4();
-        rt.makeRotationAxis(axis, angle);
-        rt.setPosition(new THREE.Vector3(translation[0], translation[1], translation[2]));
-        return rt;
+    ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, camera) {
+        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
+            .unproject(camera);
+        return point3d;
     };
     /**
-     * Calculates the scaled extrinsic camera matrix scale * [ R | t ].
+     * Convert viewport coordinates to basic coordinates.
      *
-     * @param {THREE.Matrix4} rt - Extrisic camera matrix.
-     * @param {number} scale - Scale factor.
-     * @returns {THREE.Matrix4} Scaled extrisic camera matrix.
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} viewportX - Viewport X coordinate.
+     * @param {number} viewportY - Viewport Y coordinate.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D basic coordinates.
      */
-    Transform.prototype._getSrt = function (rt, scale) {
-        var srt = rt.clone();
-        var elements = srt.elements;
-        elements[12] = scale * elements[12];
-        elements[13] = scale * elements[13];
-        elements[14] = scale * elements[14];
-        srt.scale(new THREE.Vector3(scale, scale, scale));
-        return srt;
+    ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, camera) {
+        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
+            .unproject(camera)
+            .toArray();
+        var basic = transform.projectBasic(point3d);
+        return basic;
     };
     /**
-     * Calculate a transformation matrix from normalized coordinates for
-     * texture map coordinates.
+     * Convert viewport coordinates to canvas coordinates.
      *
-     * @returns {THREE.Matrix4} Normalized coordinates to texture map
-     * coordinates transformation matrix.
+     * @param {number} viewportX - Viewport X coordinate.
+     * @param {number} viewportY - Viewport Y coordinate.
+     * @param {HTMLElement} container - The viewer container.
+     * @returns {Array<number>} 2D canvas coordinates.
      */
-    Transform.prototype._normalizedToTextureMatrix = function () {
-        var size = Math.max(this._width, this._height);
-        var w = size / this._width;
-        var h = size / this._height;
-        switch (this._orientation) {
-            case 1:
-                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 3:
-                return new THREE.Matrix4().set(-w, 0, 0, 0.5, 0, h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 6:
-                return new THREE.Matrix4().set(0, -h, 0, 0.5, -w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 8:
-                return new THREE.Matrix4().set(0, h, 0, 0.5, w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            default:
-                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-        }
+    ViewportCoords.prototype.viewportToCanvas = function (viewportX, viewportY, container) {
+        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
+        var canvasX = canvasWidth * (viewportX + 1) / 2;
+        var canvasY = -canvasHeight * (viewportY - 1) / 2;
+        return [canvasX, canvasY];
     };
-    return Transform;
+    /**
+     * Convert 3D world coordinates to 3D camera coordinates.
+     *
+     * @param {number} point3D - 3D point in world coordinate system.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 3D camera coordinates.
+     */
+    ViewportCoords.prototype.worldToCamera = function (point3d, camera) {
+        var pointCamera = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
+            .applyMatrix4(camera.matrixWorldInverse);
+        return pointCamera.toArray();
+    };
+    return ViewportCoords;
 }());
-exports.Transform = Transform;
+exports.ViewportCoords = ViewportCoords;
+exports.default = ViewportCoords;
+
+
+},{"three":242}],422:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],423:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FilterCreator = void 0;
+/**
+ * @class Filter
+ *
+ * @classdesc Represents a class for creating node filters. Implementation and
+ * definitions based on https://github.com/mapbox/feature-filter.
+ */
+var FilterCreator = /** @class */ (function () {
+    function FilterCreator() {
+    }
+    /**
+     * Create a filter from a filter expression.
+     *
+     * @description The following filters are supported:
+     *
+     * Comparison
+     * `==`
+     * `!=`
+     * `<`
+     * `<=`
+     * `>`
+     * `>=`
+     *
+     * Set membership
+     * `in`
+     * `!in`
+     *
+     * Combining
+     * `all`
+     *
+     * @param {FilterExpression} filter - Comparison, set membership or combinding filter
+     * expression.
+     * @returns {FilterFunction} Function taking a node and returning a boolean that
+     * indicates whether the node passed the test or not.
+     */
+    FilterCreator.prototype.createFilter = function (filter) {
+        return new Function("node", "return " + this._compile(filter) + ";");
+    };
+    FilterCreator.prototype._compile = function (filter) {
+        if (filter == null || filter.length <= 1) {
+            return "true";
+        }
+        var operator = filter[0];
+        var operation = operator === "==" ? this._compileComparisonOp("===", filter[1], filter[2], false) :
+            operator === "!=" ? this._compileComparisonOp("!==", filter[1], filter[2], false) :
+                operator === ">" ||
+                    operator === ">=" ||
+                    operator === "<" ||
+                    operator === "<=" ? this._compileComparisonOp(operator, filter[1], filter[2], true) :
+                    operator === "in" ?
+                        this._compileInOp(filter[1], filter.slice(2)) :
+                        operator === "!in" ?
+                            this._compileNegation(this._compileInOp(filter[1], filter.slice(2))) :
+                            operator === "all" ? this._compileLogicalOp(filter.slice(1), "&&") :
+                                "true";
+        return "(" + operation + ")";
+    };
+    FilterCreator.prototype._compare = function (a, b) {
+        return a < b ? -1 : a > b ? 1 : 0;
+    };
+    FilterCreator.prototype._compileComparisonOp = function (operator, property, value, checkType) {
+        var left = this._compilePropertyReference(property);
+        var right = JSON.stringify(value);
+        return (checkType ? "typeof " + left + "===typeof " + right + "&&" : "") + left + operator + right;
+    };
+    FilterCreator.prototype._compileInOp = function (property, values) {
+        var compare = this._compare;
+        var left = JSON.stringify(values.sort(compare));
+        var right = this._compilePropertyReference(property);
+        return left + ".indexOf(" + right + ")!==-1";
+    };
+    FilterCreator.prototype._compileLogicalOp = function (filters, operator) {
+        var compile = this._compile.bind(this);
+        return filters.map(compile).join(operator);
+    };
+    FilterCreator.prototype._compileNegation = function (expression) {
+        return "!(" + expression + ")";
+    };
+    FilterCreator.prototype._compilePropertyReference = function (property) {
+        return "node[" + JSON.stringify(property) + "]";
+    };
+    return FilterCreator;
+}());
+exports.FilterCreator = FilterCreator;
+exports.default = FilterCreator;
 
-},{"three":157}],280:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/from");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publish");
-var rbush = require("rbush");
+},{}],424:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Graph = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Edge_1 = require("../Edge");
 var Error_1 = require("../Error");
 var Graph_1 = require("../Graph");
+var Geo_1 = require("../Geo");
 /**
  * @class Graph
  *
  * @classdesc Represents a graph of nodes with edges.
  */
-var Graph = (function () {
+var Graph = /** @class */ (function () {
     /**
      * Create a new graph instance.
      *
@@ -26814,24 +47651,40 @@ var Graph = (function () {
      * @param {rbush.RBush<NodeIndexItem>} [nodeIndex] - Node index for fast spatial retreival.
      * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations.
      * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations.
+     * @param {FilterCreator} [filterCreator] - Instance for  filter creation.
+     * @param {IGraphConfiguration} [configuration] - Configuration struct.
      */
-    function Graph(apiV3, nodeIndex, graphCalculator, edgeCalculator) {
+    function Graph(apiV3, nodeIndex, graphCalculator, edgeCalculator, filterCreator, configuration) {
         this._apiV3 = apiV3;
         this._cachedNodes = {};
         this._cachedNodeTiles = {};
+        this._cachedSequenceNodes = {};
         this._cachedSpatialEdges = {};
         this._cachedTiles = {};
         this._cachingFill$ = {};
         this._cachingFull$ = {};
+        this._cachingSequenceNodes$ = {};
         this._cachingSequences$ = {};
         this._cachingSpatialArea$ = {};
         this._cachingTiles$ = {};
-        this._changed$ = new Subject_1.Subject();
+        this._changed$ = new rxjs_1.Subject();
         this._defaultAlt = 2;
         this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new Edge_1.EdgeCalculator();
+        this._filterCreator = filterCreator != null ? filterCreator : new Graph_1.FilterCreator();
+        this._filter = this._filterCreator.createFilter(undefined);
         this._graphCalculator = graphCalculator != null ? graphCalculator : new Graph_1.GraphCalculator();
+        this._configuration = configuration != null ?
+            configuration :
+            {
+                maxSequences: 50,
+                maxUnusedNodes: 100,
+                maxUnusedPreStoredNodes: 30,
+                maxUnusedTiles: 20,
+            };
         this._nodes = {};
-        this._nodeIndex = nodeIndex != null ? nodeIndex : rbush(16, [".lon", ".lat", ".lon", ".lat"]);
+        this._nodeIndex = nodeIndex != null ? nodeIndex : new Geo_1.GeoRBush(16);
+        this._nodeIndexTiles = {};
+        this._nodeToTile = {};
         this._preStored = {};
         this._requiredNodeTiles = {};
         this._requiredSpatialArea = {};
@@ -26849,9 +47702,86 @@ var Graph = (function () {
         get: function () {
             return this._changed$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    /**
+     * Caches the full node data for all images within a bounding
+     * box.
+     *
+     * @description The node assets are not cached.
+     *
+     * @param {ILatLon} sw - South west corner of bounding box.
+     * @param {ILatLon} ne - North east corner of bounding box.
+     * @returns {Observable<Graph>} Observable emitting the full
+     * nodes in the bounding box.
+     */
+    Graph.prototype.cacheBoundingBox$ = function (sw, ne) {
+        var _this = this;
+        var cacheTiles$ = this._graphCalculator.encodeHsFromBoundingBox(sw, ne)
+            .filter(function (h) {
+            return !(h in _this._cachedTiles);
+        })
+            .map(function (h) {
+            return h in _this._cachingTiles$ ?
+                _this._cachingTiles$[h] :
+                _this._cacheTile$(h);
+        });
+        if (cacheTiles$.length === 0) {
+            cacheTiles$.push(rxjs_1.of(this));
+        }
+        return rxjs_1.from(cacheTiles$).pipe(operators_1.mergeAll(), operators_1.last(), operators_1.mergeMap(function (graph) {
+            var nodes = _this._nodeIndex
+                .search({
+                maxX: ne.lat,
+                maxY: ne.lon,
+                minX: sw.lat,
+                minY: sw.lon,
+            })
+                .map(function (item) {
+                return item.node;
+            });
+            var fullNodes = [];
+            var coreNodes = [];
+            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+                var node = nodes_1[_i];
+                if (node.full) {
+                    fullNodes.push(node);
+                }
+                else {
+                    coreNodes.push(node.key);
+                }
+            }
+            var coreNodeBatches = [];
+            var batchSize = 200;
+            while (coreNodes.length > 0) {
+                coreNodeBatches.push(coreNodes.splice(0, batchSize));
+            }
+            var fullNodes$ = rxjs_1.of(fullNodes);
+            var fillNodes$ = coreNodeBatches
+                .map(function (batch) {
+                return _this._apiV3.imageByKeyFill$(batch).pipe(operators_1.map(function (imageByKeyFill) {
+                    var filledNodes = [];
+                    for (var fillKey in imageByKeyFill) {
+                        if (!imageByKeyFill.hasOwnProperty(fillKey)) {
+                            continue;
+                        }
+                        if (_this.hasNode(fillKey)) {
+                            var node = _this.getNode(fillKey);
+                            if (!node.full) {
+                                _this._makeFull(node, imageByKeyFill[fillKey]);
+                            }
+                            filledNodes.push(node);
+                        }
+                    }
+                    return filledNodes;
+                }));
+            });
+            return rxjs_1.merge(fullNodes$, rxjs_1.from(fillNodes$).pipe(operators_1.mergeAll()));
+        }), operators_1.reduce(function (acc, value) {
+            return acc.concat(value);
+        }));
+    };
     /**
      * Retrieve and cache node fill properties.
      *
@@ -26876,24 +47806,19 @@ var Graph = (function () {
         if (node.full) {
             throw new Error_1.GraphMapillaryError("Cannot fill node that is already full (" + key + ").");
         }
-        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key])
-            .do(function (imageByKeyFill) {
+        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key]).pipe(operators_1.tap(function (imageByKeyFill) {
             if (!node.full) {
                 _this._makeFull(node, imageByKeyFill[key]);
             }
             delete _this._cachingFill$[key];
-        })
-            .map(function (imageByKeyFill) {
+        }), operators_1.map(function (imageByKeyFill) {
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (key in _this._cachingFill$) {
                 delete _this._cachingFill$[key];
             }
             _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
+        }), operators_1.publish(), operators_1.refCount());
         return this._cachingFill$[key];
     };
     /**
@@ -26913,8 +47838,7 @@ var Graph = (function () {
         if (this.hasNode(key)) {
             throw new Error_1.GraphMapillaryError("Cannot cache full node that already exist in graph (" + key + ").");
         }
-        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key])
-            .do(function (imageByKeyFull) {
+        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key]).pipe(operators_1.tap(function (imageByKeyFull) {
             var fn = imageByKeyFull[key];
             if (_this.hasNode(key)) {
                 var node = _this.getNode(key);
@@ -26923,8 +47847,8 @@ var Graph = (function () {
                 }
             }
             else {
-                if (fn.sequence == null || fn.sequence.key == null) {
-                    throw new Error_1.GraphMapillaryError("Node has no sequence (" + key + ").");
+                if (fn.sequence_key == null) {
+                    throw new Error_1.GraphMapillaryError("Node has no sequence key (" + key + ").");
                 }
                 var node = new Graph_1.Node(fn);
                 _this._makeFull(node, fn);
@@ -26933,18 +47857,14 @@ var Graph = (function () {
                 _this._setNode(node);
                 delete _this._cachingFull$[key];
             }
-        })
-            .map(function (imageByKeyFull) {
+        }), operators_1.map(function (imageByKeyFull) {
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (key in _this._cachingFull$) {
                 delete _this._cachingFull$[key];
             }
             _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
+        }), operators_1.publish(), operators_1.refCount());
         return this._cachingFull$[key];
     };
     /**
@@ -26993,10 +47913,81 @@ var Graph = (function () {
         if (!(node.sequenceKey in this._sequences)) {
             throw new Error_1.GraphMapillaryError("Sequence is not cached (" + key + "), (" + node.sequenceKey + ")");
         }
-        var sequence = this._sequences[node.sequenceKey];
+        var sequence = this._sequences[node.sequenceKey].sequence;
         var edges = this._edgeCalculator.computeSequenceEdges(node, sequence);
         node.cacheSequenceEdges(edges);
     };
+    /**
+     * Retrieve and cache full nodes for all keys in a sequence.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @param {string} referenceNodeKey - Key of node to use as reference
+     * for optimized caching.
+     * @returns {Observable<Graph>} Observable emitting the graph
+     * when the nodes of the sequence has been cached.
+     */
+    Graph.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
+        var _this = this;
+        if (!this.hasSequence(sequenceKey)) {
+            throw new Error_1.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph (" + sequenceKey + ").");
+        }
+        if (this.hasSequenceNodes(sequenceKey)) {
+            throw new Error_1.GraphMapillaryError("Sequence nodes already cached (" + sequenceKey + ").");
+        }
+        var sequence = this.getSequence(sequenceKey);
+        if (sequence.key in this._cachingSequenceNodes$) {
+            return this._cachingSequenceNodes$[sequence.key];
+        }
+        var batches = [];
+        var keys = sequence.keys.slice();
+        var referenceBatchSize = 50;
+        if (!!referenceNodeKey && keys.length > referenceBatchSize) {
+            var referenceIndex = keys.indexOf(referenceNodeKey);
+            var startIndex = Math.max(0, Math.min(referenceIndex - referenceBatchSize / 2, keys.length - referenceBatchSize));
+            batches.push(keys.splice(startIndex, referenceBatchSize));
+        }
+        var batchSize = 200;
+        while (keys.length > 0) {
+            batches.push(keys.splice(0, batchSize));
+        }
+        var batchesToCache = batches.length;
+        var sequenceNodes$ = rxjs_1.from(batches).pipe(operators_1.mergeMap(function (batch) {
+            return _this._apiV3.imageByKeyFull$(batch).pipe(operators_1.tap(function (imageByKeyFull) {
+                for (var fullKey in imageByKeyFull) {
+                    if (!imageByKeyFull.hasOwnProperty(fullKey)) {
+                        continue;
+                    }
+                    var fn = imageByKeyFull[fullKey];
+                    if (_this.hasNode(fullKey)) {
+                        var node = _this.getNode(fn.key);
+                        if (!node.full) {
+                            _this._makeFull(node, fn);
+                        }
+                    }
+                    else {
+                        if (fn.sequence_key == null) {
+                            console.warn("Sequence missing, discarding node (" + fn.key + ")");
+                        }
+                        var node = new Graph_1.Node(fn);
+                        _this._makeFull(node, fn);
+                        var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
+                        _this._preStore(h, node);
+                        _this._setNode(node);
+                    }
+                }
+                batchesToCache--;
+            }), operators_1.map(function (imageByKeyFull) {
+                return _this;
+            }));
+        }, 6), operators_1.last(), operators_1.finalize(function () {
+            delete _this._cachingSequenceNodes$[sequence.key];
+            if (batchesToCache === 0) {
+                _this._cachedSequenceNodes[sequence.key] = true;
+            }
+        }), operators_1.publish(), operators_1.refCount());
+        this._cachingSequenceNodes$[sequence.key] = sequenceNodes$;
+        return sequenceNodes$;
+    };
     /**
      * Retrieve and cache full nodes for a node spatial area.
      *
@@ -27030,9 +48021,8 @@ var Graph = (function () {
         }
         var batchesToCache = batches.length;
         var spatialNodes$ = [];
-        var _loop_1 = function(batch) {
-            var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch)
-                .do(function (imageByKeyFill) {
+        var _loop_1 = function (batch) {
+            var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch).pipe(operators_1.tap(function (imageByKeyFill) {
                 for (var fillKey in imageByKeyFill) {
                     if (!imageByKeyFill.hasOwnProperty(fillKey)) {
                         continue;
@@ -27049,11 +48039,9 @@ var Graph = (function () {
                 if (--batchesToCache === 0) {
                     delete _this._cachingSpatialArea$[key];
                 }
-            })
-                .map(function (imageByKeyFill) {
+            }), operators_1.map(function (imageByKeyFill) {
                 return _this;
-            })
-                .catch(function (error) {
+            }), operators_1.catchError(function (error) {
                 for (var _i = 0, batch_1 = batch; _i < batch_1.length; _i++) {
                     var batchKey = batch_1[_i];
                     if (batchKey in spatialArea.all) {
@@ -27067,14 +48055,11 @@ var Graph = (function () {
                     delete _this._cachingSpatialArea$[key];
                 }
                 throw error;
-            })
-                .finally(function () {
+            }), operators_1.finalize(function () {
                 if (Object.keys(spatialArea.cacheNodes).length === 0) {
                     _this._changed$.next(_this);
                 }
-            })
-                .publish()
-                .refCount();
+            }), operators_1.publish(), operators_1.refCount());
             spatialNodes$.push(spatialNodeBatch$);
         };
         var this_1 = this;
@@ -27097,17 +48082,27 @@ var Graph = (function () {
             throw new Error_1.GraphMapillaryError("Spatial edges already cached (" + key + ").");
         }
         var node = this.getNode(key);
-        var sequence = this._sequences[node.sequenceKey];
+        var sequence = this._sequences[node.sequenceKey].sequence;
         var fallbackKeys = [];
-        var nextKey = sequence.findNextKey(node.key);
         var prevKey = sequence.findPrevKey(node.key);
+        if (prevKey != null) {
+            fallbackKeys.push(prevKey);
+        }
+        var nextKey = sequence.findNextKey(node.key);
+        if (nextKey != null) {
+            fallbackKeys.push(nextKey);
+        }
         var allSpatialNodes = this._requiredSpatialArea[key].all;
         var potentialNodes = [];
+        var filter = this._filter;
         for (var spatialNodeKey in allSpatialNodes) {
             if (!allSpatialNodes.hasOwnProperty(spatialNodeKey)) {
                 continue;
             }
-            potentialNodes.push(allSpatialNodes[spatialNodeKey]);
+            var spatialNode = allSpatialNodes[spatialNodeKey];
+            if (filter(spatialNode)) {
+                potentialNodes.push(spatialNode);
+            }
         }
         var potentialEdges = this._edgeCalculator.getPotentialEdges(node, potentialNodes, fallbackKeys);
         var edges = this._edgeCalculator.computeStepEdges(node, potentialEdges, prevKey, nextKey);
@@ -27118,13 +48113,14 @@ var Graph = (function () {
         node.cacheSpatialEdges(edges);
         this._cachedSpatialEdges[key] = node;
         delete this._requiredSpatialArea[key];
+        delete this._cachedNodeTiles[key];
     };
     /**
      * Retrieve and cache geohash tiles for a node.
      *
      * @param {string} key - Key of node for which to retrieve tiles.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the tiles required for the node has been cached.
+     * @returns {Array<Observable<Graph>>} Array of observables emitting
+     * the graph for each tile required for the node has been cached.
      * @throws {GraphMapillaryError} When the operation is not valid on the
      * current graph.
      */
@@ -27133,6 +48129,9 @@ var Graph = (function () {
         if (key in this._cachedNodeTiles) {
             throw new Error_1.GraphMapillaryError("Tiles already cached (" + key + ").");
         }
+        if (key in this._cachedSpatialEdges) {
+            throw new Error_1.GraphMapillaryError("Spatial edges already cached so tiles considered cached (" + key + ").");
+        }
         if (!(key in this._requiredNodeTiles)) {
             throw new Error_1.GraphMapillaryError("Tiles have not been determined (" + key + ").");
         }
@@ -27148,61 +48147,11 @@ var Graph = (function () {
         nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs);
         nodeTiles.cache = [];
         var cacheTiles$ = [];
-        var _loop_2 = function(h) {
-            var cacheTile$ = null;
-            if (h in this_2._cachingTiles$) {
-                cacheTile$ = this_2._cachingTiles$[h];
-            }
-            else {
-                cacheTile$ = this_2._apiV3.imagesByH$([h])
-                    .do(function (imagesByH) {
-                    var coreNodes = imagesByH[h];
-                    if (h in _this._cachedTiles) {
-                        return;
-                    }
-                    _this._cachedTiles[h] = [];
-                    var hCache = _this._cachedTiles[h];
-                    var preStored = _this._removeFromPreStore(h);
-                    for (var index in coreNodes) {
-                        if (!coreNodes.hasOwnProperty(index)) {
-                            continue;
-                        }
-                        var coreNode = coreNodes[index];
-                        if (coreNode == null) {
-                            break;
-                        }
-                        if (coreNode.sequence == null ||
-                            coreNode.sequence.key == null) {
-                            console.warn("Sequence missing, discarding (" + coreNode.key + ")");
-                            continue;
-                        }
-                        if (preStored != null && coreNode.key in preStored) {
-                            var node_1 = preStored[coreNode.key];
-                            delete preStored[coreNode.key];
-                            hCache.push(node_1);
-                            _this._nodeIndex.insert({ lat: node_1.latLon.lat, lon: node_1.latLon.lon, node: node_1 });
-                            continue;
-                        }
-                        var node = new Graph_1.Node(coreNode);
-                        hCache.push(node);
-                        _this._nodeIndex.insert({ lat: node.latLon.lat, lon: node.latLon.lon, node: node });
-                        _this._setNode(node);
-                    }
-                    delete _this._cachingTiles$[h];
-                })
-                    .map(function (imagesByH) {
-                    return _this;
-                })
-                    .catch(function (error) {
-                    delete _this._cachingTiles$[h];
-                    throw error;
-                })
-                    .publish()
-                    .refCount();
-                this_2._cachingTiles$[h] = cacheTile$;
-            }
-            cacheTiles$.push(cacheTile$
-                .do(function (graph) {
+        var _loop_2 = function (h) {
+            var cacheTile$ = h in this_2._cachingTiles$ ?
+                this_2._cachingTiles$[h] :
+                this_2._cacheTile$(h);
+            cacheTiles$.push(cacheTile$.pipe(operators_1.tap(function (graph) {
                 var index = nodeTiles.caching.indexOf(h);
                 if (index > -1) {
                     nodeTiles.caching.splice(index, 1);
@@ -27212,8 +48161,7 @@ var Graph = (function () {
                     delete _this._requiredNodeTiles[key];
                     _this._cachedNodeTiles[key] = true;
                 }
-            })
-                .catch(function (error) {
+            }), operators_1.catchError(function (error) {
                 var index = nodeTiles.caching.indexOf(h);
                 if (index > -1) {
                     nodeTiles.caching.splice(index, 1);
@@ -27224,12 +48172,9 @@ var Graph = (function () {
                     _this._cachedNodeTiles[key] = true;
                 }
                 throw error;
-            })
-                .finally(function () {
+            }), operators_1.finalize(function () {
                 _this._changed$.next(_this);
-            })
-                .publish()
-                .refCount());
+            }), operators_1.publish(), operators_1.refCount()));
         };
         var this_2 = this;
         for (var _i = 0, _a = nodeTiles.caching; _i < _a.length; _i++) {
@@ -27251,7 +48196,9 @@ var Graph = (function () {
         }
         var node = this.getNode(key);
         node.initializeCache(new Graph_1.NodeCache());
-        this._cachedNodes[key] = node;
+        var accessed = new Date().getTime();
+        this._cachedNodes[key] = { accessed: accessed, node: node };
+        this._updateCachedTileAccess(key, accessed);
     };
     /**
      * Get a value indicating if the graph is fill caching a node.
@@ -27292,6 +48239,16 @@ var Graph = (function () {
     Graph.prototype.isCachingSequence = function (sequenceKey) {
         return sequenceKey in this._cachingSequences$;
     };
+    /**
+     * Get a value indicating if the graph is caching sequence nodes.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {boolean} Value indicating if the sequence nodes are
+     * being cached.
+     */
+    Graph.prototype.isCachingSequenceNodes = function (sequenceKey) {
+        return sequenceKey in this._cachingSequenceNodes$;
+    };
     /**
      * Get a value indicating if the graph is caching the tiles
      * required for calculating spatial edges of a node.
@@ -27323,6 +48280,9 @@ var Graph = (function () {
      * @returns {boolean} Value indicating if a node exist in the graph.
      */
     Graph.prototype.hasNode = function (key) {
+        var accessed = new Date().getTime();
+        this._updateCachedNodeAccess(key, accessed);
+        this._updateCachedTileAccess(key, accessed);
         return key in this._nodes;
     };
     /**
@@ -27334,7 +48294,12 @@ var Graph = (function () {
      */
     Graph.prototype.hasNodeSequence = function (key) {
         var node = this.getNode(key);
-        return node.sequenceKey in this._sequences;
+        var sequenceKey = node.sequenceKey;
+        var hasNodeSequence = sequenceKey in this._sequences;
+        if (hasNodeSequence) {
+            this._sequences[sequenceKey].accessed = new Date().getTime();
+        }
+        return hasNodeSequence;
     };
     /**
      * Get a value indicating if a sequence exist in the graph.
@@ -27344,7 +48309,21 @@ var Graph = (function () {
      * in the graph.
      */
     Graph.prototype.hasSequence = function (sequenceKey) {
-        return sequenceKey in this._sequences;
+        var hasSequence = sequenceKey in this._sequences;
+        if (hasSequence) {
+            this._sequences[sequenceKey].accessed = new Date().getTime();
+        }
+        return hasSequence;
+    };
+    /**
+     * Get a value indicating if sequence nodes has been cached in the graph.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {boolean} Value indicating if a sequence nodes has been
+     * cached in the graph.
+     */
+    Graph.prototype.hasSequenceNodes = function (sequenceKey) {
+        return sequenceKey in this._cachedSequenceNodes;
     };
     /**
      * Get a value indicating if the graph has fully cached
@@ -27367,10 +48346,10 @@ var Graph = (function () {
         var node = this.getNode(key);
         var bbox = this._graphCalculator.boundingBoxCorners(node.latLon, this._tileThreshold);
         var spatialItems = this._nodeIndex.search({
-            maxX: bbox[1].lon,
-            maxY: bbox[1].lat,
-            minX: bbox[0].lon,
-            minY: bbox[0].lat,
+            maxX: bbox[1].lat,
+            maxY: bbox[1].lon,
+            minX: bbox[0].lat,
+            minY: bbox[0].lon,
         });
         var spatialNodes = {
             all: {},
@@ -27401,23 +48380,28 @@ var Graph = (function () {
         if (key in this._cachedNodeTiles) {
             return true;
         }
+        if (key in this._cachedSpatialEdges) {
+            return true;
+        }
         if (!this.hasNode(key)) {
             throw new Error_1.GraphMapillaryError("Node does not exist in graph (" + key + ").");
         }
+        var nodeTiles = { cache: [], caching: [] };
         if (!(key in this._requiredNodeTiles)) {
             var node = this.getNode(key);
-            var cache = this._graphCalculator
+            nodeTiles.cache = this._graphCalculator
                 .encodeHs(node.latLon, this._tilePrecision, this._tileThreshold)
                 .filter(function (h) {
                 return !(h in _this._cachedTiles);
             });
-            this._requiredNodeTiles[key] = {
-                cache: cache,
-                caching: [],
-            };
+            if (nodeTiles.cache.length > 0) {
+                this._requiredNodeTiles[key] = nodeTiles;
+            }
+        }
+        else {
+            nodeTiles = this._requiredNodeTiles[key];
         }
-        return this._requiredNodeTiles[key].cache.length === 0 &&
-            this._requiredNodeTiles[key].caching.length === 0;
+        return nodeTiles.cache.length === 0 && nodeTiles.caching.length === 0;
     };
     /**
      * Get a node.
@@ -27426,32 +48410,248 @@ var Graph = (function () {
      * @returns {Node} Retrieved node.
      */
     Graph.prototype.getNode = function (key) {
+        var accessed = new Date().getTime();
+        this._updateCachedNodeAccess(key, accessed);
+        this._updateCachedTileAccess(key, accessed);
         return this._nodes[key];
     };
     /**
      * Get a sequence.
      *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {Node} Retrieved sequence.
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {Node} Retrieved sequence.
+     */
+    Graph.prototype.getSequence = function (sequenceKey) {
+        var sequenceAccess = this._sequences[sequenceKey];
+        sequenceAccess.accessed = new Date().getTime();
+        return sequenceAccess.sequence;
+    };
+    /**
+     * Reset all spatial edges of the graph nodes.
+     */
+    Graph.prototype.resetSpatialEdges = function () {
+        var cachedKeys = Object.keys(this._cachedSpatialEdges);
+        for (var _i = 0, cachedKeys_1 = cachedKeys; _i < cachedKeys_1.length; _i++) {
+            var cachedKey = cachedKeys_1[_i];
+            var node = this._cachedSpatialEdges[cachedKey];
+            node.resetSpatialEdges();
+            delete this._cachedSpatialEdges[cachedKey];
+        }
+    };
+    /**
+     * Reset the complete graph but keep the nodes corresponding
+     * to the supplied keys. All other nodes will be disposed.
+     *
+     * @param {Array<string>} keepKeys - Keys for nodes to keep
+     * in graph after reset.
+     */
+    Graph.prototype.reset = function (keepKeys) {
+        var nodes = [];
+        for (var _i = 0, keepKeys_1 = keepKeys; _i < keepKeys_1.length; _i++) {
+            var key = keepKeys_1[_i];
+            if (!this.hasNode(key)) {
+                throw new Error("Node does not exist " + key);
+            }
+            var node = this.getNode(key);
+            node.resetSequenceEdges();
+            node.resetSpatialEdges();
+            nodes.push(node);
+        }
+        for (var _a = 0, _b = Object.keys(this._cachedNodes); _a < _b.length; _a++) {
+            var cachedKey = _b[_a];
+            if (keepKeys.indexOf(cachedKey) !== -1) {
+                continue;
+            }
+            this._cachedNodes[cachedKey].node.dispose();
+            delete this._cachedNodes[cachedKey];
+        }
+        this._cachedNodeTiles = {};
+        this._cachedSpatialEdges = {};
+        this._cachedTiles = {};
+        this._cachingFill$ = {};
+        this._cachingFull$ = {};
+        this._cachingSequences$ = {};
+        this._cachingSpatialArea$ = {};
+        this._cachingTiles$ = {};
+        this._nodes = {};
+        this._nodeToTile = {};
+        this._preStored = {};
+        for (var _c = 0, nodes_2 = nodes; _c < nodes_2.length; _c++) {
+            var node = nodes_2[_c];
+            this._nodes[node.key] = node;
+            var h = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);
+            this._preStore(h, node);
+        }
+        this._requiredNodeTiles = {};
+        this._requiredSpatialArea = {};
+        this._sequences = {};
+        this._nodeIndexTiles = {};
+        this._nodeIndex.clear();
+    };
+    /**
+     * Set the spatial node filter.
+     *
+     * @param {FilterExpression} filter - Filter expression to be applied
+     * when calculating spatial edges.
      */
-    Graph.prototype.getSequence = function (sequenceKey) {
-        return this._sequences[sequenceKey];
+    Graph.prototype.setFilter = function (filter) {
+        this._filter = this._filterCreator.createFilter(filter);
     };
     /**
-     * Reset all spatial edges of the graph nodes.
+     * Uncache the graph according to the graph configuration.
+     *
+     * @description Uncaches unused tiles, unused nodes and
+     * sequences according to the numbers specified in the
+     * graph configuration. Sequences does not have a direct
+     * reference to either tiles or nodes and may be uncached
+     * even if they are related to the nodes that should be kept.
+     *
+     * @param {Array<string>} keepKeys - Keys of nodes to keep in
+     * graph unrelated to last access. Tiles related to those keys
+     * will also be kept in graph.
+     * @param {string} keepSequenceKey - Optional key of sequence
+     * for which the belonging nodes should not be disposed or
+     * removed from the graph. These nodes may still be uncached if
+     * not specified in keep keys param.
      */
-    Graph.prototype.reset = function () {
-        var spatialNodeKeys = Object.keys(this._requiredSpatialArea);
-        for (var _i = 0, spatialNodeKeys_1 = spatialNodeKeys; _i < spatialNodeKeys_1.length; _i++) {
-            var spatialNodeKey = spatialNodeKeys_1[_i];
-            delete this._requiredSpatialArea[spatialNodeKey];
+    Graph.prototype.uncache = function (keepKeys, keepSequenceKey) {
+        var keysInUse = {};
+        this._addNewKeys(keysInUse, this._cachingFull$);
+        this._addNewKeys(keysInUse, this._cachingFill$);
+        this._addNewKeys(keysInUse, this._cachingSpatialArea$);
+        this._addNewKeys(keysInUse, this._requiredNodeTiles);
+        this._addNewKeys(keysInUse, this._requiredSpatialArea);
+        for (var _i = 0, keepKeys_2 = keepKeys; _i < keepKeys_2.length; _i++) {
+            var key = keepKeys_2[_i];
+            if (key in keysInUse) {
+                continue;
+            }
+            keysInUse[key] = true;
         }
-        var cachedKeys = Object.keys(this._cachedSpatialEdges);
-        for (var _a = 0, cachedKeys_1 = cachedKeys; _a < cachedKeys_1.length; _a++) {
-            var cachedKey = cachedKeys_1[_a];
-            var node = this._cachedSpatialEdges[cachedKey];
-            node.resetSpatialEdges();
-            delete this._cachedSpatialEdges[cachedKey];
+        var keepHs = {};
+        for (var key in keysInUse) {
+            if (!keysInUse.hasOwnProperty(key)) {
+                continue;
+            }
+            var node = this._nodes[key];
+            var nodeHs = this._graphCalculator.encodeHs(node.latLon);
+            for (var _a = 0, nodeHs_1 = nodeHs; _a < nodeHs_1.length; _a++) {
+                var nodeH = nodeHs_1[_a];
+                if (!(nodeH in keepHs)) {
+                    keepHs[nodeH] = true;
+                }
+            }
+        }
+        var potentialHs = [];
+        for (var h in this._cachedTiles) {
+            if (!this._cachedTiles.hasOwnProperty(h) || h in keepHs) {
+                continue;
+            }
+            potentialHs.push([h, this._cachedTiles[h]]);
+        }
+        var uncacheHs = potentialHs
+            .sort(function (h1, h2) {
+            return h2[1].accessed - h1[1].accessed;
+        })
+            .slice(this._configuration.maxUnusedTiles)
+            .map(function (h) {
+            return h[0];
+        });
+        for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) {
+            var uncacheH = uncacheHs_1[_b];
+            this._uncacheTile(uncacheH, keepSequenceKey);
+        }
+        var potentialPreStored = [];
+        var nonCachedPreStored = [];
+        for (var h in this._preStored) {
+            if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) {
+                continue;
+            }
+            var prestoredNodes = this._preStored[h];
+            for (var key in prestoredNodes) {
+                if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) {
+                    continue;
+                }
+                if (prestoredNodes[key].sequenceKey === keepSequenceKey) {
+                    continue;
+                }
+                if (key in this._cachedNodes) {
+                    potentialPreStored.push([this._cachedNodes[key], h]);
+                }
+                else {
+                    nonCachedPreStored.push([key, h]);
+                }
+            }
+        }
+        var uncachePreStored = potentialPreStored
+            .sort(function (_a, _b) {
+            var na1 = _a[0], h1 = _a[1];
+            var na2 = _b[0], h2 = _b[1];
+            return na2.accessed - na1.accessed;
+        })
+            .slice(this._configuration.maxUnusedPreStoredNodes)
+            .map(function (_a) {
+            var na = _a[0], h = _a[1];
+            return [na.node.key, h];
+        });
+        this._uncachePreStored(nonCachedPreStored);
+        this._uncachePreStored(uncachePreStored);
+        var potentialNodes = [];
+        for (var key in this._cachedNodes) {
+            if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {
+                continue;
+            }
+            potentialNodes.push(this._cachedNodes[key]);
+        }
+        var uncacheNodes = potentialNodes
+            .sort(function (n1, n2) {
+            return n2.accessed - n1.accessed;
+        })
+            .slice(this._configuration.maxUnusedNodes);
+        for (var _c = 0, uncacheNodes_1 = uncacheNodes; _c < uncacheNodes_1.length; _c++) {
+            var nodeAccess = uncacheNodes_1[_c];
+            nodeAccess.node.uncache();
+            var key = nodeAccess.node.key;
+            delete this._cachedNodes[key];
+            if (key in this._cachedNodeTiles) {
+                delete this._cachedNodeTiles[key];
+            }
+            if (key in this._cachedSpatialEdges) {
+                delete this._cachedSpatialEdges[key];
+            }
+        }
+        var potentialSequences = [];
+        for (var sequenceKey in this._sequences) {
+            if (!this._sequences.hasOwnProperty(sequenceKey) ||
+                sequenceKey in this._cachingSequences$ ||
+                sequenceKey === keepSequenceKey) {
+                continue;
+            }
+            potentialSequences.push(this._sequences[sequenceKey]);
+        }
+        var uncacheSequences = potentialSequences
+            .sort(function (s1, s2) {
+            return s2.accessed - s1.accessed;
+        })
+            .slice(this._configuration.maxSequences);
+        for (var _d = 0, uncacheSequences_1 = uncacheSequences; _d < uncacheSequences_1.length; _d++) {
+            var sequenceAccess = uncacheSequences_1[_d];
+            var sequenceKey = sequenceAccess.sequence.key;
+            delete this._sequences[sequenceKey];
+            if (sequenceKey in this._cachedSequenceNodes) {
+                delete this._cachedSequenceNodes[sequenceKey];
+            }
+            sequenceAccess.sequence.dispose();
+        }
+    };
+    Graph.prototype._addNewKeys = function (keys, dict) {
+        for (var key in dict) {
+            if (!dict.hasOwnProperty(key) || !this.hasNode(key)) {
+                continue;
+            }
+            if (!(key in keys)) {
+                keys[key] = true;
+            }
         }
     };
     Graph.prototype._cacheSequence$ = function (sequenceKey) {
@@ -27459,26 +48659,82 @@ var Graph = (function () {
         if (sequenceKey in this._cachingSequences$) {
             return this._cachingSequences$[sequenceKey];
         }
-        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey])
-            .do(function (sequenceByKey) {
+        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey]).pipe(operators_1.tap(function (sequenceByKey) {
             if (!(sequenceKey in _this._sequences)) {
-                _this._sequences[sequenceKey] = new Graph_1.Sequence(sequenceByKey[sequenceKey]);
+                _this._sequences[sequenceKey] = {
+                    accessed: new Date().getTime(),
+                    sequence: new Graph_1.Sequence(sequenceByKey[sequenceKey]),
+                };
             }
             delete _this._cachingSequences$[sequenceKey];
-        })
-            .map(function (sequenceByKey) {
+        }), operators_1.map(function (sequenceByKey) {
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (sequenceKey in _this._cachingSequences$) {
                 delete _this._cachingSequences$[sequenceKey];
             }
             _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
+        }), operators_1.publish(), operators_1.refCount());
         return this._cachingSequences$[sequenceKey];
     };
+    Graph.prototype._cacheTile$ = function (h) {
+        var _this = this;
+        this._cachingTiles$[h] = this._apiV3.imagesByH$([h]).pipe(operators_1.tap(function (imagesByH) {
+            var coreNodes = imagesByH[h];
+            if (h in _this._cachedTiles) {
+                return;
+            }
+            _this._nodeIndexTiles[h] = [];
+            _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };
+            var hCache = _this._cachedTiles[h].nodes;
+            var preStored = _this._removeFromPreStore(h);
+            for (var index in coreNodes) {
+                if (!coreNodes.hasOwnProperty(index)) {
+                    continue;
+                }
+                var coreNode = coreNodes[index];
+                if (coreNode == null) {
+                    break;
+                }
+                if (coreNode.sequence_key == null) {
+                    console.warn("Sequence missing, discarding node (" + coreNode.key + ")");
+                    continue;
+                }
+                if (preStored != null && coreNode.key in preStored) {
+                    var preStoredNode = preStored[coreNode.key];
+                    delete preStored[coreNode.key];
+                    hCache.push(preStoredNode);
+                    var preStoredNodeIndexItem = {
+                        lat: preStoredNode.latLon.lat,
+                        lon: preStoredNode.latLon.lon,
+                        node: preStoredNode,
+                    };
+                    _this._nodeIndex.insert(preStoredNodeIndexItem);
+                    _this._nodeIndexTiles[h].push(preStoredNodeIndexItem);
+                    _this._nodeToTile[preStoredNode.key] = h;
+                    continue;
+                }
+                var node = new Graph_1.Node(coreNode);
+                hCache.push(node);
+                var nodeIndexItem = {
+                    lat: node.latLon.lat,
+                    lon: node.latLon.lon,
+                    node: node,
+                };
+                _this._nodeIndex.insert(nodeIndexItem);
+                _this._nodeIndexTiles[h].push(nodeIndexItem);
+                _this._nodeToTile[node.key] = h;
+                _this._setNode(node);
+            }
+            delete _this._cachingTiles$[h];
+        }), operators_1.map(function (imagesByH) {
+            return _this;
+        }), operators_1.catchError(function (error) {
+            delete _this._cachingTiles$[h];
+            throw error;
+        }), operators_1.publish(), operators_1.refCount());
+        return this._cachingTiles$[h];
+    };
     Graph.prototype._makeFull = function (node, fillNode) {
         if (fillNode.calt == null) {
             fillNode.calt = this._defaultAlt;
@@ -27509,39 +48765,125 @@ var Graph = (function () {
         }
         this._nodes[key] = node;
     };
+    Graph.prototype._uncacheTile = function (h, keepSequenceKey) {
+        for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) {
+            var node = _a[_i];
+            var key = node.key;
+            delete this._nodeToTile[key];
+            if (key in this._cachedNodes) {
+                delete this._cachedNodes[key];
+            }
+            if (key in this._cachedNodeTiles) {
+                delete this._cachedNodeTiles[key];
+            }
+            if (key in this._cachedSpatialEdges) {
+                delete this._cachedSpatialEdges[key];
+            }
+            if (node.sequenceKey === keepSequenceKey) {
+                this._preStore(h, node);
+                node.uncache();
+            }
+            else {
+                delete this._nodes[key];
+                if (node.sequenceKey in this._cachedSequenceNodes) {
+                    delete this._cachedSequenceNodes[node.sequenceKey];
+                }
+                node.dispose();
+            }
+        }
+        for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) {
+            var nodeIndexItem = _c[_b];
+            this._nodeIndex.remove(nodeIndexItem);
+        }
+        delete this._nodeIndexTiles[h];
+        delete this._cachedTiles[h];
+    };
+    Graph.prototype._uncachePreStored = function (preStored) {
+        var hs = {};
+        for (var _i = 0, preStored_1 = preStored; _i < preStored_1.length; _i++) {
+            var _a = preStored_1[_i], key = _a[0], h = _a[1];
+            if (key in this._nodes) {
+                delete this._nodes[key];
+            }
+            if (key in this._cachedNodes) {
+                delete this._cachedNodes[key];
+            }
+            var node = this._preStored[h][key];
+            if (node.sequenceKey in this._cachedSequenceNodes) {
+                delete this._cachedSequenceNodes[node.sequenceKey];
+            }
+            delete this._preStored[h][key];
+            node.dispose();
+            hs[h] = true;
+        }
+        for (var h in hs) {
+            if (!hs.hasOwnProperty(h)) {
+                continue;
+            }
+            if (Object.keys(this._preStored[h]).length === 0) {
+                delete this._preStored[h];
+            }
+        }
+    };
+    Graph.prototype._updateCachedTileAccess = function (key, accessed) {
+        if (key in this._nodeToTile) {
+            this._cachedTiles[this._nodeToTile[key]].accessed = accessed;
+        }
+    };
+    Graph.prototype._updateCachedNodeAccess = function (key, accessed) {
+        if (key in this._cachedNodes) {
+            this._cachedNodes[key].accessed = accessed;
+        }
+    };
     return Graph;
 }());
 exports.Graph = Graph;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Graph;
 
-},{"../Edge":208,"../Error":209,"../Graph":211,"rbush":24,"rxjs/Subject":33,"rxjs/add/observable/from":40,"rxjs/add/operator/catch":48,"rxjs/add/operator/do":54,"rxjs/add/operator/finally":57,"rxjs/add/operator/map":60,"rxjs/add/operator/publish":66}],281:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{"../Edge":292,"../Error":293,"../Geo":294,"../Graph":295,"rxjs":43,"rxjs/operators":241}],425:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphCalculator = void 0;
 var geohash = require("latlon-geohash");
 var THREE = require("three");
+var Error_1 = require("../Error");
 var Geo_1 = require("../Geo");
-var GeoHashDirections = (function () {
-    function GeoHashDirections() {
-    }
-    GeoHashDirections.n = "n";
-    GeoHashDirections.nw = "nw";
-    GeoHashDirections.w = "w";
-    GeoHashDirections.sw = "sw";
-    GeoHashDirections.s = "s";
-    GeoHashDirections.se = "se";
-    GeoHashDirections.e = "e";
-    GeoHashDirections.ne = "ne";
-    return GeoHashDirections;
-}());
-var GraphCalculator = (function () {
+/**
+ * @class GraphCalculator
+ *
+ * @classdesc Represents a calculator for graph entities.
+ */
+var GraphCalculator = /** @class */ (function () {
+    /**
+     * Create a new graph calculator instance.
+     *
+     * @param {GeoCoords} geoCoords - Geo coords instance.
+     */
     function GraphCalculator(geoCoords) {
         this._geoCoords = geoCoords != null ? geoCoords : new Geo_1.GeoCoords();
     }
+    /**
+     * Encode the geohash tile for geodetic coordinates.
+     *
+     * @param {ILatLon} latlon - Latitude and longitude to encode.
+     * @param {number} precision - Precision of the encoding.
+     *
+     * @returns {string} The geohash tile for the lat, lon and precision.
+     */
     GraphCalculator.prototype.encodeH = function (latLon, precision) {
         if (precision === void 0) { precision = 7; }
         return geohash.encode(latLon.lat, latLon.lon, precision);
     };
+    /**
+     * Encode the geohash tiles within a threshold from a position
+     * using Manhattan distance.
+     *
+     * @param {ILatLon} latlon - Latitude and longitude to encode.
+     * @param {number} precision - Precision of the encoding.
+     * @param {number} threshold - Threshold of the encoding in meters.
+     *
+     * @returns {string} The geohash tiles reachable within the threshold.
+     */
     GraphCalculator.prototype.encodeHs = function (latLon, precision, threshold) {
         if (precision === void 0) { precision = 7; }
         if (threshold === void 0) { threshold = 20; }
@@ -27563,31 +48905,67 @@ var GraphCalculator = (function () {
         var t = top < threshold;
         var hs = [h];
         if (t) {
-            hs.push(neighbours[GeoHashDirections.n]);
+            hs.push(neighbours.n);
         }
         if (t && l) {
-            hs.push(neighbours[GeoHashDirections.nw]);
+            hs.push(neighbours.nw);
         }
         if (l) {
-            hs.push(neighbours[GeoHashDirections.w]);
+            hs.push(neighbours.w);
         }
         if (l && b) {
-            hs.push(neighbours[GeoHashDirections.sw]);
+            hs.push(neighbours.sw);
         }
         if (b) {
-            hs.push(neighbours[GeoHashDirections.s]);
+            hs.push(neighbours.s);
         }
         if (b && r) {
-            hs.push(neighbours[GeoHashDirections.se]);
+            hs.push(neighbours.se);
         }
         if (r) {
-            hs.push(neighbours[GeoHashDirections.e]);
+            hs.push(neighbours.e);
         }
         if (r && t) {
-            hs.push(neighbours[GeoHashDirections.ne]);
+            hs.push(neighbours.ne);
         }
         return hs;
     };
+    /**
+     * Encode the minimum set of geohash tiles containing a bounding box.
+     *
+     * @description The current algorithm does expect the bounding box
+     * to be sufficiently small to be contained in an area with the size
+     * of maximally four tiles. Up to nine adjacent tiles may be returned.
+     * The method currently uses the largest side as the threshold leading to
+     * more tiles being returned than needed in edge cases.
+     *
+     * @param {ILatLon} sw - South west corner of bounding box.
+     * @param {ILatLon} ne - North east corner of bounding box.
+     * @param {number} precision - Precision of the encoding.
+     *
+     * @returns {string} The geohash tiles containing the bounding box.
+     */
+    GraphCalculator.prototype.encodeHsFromBoundingBox = function (sw, ne, precision) {
+        if (precision === void 0) { precision = 7; }
+        if (ne.lat <= sw.lat || ne.lon <= sw.lon) {
+            throw new Error_1.GraphMapillaryError("North east needs to be top right of south west");
+        }
+        var centerLat = (sw.lat + ne.lat) / 2;
+        var centerLon = (sw.lon + ne.lon) / 2;
+        var enu = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, centerLat, centerLon, 0);
+        var threshold = Math.max(enu[0], enu[1]);
+        return this.encodeHs({ lat: centerLat, lon: centerLon }, precision, threshold);
+    };
+    /**
+     * Get the bounding box corners for a circle with radius of a threshold
+     * with center in a geodetic position.
+     *
+     * @param {ILatLon} latlon - Latitude and longitude to encode.
+     * @param {number} threshold - Threshold distance from the position in meters.
+     *
+     * @returns {Array<ILatLon>} The south west and north east corners of the
+     * bounding box.
+     */
     GraphCalculator.prototype.boundingBoxCorners = function (latLon, threshold) {
         var bl = this._geoCoords.enuToGeodetic(-threshold, -threshold, 0, latLon.lat, latLon.lon, 0);
         var tr = this._geoCoords.enuToGeodetic(threshold, threshold, 0, latLon.lat, latLon.lon, 0);
@@ -27596,6 +48974,14 @@ var GraphCalculator = (function () {
             { lat: tr[0], lon: tr[1] },
         ];
     };
+    /**
+     * Convert a compass angle to an angle axis rotation vector.
+     *
+     * @param {number} compassAngle - The compass angle in degrees.
+     * @param {number} orientation - The orientation of the original image.
+     *
+     * @returns {Array<number>} Angle axis rotation vector.
+     */
     GraphCalculator.prototype.rotationFromCompass = function (compassAngle, orientation) {
         var x = 0;
         var y = 0;
@@ -27628,43 +49014,107 @@ var GraphCalculator = (function () {
     return GraphCalculator;
 }());
 exports.GraphCalculator = GraphCalculator;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = GraphCalculator;
 
-},{"../Geo":210,"latlon-geohash":20,"three":157}],282:[function(require,module,exports){
-"use strict";
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/expand");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/last");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
+},{"../Error":293,"../Geo":294,"latlon-geohash":21,"three":242}],426:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphMode = void 0;
+/**
+ * Enumeration for graph modes.
+ * @enum {number}
+ * @readonly
+ * @description Modes for the retrieval and caching performed
+ * by the graph service on the graph.
+ */
+var GraphMode;
+(function (GraphMode) {
+    /**
+     * Caching is performed on sequences only and sequence edges are
+     * calculated. Spatial tiles
+     * are not retrieved and spatial edges are not calculated when
+     * caching nodes. Complete sequences are being cached for requested
+     * nodes within the graph.
+     */
+    GraphMode[GraphMode["Sequence"] = 0] = "Sequence";
+    /**
+     * Caching is performed with emphasis on spatial data. Sequence edges
+     * as well as spatial edges are cached. Sequence data
+     * is still requested but complete sequences are not being cached
+     * for requested nodes.
+     *
+     * This is the initial mode of the graph service.
+     */
+    GraphMode[GraphMode["Spatial"] = 1] = "Spatial";
+})(GraphMode = exports.GraphMode || (exports.GraphMode = {}));
+exports.default = GraphMode;
+
+},{}],427:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Graph_1 = require("../Graph");
 /**
  * @class GraphService
  *
  * @classdesc Represents a service for graph operations.
  */
-var GraphService = (function () {
+var GraphService = /** @class */ (function () {
     /**
      * Create a new graph service instance.
      *
      * @param {Graph} graph - Graph instance to be operated on.
      */
     function GraphService(graph, imageLoadingService) {
-        this._graph$ = Observable_1.Observable
-            .of(graph)
-            .concat(graph.changed$)
-            .publishReplay(1)
-            .refCount();
-        this._graph$.subscribe();
+        this._graph$ = rxjs_1.concat(rxjs_1.of(graph), graph.changed$).pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._graph$.subscribe(function () { });
+        this._graphMode = Graph_1.GraphMode.Spatial;
+        this._graphModeSubject$ = new rxjs_1.Subject();
+        this._graphMode$ = this._graphModeSubject$.pipe(operators_1.startWith(this._graphMode), operators_1.publishReplay(1), operators_1.refCount());
+        this._graphMode$.subscribe(function () { });
         this._imageLoadingService = imageLoadingService;
+        this._firstGraphSubjects$ = [];
+        this._initializeCacheSubscriptions = [];
+        this._sequenceSubscriptions = [];
         this._spatialSubscriptions = [];
     }
+    Object.defineProperty(GraphService.prototype, "graphMode$", {
+        /**
+         * Get graph mode observable.
+         *
+         * @description Emits the current graph mode.
+         *
+         * @returns {Observable<GraphMode>} Observable
+         * emitting the current graph mode when it changes.
+         */
+        get: function () {
+            return this._graphMode$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Cache full nodes in a bounding box.
+     *
+     * @description When called, the full properties of
+     * the node are retrieved. The node cache is not initialized
+     * for any new nodes retrieved and the node assets are not
+     * retrieved, {@link cacheNode$} needs to be called for caching
+     * assets.
+     *
+     * @param {ILatLon} sw - South west corner of bounding box.
+     * @param {ILatLon} ne - North east corner of bounding box.
+     * @return {Observable<Array<Node>>} Observable emitting a single item,
+     * the nodes of the bounding box, when they have all been retrieved.
+     * @throws {Error} Propagates any IO node caching errors to the caller.
+     */
+    GraphService.prototype.cacheBoundingBox$ = function (sw, ne) {
+        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
+            return graph.cacheBoundingBox$(sw, ne);
+        }));
+    };
     /**
      * Cache a node in the graph and retrieve it.
      *
@@ -27685,272 +49135,337 @@ var GraphService = (function () {
      */
     GraphService.prototype.cacheNode$ = function (key) {
         var _this = this;
-        var firstGraph$ = this._graph$
-            .first()
-            .mergeMap(function (graph) {
+        var firstGraphSubject$ = new rxjs_1.Subject();
+        this._firstGraphSubjects$.push(firstGraphSubject$);
+        var firstGraph$ = firstGraphSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        var node$ = firstGraph$.pipe(operators_1.map(function (graph) {
+            return graph.getNode(key);
+        }), operators_1.mergeMap(function (node) {
+            return node.assetsCached ?
+                rxjs_1.of(node) :
+                node.cacheAssets$();
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        node$.subscribe(function (node) {
+            _this._imageLoadingService.loadnode$.next(node);
+        }, function (error) {
+            console.error("Failed to cache node (" + key + ")", error);
+        });
+        var initializeCacheSubscription = this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
             if (graph.isCachingFull(key) || !graph.hasNode(key)) {
                 return graph.cacheFull$(key);
             }
             if (graph.isCachingFill(key) || !graph.getNode(key).full) {
                 return graph.cacheFill$(key);
             }
-            return Observable_1.Observable.of(graph);
-        })
-            .do(function (graph) {
+            return rxjs_1.of(graph);
+        }), operators_1.tap(function (graph) {
             if (!graph.hasInitializedCache(key)) {
                 graph.initializeCache(key);
             }
-        })
-            .publishReplay(1)
-            .refCount();
-        var node$ = firstGraph$
-            .map(function (graph) {
-            return graph.getNode(key);
-        })
-            .mergeMap(function (node) {
-            return node.assetsCached ?
-                Observable_1.Observable.of(node) :
-                node.cacheAssets$();
-        })
-            .publishReplay(1)
-            .refCount();
-        node$.subscribe(function (node) {
-            _this._imageLoadingService.loadnode$.next(node);
+        }), operators_1.finalize(function () {
+            if (initializeCacheSubscription == null) {
+                return;
+            }
+            _this._removeFromArray(initializeCacheSubscription, _this._initializeCacheSubscriptions);
+            _this._removeFromArray(firstGraphSubject$, _this._firstGraphSubjects$);
+        }))
+            .subscribe(function (graph) {
+            firstGraphSubject$.next(graph);
+            firstGraphSubject$.complete();
         }, function (error) {
-            console.error("Failed to cache node (" + key + ")", error);
+            firstGraphSubject$.error(error);
         });
-        firstGraph$
-            .mergeMap(function (graph) {
+        if (!initializeCacheSubscription.closed) {
+            this._initializeCacheSubscriptions.push(initializeCacheSubscription);
+        }
+        var graphSequence$ = firstGraph$.pipe(operators_1.mergeMap(function (graph) {
             if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {
                 return graph.cacheNodeSequence$(key);
             }
-            return Observable_1.Observable.of(graph);
-        })
-            .do(function (graph) {
+            return rxjs_1.of(graph);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var sequenceSubscription = graphSequence$.pipe(operators_1.tap(function (graph) {
             if (!graph.getNode(key).sequenceEdges.cached) {
                 graph.cacheSequenceEdges(key);
             }
-        })
+        }), operators_1.finalize(function () {
+            if (sequenceSubscription == null) {
+                return;
+            }
+            _this._removeFromArray(sequenceSubscription, _this._sequenceSubscriptions);
+        }))
             .subscribe(function (graph) { return; }, function (error) {
             console.error("Failed to cache sequence edges (" + key + ").", error);
         });
-        var spatialSubscription = firstGraph$
-            .expand(function (graph) {
-            if (graph.hasTiles(key)) {
-                return Observable_1.Observable.empty();
-            }
-            return Observable_1.Observable
-                .from(graph.cacheTiles$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .mergeMap(function (g) {
-                    if (g.isCachingTiles(key)) {
-                        return Observable_1.Observable.empty();
-                    }
-                    return Observable_1.Observable.of(g);
-                })
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache tile data (" + key + ").", error);
-                    return Observable_1.Observable.empty();
-                });
-            });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            if (graph.hasSpatialArea(key)) {
-                return Observable_1.Observable.of(graph);
-            }
-            return Observable_1.Observable
-                .from(graph.cacheSpatialArea$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache spatial nodes (" + key + ").", error);
-                    return Observable_1.Observable.empty();
-                });
+        if (!sequenceSubscription.closed) {
+            this._sequenceSubscriptions.push(sequenceSubscription);
+        }
+        if (this._graphMode === Graph_1.GraphMode.Spatial) {
+            var spatialSubscription_1 = firstGraph$.pipe(operators_1.expand(function (graph) {
+                if (graph.hasTiles(key)) {
+                    return rxjs_1.empty();
+                }
+                return rxjs_1.from(graph.cacheTiles$(key)).pipe(operators_1.mergeMap(function (graph$) {
+                    return graph$.pipe(operators_1.mergeMap(function (g) {
+                        if (g.isCachingTiles(key)) {
+                            return rxjs_1.empty();
+                        }
+                        return rxjs_1.of(g);
+                    }), operators_1.catchError(function (error, caught$) {
+                        console.error("Failed to cache tile data (" + key + ").", error);
+                        return rxjs_1.empty();
+                    }));
+                }));
+            }), operators_1.last(), operators_1.mergeMap(function (graph) {
+                if (graph.hasSpatialArea(key)) {
+                    return rxjs_1.of(graph);
+                }
+                return rxjs_1.from(graph.cacheSpatialArea$(key)).pipe(operators_1.mergeMap(function (graph$) {
+                    return graph$.pipe(operators_1.catchError(function (error, caught$) {
+                        console.error("Failed to cache spatial nodes (" + key + ").", error);
+                        return rxjs_1.empty();
+                    }));
+                }));
+            }), operators_1.last(), operators_1.mergeMap(function (graph) {
+                return graph.hasNodeSequence(key) ?
+                    rxjs_1.of(graph) :
+                    graph.cacheNodeSequence$(key);
+            }), operators_1.tap(function (graph) {
+                if (!graph.getNode(key).spatialEdges.cached) {
+                    graph.cacheSpatialEdges(key);
+                }
+            }), operators_1.finalize(function () {
+                if (spatialSubscription_1 == null) {
+                    return;
+                }
+                _this._removeFromArray(spatialSubscription_1, _this._spatialSubscriptions);
+            }))
+                .subscribe(function (graph) { return; }, function (error) {
+                console.error("Failed to cache spatial edges (" + key + ").", error);
             });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            return graph.hasNodeSequence(key) ?
-                Observable_1.Observable.of(graph) :
-                graph.cacheNodeSequence$(key);
-        })
-            .do(function (graph) {
-            if (!graph.getNode(key).spatialEdges.cached) {
-                graph.cacheSpatialEdges(key);
-            }
-        })
-            .finally(function () {
-            if (spatialSubscription == null) {
-                return;
+            if (!spatialSubscription_1.closed) {
+                this._spatialSubscriptions.push(spatialSubscription_1);
             }
-            _this._removeSpatialSubscription(spatialSubscription);
-        })
-            .subscribe(function (graph) { return; }, function (error) {
-            console.error("Failed to cache spatial edges (" + key + ").", error);
-        });
-        if (!spatialSubscription.closed) {
-            this._spatialSubscriptions.push(spatialSubscription);
         }
-        return node$
-            .first(function (node) {
+        return node$.pipe(operators_1.first(function (node) {
             return node.assetsCached;
-        });
+        }));
     };
     /**
      * Cache a sequence in the graph and retrieve it.
      *
-     * @param {string} sequenceKey - Sequence key.
-     * @returns {Observable<Sequence>} Observable emitting a single item,
-     * the sequence, when it has been retrieved and its assets are cached.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
+     * @param {string} sequenceKey - Sequence key.
+     * @returns {Observable<Sequence>} Observable emitting a single item,
+     * the sequence, when it has been retrieved and its assets are cached.
+     * @throws {Error} Propagates any IO node caching errors to the caller.
+     */
+    GraphService.prototype.cacheSequence$ = function (sequenceKey) {
+        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
+            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
+                return graph.cacheSequence$(sequenceKey);
+            }
+            return rxjs_1.of(graph);
+        }), operators_1.map(function (graph) {
+            return graph.getSequence(sequenceKey);
+        }));
+    };
+    /**
+     * Cache a sequence and its nodes in the graph and retrieve the sequence.
+     *
+     * @description Caches a sequence and its assets are cached and
+     * retrieves all nodes belonging to the sequence. The node assets
+     * or edges will not be cached.
+     *
+     * @param {string} sequenceKey - Sequence key.
+     * @param {string} referenceNodeKey - Key of node to use as reference
+     * for optimized caching.
+     * @returns {Observable<Sequence>} Observable emitting a single item,
+     * the sequence, when it has been retrieved, its assets are cached and
+     * all nodes belonging to the sequence has been retrieved.
+     * @throws {Error} Propagates any IO node caching errors to the caller.
+     */
+    GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
+        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
+            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
+                return graph.cacheSequence$(sequenceKey);
+            }
+            return rxjs_1.of(graph);
+        }), operators_1.mergeMap(function (graph) {
+            if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) {
+                return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey);
+            }
+            return rxjs_1.of(graph);
+        }), operators_1.map(function (graph) {
+            return graph.getSequence(sequenceKey);
+        }));
+    };
+    /**
+     * Set a spatial edge filter on the graph.
+     *
+     * @description Resets the spatial edges of all cached nodes.
+     *
+     * @param {FilterExpression} filter - Filter expression to be applied.
+     * @return {Observable<Graph>} Observable emitting a single item,
+     * the graph, when the spatial edges have been reset.
+     */
+    GraphService.prototype.setFilter$ = function (filter) {
+        this._resetSubscriptions(this._spatialSubscriptions);
+        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
+            graph.resetSpatialEdges();
+            graph.setFilter(filter);
+        }), operators_1.map(function (graph) {
+            return undefined;
+        }));
+    };
+    /**
+     * Set the graph mode.
+     *
+     * @description If graph mode is set to spatial, caching
+     * is performed with emphasis on spatial edges. If graph
+     * mode is set to sequence no tile data is requested and
+     * no spatial edges are computed.
+     *
+     * When setting graph mode to sequence all spatial
+     * subscriptions are aborted.
+     *
+     * @param {GraphMode} mode - Graph mode to set.
+     */
+    GraphService.prototype.setGraphMode = function (mode) {
+        if (this._graphMode === mode) {
+            return;
+        }
+        if (mode === Graph_1.GraphMode.Sequence) {
+            this._resetSubscriptions(this._spatialSubscriptions);
+        }
+        this._graphMode = mode;
+        this._graphModeSubject$.next(this._graphMode);
+    };
+    /**
+     * Reset the graph.
+     *
+     * @description Resets the graph but keeps the nodes of the
+     * supplied keys.
+     *
+     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
+     * @return {Observable<Node>} Observable emitting a single item,
+     * the graph, when it has been reset.
      */
-    GraphService.prototype.cacheSequence$ = function (sequenceKey) {
-        return this._graph$
-            .first()
-            .mergeMap(function (graph) {
-            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
-                return graph.cacheSequence$(sequenceKey);
-            }
-            return Observable_1.Observable.of(graph);
-        })
-            .map(function (graph) {
-            return graph.getSequence(sequenceKey);
-        });
+    GraphService.prototype.reset$ = function (keepKeys) {
+        this._abortSubjects(this._firstGraphSubjects$);
+        this._resetSubscriptions(this._initializeCacheSubscriptions);
+        this._resetSubscriptions(this._sequenceSubscriptions);
+        this._resetSubscriptions(this._spatialSubscriptions);
+        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
+            graph.reset(keepKeys);
+        }), operators_1.map(function (graph) {
+            return undefined;
+        }));
     };
     /**
-     * Reset the spatial edges of all cached nodes and recaches the
-     * spatial edges of the provided node.
+     * Uncache the graph.
      *
-     * @param {string} key - Key of the node to cache edges for after reset.
-     * @returns {Observable<Sequence>} Observable emitting a single item,
-     * the node, when it has been retrieved and its assets are cached after
-     * the spatial reset.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
+     * @description Uncaches the graph by removing tiles, nodes and
+     * sequences. Keeps the nodes of the supplied keys and the tiles
+     * related to those nodes.
+     *
+     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
+     * @param {string} keepSequenceKey - Optional key of sequence
+     * for which the belonging nodes should not be disposed or
+     * removed from the graph. These nodes may still be uncached if
+     * not specified in keep keys param.
+     * @return {Observable<Graph>} Observable emitting a single item,
+     * the graph, when the graph has been uncached.
      */
-    GraphService.prototype.reset$ = function (key) {
-        var _this = this;
-        this._resetSpatialSubscriptions();
-        return this._graph$
-            .first()
-            .do(function (graph) {
-            graph.reset();
-        })
-            .mergeMap(function (graph) {
-            return _this.cacheNode$(key);
-        });
+    GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) {
+        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
+            graph.uncache(keepKeys, keepSequenceKey);
+        }), operators_1.map(function (graph) {
+            return undefined;
+        }));
+    };
+    GraphService.prototype._abortSubjects = function (subjects) {
+        for (var _i = 0, _a = subjects.slice(); _i < _a.length; _i++) {
+            var subject = _a[_i];
+            this._removeFromArray(subject, subjects);
+            subject.error(new Error("Cache node request was aborted."));
+        }
     };
-    GraphService.prototype._removeSpatialSubscription = function (spatialSubscription) {
-        var index = this._spatialSubscriptions.indexOf(spatialSubscription);
-        if (index > -1) {
-            this._spatialSubscriptions.splice(index, 1);
+    GraphService.prototype._removeFromArray = function (object, objects) {
+        var index = objects.indexOf(object);
+        if (index !== -1) {
+            objects.splice(index, 1);
         }
     };
-    GraphService.prototype._resetSpatialSubscriptions = function () {
-        for (var _i = 0, _a = this._spatialSubscriptions; _i < _a.length; _i++) {
+    GraphService.prototype._resetSubscriptions = function (subscriptions) {
+        for (var _i = 0, _a = subscriptions.slice(); _i < _a.length; _i++) {
             var subscription = _a[_i];
+            this._removeFromArray(subscription, subscriptions);
             if (!subscription.closed) {
                 subscription.unsubscribe();
             }
         }
-        this._spatialSubscriptions = [];
     };
     return GraphService;
 }());
 exports.GraphService = GraphService;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = GraphService;
 
-},{"rxjs/Observable":28,"rxjs/add/operator/catch":48,"rxjs/add/operator/concat":50,"rxjs/add/operator/do":54,"rxjs/add/operator/expand":55,"rxjs/add/operator/finally":57,"rxjs/add/operator/first":58,"rxjs/add/operator/last":59,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/publishReplay":67}],283:[function(require,module,exports){
+},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],428:[function(require,module,exports){
 "use strict";
-var Observable_1 = require("rxjs/Observable");
-var Utils_1 = require("../Utils");
-var ImageLoader = (function () {
-    function ImageLoader() {
-    }
-    ImageLoader.loadThumbnail = function (key, imageSize) {
-        return this._load(key, imageSize, Utils_1.Urls.thumbnail);
-    };
-    ImageLoader.loadDynamic = function (key, imageSize) {
-        return this._load(key, imageSize, Utils_1.Urls.dynamicImage);
-    };
-    ImageLoader._load = function (key, size, getUrl) {
-        return Observable_1.Observable.create(function (subscriber) {
-            var image = new Image();
-            image.crossOrigin = "Anonymous";
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", getUrl(key, size), true);
-            xmlHTTP.responseType = "arraybuffer";
-            xmlHTTP.onload = function (pe) {
-                if (xmlHTTP.status !== 200) {
-                    subscriber.error(new Error("Failed to fetch image (" + key + "). Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText));
-                    return;
-                }
-                image.onload = function (e) {
-                    subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image });
-                    subscriber.complete();
-                };
-                image.onerror = function (error) {
-                    subscriber.error(new Error("Failed to load image (" + key + ")"));
-                };
-                var blob = new Blob([xmlHTTP.response]);
-                image.src = window.URL.createObjectURL(blob);
-            };
-            xmlHTTP.onprogress = function (pe) {
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
-            };
-            xmlHTTP.onerror = function (error) {
-                subscriber.error(new Error("Failed to fetch image (" + key + ")"));
-            };
-            xmlHTTP.send(null);
-        });
-    };
-    return ImageLoader;
-}());
-exports.ImageLoader = ImageLoader;
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImageLoader;
-
-},{"../Utils":215,"rxjs/Observable":28}],284:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var ImageLoadingService = (function () {
+exports.ImageLoadingService = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var ImageLoadingService = /** @class */ (function () {
     function ImageLoadingService() {
-        this._loadnode$ = new Subject_1.Subject();
-        this._loadstatus$ = this._loadnode$
-            .scan(function (nodes, node) {
-            nodes[node.key] = node.loadStatus;
+        this._loadnode$ = new rxjs_1.Subject();
+        this._loadstatus$ = this._loadnode$.pipe(operators_1.scan(function (_a, node) {
+            var nodes = _a[0];
+            var changed = false;
+            if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) {
+                if (node.key in nodes) {
+                    delete nodes[node.key];
+                    changed = true;
+                }
+            }
+            else {
+                nodes[node.key] = node.loadStatus;
+                changed = true;
+            }
+            return [nodes, changed];
+        }, [{}, false]), operators_1.filter(function (_a) {
+            var nodes = _a[0], changed = _a[1];
+            return changed;
+        }), operators_1.map(function (_a) {
+            var nodes = _a[0];
             return nodes;
-        }, {})
-            .publishReplay(1)
-            .refCount();
-        this._loadstatus$.subscribe();
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._loadstatus$.subscribe(function () { });
     }
     Object.defineProperty(ImageLoadingService.prototype, "loadnode$", {
         get: function () {
             return this._loadnode$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(ImageLoadingService.prototype, "loadstatus$", {
         get: function () {
             return this._loadstatus$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return ImageLoadingService;
 }());
 exports.ImageLoadingService = ImageLoadingService;
 
-},{"rxjs/Subject":33}],285:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{"rxjs":43,"rxjs/operators":241}],429:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MeshReader = void 0;
 var Pbf = require("pbf");
-var MeshReader = (function () {
+var MeshReader = /** @class */ (function () {
     function MeshReader() {
     }
     MeshReader.read = function (buffer) {
@@ -27969,20 +49484,49 @@ var MeshReader = (function () {
 }());
 exports.MeshReader = MeshReader;
 
-},{"pbf":22}],286:[function(require,module,exports){
+},{"pbf":40}],430:[function(require,module,exports){
 "use strict";
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/map");
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Node = void 0;
+var operators_1 = require("rxjs/operators");
 /**
  * @class Node
  *
  * @classdesc Represents a node in the navigation graph.
+ *
+ * Explanation of position and bearing properties:
+ *
+ * When images are uploaded they will have GPS information in the EXIF, this is what
+ * is called `originalLatLon` {@link Node.originalLatLon}.
+ *
+ * When Structure from Motions has been run for a node a `computedLatLon` that
+ * differs from the `originalLatLon` will be created. It is different because
+ * GPS positions are not very exact and SfM aligns the camera positions according
+ * to the 3D reconstruction {@link Node.computedLatLon}.
+ *
+ * At last there exist a `latLon` property which evaluates to
+ * the `computedLatLon` from SfM if it exists but falls back
+ * to the `originalLatLon` from the EXIF GPS otherwise {@link Node.latLon}.
+ *
+ * Everything that is done in in the Viewer is based on the SfM positions,
+ * i.e. `computedLatLon`. That is why the smooth transitions go in the right
+ * direction (nd not in strange directions because of bad GPS).
+ *
+ * E.g. when placing a marker in the Viewer it is relative to the SfM
+ * position i.e. the `computedLatLon`.
+ *
+ * The same concept as above also applies to the compass angle (or bearing) properties
+ * `originalCa`, `computedCa` and `ca`.
  */
-var Node = (function () {
+var Node = /** @class */ (function () {
     /**
      * Create a new node instance.
      *
+     * @description Nodes are always created internally by the library.
+     * Nodes can not be added to the library through any API method.
+     *
      * @param {ICoreNode} coreNode - Raw core node data.
+     * @ignore
      */
     function Node(core) {
         this._cache = null;
@@ -28000,6 +49544,8 @@ var Node = (function () {
          *
          * @returns {boolean} Value indicating whether all assets have been
          * cached.
+         *
+         * @ignore
          */
         get: function () {
             return this._core != null &&
@@ -28008,7 +49554,7 @@ var Node = (function () {
                 this._cache.image != null &&
                 this._cache.mesh != null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "alt", {
@@ -28023,7 +49569,7 @@ var Node = (function () {
         get: function () {
             return this._fill.calt;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "ca", {
@@ -28033,12 +49579,27 @@ var Node = (function () {
          * @description If the SfM computed compass angle exists it will
          * be returned, otherwise the original EXIF compass angle.
          *
-         * @returns {number} Compass angle, measured in degrees.
+         * @returns {number} Compass angle, measured in degrees
+         * clockwise with respect to north.
          */
         get: function () {
             return this._fill.cca != null ? this._fill.cca : this._fill.ca;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "cameraProjection", {
+        /**
+         * Get cameraProjection.
+         *
+         * @description Will be undefined if SfM has not been run.
+         *
+         * @returns {number} The camera projection of the image.
+         */
+        get: function () {
+            return this._fill.camera_projection_type;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "capturedAt", {
@@ -28050,7 +49611,66 @@ var Node = (function () {
         get: function () {
             return this._fill.captured_at;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "cameraUuid", {
+        /**
+         * Get camera uuid.
+         *
+         * @description Will be undefined if the camera uuid was not
+         * recorded in the image exif information.
+         *
+         * @returns {string} Universally unique id for camera used
+         * when capturing image.
+         */
+        get: function () {
+            return this._fill.captured_with_camera_uuid;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "clusterKey", {
+        /**
+         * Get clusterKey.
+         *
+         * @returns {string} Unique key of the SfM cluster to which
+         * the node belongs.
+         */
+        get: function () {
+            return this._fill.cluster_key;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "ck1", {
+        /**
+         * Get ck1.
+         *
+         * @description Will not be set if SfM has not been run.
+         *
+         * @returns {number} SfM computed radial distortion parameter
+         * k1.
+         */
+        get: function () {
+            return this._fill.ck1;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "ck2", {
+        /**
+         * Get ck2.
+         *
+         * @description Will not be set if SfM has not been run.
+         *
+         * @returns {number} SfM computed radial distortion parameter
+         * k2.
+         */
+        get: function () {
+            return this._fill.ck2;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "computedCA", {
@@ -28059,12 +49679,13 @@ var Node = (function () {
          *
          * @description Will not be set if SfM has not been run.
          *
-         * @returns {number} SfM computed compass angle, measured in degrees.
+         * @returns {number} SfM computed compass angle, measured
+         * in degrees clockwise with respect to north.
          */
         get: function () {
             return this._fill.cca;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "computedLatLon", {
@@ -28079,7 +49700,7 @@ var Node = (function () {
         get: function () {
             return this._core.cl;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "focal", {
@@ -28093,7 +49714,7 @@ var Node = (function () {
         get: function () {
             return this._fill.cfocal;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "full", {
@@ -28105,11 +49726,13 @@ var Node = (function () {
          *
          * @returns {boolean} Value indicating whether the node has all
          * properties filled.
+         *
+         * @ignore
          */
         get: function () {
             return this._fill != null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "fullPano", {
@@ -28126,7 +49749,7 @@ var Node = (function () {
                 this._fill.gpano.CroppedAreaImageWidthPixels === this._fill.gpano.FullPanoWidthPixels &&
                 this._fill.gpano.CroppedAreaImageHeightPixels === this._fill.gpano.FullPanoHeightPixels;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "gpano", {
@@ -28140,7 +49763,7 @@ var Node = (function () {
         get: function () {
             return this._fill.gpano;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "height", {
@@ -28153,7 +49776,7 @@ var Node = (function () {
         get: function () {
             return this._fill.height;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "image", {
@@ -28167,7 +49790,22 @@ var Node = (function () {
         get: function () {
             return this._cache.image;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "image$", {
+        /**
+         * Get image$.
+         *
+         * @returns {Observable<HTMLImageElement>} Observable emitting
+         * the cached image when it is updated.
+         *
+         * @ignore
+         */
+        get: function () {
+            return this._cache.image$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "key", {
@@ -28179,7 +49817,7 @@ var Node = (function () {
         get: function () {
             return this._core.key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "latLon", {
@@ -28196,7 +49834,7 @@ var Node = (function () {
         get: function () {
             return this._core.cl != null ? this._core.cl : this._core.l;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "loadStatus", {
@@ -28205,11 +49843,13 @@ var Node = (function () {
          *
          * @returns {ILoadStatus} Value indicating the load status
          * of the mesh and image.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.loadStatus;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "merged", {
@@ -28225,7 +49865,7 @@ var Node = (function () {
                 this._fill.merge_version != null &&
                 this._fill.merge_version > 0;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "mergeCC", {
@@ -28241,7 +49881,7 @@ var Node = (function () {
         get: function () {
             return this._fill.merge_cc;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "mergeVersion", {
@@ -28253,7 +49893,7 @@ var Node = (function () {
         get: function () {
             return this._fill.merge_version;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "mesh", {
@@ -28268,7 +49908,21 @@ var Node = (function () {
         get: function () {
             return this._cache.mesh;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "organizationKey", {
+        /**
+         * Get organizationKey.
+         *
+         * @returns {string} Unique key of the organization to which
+         * the node belongs. If the node does not belong to an
+         * organization the organization key will be undefined.
+         */
+        get: function () {
+            return this._fill.organization_key;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "orientation", {
@@ -28280,7 +49934,7 @@ var Node = (function () {
         get: function () {
             return this._fill.orientation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "originalCA", {
@@ -28293,7 +49947,7 @@ var Node = (function () {
         get: function () {
             return this._fill.ca;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "originalLatLon", {
@@ -28306,7 +49960,7 @@ var Node = (function () {
         get: function () {
             return this._core.l;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "pano", {
@@ -28320,7 +49974,39 @@ var Node = (function () {
             return this._fill.gpano != null &&
                 this._fill.gpano.FullPanoWidthPixels != null;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "private", {
+        /**
+         * Get private.
+         *
+         * @returns {boolean} Value specifying if image is accessible to
+         * organization members only or to everyone.
+         */
+        get: function () {
+            return this._fill.private;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "projectKey", {
+        /**
+         * Get projectKey.
+         *
+         * @returns {string} Unique key of the project to which
+         * the node belongs. If the node does not belong to a
+         * project the project key will be undefined.
+         *
+         * @deprecated This property will be deprecated in favor
+         * of the organization key and private properties.
+         */
+        get: function () {
+            return this._fill.project != null ?
+                this._fill.project.key :
+                null;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "rotation", {
@@ -28334,7 +50020,7 @@ var Node = (function () {
         get: function () {
             return this._fill.c_rotation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "scale", {
@@ -28348,7 +50034,7 @@ var Node = (function () {
         get: function () {
             return this._fill.atomic_scale;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "sequenceKey", {
@@ -28359,9 +50045,9 @@ var Node = (function () {
          * the node belongs.
          */
         get: function () {
-            return this._core.sequence.key;
+            return this._core.sequence_key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "sequenceEdges", {
@@ -28370,24 +50056,30 @@ var Node = (function () {
          *
          * @returns {IEdgeStatus} Value describing the status of the
          * sequence edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.sequenceEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "sequenceEdges$", {
         /**
          * Get sequenceEdges$.
          *
+         * @description Internal observable, should not be used as an API.
+         *
          * @returns {Observable<IEdgeStatus>} Observable emitting
          * values describing the status of the sequence edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.sequenceEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "spatialEdges", {
@@ -28396,24 +50088,30 @@ var Node = (function () {
          *
          * @returns {IEdgeStatus} Value describing the status of the
          * spatial edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.spatialEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "spatialEdges$", {
         /**
          * Get spatialEdges$.
          *
+         * @description Internal observable, should not be used as an API.
+         *
          * @returns {Observable<IEdgeStatus>} Observable emitting
          * values describing the status of the spatial edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.spatialEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "userKey", {
@@ -28426,7 +50124,7 @@ var Node = (function () {
         get: function () {
             return this._fill.user.key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "username", {
@@ -28439,7 +50137,7 @@ var Node = (function () {
         get: function () {
             return this._fill.user.username;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "width", {
@@ -28452,7 +50150,7 @@ var Node = (function () {
         get: function () {
             return this._fill.width;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -28463,13 +50161,31 @@ var Node = (function () {
      *
      * @returns {Observable<Node>} Observable emitting this node whenever the
      * load status has changed and when the mesh or image has been fully loaded.
+     *
+     * @ignore
      */
     Node.prototype.cacheAssets$ = function () {
         var _this = this;
-        return this._cache.cacheAssets$(this.key, this.pano, this.merged)
-            .map(function (cache) {
+        return this._cache.cacheAssets$(this.key, this.pano, this.merged).pipe(operators_1.map(function () {
             return _this;
-        });
+        }));
+    };
+    /**
+     * Cache the image asset.
+     *
+     * @description Use for caching a differently sized image than
+     * the one currently held by the node.
+     *
+     * @returns {Observable<Node>} Observable emitting this node whenever the
+     * load status has changed and when the mesh or image has been fully loaded.
+     *
+     * @ignore
+     */
+    Node.prototype.cacheImage$ = function (imageSize) {
+        var _this = this;
+        return this._cache.cacheImage$(this.key, imageSize).pipe(operators_1.map(function () {
+            return _this;
+        }));
     };
     /**
      * Cache the sequence edges.
@@ -28478,6 +50194,7 @@ var Node = (function () {
      * internally by the library.
      *
      * @param {Array<IEdge>} edges - Sequence edges to cache.
+     * @ignore
      */
     Node.prototype.cacheSequenceEdges = function (edges) {
         this._cache.cacheSequenceEdges(edges);
@@ -28489,6 +50206,7 @@ var Node = (function () {
      * internally by the library.
      *
      * @param {Array<IEdge>} edges - Spatial edges to cache.
+     * @ignore
      */
     Node.prototype.cacheSpatialEdges = function (edges) {
         this._cache.cacheSpatialEdges(edges);
@@ -28497,6 +50215,7 @@ var Node = (function () {
      * Dispose the node.
      *
      * @description Disposes all cached assets.
+     * @ignore
      */
     Node.prototype.dispose = function () {
         if (this._cache != null) {
@@ -28513,6 +50232,7 @@ var Node = (function () {
      * the library.
      *
      * @param {NodeCache} cache - The node cache to set as cache.
+     * @ignore
      */
     Node.prototype.initializeCache = function (cache) {
         if (this._cache != null) {
@@ -28527,6 +50247,7 @@ var Node = (function () {
      * the library.
      *
      * @param {IFillNode} fill - The fill node struct.
+     * @ignore
      */
     Node.prototype.makeFull = function (fill) {
         if (fill == null) {
@@ -28534,25 +50255,47 @@ var Node = (function () {
         }
         this._fill = fill;
     };
+    /**
+     * Reset the sequence edges.
+     *
+     * @ignore
+     */
+    Node.prototype.resetSequenceEdges = function () {
+        this._cache.resetSequenceEdges();
+    };
     /**
      * Reset the spatial edges.
+     *
+     * @ignore
      */
     Node.prototype.resetSpatialEdges = function () {
         this._cache.resetSpatialEdges();
     };
+    /**
+     * Clears the image and mesh assets, aborts
+     * any outstanding requests and resets edges.
+     *
+     * @ignore
+     */
+    Node.prototype.uncache = function () {
+        if (this._cache == null) {
+            return;
+        }
+        this._cache.dispose();
+        this._cache = null;
+    };
     return Node;
 }());
 exports.Node = Node;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Node;
 
-},{"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/map":60}],287:[function(require,module,exports){
+},{"rxjs/operators":241}],431:[function(require,module,exports){
 (function (Buffer){
 "use strict";
-var Subject_1 = require("rxjs/Subject");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/publishReplay");
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.NodeCache = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Graph_1 = require("../Graph");
 var Utils_1 = require("../Utils");
 /**
@@ -28560,28 +50303,26 @@ var Utils_1 = require("../Utils");
  *
  * @classdesc Represents the cached properties of a node.
  */
-var NodeCache = (function () {
+var NodeCache = /** @class */ (function () {
     /**
      * Create a new node cache instance.
      */
     function NodeCache() {
+        this._disposed = false;
         this._image = null;
         this._loadStatus = { loaded: 0, total: 0 };
         this._mesh = null;
         this._sequenceEdges = { cached: false, edges: [] };
         this._spatialEdges = { cached: false, edges: [] };
-        this._sequenceEdgesChanged$ = new Subject_1.Subject();
-        this._sequenceEdges$ = this._sequenceEdgesChanged$
-            .startWith(this._sequenceEdges)
-            .publishReplay(1)
-            .refCount();
-        this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe();
-        this._spatialEdgesChanged$ = new Subject_1.Subject();
-        this._spatialEdges$ = this._spatialEdgesChanged$
-            .startWith(this._spatialEdges)
-            .publishReplay(1)
-            .refCount();
-        this._spatialEdgesSubscription = this._spatialEdges$.subscribe();
+        this._imageChanged$ = new rxjs_1.Subject();
+        this._image$ = this._imageChanged$.pipe(operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
+        this._iamgeSubscription = this._image$.subscribe();
+        this._sequenceEdgesChanged$ = new rxjs_1.Subject();
+        this._sequenceEdges$ = this._sequenceEdgesChanged$.pipe(operators_1.startWith(this._sequenceEdges), operators_1.publishReplay(1), operators_1.refCount());
+        this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(function () { });
+        this._spatialEdgesChanged$ = new rxjs_1.Subject();
+        this._spatialEdges$ = this._spatialEdgesChanged$.pipe(operators_1.startWith(this._spatialEdges), operators_1.publishReplay(1), operators_1.refCount());
+        this._spatialEdgesSubscription = this._spatialEdges$.subscribe(function () { });
         this._cachingAssets$ = null;
     }
     Object.defineProperty(NodeCache.prototype, "image", {
@@ -28596,7 +50337,20 @@ var NodeCache = (function () {
         get: function () {
             return this._image;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(NodeCache.prototype, "image$", {
+        /**
+         * Get image$.
+         *
+         * @returns {Observable<HTMLImageElement>} Observable emitting
+         * the cached image when it is updated.
+         */
+        get: function () {
+            return this._image$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "loadStatus", {
@@ -28609,7 +50363,7 @@ var NodeCache = (function () {
         get: function () {
             return this._loadStatus;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "mesh", {
@@ -28625,7 +50379,7 @@ var NodeCache = (function () {
         get: function () {
             return this._mesh;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "sequenceEdges", {
@@ -28638,7 +50392,7 @@ var NodeCache = (function () {
         get: function () {
             return this._sequenceEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "sequenceEdges$", {
@@ -28651,7 +50405,7 @@ var NodeCache = (function () {
         get: function () {
             return this._sequenceEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "spatialEdges", {
@@ -28664,7 +50418,7 @@ var NodeCache = (function () {
         get: function () {
             return this._spatialEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "spatialEdges$", {
@@ -28677,7 +50431,7 @@ var NodeCache = (function () {
         get: function () {
             return this._spatialEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -28686,16 +50440,20 @@ var NodeCache = (function () {
      * @param {string} key - Key of the node to cache.
      * @param {boolean} pano - Value indicating whether node is a panorama.
      * @param {boolean} merged - Value indicating whether node is merged.
-     * @returns {Observable<Node>} Observable emitting this node whenever the
-     * load status has changed and when the mesh or image has been fully loaded.
+     * @returns {Observable<NodeCache>} Observable emitting this node
+     * cache whenever the load status has changed and when the mesh or image
+     * has been fully loaded.
      */
     NodeCache.prototype.cacheAssets$ = function (key, pano, merged) {
         var _this = this;
         if (this._cachingAssets$ != null) {
             return this._cachingAssets$;
         }
-        this._cachingAssets$ = Observable_1.Observable
-            .combineLatest(this._cacheImage(key, pano), this._cacheMesh(key, merged), function (imageStatus, meshStatus) {
+        var imageSize = pano ?
+            Utils_1.Settings.basePanoramaSize :
+            Utils_1.Settings.baseImageSize;
+        this._cachingAssets$ = rxjs_1.combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged)).pipe(operators_1.map(function (_a) {
+            var imageStatus = _a[0], meshStatus = _a[1];
             _this._loadStatus.loaded = 0;
             _this._loadStatus.total = 0;
             if (meshStatus) {
@@ -28709,14 +50467,46 @@ var NodeCache = (function () {
                 _this._loadStatus.total += imageStatus.loaded.total;
             }
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             _this._cachingAssets$ = null;
-        })
-            .publishReplay(1)
-            .refCount();
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._cachingAssets$.pipe(operators_1.first(function (nodeCache) {
+            return !!nodeCache._image;
+        }))
+            .subscribe(function (nodeCache) {
+            _this._imageChanged$.next(_this._image);
+        }, function (error) { });
         return this._cachingAssets$;
     };
+    /**
+     * Cache an image with a higher resolution than the current one.
+     *
+     * @param {string} key - Key of the node to cache.
+     * @param {ImageSize} imageSize - The size to cache.
+     * @returns {Observable<NodeCache>} Observable emitting a single item,
+     * the node cache, when the image has been cached. If supplied image
+     * size is not larger than the current image size the node cache is
+     * returned immediately.
+     */
+    NodeCache.prototype.cacheImage$ = function (key, imageSize) {
+        var _this = this;
+        if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) {
+            return rxjs_1.of(this);
+        }
+        var cacheImage$ = this._cacheImage$(key, imageSize).pipe(operators_1.first(function (status) {
+            return status.object != null;
+        }), operators_1.tap(function (status) {
+            _this._disposeImage();
+            _this._image = status.object;
+        }), operators_1.map(function (imageStatus) {
+            return _this;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        cacheImage$
+            .subscribe(function (nodeCache) {
+            _this._imageChanged$.next(_this._image);
+        }, function (error) { });
+        return cacheImage$;
+    };
     /**
      * Cache the sequence edges.
      *
@@ -28742,15 +50532,32 @@ var NodeCache = (function () {
      * all streams.
      */
     NodeCache.prototype.dispose = function () {
+        this._iamgeSubscription.unsubscribe();
         this._sequenceEdgesSubscription.unsubscribe();
         this._spatialEdgesSubscription.unsubscribe();
-        this._image = null;
+        this._disposeImage();
         this._mesh = null;
-        this._loadStatus = { loaded: 0, total: 0 };
+        this._loadStatus.loaded = 0;
+        this._loadStatus.total = 0;
         this._sequenceEdges = { cached: false, edges: [] };
         this._spatialEdges = { cached: false, edges: [] };
+        this._imageChanged$.next(null);
+        this._sequenceEdgesChanged$.next(this._sequenceEdges);
+        this._spatialEdgesChanged$.next(this._spatialEdges);
+        this._disposed = true;
+        if (this._imageRequest != null) {
+            this._imageRequest.abort();
+        }
+        if (this._meshRequest != null) {
+            this._meshRequest.abort();
+        }
+    };
+    /**
+     * Reset the sequence edges.
+     */
+    NodeCache.prototype.resetSequenceEdges = function () {
+        this._sequenceEdges = { cached: false, edges: [] };
         this._sequenceEdgesChanged$.next(this._sequenceEdges);
-        this._spatialEdgesChanged$.next(this._spatialEdges);
     };
     /**
      * Reset the spatial edges.
@@ -28768,11 +50575,59 @@ var NodeCache = (function () {
      * emitting a load status object every time the load status changes
      * and completes when the image is fully loaded.
      */
-    NodeCache.prototype._cacheImage = function (key, pano) {
-        var imageSize = pano ?
-            Utils_1.Settings.basePanoramaSize :
-            Utils_1.Settings.baseImageSize;
-        return Graph_1.ImageLoader.loadThumbnail(key, imageSize);
+    NodeCache.prototype._cacheImage$ = function (key, imageSize) {
+        var _this = this;
+        return rxjs_1.Observable.create(function (subscriber) {
+            var xmlHTTP = new XMLHttpRequest();
+            xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize, Utils_1.Urls.origin), true);
+            xmlHTTP.responseType = "arraybuffer";
+            xmlHTTP.timeout = 15000;
+            xmlHTTP.onload = function (pe) {
+                if (xmlHTTP.status !== 200) {
+                    _this._imageRequest = null;
+                    subscriber.error(new Error("Failed to fetch image (" + key + "). Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText));
+                    return;
+                }
+                var image = new Image();
+                image.crossOrigin = "Anonymous";
+                image.onload = function (e) {
+                    _this._imageRequest = null;
+                    if (_this._disposed) {
+                        window.URL.revokeObjectURL(image.src);
+                        subscriber.error(new Error("Image load was aborted (" + key + ")"));
+                        return;
+                    }
+                    subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image });
+                    subscriber.complete();
+                };
+                image.onerror = function (error) {
+                    _this._imageRequest = null;
+                    subscriber.error(new Error("Failed to load image (" + key + ")"));
+                };
+                var blob = new Blob([xmlHTTP.response]);
+                image.src = window.URL.createObjectURL(blob);
+            };
+            xmlHTTP.onprogress = function (pe) {
+                if (_this._disposed) {
+                    return;
+                }
+                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
+            };
+            xmlHTTP.onerror = function (error) {
+                _this._imageRequest = null;
+                subscriber.error(new Error("Failed to fetch image (" + key + ")"));
+            };
+            xmlHTTP.ontimeout = function (e) {
+                _this._imageRequest = null;
+                subscriber.error(new Error("Image request timed out (" + key + ")"));
+            };
+            xmlHTTP.onabort = function (event) {
+                _this._imageRequest = null;
+                subscriber.error(new Error("Image request was aborted (" + key + ")"));
+            };
+            _this._imageRequest = xmlHTTP;
+            xmlHTTP.send(null);
+        });
     };
     /**
      * Cache the mesh.
@@ -28783,9 +50638,9 @@ var NodeCache = (function () {
      * a load status object every time the load status changes and completes
      * when the mesh is fully loaded.
      */
-    NodeCache.prototype._cacheMesh = function (key, merged) {
+    NodeCache.prototype._cacheMesh$ = function (key, merged) {
         var _this = this;
-        return Observable_1.Observable.create(function (subscriber) {
+        return rxjs_1.Observable.create(function (subscriber) {
             if (!merged) {
                 subscriber.next(_this._createEmptyMeshLoadStatus());
                 subscriber.complete();
@@ -28794,7 +50649,12 @@ var NodeCache = (function () {
             var xmlHTTP = new XMLHttpRequest();
             xmlHTTP.open("GET", Utils_1.Urls.protoMesh(key), true);
             xmlHTTP.responseType = "arraybuffer";
+            xmlHTTP.timeout = 15000;
             xmlHTTP.onload = function (pe) {
+                _this._meshRequest = null;
+                if (_this._disposed) {
+                    return;
+                }
                 var mesh = xmlHTTP.status === 200 ?
                     Graph_1.MeshReader.read(new Buffer(xmlHTTP.response)) :
                     { faces: [], vertices: [] };
@@ -28802,13 +50662,28 @@ var NodeCache = (function () {
                 subscriber.complete();
             };
             xmlHTTP.onprogress = function (pe) {
+                if (_this._disposed) {
+                    return;
+                }
                 subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
             };
             xmlHTTP.onerror = function (e) {
+                _this._meshRequest = null;
                 console.error("Failed to cache mesh (" + key + ")");
                 subscriber.next(_this._createEmptyMeshLoadStatus());
                 subscriber.complete();
             };
+            xmlHTTP.ontimeout = function (e) {
+                _this._meshRequest = null;
+                console.error("Mesh request timed out (" + key + ")");
+                subscriber.next(_this._createEmptyMeshLoadStatus());
+                subscriber.complete();
+            };
+            xmlHTTP.onabort = function (e) {
+                _this._meshRequest = null;
+                subscriber.error(new Error("Mesh request was aborted (" + key + ")"));
+            };
+            _this._meshRequest = xmlHTTP;
             xmlHTTP.send(null);
         });
     };
@@ -28824,24 +50699,29 @@ var NodeCache = (function () {
             object: { faces: [], vertices: [] },
         };
     };
+    NodeCache.prototype._disposeImage = function () {
+        if (this._image != null) {
+            window.URL.revokeObjectURL(this._image.src);
+        }
+        this._image = null;
+    };
     return NodeCache;
 }());
 exports.NodeCache = NodeCache;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = NodeCache;
 
 }).call(this,require("buffer").Buffer)
 
-},{"../Graph":211,"../Utils":215,"buffer":5,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/publishReplay":67}],288:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{"../Graph":295,"../Utils":301,"buffer":6,"rxjs":43,"rxjs/operators":241}],432:[function(require,module,exports){
 "use strict";
-var _ = require("underscore");
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Sequence = void 0;
 /**
  * @class Sequence
  *
  * @classdesc Represents a sequence of ordered nodes.
  */
-var Sequence = (function () {
+var Sequence = /** @class */ (function () {
     /**
      * Create a new sequene instance.
      *
@@ -28860,7 +50740,7 @@ var Sequence = (function () {
         get: function () {
             return this._key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Sequence.prototype, "keys", {
@@ -28872,9 +50752,18 @@ var Sequence = (function () {
         get: function () {
             return this._keys;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    /**
+     * Dispose the sequence.
+     *
+     * @description Disposes all cached assets.
+     */
+    Sequence.prototype.dispose = function () {
+        this._key = null;
+        this._keys = null;
+    };
     /**
      * Find the next node key in the sequence with respect to
      * the provided node key.
@@ -28883,7 +50772,7 @@ var Sequence = (function () {
      * @returns {string} Next key in sequence if it exists, null otherwise.
      */
     Sequence.prototype.findNextKey = function (key) {
-        var i = _.indexOf(this._keys, key);
+        var i = this._keys.indexOf(key);
         if ((i + 1) >= this._keys.length || i === -1) {
             return null;
         }
@@ -28899,7 +50788,7 @@ var Sequence = (function () {
      * @returns {string} Previous key in sequence if it exists, null otherwise.
      */
     Sequence.prototype.findPrevKey = function (key) {
-        var i = _.indexOf(this._keys, key);
+        var i = this._keys.indexOf(key);
         if (i === 0 || i === -1) {
             return null;
         }
@@ -28910,12 +50799,12 @@ var Sequence = (function () {
     return Sequence;
 }());
 exports.Sequence = Sequence;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Sequence;
 
-},{"underscore":158}],289:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{}],433:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeCalculator = void 0;
 var THREE = require("three");
 var Edge_1 = require("../../Edge");
 var Error_1 = require("../../Error");
@@ -28925,7 +50814,7 @@ var Geo_1 = require("../../Geo");
  *
  * @classdesc Represents a class for calculating node edges.
  */
-var EdgeCalculator = (function () {
+var EdgeCalculator = /** @class */ (function () {
     /**
      * Create a new edge calculator instance.
      *
@@ -28989,6 +50878,7 @@ var EdgeCalculator = (function () {
             var sameUser = potential.userKey === node.userKey;
             var potentialEdge = {
                 capturedAt: potential.capturedAt,
+                croppedPano: potential.pano && !potential.fullPano,
                 directionChange: directionChange,
                 distance: distance,
                 fullPano: potential.fullPano,
@@ -29068,8 +50958,7 @@ var EdgeCalculator = (function () {
             if (potentialEdge.sequenceKey == null) {
                 continue;
             }
-            if (potentialEdge.sameSequence ||
-                !potentialEdge.sameMergeCC) {
+            if (potentialEdge.sameSequence) {
                 continue;
             }
             if (nodeFullPano) {
@@ -29139,6 +51028,9 @@ var EdgeCalculator = (function () {
     /**
      * Computes the step edges for a perspective node.
      *
+     * @description Step edge targets can only be other perspective nodes.
+     * Returns an empty array for cropped and full panoramas.
+     *
      * @param {Node} node - Source node.
      * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
      * @param {string} prevKey - Key of previous node in sequence.
@@ -29150,7 +51042,7 @@ var EdgeCalculator = (function () {
             throw new Error_1.ArgumentMapillaryError("Node has to be full.");
         }
         var edges = [];
-        if (node.fullPano) {
+        if (node.pano) {
             return edges;
         }
         for (var k in this._directions.steps) {
@@ -29163,7 +51055,7 @@ var EdgeCalculator = (function () {
             var fallback = null;
             for (var _i = 0, potentialEdges_2 = potentialEdges; _i < potentialEdges_2.length; _i++) {
                 var potential = potentialEdges_2[_i];
-                if (potential.fullPano) {
+                if (potential.croppedPano || potential.fullPano) {
                     continue;
                 }
                 if (Math.abs(potential.directionChange) > this._settings.stepMaxDirectionChange) {
@@ -29175,1815 +51067,2734 @@ var EdgeCalculator = (function () {
                 if (Math.abs(drift) > this._settings.stepMaxDrift) {
                     continue;
                 }
-                var potentialKey = potential.key;
-                if (step.useFallback && (potentialKey === prevKey || potentialKey === nextKey)) {
-                    fallback = potential;
+                var potentialKey = potential.key;
+                if (step.useFallback && (potentialKey === prevKey || potentialKey === nextKey)) {
+                    fallback = potential;
+                }
+                if (potential.distance > this._settings.stepMaxDistance) {
+                    continue;
+                }
+                motionDifference = Math.sqrt(motionDifference * motionDifference +
+                    potential.verticalMotion * potential.verticalMotion);
+                var score = this._coefficients.stepPreferredDistance *
+                    Math.abs(potential.distance - this._settings.stepPreferredDistance) /
+                    this._settings.stepMaxDistance +
+                    this._coefficients.stepMotion * motionDifference / this._settings.stepMaxDrift +
+                    this._coefficients.stepRotation * potential.rotation / this._settings.stepMaxDirectionChange +
+                    this._coefficients.stepSequencePenalty * (potential.sameSequence ? 0 : 1) +
+                    this._coefficients.stepMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
+                if (score < lowestScore) {
+                    lowestScore = score;
+                    edge = potential;
+                }
+            }
+            edge = edge == null ? fallback : edge;
+            if (edge != null) {
+                edges.push({
+                    data: {
+                        direction: step.direction,
+                        worldMotionAzimuth: edge.worldMotionAzimuth,
+                    },
+                    from: node.key,
+                    to: edge.key,
+                });
+            }
+        }
+        return edges;
+    };
+    /**
+     * Computes the turn edges for a perspective node.
+     *
+     * @description Turn edge targets can only be other perspective images.
+     * Returns an empty array for cropped and full panoramas.
+     *
+     * @param {Node} node - Source node.
+     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
+     * @throws {ArgumentMapillaryError} If node is not full.
+     */
+    EdgeCalculator.prototype.computeTurnEdges = function (node, potentialEdges) {
+        if (!node.full) {
+            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
+        }
+        var edges = [];
+        if (node.pano) {
+            return edges;
+        }
+        for (var k in this._directions.turns) {
+            if (!this._directions.turns.hasOwnProperty(k)) {
+                continue;
+            }
+            var turn = this._directions.turns[k];
+            var lowestScore = Number.MAX_VALUE;
+            var edge = null;
+            for (var _i = 0, potentialEdges_3 = potentialEdges; _i < potentialEdges_3.length; _i++) {
+                var potential = potentialEdges_3[_i];
+                if (potential.croppedPano || potential.fullPano) {
+                    continue;
+                }
+                if (potential.distance > this._settings.turnMaxDistance) {
+                    continue;
+                }
+                var rig = turn.direction !== Edge_1.EdgeDirection.TurnU &&
+                    potential.distance < this._settings.turnMaxRigDistance &&
+                    Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;
+                var directionDifference = this._spatial.angleDifference(turn.directionChange, potential.directionChange);
+                var score = void 0;
+                if (rig &&
+                    potential.directionChange * turn.directionChange > 0 &&
+                    Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {
+                    score = -Math.PI / 2 + Math.abs(potential.directionChange);
+                }
+                else {
+                    if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {
+                        continue;
+                    }
+                    var motionDifference = turn.motionChange ?
+                        this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;
+                    motionDifference = Math.sqrt(motionDifference * motionDifference +
+                        potential.verticalMotion * potential.verticalMotion);
+                    score =
+                        this._coefficients.turnDistance * potential.distance /
+                            this._settings.turnMaxDistance +
+                            this._coefficients.turnMotion * motionDifference / Math.PI +
+                            this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +
+                            this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
+                }
+                if (score < lowestScore) {
+                    lowestScore = score;
+                    edge = potential;
+                }
+            }
+            if (edge != null) {
+                edges.push({
+                    data: {
+                        direction: turn.direction,
+                        worldMotionAzimuth: edge.worldMotionAzimuth,
+                    },
+                    from: node.key,
+                    to: edge.key,
+                });
+            }
+        }
+        return edges;
+    };
+    /**
+     * Computes the pano edges for a perspective node.
+     *
+     * @description Perspective to pano edge targets can only be
+     * full pano nodes. Returns an empty array for cropped and full panoramas.
+     *
+     * @param {Node} node - Source node.
+     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
+     * @throws {ArgumentMapillaryError} If node is not full.
+     */
+    EdgeCalculator.prototype.computePerspectiveToPanoEdges = function (node, potentialEdges) {
+        if (!node.full) {
+            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
+        }
+        if (node.pano) {
+            return [];
+        }
+        var lowestScore = Number.MAX_VALUE;
+        var edge = null;
+        for (var _i = 0, potentialEdges_4 = potentialEdges; _i < potentialEdges_4.length; _i++) {
+            var potential = potentialEdges_4[_i];
+            if (!potential.fullPano) {
+                continue;
+            }
+            var score = this._coefficients.panoPreferredDistance *
+                Math.abs(potential.distance - this._settings.panoPreferredDistance) /
+                this._settings.panoMaxDistance +
+                this._coefficients.panoMotion * Math.abs(potential.motionChange) / Math.PI +
+                this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
+            if (score < lowestScore) {
+                lowestScore = score;
+                edge = potential;
+            }
+        }
+        if (edge == null) {
+            return [];
+        }
+        return [
+            {
+                data: {
+                    direction: Edge_1.EdgeDirection.Pano,
+                    worldMotionAzimuth: edge.worldMotionAzimuth,
+                },
+                from: node.key,
+                to: edge.key,
+            },
+        ];
+    };
+    /**
+     * Computes the full pano and step edges for a full pano node.
+     *
+     * @description Pano to pano edge targets can only be
+     * full pano nodes. Pano to step edge targets can only be perspective
+     * nodes.
+     * Returns an empty array for cropped panoramas and perspective nodes.
+     *
+     * @param {Node} node - Source node.
+     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
+     * @throws {ArgumentMapillaryError} If node is not full.
+     */
+    EdgeCalculator.prototype.computePanoEdges = function (node, potentialEdges) {
+        if (!node.full) {
+            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
+        }
+        if (!node.fullPano) {
+            return [];
+        }
+        var panoEdges = [];
+        var potentialPanos = [];
+        var potentialSteps = [];
+        for (var _i = 0, potentialEdges_5 = potentialEdges; _i < potentialEdges_5.length; _i++) {
+            var potential = potentialEdges_5[_i];
+            if (potential.distance > this._settings.panoMaxDistance) {
+                continue;
+            }
+            if (potential.fullPano) {
+                if (potential.distance < this._settings.panoMinDistance) {
+                    continue;
+                }
+                potentialPanos.push(potential);
+            }
+            else {
+                if (potential.croppedPano) {
+                    continue;
+                }
+                for (var k in this._directions.panos) {
+                    if (!this._directions.panos.hasOwnProperty(k)) {
+                        continue;
+                    }
+                    var pano = this._directions.panos[k];
+                    var turn = this._spatial.angleDifference(potential.directionChange, potential.motionChange);
+                    var turnChange = this._spatial.angleDifference(pano.directionChange, turn);
+                    if (Math.abs(turnChange) > this._settings.panoMaxStepTurnChange) {
+                        continue;
+                    }
+                    potentialSteps.push([pano.direction, potential]);
+                    // break if step direction found
+                    break;
+                }
+            }
+        }
+        var maxRotationDifference = Math.PI / this._settings.panoMaxItems;
+        var occupiedAngles = [];
+        var stepAngles = [];
+        for (var index = 0; index < this._settings.panoMaxItems; index++) {
+            var rotation = index / this._settings.panoMaxItems * 2 * Math.PI;
+            var lowestScore = Number.MAX_VALUE;
+            var edge = null;
+            for (var _a = 0, potentialPanos_1 = potentialPanos; _a < potentialPanos_1.length; _a++) {
+                var potential = potentialPanos_1[_a];
+                var motionDifference = this._spatial.angleDifference(rotation, potential.motionChange);
+                if (Math.abs(motionDifference) > maxRotationDifference) {
+                    continue;
+                }
+                var occupiedDifference = Number.MAX_VALUE;
+                for (var _b = 0, occupiedAngles_1 = occupiedAngles; _b < occupiedAngles_1.length; _b++) {
+                    var occupiedAngle = occupiedAngles_1[_b];
+                    var difference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential.motionChange));
+                    if (difference < occupiedDifference) {
+                        occupiedDifference = difference;
+                    }
                 }
-                if (potential.distance > this._settings.stepMaxDistance) {
+                if (occupiedDifference <= maxRotationDifference) {
                     continue;
                 }
-                motionDifference = Math.sqrt(motionDifference * motionDifference +
-                    potential.verticalMotion * potential.verticalMotion);
-                var score = this._coefficients.stepPreferredDistance *
-                    Math.abs(potential.distance - this._settings.stepPreferredDistance) /
-                    this._settings.stepMaxDistance +
-                    this._coefficients.stepMotion * motionDifference / this._settings.stepMaxDrift +
-                    this._coefficients.stepRotation * potential.rotation / this._settings.stepMaxDirectionChange +
-                    this._coefficients.stepSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                    this._coefficients.stepMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
+                var score = this._coefficients.panoPreferredDistance *
+                    Math.abs(potential.distance - this._settings.panoPreferredDistance) /
+                    this._settings.panoMaxDistance +
+                    this._coefficients.panoMotion * Math.abs(motionDifference) / maxRotationDifference +
+                    this._coefficients.panoSequencePenalty * (potential.sameSequence ? 0 : 1) +
+                    this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
                 if (score < lowestScore) {
                     lowestScore = score;
                     edge = potential;
                 }
             }
-            edge = edge == null ? fallback : edge;
             if (edge != null) {
-                edges.push({
+                occupiedAngles.push(edge.motionChange);
+                panoEdges.push({
                     data: {
-                        direction: step.direction,
+                        direction: Edge_1.EdgeDirection.Pano,
                         worldMotionAzimuth: edge.worldMotionAzimuth,
                     },
                     from: node.key,
                     to: edge.key,
                 });
             }
+            else {
+                stepAngles.push(rotation);
+            }
         }
-        return edges;
+        var occupiedStepAngles = {};
+        occupiedStepAngles[Edge_1.EdgeDirection.Pano] = occupiedAngles;
+        occupiedStepAngles[Edge_1.EdgeDirection.StepForward] = [];
+        occupiedStepAngles[Edge_1.EdgeDirection.StepLeft] = [];
+        occupiedStepAngles[Edge_1.EdgeDirection.StepBackward] = [];
+        occupiedStepAngles[Edge_1.EdgeDirection.StepRight] = [];
+        for (var _c = 0, stepAngles_1 = stepAngles; _c < stepAngles_1.length; _c++) {
+            var stepAngle = stepAngles_1[_c];
+            var occupations = [];
+            for (var k in this._directions.panos) {
+                if (!this._directions.panos.hasOwnProperty(k)) {
+                    continue;
+                }
+                var pano = this._directions.panos[k];
+                var allOccupiedAngles = occupiedStepAngles[Edge_1.EdgeDirection.Pano]
+                    .concat(occupiedStepAngles[pano.direction])
+                    .concat(occupiedStepAngles[pano.prev])
+                    .concat(occupiedStepAngles[pano.next]);
+                var lowestScore = Number.MAX_VALUE;
+                var edge = null;
+                for (var _d = 0, potentialSteps_1 = potentialSteps; _d < potentialSteps_1.length; _d++) {
+                    var potential = potentialSteps_1[_d];
+                    if (potential[0] !== pano.direction) {
+                        continue;
+                    }
+                    var motionChange = this._spatial.angleDifference(stepAngle, potential[1].motionChange);
+                    if (Math.abs(motionChange) > maxRotationDifference) {
+                        continue;
+                    }
+                    var minOccupiedDifference = Number.MAX_VALUE;
+                    for (var _e = 0, allOccupiedAngles_1 = allOccupiedAngles; _e < allOccupiedAngles_1.length; _e++) {
+                        var occupiedAngle = allOccupiedAngles_1[_e];
+                        var occupiedDifference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential[1].motionChange));
+                        if (occupiedDifference < minOccupiedDifference) {
+                            minOccupiedDifference = occupiedDifference;
+                        }
+                    }
+                    if (minOccupiedDifference <= maxRotationDifference) {
+                        continue;
+                    }
+                    var score = this._coefficients.panoPreferredDistance *
+                        Math.abs(potential[1].distance - this._settings.panoPreferredDistance) /
+                        this._settings.panoMaxDistance +
+                        this._coefficients.panoMotion * Math.abs(motionChange) / maxRotationDifference +
+                        this._coefficients.panoMergeCCPenalty * (potential[1].sameMergeCC ? 0 : 1);
+                    if (score < lowestScore) {
+                        lowestScore = score;
+                        edge = potential;
+                    }
+                }
+                if (edge != null) {
+                    occupations.push(edge);
+                    panoEdges.push({
+                        data: {
+                            direction: edge[0],
+                            worldMotionAzimuth: edge[1].worldMotionAzimuth,
+                        },
+                        from: node.key,
+                        to: edge[1].key,
+                    });
+                }
+            }
+            for (var _f = 0, occupations_1 = occupations; _f < occupations_1.length; _f++) {
+                var occupation = occupations_1[_f];
+                occupiedStepAngles[occupation[0]].push(occupation[1].motionChange);
+            }
+        }
+        return panoEdges;
     };
+    return EdgeCalculator;
+}());
+exports.EdgeCalculator = EdgeCalculator;
+exports.default = EdgeCalculator;
+
+},{"../../Edge":292,"../../Error":293,"../../Geo":294,"three":242}],434:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeCalculatorCoefficients = void 0;
+var EdgeCalculatorCoefficients = /** @class */ (function () {
+    function EdgeCalculatorCoefficients() {
+        this.panoPreferredDistance = 2;
+        this.panoMotion = 2;
+        this.panoSequencePenalty = 1;
+        this.panoMergeCCPenalty = 4;
+        this.stepPreferredDistance = 4;
+        this.stepMotion = 3;
+        this.stepRotation = 4;
+        this.stepSequencePenalty = 2;
+        this.stepMergeCCPenalty = 6;
+        this.similarDistance = 2;
+        this.similarRotation = 3;
+        this.turnDistance = 4;
+        this.turnMotion = 2;
+        this.turnSequencePenalty = 1;
+        this.turnMergeCCPenalty = 4;
+    }
+    return EdgeCalculatorCoefficients;
+}());
+exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients;
+exports.default = EdgeCalculatorCoefficients;
+
+},{}],435:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeCalculatorDirections = void 0;
+var Edge_1 = require("../../Edge");
+var EdgeCalculatorDirections = /** @class */ (function () {
+    function EdgeCalculatorDirections() {
+        this.steps = {};
+        this.turns = {};
+        this.panos = {};
+        this.steps[Edge_1.EdgeDirection.StepForward] = {
+            direction: Edge_1.EdgeDirection.StepForward,
+            motionChange: 0,
+            useFallback: true,
+        };
+        this.steps[Edge_1.EdgeDirection.StepBackward] = {
+            direction: Edge_1.EdgeDirection.StepBackward,
+            motionChange: Math.PI,
+            useFallback: true,
+        };
+        this.steps[Edge_1.EdgeDirection.StepLeft] = {
+            direction: Edge_1.EdgeDirection.StepLeft,
+            motionChange: Math.PI / 2,
+            useFallback: false,
+        };
+        this.steps[Edge_1.EdgeDirection.StepRight] = {
+            direction: Edge_1.EdgeDirection.StepRight,
+            motionChange: -Math.PI / 2,
+            useFallback: false,
+        };
+        this.turns[Edge_1.EdgeDirection.TurnLeft] = {
+            direction: Edge_1.EdgeDirection.TurnLeft,
+            directionChange: Math.PI / 2,
+            motionChange: Math.PI / 4,
+        };
+        this.turns[Edge_1.EdgeDirection.TurnRight] = {
+            direction: Edge_1.EdgeDirection.TurnRight,
+            directionChange: -Math.PI / 2,
+            motionChange: -Math.PI / 4,
+        };
+        this.turns[Edge_1.EdgeDirection.TurnU] = {
+            direction: Edge_1.EdgeDirection.TurnU,
+            directionChange: Math.PI,
+            motionChange: null,
+        };
+        this.panos[Edge_1.EdgeDirection.StepForward] = {
+            direction: Edge_1.EdgeDirection.StepForward,
+            directionChange: 0,
+            next: Edge_1.EdgeDirection.StepLeft,
+            prev: Edge_1.EdgeDirection.StepRight,
+        };
+        this.panos[Edge_1.EdgeDirection.StepBackward] = {
+            direction: Edge_1.EdgeDirection.StepBackward,
+            directionChange: Math.PI,
+            next: Edge_1.EdgeDirection.StepRight,
+            prev: Edge_1.EdgeDirection.StepLeft,
+        };
+        this.panos[Edge_1.EdgeDirection.StepLeft] = {
+            direction: Edge_1.EdgeDirection.StepLeft,
+            directionChange: Math.PI / 2,
+            next: Edge_1.EdgeDirection.StepBackward,
+            prev: Edge_1.EdgeDirection.StepForward,
+        };
+        this.panos[Edge_1.EdgeDirection.StepRight] = {
+            direction: Edge_1.EdgeDirection.StepRight,
+            directionChange: -Math.PI / 2,
+            next: Edge_1.EdgeDirection.StepForward,
+            prev: Edge_1.EdgeDirection.StepBackward,
+        };
+    }
+    return EdgeCalculatorDirections;
+}());
+exports.EdgeCalculatorDirections = EdgeCalculatorDirections;
+
+},{"../../Edge":292}],436:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeCalculatorSettings = void 0;
+var EdgeCalculatorSettings = /** @class */ (function () {
+    function EdgeCalculatorSettings() {
+        this.panoMinDistance = 0.1;
+        this.panoMaxDistance = 20;
+        this.panoPreferredDistance = 5;
+        this.panoMaxItems = 4;
+        this.panoMaxStepTurnChange = Math.PI / 8;
+        this.rotationMaxDistance = this.turnMaxRigDistance;
+        this.rotationMaxDirectionChange = Math.PI / 6;
+        this.rotationMaxVerticalDirectionChange = Math.PI / 8;
+        this.similarMaxDirectionChange = Math.PI / 8;
+        this.similarMaxDistance = 12;
+        this.similarMinTimeDifference = 12 * 3600 * 1000;
+        this.stepMaxDistance = 20;
+        this.stepMaxDirectionChange = Math.PI / 6;
+        this.stepMaxDrift = Math.PI / 6;
+        this.stepPreferredDistance = 4;
+        this.turnMaxDistance = 15;
+        this.turnMaxDirectionChange = 2 * Math.PI / 9;
+        this.turnMaxRigDistance = 0.65;
+        this.turnMinRigDirectionChange = Math.PI / 6;
+    }
+    Object.defineProperty(EdgeCalculatorSettings.prototype, "maxDistance", {
+        get: function () {
+            return Math.max(this.panoMaxDistance, this.similarMaxDistance, this.stepMaxDistance, this.turnMaxDistance);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return EdgeCalculatorSettings;
+}());
+exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
+exports.default = EdgeCalculatorSettings;
+
+},{}],437:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeDirection = void 0;
+/**
+ * Enumeration for edge directions
+ * @enum {number}
+ * @readonly
+ * @description Directions for edges in node graph describing
+ * sequence, spatial and node type relations between nodes.
+ */
+var EdgeDirection;
+(function (EdgeDirection) {
     /**
-     * Computes the turn edges for a perspective node.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
+     * Next node in the sequence.
      */
-    EdgeCalculator.prototype.computeTurnEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var edges = [];
-        if (node.fullPano) {
-            return edges;
-        }
-        for (var k in this._directions.turns) {
-            if (!this._directions.turns.hasOwnProperty(k)) {
-                continue;
-            }
-            var turn = this._directions.turns[k];
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            for (var _i = 0, potentialEdges_3 = potentialEdges; _i < potentialEdges_3.length; _i++) {
-                var potential = potentialEdges_3[_i];
-                if (potential.fullPano) {
-                    continue;
+    EdgeDirection[EdgeDirection["Next"] = 0] = "Next";
+    /**
+     * Previous node in the sequence.
+     */
+    EdgeDirection[EdgeDirection["Prev"] = 1] = "Prev";
+    /**
+     * Step to the left keeping viewing direction.
+     */
+    EdgeDirection[EdgeDirection["StepLeft"] = 2] = "StepLeft";
+    /**
+     * Step to the right keeping viewing direction.
+     */
+    EdgeDirection[EdgeDirection["StepRight"] = 3] = "StepRight";
+    /**
+     * Step forward keeping viewing direction.
+     */
+    EdgeDirection[EdgeDirection["StepForward"] = 4] = "StepForward";
+    /**
+     * Step backward keeping viewing direction.
+     */
+    EdgeDirection[EdgeDirection["StepBackward"] = 5] = "StepBackward";
+    /**
+     * Turn 90 degrees counter clockwise.
+     */
+    EdgeDirection[EdgeDirection["TurnLeft"] = 6] = "TurnLeft";
+    /**
+     * Turn 90 degrees clockwise.
+     */
+    EdgeDirection[EdgeDirection["TurnRight"] = 7] = "TurnRight";
+    /**
+     * Turn 180 degrees.
+     */
+    EdgeDirection[EdgeDirection["TurnU"] = 8] = "TurnU";
+    /**
+     * Panorama in general direction.
+     */
+    EdgeDirection[EdgeDirection["Pano"] = 9] = "Pano";
+    /**
+     * Looking in roughly the same direction at rougly the same position.
+     */
+    EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar";
+})(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {}));
+
+},{}],438:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],439:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],440:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DOMRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var rxjs_2 = require("rxjs");
+var Render_1 = require("../Render");
+var DOMRenderer = /** @class */ (function () {
+    function DOMRenderer(element, renderService, currentFrame$) {
+        this._adaptiveOperation$ = new rxjs_2.Subject();
+        this._render$ = new rxjs_2.Subject();
+        this._renderAdaptive$ = new rxjs_2.Subject();
+        this._renderService = renderService;
+        this._currentFrame$ = currentFrame$;
+        var rootNode = vd.create(vd.h("div.domRenderer", []));
+        element.appendChild(rootNode);
+        this._offset$ = this._adaptiveOperation$.pipe(operators_1.scan(function (adaptive, operation) {
+            return operation(adaptive);
+        }, {
+            elementHeight: element.offsetHeight,
+            elementWidth: element.offsetWidth,
+            imageAspect: 0,
+            renderMode: Render_1.RenderMode.Fill,
+        }), operators_1.filter(function (adaptive) {
+            return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0;
+        }), operators_1.map(function (adaptive) {
+            var elementAspect = adaptive.elementWidth / adaptive.elementHeight;
+            var ratio = adaptive.imageAspect / elementAspect;
+            var verticalOffset = 0;
+            var horizontalOffset = 0;
+            if (adaptive.renderMode === Render_1.RenderMode.Letterbox) {
+                if (adaptive.imageAspect > elementAspect) {
+                    verticalOffset = adaptive.elementHeight * (1 - 1 / ratio) / 2;
                 }
-                if (potential.distance > this._settings.turnMaxDistance) {
-                    continue;
+                else {
+                    horizontalOffset = adaptive.elementWidth * (1 - ratio) / 2;
                 }
-                var rig = turn.direction !== Edge_1.EdgeDirection.TurnU &&
-                    potential.distance < this._settings.turnMaxRigDistance &&
-                    Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;
-                var directionDifference = this._spatial.angleDifference(turn.directionChange, potential.directionChange);
-                var score = void 0;
-                if (rig &&
-                    potential.directionChange * turn.directionChange > 0 &&
-                    Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {
-                    score = -Math.PI / 2 + Math.abs(potential.directionChange);
+            }
+            else {
+                if (adaptive.imageAspect > elementAspect) {
+                    horizontalOffset = -adaptive.elementWidth * (ratio - 1) / 2;
                 }
                 else {
-                    if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {
-                        continue;
-                    }
-                    var motionDifference = turn.motionChange ?
-                        this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;
-                    motionDifference = Math.sqrt(motionDifference * motionDifference +
-                        potential.verticalMotion * potential.verticalMotion);
-                    score =
-                        this._coefficients.turnDistance * potential.distance /
-                            this._settings.turnMaxDistance +
-                            this._coefficients.turnMotion * motionDifference / Math.PI +
-                            this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                            this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                }
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
+                    verticalOffset = -adaptive.elementHeight * (1 / ratio - 1) / 2;
                 }
             }
-            if (edge != null) {
-                edges.push({
-                    data: {
-                        direction: turn.direction,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-        }
-        return edges;
-    };
-    /**
-     * Computes the pano edges for a perspective node.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computePerspectiveToPanoEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (node.fullPano) {
-            return [];
-        }
-        var lowestScore = Number.MAX_VALUE;
-        var edge = null;
-        for (var _i = 0, potentialEdges_4 = potentialEdges; _i < potentialEdges_4.length; _i++) {
-            var potential = potentialEdges_4[_i];
-            if (!potential.fullPano) {
-                continue;
-            }
-            var score = this._coefficients.panoPreferredDistance *
-                Math.abs(potential.distance - this._settings.panoPreferredDistance) /
-                this._settings.panoMaxDistance +
-                this._coefficients.panoMotion * Math.abs(potential.motionChange) / Math.PI +
-                this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-            if (score < lowestScore) {
-                lowestScore = score;
-                edge = potential;
+            return {
+                bottom: verticalOffset,
+                left: horizontalOffset,
+                right: horizontalOffset,
+                top: verticalOffset,
+            };
+        }));
+        this._currentFrame$.pipe(operators_1.filter(function (frame) {
+            return frame.state.currentNode != null;
+        }), operators_1.distinctUntilChanged(function (k1, k2) {
+            return k1 === k2;
+        }, function (frame) {
+            return frame.state.currentNode.key;
+        }), operators_1.map(function (frame) {
+            return frame.state.currentTransform.basicAspect;
+        }), operators_1.map(function (aspect) {
+            return function (adaptive) {
+                adaptive.imageAspect = aspect;
+                return adaptive;
+            };
+        }))
+            .subscribe(this._adaptiveOperation$);
+        rxjs_1.combineLatest(this._renderAdaptive$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
+            if (vNodeHash.vnode == null) {
+                delete vNodeHashes[vNodeHash.name];
             }
-        }
-        if (edge == null) {
-            return [];
-        }
-        return [
-            {
-                data: {
-                    direction: Edge_1.EdgeDirection.Pano,
-                    worldMotionAzimuth: edge.worldMotionAzimuth,
-                },
-                from: node.key,
-                to: edge.key,
-            },
-        ];
-    };
-    /**
-     * Computes the pano and step edges for a pano node.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computePanoEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (!node.fullPano) {
-            return [];
-        }
-        var panoEdges = [];
-        var potentialPanos = [];
-        var potentialSteps = [];
-        for (var _i = 0, potentialEdges_5 = potentialEdges; _i < potentialEdges_5.length; _i++) {
-            var potential = potentialEdges_5[_i];
-            if (potential.distance > this._settings.panoMaxDistance) {
-                continue;
+            else {
+                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
             }
-            if (potential.fullPano) {
-                if (potential.distance < this._settings.panoMinDistance) {
+            return vNodeHashes;
+        }, {})), this._offset$).pipe(operators_1.map(function (vo) {
+            var vNodes = [];
+            var hashes = vo[0];
+            for (var name_1 in hashes) {
+                if (!hashes.hasOwnProperty(name_1)) {
                     continue;
                 }
-                potentialPanos.push(potential);
+                vNodes.push(hashes[name_1]);
+            }
+            var offset = vo[1];
+            var properties = {
+                style: {
+                    bottom: offset.bottom + "px",
+                    left: offset.left + "px",
+                    "pointer-events": "none",
+                    position: "absolute",
+                    right: offset.right + "px",
+                    top: offset.top + "px",
+                },
+            };
+            return {
+                name: "adaptiveDomRenderer",
+                vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes),
+            };
+        }))
+            .subscribe(this._render$);
+        this._vNode$ = this._render$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
+            if (vNodeHash.vnode == null) {
+                delete vNodeHashes[vNodeHash.name];
             }
             else {
-                for (var k in this._directions.panos) {
-                    if (!this._directions.panos.hasOwnProperty(k)) {
-                        continue;
-                    }
-                    var pano = this._directions.panos[k];
-                    var turn = this._spatial.angleDifference(potential.directionChange, potential.motionChange);
-                    var turnChange = this._spatial.angleDifference(pano.directionChange, turn);
-                    if (Math.abs(turnChange) > this._settings.panoMaxStepTurnChange) {
-                        continue;
-                    }
-                    potentialSteps.push([pano.direction, potential]);
-                    // break if step direction found
-                    break;
-                }
+                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
             }
-        }
-        var maxRotationDifference = Math.PI / this._settings.panoMaxItems;
-        var occupiedAngles = [];
-        var stepAngles = [];
-        for (var index = 0; index < this._settings.panoMaxItems; index++) {
-            var rotation = index / this._settings.panoMaxItems * 2 * Math.PI;
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            for (var _a = 0, potentialPanos_1 = potentialPanos; _a < potentialPanos_1.length; _a++) {
-                var potential = potentialPanos_1[_a];
-                var motionDifference = this._spatial.angleDifference(rotation, potential.motionChange);
-                if (Math.abs(motionDifference) > maxRotationDifference) {
+            return vNodeHashes;
+        }, {}), operators_1.map(function (hashes) {
+            var vNodes = [];
+            for (var name_2 in hashes) {
+                if (!hashes.hasOwnProperty(name_2)) {
                     continue;
                 }
-                var occupiedDifference = Number.MAX_VALUE;
-                for (var _b = 0, occupiedAngles_1 = occupiedAngles; _b < occupiedAngles_1.length; _b++) {
-                    var occupiedAngle = occupiedAngles_1[_b];
-                    var difference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential.motionChange));
-                    if (difference < occupiedDifference) {
-                        occupiedDifference = difference;
-                    }
+                vNodes.push(hashes[name_2]);
+            }
+            return vd.h("div.domRenderer", vNodes);
+        }));
+        this._vPatch$ = this._vNode$.pipe(operators_1.scan(function (nodePatch, vNode) {
+            nodePatch.vpatch = vd.diff(nodePatch.vnode, vNode);
+            nodePatch.vnode = vNode;
+            return nodePatch;
+        }, { vnode: vd.h("div.domRenderer", []), vpatch: null }), operators_1.pluck("vpatch"));
+        this._element$ = this._vPatch$.pipe(operators_1.scan(function (oldElement, vPatch) {
+            return vd.patch(oldElement, vPatch);
+        }, rootNode), operators_1.publishReplay(1), operators_1.refCount());
+        this._element$.subscribe(function () { });
+        this._renderService.size$.pipe(operators_1.map(function (size) {
+            return function (adaptive) {
+                adaptive.elementWidth = size.width;
+                adaptive.elementHeight = size.height;
+                return adaptive;
+            };
+        }))
+            .subscribe(this._adaptiveOperation$);
+        this._renderService.renderMode$.pipe(operators_1.map(function (renderMode) {
+            return function (adaptive) {
+                adaptive.renderMode = renderMode;
+                return adaptive;
+            };
+        }))
+            .subscribe(this._adaptiveOperation$);
+    }
+    Object.defineProperty(DOMRenderer.prototype, "element$", {
+        get: function () {
+            return this._element$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DOMRenderer.prototype, "render$", {
+        get: function () {
+            return this._render$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DOMRenderer.prototype, "renderAdaptive$", {
+        get: function () {
+            return this._renderAdaptive$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    DOMRenderer.prototype.clear = function (name) {
+        this._renderAdaptive$.next({ name: name, vnode: null });
+        this._render$.next({ name: name, vnode: null });
+    };
+    return DOMRenderer;
+}());
+exports.DOMRenderer = DOMRenderer;
+exports.default = DOMRenderer;
+
+
+},{"../Render":297,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],441:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GLRenderStage = void 0;
+var GLRenderStage;
+(function (GLRenderStage) {
+    GLRenderStage[GLRenderStage["Background"] = 0] = "Background";
+    GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground";
+})(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {}));
+exports.default = GLRenderStage;
+
+},{}],442:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GLRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var THREE = require("three");
+var Render_1 = require("../Render");
+var Utils_1 = require("../Utils");
+var GLRenderer = /** @class */ (function () {
+    function GLRenderer(canvasContainer, renderService, dom) {
+        var _this = this;
+        this._renderFrame$ = new rxjs_1.Subject();
+        this._renderCameraOperation$ = new rxjs_1.Subject();
+        this._render$ = new rxjs_1.Subject();
+        this._clear$ = new rxjs_1.Subject();
+        this._renderOperation$ = new rxjs_1.Subject();
+        this._rendererOperation$ = new rxjs_1.Subject();
+        this._eraserOperation$ = new rxjs_1.Subject();
+        this._renderService = renderService;
+        this._dom = !!dom ? dom : new Utils_1.DOM();
+        this._renderer$ = this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
+            return operation(renderer);
+        }, { needsRender: false, renderer: null }), operators_1.filter(function (renderer) {
+            return !!renderer.renderer;
+        }));
+        this._renderCollection$ = this._renderOperation$.pipe(operators_1.scan(function (hashes, operation) {
+            return operation(hashes);
+        }, {}), operators_1.share());
+        this._renderCamera$ = this._renderCameraOperation$.pipe(operators_1.scan(function (rc, operation) {
+            return operation(rc);
+        }, { frameId: -1, needsRender: false, perspective: null }));
+        this._eraser$ = this._eraserOperation$.pipe(operators_1.startWith(function (eraser) {
+            return eraser;
+        }), operators_1.scan(function (eraser, operation) {
+            return operation(eraser);
+        }, { needsRender: false }));
+        rxjs_1.combineLatest(this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$).pipe(operators_1.map(function (_a) {
+            var renderer = _a[0], hashes = _a[1], rc = _a[2], eraser = _a[3];
+            var renders = Object.keys(hashes)
+                .map(function (key) {
+                return hashes[key];
+            });
+            return { camera: rc, eraser: eraser, renderer: renderer, renders: renders };
+        }), operators_1.filter(function (co) {
+            var needsRender = co.renderer.needsRender ||
+                co.camera.needsRender ||
+                co.eraser.needsRender;
+            var frameId = co.camera.frameId;
+            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
+                var render = _a[_i];
+                if (render.frameId !== frameId) {
+                    return false;
                 }
-                if (occupiedDifference <= maxRotationDifference) {
-                    continue;
+                needsRender = needsRender || render.needsRender;
+            }
+            return needsRender;
+        }), operators_1.distinctUntilChanged(function (n1, n2) {
+            return n1 === n2;
+        }, function (co) {
+            return co.eraser.needsRender ? -1 : co.camera.frameId;
+        }))
+            .subscribe(function (co) {
+            co.renderer.needsRender = false;
+            co.camera.needsRender = false;
+            co.eraser.needsRender = false;
+            var perspectiveCamera = co.camera.perspective;
+            var backgroundRenders = [];
+            var foregroundRenders = [];
+            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
+                var render = _a[_i];
+                if (render.stage === Render_1.GLRenderStage.Background) {
+                    backgroundRenders.push(render.render);
                 }
-                var score = this._coefficients.panoPreferredDistance *
-                    Math.abs(potential.distance - this._settings.panoPreferredDistance) /
-                    this._settings.panoMaxDistance +
-                    this._coefficients.panoMotion * Math.abs(motionDifference) / maxRotationDifference +
-                    this._coefficients.panoSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                    this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
+                else if (render.stage === Render_1.GLRenderStage.Foreground) {
+                    foregroundRenders.push(render.render);
                 }
             }
-            if (edge != null) {
-                occupiedAngles.push(edge.motionChange);
-                panoEdges.push({
-                    data: {
-                        direction: Edge_1.EdgeDirection.Pano,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
+            var renderer = co.renderer.renderer;
+            renderer.clear();
+            for (var _b = 0, backgroundRenders_1 = backgroundRenders; _b < backgroundRenders_1.length; _b++) {
+                var render = backgroundRenders_1[_b];
+                render(perspectiveCamera, renderer);
             }
-            else {
-                stepAngles.push(rotation);
+            renderer.clearDepth();
+            for (var _c = 0, foregroundRenders_1 = foregroundRenders; _c < foregroundRenders_1.length; _c++) {
+                var render = foregroundRenders_1[_c];
+                render(perspectiveCamera, renderer);
             }
-        }
-        var occupiedStepAngles = {};
-        occupiedStepAngles[Edge_1.EdgeDirection.Pano] = occupiedAngles;
-        occupiedStepAngles[Edge_1.EdgeDirection.StepForward] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepLeft] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepBackward] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepRight] = [];
-        for (var _c = 0, stepAngles_1 = stepAngles; _c < stepAngles_1.length; _c++) {
-            var stepAngle = stepAngles_1[_c];
-            var occupations = [];
-            for (var k in this._directions.panos) {
-                if (!this._directions.panos.hasOwnProperty(k)) {
-                    continue;
-                }
-                var pano = this._directions.panos[k];
-                var allOccupiedAngles = occupiedStepAngles[Edge_1.EdgeDirection.Pano]
-                    .concat(occupiedStepAngles[pano.direction])
-                    .concat(occupiedStepAngles[pano.prev])
-                    .concat(occupiedStepAngles[pano.next]);
-                var lowestScore = Number.MAX_VALUE;
-                var edge = null;
-                for (var _d = 0, potentialSteps_1 = potentialSteps; _d < potentialSteps_1.length; _d++) {
-                    var potential = potentialSteps_1[_d];
-                    if (potential[0] !== pano.direction) {
-                        continue;
-                    }
-                    var motionChange = this._spatial.angleDifference(stepAngle, potential[1].motionChange);
-                    if (Math.abs(motionChange) > maxRotationDifference) {
-                        continue;
-                    }
-                    var minOccupiedDifference = Number.MAX_VALUE;
-                    for (var _e = 0, allOccupiedAngles_1 = allOccupiedAngles; _e < allOccupiedAngles_1.length; _e++) {
-                        var occupiedAngle = allOccupiedAngles_1[_e];
-                        var occupiedDifference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential[1].motionChange));
-                        if (occupiedDifference < minOccupiedDifference) {
-                            minOccupiedDifference = occupiedDifference;
-                        }
-                    }
-                    if (minOccupiedDifference <= maxRotationDifference) {
-                        continue;
-                    }
-                    var score = this._coefficients.panoPreferredDistance *
-                        Math.abs(potential[1].distance - this._settings.panoPreferredDistance) /
-                        this._settings.panoMaxDistance +
-                        this._coefficients.panoMotion * Math.abs(motionChange) / maxRotationDifference +
-                        this._coefficients.panoMergeCCPenalty * (potential[1].sameMergeCC ? 0 : 1);
-                    if (score < lowestScore) {
-                        lowestScore = score;
-                        edge = potential;
-                    }
+        });
+        this._renderFrame$.pipe(operators_1.map(function (rc) {
+            return function (irc) {
+                irc.frameId = rc.frameId;
+                irc.perspective = rc.perspective;
+                if (rc.changed === true) {
+                    irc.needsRender = true;
                 }
-                if (edge != null) {
-                    occupations.push(edge);
-                    panoEdges.push({
-                        data: {
-                            direction: edge[0],
-                            worldMotionAzimuth: edge[1].worldMotionAzimuth,
-                        },
-                        from: node.key,
-                        to: edge[1].key,
-                    });
+                return irc;
+            };
+        }))
+            .subscribe(this._renderCameraOperation$);
+        this._renderFrameSubscribe();
+        var renderHash$ = this._render$.pipe(operators_1.map(function (hash) {
+            return function (hashes) {
+                hashes[hash.name] = hash.render;
+                return hashes;
+            };
+        }));
+        var clearHash$ = this._clear$.pipe(operators_1.map(function (name) {
+            return function (hashes) {
+                delete hashes[name];
+                return hashes;
+            };
+        }));
+        rxjs_1.merge(renderHash$, clearHash$)
+            .subscribe(this._renderOperation$);
+        this._webGLRenderer$ = this._render$.pipe(operators_1.first(), operators_1.map(function (hash) {
+            var canvas = _this._dom.createElement("canvas", "mapillary-js-canvas");
+            canvas.style.position = "absolute";
+            canvas.setAttribute("tabindex", "0");
+            canvasContainer.appendChild(canvas);
+            var element = renderService.element;
+            var webGLRenderer = new THREE.WebGLRenderer({ canvas: canvas });
+            webGLRenderer.setPixelRatio(window.devicePixelRatio);
+            webGLRenderer.setSize(element.offsetWidth, element.offsetHeight);
+            webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0);
+            webGLRenderer.autoClear = false;
+            return webGLRenderer;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._webGLRenderer$.subscribe(function () { });
+        var createRenderer$ = this._webGLRenderer$.pipe(operators_1.first(), operators_1.map(function (webGLRenderer) {
+            return function (renderer) {
+                renderer.needsRender = true;
+                renderer.renderer = webGLRenderer;
+                return renderer;
+            };
+        }));
+        var resizeRenderer$ = this._renderService.size$.pipe(operators_1.map(function (size) {
+            return function (renderer) {
+                if (renderer.renderer == null) {
+                    return renderer;
                 }
+                renderer.renderer.setSize(size.width, size.height);
+                renderer.needsRender = true;
+                return renderer;
+            };
+        }));
+        var clearRenderer$ = this._clear$.pipe(operators_1.map(function (name) {
+            return function (renderer) {
+                if (renderer.renderer == null) {
+                    return renderer;
+                }
+                renderer.needsRender = true;
+                return renderer;
+            };
+        }));
+        rxjs_1.merge(createRenderer$, resizeRenderer$, clearRenderer$)
+            .subscribe(this._rendererOperation$);
+        var renderCollectionEmpty$ = this._renderCollection$.pipe(operators_1.filter(function (hashes) {
+            return Object.keys(hashes).length === 0;
+        }), operators_1.share());
+        renderCollectionEmpty$
+            .subscribe(function (hashes) {
+            if (_this._renderFrameSubscription == null) {
+                return;
             }
-            for (var _f = 0, occupations_1 = occupations; _f < occupations_1.length; _f++) {
-                var occupation = occupations_1[_f];
-                occupiedStepAngles[occupation[0]].push(occupation[1].motionChange);
-            }
-        }
-        return panoEdges;
-    };
-    return EdgeCalculator;
-}());
-exports.EdgeCalculator = EdgeCalculator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EdgeCalculator;
-
-},{"../../Edge":208,"../../Error":209,"../../Geo":210,"three":157}],290:[function(require,module,exports){
-"use strict";
-var EdgeCalculatorCoefficients = (function () {
-    function EdgeCalculatorCoefficients() {
-        this.panoPreferredDistance = 2;
-        this.panoMotion = 2;
-        this.panoSequencePenalty = 1;
-        this.panoMergeCCPenalty = 4;
-        this.stepPreferredDistance = 4;
-        this.stepMotion = 3;
-        this.stepRotation = 4;
-        this.stepSequencePenalty = 2;
-        this.stepMergeCCPenalty = 6;
-        this.similarDistance = 2;
-        this.similarRotation = 3;
-        this.turnDistance = 4;
-        this.turnMotion = 2;
-        this.turnSequencePenalty = 1;
-        this.turnMergeCCPenalty = 4;
+            _this._renderFrameSubscription.unsubscribe();
+            _this._renderFrameSubscription = null;
+            _this._renderFrameSubscribe();
+        });
+        renderCollectionEmpty$.pipe(operators_1.map(function (hashes) {
+            return function (eraser) {
+                eraser.needsRender = true;
+                return eraser;
+            };
+        }))
+            .subscribe(this._eraserOperation$);
     }
-    return EdgeCalculatorCoefficients;
+    Object.defineProperty(GLRenderer.prototype, "render$", {
+        get: function () {
+            return this._render$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(GLRenderer.prototype, "webGLRenderer$", {
+        get: function () {
+            return this._webGLRenderer$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    GLRenderer.prototype.clear = function (name) {
+        this._clear$.next(name);
+    };
+    GLRenderer.prototype._renderFrameSubscribe = function () {
+        var _this = this;
+        this._render$.pipe(operators_1.first(), operators_1.map(function (renderHash) {
+            return function (irc) {
+                irc.needsRender = true;
+                return irc;
+            };
+        }))
+            .subscribe(function (operation) {
+            _this._renderCameraOperation$.next(operation);
+        });
+        this._renderFrameSubscription = this._render$.pipe(operators_1.first(), operators_1.mergeMap(function (hash) {
+            return _this._renderService.renderCameraFrame$;
+        }))
+            .subscribe(this._renderFrame$);
+    };
+    return GLRenderer;
 }());
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EdgeCalculatorCoefficients;
+exports.GLRenderer = GLRenderer;
+exports.default = GLRenderer;
 
-},{}],291:[function(require,module,exports){
-"use strict";
-var Edge_1 = require("../../Edge");
-var EdgeCalculatorDirections = (function () {
-    function EdgeCalculatorDirections() {
-        this.steps = {};
-        this.turns = {};
-        this.panos = {};
-        this.steps[Edge_1.EdgeDirection.StepForward] = {
-            direction: Edge_1.EdgeDirection.StepForward,
-            motionChange: 0,
-            useFallback: true,
-        };
-        this.steps[Edge_1.EdgeDirection.StepBackward] = {
-            direction: Edge_1.EdgeDirection.StepBackward,
-            motionChange: Math.PI,
-            useFallback: true,
-        };
-        this.steps[Edge_1.EdgeDirection.StepLeft] = {
-            direction: Edge_1.EdgeDirection.StepLeft,
-            motionChange: Math.PI / 2,
-            useFallback: false,
-        };
-        this.steps[Edge_1.EdgeDirection.StepRight] = {
-            direction: Edge_1.EdgeDirection.StepRight,
-            motionChange: -Math.PI / 2,
-            useFallback: false,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnLeft] = {
-            direction: Edge_1.EdgeDirection.TurnLeft,
-            directionChange: Math.PI / 2,
-            motionChange: Math.PI / 4,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnRight] = {
-            direction: Edge_1.EdgeDirection.TurnRight,
-            directionChange: -Math.PI / 2,
-            motionChange: -Math.PI / 4,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnU] = {
-            direction: Edge_1.EdgeDirection.TurnU,
-            directionChange: Math.PI,
-            motionChange: null,
-        };
-        this.panos[Edge_1.EdgeDirection.StepForward] = {
-            direction: Edge_1.EdgeDirection.StepForward,
-            directionChange: 0,
-            next: Edge_1.EdgeDirection.StepLeft,
-            prev: Edge_1.EdgeDirection.StepRight,
-        };
-        this.panos[Edge_1.EdgeDirection.StepBackward] = {
-            direction: Edge_1.EdgeDirection.StepBackward,
-            directionChange: Math.PI,
-            next: Edge_1.EdgeDirection.StepRight,
-            prev: Edge_1.EdgeDirection.StepLeft,
-        };
-        this.panos[Edge_1.EdgeDirection.StepLeft] = {
-            direction: Edge_1.EdgeDirection.StepLeft,
-            directionChange: Math.PI / 2,
-            next: Edge_1.EdgeDirection.StepBackward,
-            prev: Edge_1.EdgeDirection.StepForward,
-        };
-        this.panos[Edge_1.EdgeDirection.StepRight] = {
-            direction: Edge_1.EdgeDirection.StepRight,
-            directionChange: -Math.PI / 2,
-            next: Edge_1.EdgeDirection.StepForward,
-            prev: Edge_1.EdgeDirection.StepBackward,
-        };
-    }
-    return EdgeCalculatorDirections;
-}());
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections;
 
-},{"../../Edge":208}],292:[function(require,module,exports){
+},{"../Render":297,"../Utils":301,"rxjs":43,"rxjs/operators":241,"three":242}],443:[function(require,module,exports){
 "use strict";
-var EdgeCalculatorSettings = (function () {
-    function EdgeCalculatorSettings() {
-        this.panoMinDistance = 0.1;
-        this.panoMaxDistance = 20;
-        this.panoPreferredDistance = 5;
-        this.panoMaxItems = 4;
-        this.panoMaxStepTurnChange = Math.PI / 8;
-        this.rotationMaxDistance = this.turnMaxRigDistance;
-        this.rotationMaxDirectionChange = Math.PI / 6;
-        this.rotationMaxVerticalDirectionChange = Math.PI / 8;
-        this.similarMaxDirectionChange = Math.PI / 8;
-        this.similarMaxDistance = 12;
-        this.similarMinTimeDifference = 12 * 3600 * 1000;
-        this.stepMaxDistance = 20;
-        this.stepMaxDirectionChange = Math.PI / 6;
-        this.stepMaxDrift = Math.PI / 6;
-        this.stepPreferredDistance = 4;
-        this.turnMaxDistance = 15;
-        this.turnMaxDirectionChange = 2 * Math.PI / 9;
-        this.turnMaxRigDistance = 0.65;
-        this.turnMinRigDirectionChange = Math.PI / 6;
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderCamera = void 0;
+var THREE = require("three");
+var Geo_1 = require("../Geo");
+var Render_1 = require("../Render");
+var State_1 = require("../State");
+var RenderCamera = /** @class */ (function () {
+    function RenderCamera(elementWidth, elementHeight, renderMode) {
+        this._spatial = new Geo_1.Spatial();
+        this._viewportCoords = new Geo_1.ViewportCoords();
+        this._initialFov = 50;
+        this._alpha = -1;
+        this._renderMode = renderMode;
+        this._zoom = 0;
+        this._frameId = -1;
+        this._changed = false;
+        this._changedForFrame = -1;
+        this._currentNodeId = null;
+        this._previousNodeId = null;
+        this._currentPano = false;
+        this._previousPano = false;
+        this._state = null;
+        this._currentProjectedPoints = [];
+        this._previousProjectedPoints = [];
+        this._currentFov = this._initialFov;
+        this._previousFov = this._initialFov;
+        this._camera = new Geo_1.Camera();
+        this._perspective = new THREE.PerspectiveCamera(this._initialFov, this._computeAspect(elementWidth, elementHeight), 0.16, 10000);
+        this._perspective.matrixAutoUpdate = false;
+        this._rotation = { phi: 0, theta: 0 };
     }
-    Object.defineProperty(EdgeCalculatorSettings.prototype, "maxDistance", {
+    Object.defineProperty(RenderCamera.prototype, "alpha", {
         get: function () {
-            return Math.max(this.panoMaxDistance, this.similarMaxDistance, this.stepMaxDistance, this.turnMaxDistance);
+            return this._alpha;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return EdgeCalculatorSettings;
+    Object.defineProperty(RenderCamera.prototype, "camera", {
+        get: function () {
+            return this._camera;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "changed", {
+        get: function () {
+            return this._frameId === this._changedForFrame;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "frameId", {
+        get: function () {
+            return this._frameId;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "perspective", {
+        get: function () {
+            return this._perspective;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "renderMode", {
+        get: function () {
+            return this._renderMode;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "rotation", {
+        get: function () {
+            return this._rotation;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "zoom", {
+        get: function () {
+            return this._zoom;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    RenderCamera.prototype.getTilt = function () {
+        return 90 - this._spatial.radToDeg(this._rotation.theta);
+    };
+    RenderCamera.prototype.fovToZoom = function (fov) {
+        fov = Math.min(90, Math.max(0, fov));
+        var currentFov = this._computeCurrentFov(0);
+        var actualFov = this._alpha === 1 ?
+            currentFov :
+            this._interpolateFov(currentFov, this._computePreviousFov(0), this._alpha);
+        var y0 = Math.tan(actualFov / 2 * Math.PI / 180);
+        var y1 = Math.tan(fov / 2 * Math.PI / 180);
+        var zoom = Math.log(y0 / y1) / Math.log(2);
+        return zoom;
+    };
+    RenderCamera.prototype.setFrame = function (frame) {
+        var state = frame.state;
+        if (state.state !== this._state) {
+            this._state = state.state;
+            this._changed = true;
+        }
+        var currentNodeId = state.currentNode.key;
+        var previousNodeId = !!state.previousNode ? state.previousNode.key : null;
+        if (currentNodeId !== this._currentNodeId) {
+            this._currentNodeId = currentNodeId;
+            this._currentPano = !!state.currentTransform.gpano;
+            this._currentProjectedPoints = this._computeProjectedPoints(state.currentTransform);
+            this._changed = true;
+        }
+        if (previousNodeId !== this._previousNodeId) {
+            this._previousNodeId = previousNodeId;
+            this._previousPano = !!state.previousTransform.gpano;
+            this._previousProjectedPoints = this._computeProjectedPoints(state.previousTransform);
+            this._changed = true;
+        }
+        var zoom = state.zoom;
+        if (zoom !== this._zoom) {
+            this._zoom = zoom;
+            this._changed = true;
+        }
+        if (this._changed) {
+            this._currentFov = this._computeCurrentFov(this.zoom);
+            this._previousFov = this._computePreviousFov(this._zoom);
+        }
+        var alpha = state.alpha;
+        if (this._changed || alpha !== this._alpha) {
+            this._alpha = alpha;
+            this._perspective.fov = this._state === State_1.State.Earth ?
+                60 :
+                this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
+            this._changed = true;
+        }
+        var camera = state.camera;
+        if (this._camera.diff(camera) > 1e-9) {
+            this._camera.copy(camera);
+            this._rotation = this._computeRotation(camera);
+            this._perspective.up.copy(camera.up);
+            this._perspective.position.copy(camera.position);
+            // Workaround for shaking camera
+            this._perspective.matrixAutoUpdate = true;
+            this._perspective.lookAt(camera.lookat);
+            this._perspective.matrixAutoUpdate = false;
+            this._perspective.updateMatrix();
+            this._perspective.updateMatrixWorld(false);
+            this._changed = true;
+        }
+        if (this._changed) {
+            this._perspective.updateProjectionMatrix();
+        }
+        this._setFrameId(frame.id);
+    };
+    RenderCamera.prototype.setRenderMode = function (renderMode) {
+        this._renderMode = renderMode;
+        this._perspective.fov = this._computeFov();
+        this._perspective.updateProjectionMatrix();
+        this._changed = true;
+    };
+    RenderCamera.prototype.setSize = function (size) {
+        this._perspective.aspect = this._computeAspect(size.width, size.height);
+        this._perspective.fov = this._computeFov();
+        this._perspective.updateProjectionMatrix();
+        this._changed = true;
+    };
+    RenderCamera.prototype._computeAspect = function (elementWidth, elementHeight) {
+        return elementWidth === 0 ? 0 : elementWidth / elementHeight;
+    };
+    RenderCamera.prototype._computeCurrentFov = function (zoom) {
+        if (this._perspective.aspect === 0) {
+            return 0;
+        }
+        if (!this._currentNodeId) {
+            return this._initialFov;
+        }
+        return this._currentPano ?
+            this._yToFov(1, zoom) :
+            this._computeVerticalFov(this._currentProjectedPoints, this._renderMode, zoom, this.perspective.aspect);
+    };
+    RenderCamera.prototype._computeFov = function () {
+        this._currentFov = this._computeCurrentFov(this._zoom);
+        this._previousFov = this._computePreviousFov(this._zoom);
+        return this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
+    };
+    RenderCamera.prototype._computePreviousFov = function (zoom) {
+        if (this._perspective.aspect === 0) {
+            return 0;
+        }
+        if (!this._currentNodeId) {
+            return this._initialFov;
+        }
+        return !this._previousNodeId ?
+            this._currentFov :
+            this._previousPano ?
+                this._yToFov(1, zoom) :
+                this._computeVerticalFov(this._previousProjectedPoints, this._renderMode, zoom, this.perspective.aspect);
+    };
+    RenderCamera.prototype._computeProjectedPoints = function (transform) {
+        var vertices = [[0.5, 0], [1, 0]];
+        var directions = [[0.5, 0], [0, 0.5]];
+        var pointsPerLine = 100;
+        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
+    };
+    RenderCamera.prototype._computeRequiredVerticalFov = function (projectedPoint, zoom, aspect) {
+        var maxY = Math.max(projectedPoint[0] / aspect, projectedPoint[1]);
+        return this._yToFov(maxY, zoom);
+    };
+    RenderCamera.prototype._computeRotation = function (camera) {
+        var direction = camera.lookat.clone().sub(camera.position);
+        var up = camera.up.clone();
+        var phi = this._spatial.azimuthal(direction.toArray(), up.toArray());
+        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
+        return { phi: phi, theta: theta };
+    };
+    RenderCamera.prototype._computeVerticalFov = function (projectedPoints, renderMode, zoom, aspect) {
+        var _this = this;
+        var fovs = projectedPoints
+            .map(function (projectedPoint) {
+            return _this._computeRequiredVerticalFov(projectedPoint, zoom, aspect);
+        });
+        var fov = renderMode === Render_1.RenderMode.Fill ?
+            Math.min.apply(Math, fovs) * 0.995 : Math.max.apply(Math, fovs);
+        return fov;
+    };
+    RenderCamera.prototype._yToFov = function (y, zoom) {
+        return 2 * Math.atan(y / Math.pow(2, zoom)) * 180 / Math.PI;
+    };
+    RenderCamera.prototype._interpolateFov = function (v1, v2, alpha) {
+        return alpha * v1 + (1 - alpha) * v2;
+    };
+    RenderCamera.prototype._setFrameId = function (frameId) {
+        this._frameId = frameId;
+        if (this._changed) {
+            this._changed = false;
+            this._changedForFrame = frameId;
+        }
+    };
+    return RenderCamera;
 }());
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EdgeCalculatorSettings;
+exports.RenderCamera = RenderCamera;
+exports.default = RenderCamera;
 
-},{}],293:[function(require,module,exports){
+},{"../Geo":294,"../Render":297,"../State":298,"three":242}],444:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderMode = void 0;
 /**
- * Enumeration for edge directions
+ * Enumeration for render mode
  * @enum {number}
  * @readonly
- * @description Directions for edges in node graph describing
- * sequence, spatial and node type relations between nodes.
+ * @description Modes for specifying how rendering is done
+ * in the viewer. All modes preserves the original aspect
+ * ratio of the images.
  */
-(function (EdgeDirection) {
-    /**
-     * Next node in the sequence.
-     */
-    EdgeDirection[EdgeDirection["Next"] = 0] = "Next";
-    /**
-     * Previous node in the sequence.
-     */
-    EdgeDirection[EdgeDirection["Prev"] = 1] = "Prev";
-    /**
-     * Step to the left keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepLeft"] = 2] = "StepLeft";
-    /**
-     * Step to the right keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepRight"] = 3] = "StepRight";
-    /**
-     * Step forward keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepForward"] = 4] = "StepForward";
-    /**
-     * Step backward keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepBackward"] = 5] = "StepBackward";
-    /**
-     * Turn 90 degrees counter clockwise.
-     */
-    EdgeDirection[EdgeDirection["TurnLeft"] = 6] = "TurnLeft";
-    /**
-     * Turn 90 degrees clockwise.
-     */
-    EdgeDirection[EdgeDirection["TurnRight"] = 7] = "TurnRight";
-    /**
-     * Turn 180 degrees.
-     */
-    EdgeDirection[EdgeDirection["TurnU"] = 8] = "TurnU";
+var RenderMode;
+(function (RenderMode) {
     /**
-     * Panorama in general direction.
+     * Displays all content within the viewer.
+     *
+     * @description Black bars shown on both
+     * sides of the content. Bars are shown
+     * either below and above or to the left
+     * and right of the content depending on
+     * the aspect ratio relation between the
+     * image and the viewer.
      */
-    EdgeDirection[EdgeDirection["Pano"] = 9] = "Pano";
+    RenderMode[RenderMode["Letterbox"] = 0] = "Letterbox";
     /**
-     * Looking in roughly the same direction at rougly the same position.
+     * Fills the viewer by cropping content.
+     *
+     * @description Cropping is done either
+     * in horizontal or vertical direction
+     * depending on the aspect ratio relation
+     * between the image and the viewer.
      */
-    EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar";
-})(exports.EdgeDirection || (exports.EdgeDirection = {}));
-var EdgeDirection = exports.EdgeDirection;
-;
+    RenderMode[RenderMode["Fill"] = 1] = "Fill";
+})(RenderMode = exports.RenderMode || (exports.RenderMode = {}));
+exports.default = RenderMode;
 
-},{}],294:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{}],445:[function(require,module,exports){
 "use strict";
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pluck");
-require("rxjs/add/operator/scan");
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderService = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../Geo");
 var Render_1 = require("../Render");
-var DOMRenderer = (function () {
-    function DOMRenderer(element, renderService, currentFrame$) {
-        this._adaptiveOperation$ = new Subject_1.Subject();
-        this._render$ = new Subject_1.Subject();
-        this._renderAdaptive$ = new Subject_1.Subject();
-        this._renderService = renderService;
+var RenderService = /** @class */ (function () {
+    function RenderService(element, currentFrame$, renderMode, renderCamera) {
+        var _this = this;
+        this._element = element;
         this._currentFrame$ = currentFrame$;
-        var rootNode = vd.create(vd.h("div.domRenderer", []));
-        element.appendChild(rootNode);
-        this._offset$ = this._adaptiveOperation$
-            .scan(function (adaptive, operation) {
-            return operation(adaptive);
-        }, {
-            elementHeight: element.offsetHeight,
-            elementWidth: element.offsetWidth,
-            imageAspect: 0,
-            renderMode: Render_1.RenderMode.Fill,
-        })
-            .filter(function (adaptive) {
-            return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0;
-        })
-            .map(function (adaptive) {
-            var elementAspect = adaptive.elementWidth / adaptive.elementHeight;
-            var ratio = adaptive.imageAspect / elementAspect;
-            var verticalOffset = 0;
-            var horizontalOffset = 0;
-            if (adaptive.renderMode === Render_1.RenderMode.Letterbox) {
-                if (adaptive.imageAspect > elementAspect) {
-                    verticalOffset = adaptive.elementHeight * (1 - 1 / ratio) / 2;
-                }
-                else {
-                    horizontalOffset = adaptive.elementWidth * (1 - ratio) / 2;
-                }
-            }
-            else {
-                if (adaptive.imageAspect > elementAspect) {
-                    horizontalOffset = -adaptive.elementWidth * (ratio - 1) / 2;
-                }
-                else {
-                    verticalOffset = -adaptive.elementHeight * (1 / ratio - 1) / 2;
-                }
-            }
-            return {
-                bottom: verticalOffset,
-                left: horizontalOffset,
-                right: horizontalOffset,
-                top: verticalOffset,
+        this._spatial = new Geo_1.Spatial();
+        renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill;
+        this._resize$ = new rxjs_1.Subject();
+        this._renderCameraOperation$ = new rxjs_1.Subject();
+        this._size$ =
+            new rxjs_1.BehaviorSubject({
+                height: this._element.offsetHeight,
+                width: this._element.offsetWidth,
+            });
+        this._resize$.pipe(operators_1.map(function () {
+            return { height: _this._element.offsetHeight, width: _this._element.offsetWidth };
+        }))
+            .subscribe(this._size$);
+        this._renderMode$ = new rxjs_1.BehaviorSubject(renderMode);
+        this._renderCameraHolder$ = this._renderCameraOperation$.pipe(operators_1.startWith(function (rc) {
+            return rc;
+        }), operators_1.scan(function (rc, operation) {
+            return operation(rc);
+        }, !!renderCamera ? renderCamera : new Render_1.RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode)), operators_1.publishReplay(1), operators_1.refCount());
+        this._renderCameraFrame$ = this._currentFrame$.pipe(operators_1.withLatestFrom(this._renderCameraHolder$), operators_1.tap(function (_a) {
+            var frame = _a[0], rc = _a[1];
+            rc.setFrame(frame);
+        }), operators_1.map(function (args) {
+            return args[1];
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._renderCamera$ = this._renderCameraFrame$.pipe(operators_1.filter(function (rc) {
+            return rc.changed;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._bearing$ = this._renderCamera$.pipe(operators_1.map(function (rc) {
+            var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(rc.rotation.phi));
+            return _this._spatial.wrap(bearing, 0, 360);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._size$.pipe(operators_1.skip(1), operators_1.map(function (size) {
+            return function (rc) {
+                rc.setSize(size);
+                return rc;
+            };
+        }))
+            .subscribe(this._renderCameraOperation$);
+        this._renderMode$.pipe(operators_1.skip(1), operators_1.map(function (rm) {
+            return function (rc) {
+                rc.setRenderMode(rm);
+                return rc;
             };
+        }))
+            .subscribe(this._renderCameraOperation$);
+        this._bearing$.subscribe(function () { });
+        this._renderCameraHolder$.subscribe(function () { });
+        this._size$.subscribe(function () { });
+        this._renderMode$.subscribe(function () { });
+        this._renderCamera$.subscribe(function () { });
+        this._renderCameraFrame$.subscribe(function () { });
+    }
+    Object.defineProperty(RenderService.prototype, "bearing$", {
+        get: function () {
+            return this._bearing$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderService.prototype, "element", {
+        get: function () {
+            return this._element;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderService.prototype, "resize$", {
+        get: function () {
+            return this._resize$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderService.prototype, "size$", {
+        get: function () {
+            return this._size$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderService.prototype, "renderMode$", {
+        get: function () {
+            return this._renderMode$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderService.prototype, "renderCameraFrame$", {
+        get: function () {
+            return this._renderCameraFrame$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderService.prototype, "renderCamera$", {
+        get: function () {
+            return this._renderCamera$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return RenderService;
+}());
+exports.RenderService = RenderService;
+exports.default = RenderService;
+
+
+},{"../Geo":294,"../Render":297,"rxjs":43,"rxjs/operators":241}],446:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],447:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FrameGenerator = void 0;
+var FrameGenerator = /** @class */ (function () {
+    function FrameGenerator(root) {
+        if (root.requestAnimationFrame) {
+            this._cancelAnimationFrame = root.cancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.requestAnimationFrame.bind(root);
+        }
+        else if (root.mozRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.mozRequestAnimationFrame.bind(root);
+        }
+        else if (root.webkitRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root);
+        }
+        else if (root.msRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.msCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.msRequestAnimationFrame.bind(root);
+        }
+        else if (root.oRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.oCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.oRequestAnimationFrame.bind(root);
+        }
+        else {
+            this._cancelAnimationFrame = root.clearTimeout.bind(root);
+            this._requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); };
+        }
+    }
+    Object.defineProperty(FrameGenerator.prototype, "cancelAnimationFrame", {
+        get: function () {
+            return this._cancelAnimationFrame;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(FrameGenerator.prototype, "requestAnimationFrame", {
+        get: function () {
+            return this._requestAnimationFrame;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return FrameGenerator;
+}());
+exports.FrameGenerator = FrameGenerator;
+exports.default = FrameGenerator;
+
+},{}],448:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RotationDelta = void 0;
+var RotationDelta = /** @class */ (function () {
+    function RotationDelta(phi, theta) {
+        this._phi = phi;
+        this._theta = theta;
+    }
+    Object.defineProperty(RotationDelta.prototype, "phi", {
+        get: function () {
+            return this._phi;
+        },
+        set: function (value) {
+            this._phi = value;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RotationDelta.prototype, "theta", {
+        get: function () {
+            return this._theta;
+        },
+        set: function (value) {
+            this._theta = value;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RotationDelta.prototype, "isZero", {
+        get: function () {
+            return this._phi === 0 && this._theta === 0;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    RotationDelta.prototype.copy = function (delta) {
+        this._phi = delta.phi;
+        this._theta = delta.theta;
+    };
+    RotationDelta.prototype.lerp = function (other, alpha) {
+        this._phi = (1 - alpha) * this._phi + alpha * other.phi;
+        this._theta = (1 - alpha) * this._theta + alpha * other.theta;
+    };
+    RotationDelta.prototype.multiply = function (value) {
+        this._phi *= value;
+        this._theta *= value;
+    };
+    RotationDelta.prototype.threshold = function (value) {
+        this._phi = Math.abs(this._phi) > value ? this._phi : 0;
+        this._theta = Math.abs(this._theta) > value ? this._theta : 0;
+    };
+    RotationDelta.prototype.lengthSquared = function () {
+        return this._phi * this._phi + this._theta * this._theta;
+    };
+    RotationDelta.prototype.reset = function () {
+        this._phi = 0;
+        this._theta = 0;
+    };
+    return RotationDelta;
+}());
+exports.RotationDelta = RotationDelta;
+exports.default = RotationDelta;
+
+},{}],449:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.State = void 0;
+var State;
+(function (State) {
+    State[State["Earth"] = 0] = "Earth";
+    State[State["Traversing"] = 1] = "Traversing";
+    State[State["Waiting"] = 2] = "Waiting";
+    State[State["WaitingInteractively"] = 3] = "WaitingInteractively";
+})(State = exports.State || (exports.State = {}));
+exports.default = State;
+
+},{}],450:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.StateContext = void 0;
+var State_1 = require("../State");
+var Geo_1 = require("../Geo");
+var StateContext = /** @class */ (function () {
+    function StateContext(transitionMode) {
+        this._state = new State_1.TraversingState({
+            alpha: 1,
+            camera: new Geo_1.Camera(),
+            currentIndex: -1,
+            reference: { alt: 0, lat: 0, lon: 0 },
+            trajectory: [],
+            transitionMode: transitionMode == null ? State_1.TransitionMode.Default : transitionMode,
+            zoom: 0,
         });
-        this._currentFrame$
-            .filter(function (frame) {
-            return frame.state.currentNode != null;
-        })
-            .distinctUntilChanged(function (k1, k2) {
-            return k1 === k2;
-        }, function (frame) {
-            return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
-            return frame.state.currentTransform.basicAspect;
-        })
-            .map(function (aspect) {
-            return function (adaptive) {
-                adaptive.imageAspect = aspect;
-                return adaptive;
-            };
-        })
-            .subscribe(this._adaptiveOperation$);
-        this._renderAdaptive$
-            .scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
+    }
+    Object.defineProperty(StateContext.prototype, "state", {
+        get: function () {
+            if (this._state instanceof State_1.EarthState) {
+                return State_1.State.Earth;
             }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
+            else if (this._state instanceof State_1.TraversingState) {
+                return State_1.State.Traversing;
             }
-            return vNodeHashes;
-        }, {})
-            .combineLatest(this._offset$)
-            .map(function (vo) {
-            var vNodes = _.values(vo[0]);
-            var offset = vo[1];
-            var properties = {
-                style: {
-                    bottom: offset.bottom + "px",
-                    left: offset.left + "px",
-                    position: "absolute",
-                    right: offset.right + "px",
-                    top: offset.top + "px",
-                    zIndex: -1,
-                },
-            };
-            return {
-                name: "adaptiveDomRenderer",
-                vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes),
-            };
-        })
-            .subscribe(this._render$);
-        this._vNode$ = this._render$
-            .scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
+            else if (this._state instanceof State_1.WaitingState) {
+                return State_1.State.Waiting;
             }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
+            else if (this._state instanceof State_1.InteractiveWaitingState) {
+                return State_1.State.WaitingInteractively;
             }
-            return vNodeHashes;
-        }, {})
-            .map(function (vNodeHashes) {
-            var vNodes = _.values(vNodeHashes);
-            return vd.h("div.domRenderer", vNodes);
-        });
-        this._vPatch$ = this._vNode$
-            .scan(function (nodePatch, vNode) {
-            nodePatch.vpatch = vd.diff(nodePatch.vnode, vNode);
-            nodePatch.vnode = vNode;
-            return nodePatch;
-        }, { vnode: vd.h("div.domRenderer", []), vpatch: null })
-            .pluck("vpatch");
-        this._element$ = this._vPatch$
-            .scan(function (oldElement, vPatch) {
-            return vd.patch(oldElement, vPatch);
-        }, rootNode)
-            .publishReplay(1)
-            .refCount();
-        this._element$.subscribe();
-        this._renderService.size$
-            .map(function (size) {
-            return function (adaptive) {
-                adaptive.elementWidth = size.width;
-                adaptive.elementHeight = size.height;
-                return adaptive;
-            };
-        })
-            .subscribe(this._adaptiveOperation$);
-        this._renderService.renderMode$
-            .map(function (renderMode) {
-            return function (adaptive) {
-                adaptive.renderMode = renderMode;
-                return adaptive;
+            throw new Error("Invalid state");
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "reference", {
+        get: function () {
+            return this._state.reference;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "alpha", {
+        get: function () {
+            return this._state.alpha;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "camera", {
+        get: function () {
+            return this._state.camera;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "zoom", {
+        get: function () {
+            return this._state.zoom;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "currentNode", {
+        get: function () {
+            return this._state.currentNode;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "previousNode", {
+        get: function () {
+            return this._state.previousNode;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "currentCamera", {
+        get: function () {
+            return this._state.currentCamera;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "currentTransform", {
+        get: function () {
+            return this._state.currentTransform;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "previousTransform", {
+        get: function () {
+            return this._state.previousTransform;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "trajectory", {
+        get: function () {
+            return this._state.trajectory;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "currentIndex", {
+        get: function () {
+            return this._state.currentIndex;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "lastNode", {
+        get: function () {
+            return this._state.trajectory[this._state.trajectory.length - 1];
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "nodesAhead", {
+        get: function () {
+            return this._state.trajectory.length - 1 - this._state.currentIndex;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateContext.prototype, "motionless", {
+        get: function () {
+            return this._state.motionless;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    StateContext.prototype.earth = function () {
+        this._state = this._state.earth();
+    };
+    StateContext.prototype.traverse = function () {
+        this._state = this._state.traverse();
+    };
+    StateContext.prototype.wait = function () {
+        this._state = this._state.wait();
+    };
+    StateContext.prototype.waitInteractively = function () {
+        this._state = this._state.waitInteractively();
+    };
+    StateContext.prototype.getCenter = function () {
+        return this._state.getCenter();
+    };
+    StateContext.prototype.setCenter = function (center) {
+        this._state.setCenter(center);
+    };
+    StateContext.prototype.setZoom = function (zoom) {
+        this._state.setZoom(zoom);
+    };
+    StateContext.prototype.update = function (fps) {
+        this._state.update(fps);
+    };
+    StateContext.prototype.append = function (nodes) {
+        this._state.append(nodes);
+    };
+    StateContext.prototype.prepend = function (nodes) {
+        this._state.prepend(nodes);
+    };
+    StateContext.prototype.remove = function (n) {
+        this._state.remove(n);
+    };
+    StateContext.prototype.clear = function () {
+        this._state.clear();
+    };
+    StateContext.prototype.clearPrior = function () {
+        this._state.clearPrior();
+    };
+    StateContext.prototype.cut = function () {
+        this._state.cut();
+    };
+    StateContext.prototype.set = function (nodes) {
+        this._state.set(nodes);
+    };
+    StateContext.prototype.rotate = function (delta) {
+        this._state.rotate(delta);
+    };
+    StateContext.prototype.rotateUnbounded = function (delta) {
+        this._state.rotateUnbounded(delta);
+    };
+    StateContext.prototype.rotateWithoutInertia = function (delta) {
+        this._state.rotateWithoutInertia(delta);
+    };
+    StateContext.prototype.rotateBasic = function (basicRotation) {
+        this._state.rotateBasic(basicRotation);
+    };
+    StateContext.prototype.rotateBasicUnbounded = function (basicRotation) {
+        this._state.rotateBasicUnbounded(basicRotation);
+    };
+    StateContext.prototype.rotateBasicWithoutInertia = function (basicRotation) {
+        this._state.rotateBasicWithoutInertia(basicRotation);
+    };
+    StateContext.prototype.rotateToBasic = function (basic) {
+        this._state.rotateToBasic(basic);
+    };
+    StateContext.prototype.move = function (delta) {
+        this._state.move(delta);
+    };
+    StateContext.prototype.moveTo = function (delta) {
+        this._state.moveTo(delta);
+    };
+    StateContext.prototype.zoomIn = function (delta, reference) {
+        this._state.zoomIn(delta, reference);
+    };
+    StateContext.prototype.setSpeed = function (speed) {
+        this._state.setSpeed(speed);
+    };
+    StateContext.prototype.setTransitionMode = function (mode) {
+        this._state.setTransitionMode(mode);
+    };
+    StateContext.prototype.dolly = function (delta) {
+        this._state.dolly(delta);
+    };
+    StateContext.prototype.orbit = function (rotation) {
+        this._state.orbit(rotation);
+    };
+    StateContext.prototype.truck = function (direction) {
+        this._state.truck(direction);
+    };
+    return StateContext;
+}());
+exports.StateContext = StateContext;
+
+},{"../Geo":294,"../State":298}],451:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.StateService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var State_1 = require("../State");
+var StateService = /** @class */ (function () {
+    function StateService(transitionMode) {
+        var _this = this;
+        this._appendNode$ = new rxjs_1.Subject();
+        this._start$ = new rxjs_1.Subject();
+        this._frame$ = new rxjs_1.Subject();
+        this._fpsSampleRate = 30;
+        this._contextOperation$ = new rxjs_1.BehaviorSubject(function (context) {
+            return context;
+        });
+        this._context$ = this._contextOperation$.pipe(operators_1.scan(function (context, operation) {
+            return operation(context);
+        }, new State_1.StateContext(transitionMode)), operators_1.publishReplay(1), operators_1.refCount());
+        this._state$ = this._context$.pipe(operators_1.map(function (context) {
+            return context.state;
+        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._fps$ = this._start$.pipe(operators_1.switchMap(function () {
+            return _this._frame$.pipe(operators_1.bufferCount(1, _this._fpsSampleRate), operators_1.map(function (frameIds) {
+                return new Date().getTime();
+            }), operators_1.pairwise(), operators_1.map(function (times) {
+                return Math.max(20, 1000 * _this._fpsSampleRate / (times[1] - times[0]));
+            }), operators_1.startWith(60));
+        }), operators_1.share());
+        this._currentState$ = this._frame$.pipe(operators_1.withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
+            return [frameId, fps, context];
+        }), operators_1.filter(function (fc) {
+            return fc[2].currentNode != null;
+        }), operators_1.tap(function (fc) {
+            fc[2].update(fc[1]);
+        }), operators_1.map(function (fc) {
+            return { fps: fc[1], id: fc[0], state: fc[2] };
+        }), operators_1.share());
+        this._lastState$ = this._currentState$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        var nodeChanged$ = this._currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (f) {
+            return f.state.currentNode.key;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var nodeChangedSubject$ = new rxjs_1.Subject();
+        nodeChanged$
+            .subscribe(nodeChangedSubject$);
+        this._currentKey$ = new rxjs_1.BehaviorSubject(null);
+        nodeChangedSubject$.pipe(operators_1.map(function (f) {
+            return f.state.currentNode.key;
+        }))
+            .subscribe(this._currentKey$);
+        this._currentNode$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
+            return f.state.currentNode;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._currentCamera$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
+            return f.state.currentCamera;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._currentTransform$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
+            return f.state.currentTransform;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._reference$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
+            return f.state.reference;
+        }), operators_1.distinctUntilChanged(function (r1, r2) {
+            return r1.lat === r2.lat && r1.lon === r2.lon;
+        }, function (reference) {
+            return { lat: reference.lat, lon: reference.lon };
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._currentNodeExternal$ = nodeChanged$.pipe(operators_1.map(function (f) {
+            return f.state.currentNode;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._appendNode$.pipe(operators_1.map(function (node) {
+            return function (context) {
+                context.append([node]);
+                return context;
             };
-        })
-            .subscribe(this._adaptiveOperation$);
+        }))
+            .subscribe(this._contextOperation$);
+        this._inMotionOperation$ = new rxjs_1.Subject();
+        nodeChanged$.pipe(operators_1.map(function (frame) {
+            return true;
+        }))
+            .subscribe(this._inMotionOperation$);
+        this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (moving) {
+            return moving;
+        }), operators_1.switchMap(function (moving) {
+            return _this._currentState$.pipe(operators_1.filter(function (frame) {
+                return frame.state.nodesAhead === 0;
+            }), operators_1.map(function (frame) {
+                return [frame.state.camera.clone(), frame.state.zoom];
+            }), operators_1.pairwise(), operators_1.map(function (pair) {
+                var c1 = pair[0][0];
+                var c2 = pair[1][0];
+                var z1 = pair[0][1];
+                var z2 = pair[1][1];
+                return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;
+            }), operators_1.first(function (changed) {
+                return !changed;
+            }));
+        }))
+            .subscribe(this._inMotionOperation$);
+        this._inMotion$ = this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._inTranslationOperation$ = new rxjs_1.Subject();
+        nodeChanged$.pipe(operators_1.map(function (frame) {
+            return true;
+        }))
+            .subscribe(this._inTranslationOperation$);
+        this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (inTranslation) {
+            return inTranslation;
+        }), operators_1.switchMap(function (inTranslation) {
+            return _this._currentState$.pipe(operators_1.filter(function (frame) {
+                return frame.state.nodesAhead === 0;
+            }), operators_1.map(function (frame) {
+                return frame.state.camera.position.clone();
+            }), operators_1.pairwise(), operators_1.map(function (pair) {
+                return pair[0].distanceToSquared(pair[1]) !== 0;
+            }), operators_1.first(function (changed) {
+                return !changed;
+            }));
+        }))
+            .subscribe(this._inTranslationOperation$);
+        this._inTranslation$ = this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._state$.subscribe(function () { });
+        this._currentNode$.subscribe(function () { });
+        this._currentCamera$.subscribe(function () { });
+        this._currentTransform$.subscribe(function () { });
+        this._reference$.subscribe(function () { });
+        this._currentNodeExternal$.subscribe(function () { });
+        this._lastState$.subscribe(function () { });
+        this._inMotion$.subscribe(function () { });
+        this._inTranslation$.subscribe(function () { });
+        this._frameId = null;
+        this._frameGenerator = new State_1.FrameGenerator(window);
     }
-    Object.defineProperty(DOMRenderer.prototype, "element$", {
+    Object.defineProperty(StateService.prototype, "currentState$", {
         get: function () {
-            return this._element$;
+            return this._currentState$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DOMRenderer.prototype, "render$", {
+    Object.defineProperty(StateService.prototype, "currentNode$", {
         get: function () {
-            return this._render$;
+            return this._currentNode$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DOMRenderer.prototype, "renderAdaptive$", {
+    Object.defineProperty(StateService.prototype, "currentKey$", {
         get: function () {
-            return this._renderAdaptive$;
+            return this._currentKey$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    DOMRenderer.prototype.clear = function (name) {
-        this._renderAdaptive$.next({ name: name, vnode: null });
-        this._render$.next({ name: name, vnode: null });
-    };
-    return DOMRenderer;
-}());
-exports.DOMRenderer = DOMRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DOMRenderer;
-
-},{"../Render":213,"rxjs/Subject":33,"rxjs/add/operator/combineLatest":49,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/pluck":65,"rxjs/add/operator/scan":68,"underscore":158,"virtual-dom":163}],295:[function(require,module,exports){
-"use strict";
-(function (GLRenderStage) {
-    GLRenderStage[GLRenderStage["Background"] = 0] = "Background";
-    GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground";
-})(exports.GLRenderStage || (exports.GLRenderStage = {}));
-var GLRenderStage = exports.GLRenderStage;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GLRenderStage;
-
-},{}],296:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/startWith");
-var Render_1 = require("../Render");
-var GLRenderer = (function () {
-    function GLRenderer(renderService) {
-        var _this = this;
-        this._renderFrame$ = new Subject_1.Subject();
-        this._renderCameraOperation$ = new Subject_1.Subject();
-        this._render$ = new Subject_1.Subject();
-        this._clear$ = new Subject_1.Subject();
-        this._renderOperation$ = new Subject_1.Subject();
-        this._rendererOperation$ = new Subject_1.Subject();
-        this._eraserOperation$ = new Subject_1.Subject();
-        this._renderService = renderService;
-        this._renderer$ = this._rendererOperation$
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, { needsRender: false, renderer: null });
-        this._renderCollection$ = this._renderOperation$
-            .scan(function (hashes, operation) {
-            return operation(hashes);
-        }, {})
-            .share();
-        this._renderCamera$ = this._renderCameraOperation$
-            .scan(function (rc, operation) {
-            return operation(rc);
-        }, { frameId: -1, needsRender: false, perspective: null });
-        this._eraser$ = this._eraserOperation$
-            .startWith(function (eraser) {
-            return eraser;
-        })
-            .scan(function (eraser, operation) {
-            return operation(eraser);
-        }, { needsRender: false });
-        Observable_1.Observable
-            .combineLatest([this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$], function (renderer, hashes, rc, eraser) {
-            var renders = Object.keys(hashes)
-                .map(function (key) {
-                return hashes[key];
-            });
-            return { camera: rc, eraser: eraser, renderer: renderer, renders: renders };
-        })
-            .filter(function (co) {
-            var needsRender = co.renderer.needsRender ||
-                co.camera.needsRender ||
-                co.eraser.needsRender;
-            var frameId = co.camera.frameId;
-            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
-                var render = _a[_i];
-                if (render.frameId !== frameId) {
-                    return false;
-                }
-                needsRender = needsRender || render.needsRender;
-            }
-            return needsRender;
-        })
-            .distinctUntilChanged(function (n1, n2) {
-            return n1 === n2;
-        }, function (co) {
-            return co.eraser.needsRender ? -1 : co.camera.frameId;
-        })
-            .subscribe(function (co) {
-            co.renderer.needsRender = false;
-            co.camera.needsRender = false;
-            co.eraser.needsRender = false;
-            var perspectiveCamera = co.camera.perspective;
-            var backgroundRenders = [];
-            var foregroundRenders = [];
-            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
-                var render = _a[_i];
-                if (render.stage === Render_1.GLRenderStage.Background) {
-                    backgroundRenders.push(render.render);
-                }
-                else if (render.stage === Render_1.GLRenderStage.Foreground) {
-                    foregroundRenders.push(render.render);
-                }
-            }
-            var renderer = co.renderer.renderer;
-            renderer.autoClear = false;
-            renderer.clear();
-            for (var _b = 0, backgroundRenders_1 = backgroundRenders; _b < backgroundRenders_1.length; _b++) {
-                var render = backgroundRenders_1[_b];
-                render(perspectiveCamera, renderer);
-            }
-            renderer.clearDepth();
-            for (var _c = 0, foregroundRenders_1 = foregroundRenders; _c < foregroundRenders_1.length; _c++) {
-                var render = foregroundRenders_1[_c];
-                render(perspectiveCamera, renderer);
-            }
-        });
-        this._renderFrame$
-            .map(function (rc) {
-            return function (irc) {
-                irc.frameId = rc.frameId;
-                irc.perspective = rc.perspective;
-                if (rc.changed === true) {
-                    irc.needsRender = true;
-                }
-                return irc;
-            };
-        })
-            .subscribe(this._renderCameraOperation$);
-        this._renderFrameSubscribe();
-        var renderHash$ = this._render$
-            .map(function (hash) {
-            return function (hashes) {
-                hashes[hash.name] = hash.render;
-                return hashes;
-            };
-        });
-        var clearHash$ = this._clear$
-            .map(function (name) {
-            return function (hashes) {
-                delete hashes[name];
-                return hashes;
-            };
-        });
-        Observable_1.Observable
-            .merge(renderHash$, clearHash$)
-            .subscribe(this._renderOperation$);
-        var createRenderer$ = this._render$
-            .first()
-            .map(function (hash) {
-            return function (renderer) {
-                var webGLRenderer = new THREE.WebGLRenderer();
-                var element = renderService.element;
-                webGLRenderer.setSize(element.offsetWidth, element.offsetHeight);
-                webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0);
-                webGLRenderer.sortObjects = false;
-                webGLRenderer.domElement.style.width = "100%";
-                webGLRenderer.domElement.style.height = "100%";
-                element.appendChild(webGLRenderer.domElement);
-                renderer.needsRender = true;
-                renderer.renderer = webGLRenderer;
-                return renderer;
-            };
-        });
-        var resizeRenderer$ = this._renderService.size$
-            .map(function (size) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.renderer.setSize(size.width, size.height);
-                renderer.needsRender = true;
-                return renderer;
-            };
-        });
-        var clearRenderer$ = this._clear$
-            .map(function (name) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.needsRender = true;
-                return renderer;
-            };
-        });
-        Observable_1.Observable
-            .merge(createRenderer$, resizeRenderer$, clearRenderer$)
-            .subscribe(this._rendererOperation$);
-        var renderCollectionEmpty$ = this._renderCollection$
-            .filter(function (hashes) {
-            return Object.keys(hashes).length === 0;
-        })
-            .share();
-        renderCollectionEmpty$
-            .subscribe(function (hashes) {
-            if (_this._renderFrameSubscription == null) {
-                return;
-            }
-            _this._renderFrameSubscription.unsubscribe();
-            _this._renderFrameSubscription = null;
-            _this._renderFrameSubscribe();
-        });
-        renderCollectionEmpty$
-            .map(function (hashes) {
-            return function (eraser) {
-                eraser.needsRender = true;
-                return eraser;
-            };
-        })
-            .subscribe(this._eraserOperation$);
-    }
-    Object.defineProperty(GLRenderer.prototype, "render$", {
+    Object.defineProperty(StateService.prototype, "currentNodeExternal$", {
         get: function () {
-            return this._render$;
+            return this._currentNodeExternal$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    GLRenderer.prototype.clear = function (name) {
-        this._clear$.next(name);
-    };
-    GLRenderer.prototype._renderFrameSubscribe = function () {
-        var _this = this;
-        this._render$
-            .first()
-            .map(function (renderHash) {
-            return function (irc) {
-                irc.needsRender = true;
-                return irc;
-            };
-        })
-            .subscribe(function (operation) {
-            _this._renderCameraOperation$.next(operation);
-        });
-        this._renderFrameSubscription = this._render$
-            .first()
-            .mergeMap(function (hash) {
-            return _this._renderService.renderCameraFrame$;
-        })
-            .subscribe(this._renderFrame$);
-    };
-    return GLRenderer;
-}());
-exports.GLRenderer = GLRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GLRenderer;
-
-},{"../Render":213,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/startWith":72,"three":157}],297:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var RenderCamera = (function () {
-    function RenderCamera(perspectiveCameraAspect, renderMode) {
-        this.alpha = -1;
-        this.zoom = 0;
-        this._frameId = -1;
-        this._changed = false;
-        this._changedForFrame = -1;
-        this.currentAspect = 1;
-        this.currentPano = false;
-        this.previousAspect = 1;
-        this.previousPano = false;
-        this.renderMode = renderMode;
-        this._camera = new Geo_1.Camera();
-        this._perspective = new THREE.PerspectiveCamera(50, perspectiveCameraAspect, 0.4, 10000);
-    }
-    Object.defineProperty(RenderCamera.prototype, "perspective", {
+    Object.defineProperty(StateService.prototype, "currentCamera$", {
+        get: function () {
+            return this._currentCamera$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateService.prototype, "currentTransform$", {
         get: function () {
-            return this._perspective;
+            return this._currentTransform$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderCamera.prototype, "camera", {
+    Object.defineProperty(StateService.prototype, "state$", {
         get: function () {
-            return this._camera;
+            return this._state$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderCamera.prototype, "changed", {
+    Object.defineProperty(StateService.prototype, "reference$", {
         get: function () {
-            return this.frameId === this._changedForFrame;
+            return this._reference$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderCamera.prototype, "frameId", {
+    Object.defineProperty(StateService.prototype, "inMotion$", {
         get: function () {
-            return this._frameId;
+            return this._inMotion$;
         },
-        set: function (value) {
-            this._frameId = value;
-            if (this._changed) {
-                this._changed = false;
-                this._changedForFrame = value;
-            }
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateService.prototype, "inTranslation$", {
+        get: function () {
+            return this._inTranslation$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    RenderCamera.prototype.updateProjection = function () {
-        var currentAspect = this._getAspect(this.currentAspect, this.currentPano, this.perspective.aspect);
-        var previousAspect = this._getAspect(this.previousAspect, this.previousPano, this.perspective.aspect);
-        var aspect = (1 - this.alpha) * previousAspect + this.alpha * currentAspect;
-        var verticalFov = this._getVerticalFov(aspect, this._camera.focal, this.zoom);
-        this._perspective.fov = verticalFov;
-        this._perspective.updateProjectionMatrix();
-        this._changed = true;
+    Object.defineProperty(StateService.prototype, "appendNode$", {
+        get: function () {
+            return this._appendNode$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    StateService.prototype.earth = function () {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.earth(); });
     };
-    RenderCamera.prototype.updatePerspective = function (camera) {
-        this._perspective.up.copy(camera.up);
-        this._perspective.position.copy(camera.position);
-        this._perspective.lookAt(camera.lookat);
-        this._changed = true;
+    StateService.prototype.traverse = function () {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.traverse(); });
+    };
+    StateService.prototype.wait = function () {
+        this._invokeContextOperation(function (context) { context.wait(); });
     };
-    RenderCamera.prototype._getVerticalFov = function (aspect, focal, zoom) {
-        return 2 * Math.atan(0.5 / (Math.pow(2, zoom) * aspect * focal)) * 180 / Math.PI;
+    StateService.prototype.waitInteractively = function () {
+        this._invokeContextOperation(function (context) { context.waitInteractively(); });
     };
-    RenderCamera.prototype._getAspect = function (nodeAspect, pano, perspectiveCameraAspect) {
-        if (pano) {
-            return 1;
+    StateService.prototype.appendNodes = function (nodes) {
+        this._invokeContextOperation(function (context) { context.append(nodes); });
+    };
+    StateService.prototype.prependNodes = function (nodes) {
+        this._invokeContextOperation(function (context) { context.prepend(nodes); });
+    };
+    StateService.prototype.removeNodes = function (n) {
+        this._invokeContextOperation(function (context) { context.remove(n); });
+    };
+    StateService.prototype.clearNodes = function () {
+        this._invokeContextOperation(function (context) { context.clear(); });
+    };
+    StateService.prototype.clearPriorNodes = function () {
+        this._invokeContextOperation(function (context) { context.clearPrior(); });
+    };
+    StateService.prototype.cutNodes = function () {
+        this._invokeContextOperation(function (context) { context.cut(); });
+    };
+    StateService.prototype.setNodes = function (nodes) {
+        this._invokeContextOperation(function (context) { context.set(nodes); });
+    };
+    StateService.prototype.rotate = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotate(delta); });
+    };
+    StateService.prototype.rotateUnbounded = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateUnbounded(delta); });
+    };
+    StateService.prototype.rotateWithoutInertia = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateWithoutInertia(delta); });
+    };
+    StateService.prototype.rotateBasic = function (basicRotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); });
+    };
+    StateService.prototype.rotateBasicUnbounded = function (basicRotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); });
+    };
+    StateService.prototype.rotateBasicWithoutInertia = function (basicRotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateBasicWithoutInertia(basicRotation); });
+    };
+    StateService.prototype.rotateToBasic = function (basic) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateToBasic(basic); });
+    };
+    StateService.prototype.move = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.move(delta); });
+    };
+    StateService.prototype.moveTo = function (position) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.moveTo(position); });
+    };
+    StateService.prototype.dolly = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.dolly(delta); });
+    };
+    StateService.prototype.orbit = function (rotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.orbit(rotation); });
+    };
+    StateService.prototype.truck = function (direction) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.truck(direction); });
+    };
+    /**
+     * Change zoom level while keeping the reference point position approximately static.
+     *
+     * @parameter {number} delta - Change in zoom level.
+     * @parameter {Array<number>} reference - Reference point in basic coordinates.
+     */
+    StateService.prototype.zoomIn = function (delta, reference) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); });
+    };
+    StateService.prototype.getCenter = function () {
+        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
+            return frame.state.getCenter();
+        }));
+    };
+    StateService.prototype.getZoom = function () {
+        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
+            return frame.state.zoom;
+        }));
+    };
+    StateService.prototype.setCenter = function (center) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.setCenter(center); });
+    };
+    StateService.prototype.setSpeed = function (speed) {
+        this._invokeContextOperation(function (context) { context.setSpeed(speed); });
+    };
+    StateService.prototype.setTransitionMode = function (mode) {
+        this._invokeContextOperation(function (context) { context.setTransitionMode(mode); });
+    };
+    StateService.prototype.setZoom = function (zoom) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.setZoom(zoom); });
+    };
+    StateService.prototype.start = function () {
+        if (this._frameId == null) {
+            this._start$.next(null);
+            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
+            this._frame$.next(this._frameId);
         }
-        var coeff = Math.max(1, 1 / nodeAspect);
-        var usePerspective = this.renderMode === Render_1.RenderMode.Letterbox ?
-            nodeAspect > perspectiveCameraAspect :
-            nodeAspect < perspectiveCameraAspect;
-        var aspect = usePerspective ?
-            coeff * perspectiveCameraAspect :
-            coeff * nodeAspect;
-        return aspect;
     };
-    return RenderCamera;
+    StateService.prototype.stop = function () {
+        if (this._frameId != null) {
+            this._frameGenerator.cancelAnimationFrame(this._frameId);
+            this._frameId = null;
+        }
+    };
+    StateService.prototype._invokeContextOperation = function (action) {
+        this._contextOperation$
+            .next(function (context) {
+            action(context);
+            return context;
+        });
+    };
+    StateService.prototype._frame = function (time) {
+        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
+        this._frame$.next(this._frameId);
+    };
+    return StateService;
 }());
-exports.RenderCamera = RenderCamera;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderCamera;
+exports.StateService = StateService;
 
-},{"../Geo":210,"../Render":213,"three":157}],298:[function(require,module,exports){
+},{"../State":298,"rxjs":43,"rxjs/operators":241}],452:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TransitionMode = void 0;
 /**
- * Enumeration for render mode
+ * Enumeration for transition mode
  * @enum {number}
  * @readonly
- * @description Modes for specifying how rendering is done
- * in the viewer. All modes preserves the original aspect
- * ratio of the images.
+ * @description Modes for specifying how transitions
+ * between nodes are performed.
  */
-(function (RenderMode) {
+var TransitionMode;
+(function (TransitionMode) {
     /**
-     * Displays all content within the viewer.
+     * Default transitions.
      *
-     * @description Black bars shown on both
-     * sides of the content. Bars are shown
-     * either below and above or to the left
-     * and right of the content depending on
-     * the aspect ratio relation between the
-     * image and the viewer.
+     * @description The viewer dynamically determines
+     * whether transitions should be performed with or
+     * without motion and blending for each transition
+     * based on the underlying data.
      */
-    RenderMode[RenderMode["Letterbox"] = 0] = "Letterbox";
+    TransitionMode[TransitionMode["Default"] = 0] = "Default";
     /**
-     * Fills the viewer by cropping content.
+     * Instantaneous transitions.
      *
-     * @description Cropping is done either
-     * in horizontal or vertical direction
-     * depending on the aspect ratio relation
-     * between the image and the viewer.
+     * @description All transitions are performed
+     * without motion or blending.
      */
-    RenderMode[RenderMode["Fill"] = 1] = "Fill";
-})(exports.RenderMode || (exports.RenderMode = {}));
-var RenderMode = exports.RenderMode;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderMode;
+    TransitionMode[TransitionMode["Instantaneous"] = 1] = "Instantaneous";
+})(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {}));
+exports.default = TransitionMode;
 
-},{}],299:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/withLatestFrom");
-var Render_1 = require("../Render");
-var RenderService = (function () {
-    function RenderService(element, currentFrame$, renderMode) {
-        var _this = this;
-        this._element = element;
-        this._currentFrame$ = currentFrame$;
-        renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill;
-        this._resize$ = new Subject_1.Subject();
-        this._renderCameraOperation$ = new Subject_1.Subject();
-        this._size$ =
-            new BehaviorSubject_1.BehaviorSubject({
-                height: this._element.offsetHeight,
-                width: this._element.offsetWidth,
-            });
-        this._resize$
-            .map(function () {
-            return { height: _this._element.offsetHeight, width: _this._element.offsetWidth };
-        })
-            .subscribe(this._size$);
-        this._renderMode$ = new BehaviorSubject_1.BehaviorSubject(renderMode);
-        this._renderCameraHolder$ = this._renderCameraOperation$
-            .startWith(function (rc) {
-            return rc;
-        })
-            .scan(function (rc, operation) {
-            return operation(rc);
-        }, new Render_1.RenderCamera(this._element.offsetWidth / this._element.offsetHeight, renderMode))
-            .publishReplay(1)
-            .refCount();
-        this._renderCameraFrame$ = this._currentFrame$
-            .withLatestFrom(this._renderCameraHolder$, function (frame, renderCamera) {
-            return [frame, renderCamera];
-        })
-            .do(function (args) {
-            var frame = args[0];
-            var rc = args[1];
-            var camera = frame.state.camera;
-            if (rc.alpha !== frame.state.alpha ||
-                rc.zoom !== frame.state.zoom ||
-                rc.camera.diff(camera) > 1e-5) {
-                var currentTransform = frame.state.currentTransform;
-                var previousTransform = frame.state.previousTransform != null ?
-                    frame.state.previousTransform :
-                    frame.state.currentTransform;
-                var previousNode = frame.state.previousNode != null ?
-                    frame.state.previousNode :
-                    frame.state.currentNode;
-                rc.currentAspect = currentTransform.basicAspect;
-                rc.currentPano = frame.state.currentNode.pano;
-                rc.previousAspect = previousTransform.basicAspect;
-                rc.previousPano = previousNode.pano;
-                rc.alpha = frame.state.alpha;
-                rc.zoom = frame.state.zoom;
-                rc.camera.copy(camera);
-                rc.updatePerspective(camera);
-                rc.updateProjection();
-            }
-            rc.frameId = frame.id;
-        })
-            .map(function (args) {
-            return args[1];
-        })
-            .publishReplay(1)
-            .refCount();
-        this._renderCamera$ = this._renderCameraFrame$
-            .filter(function (rc) {
-            return rc.changed;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._size$
-            .skip(1)
-            .map(function (size) {
-            return function (rc) {
-                rc.perspective.aspect = size.width / size.height;
-                rc.updateProjection();
-                return rc;
-            };
-        })
-            .subscribe(this._renderCameraOperation$);
-        this._renderMode$
-            .skip(1)
-            .map(function (rm) {
-            return function (rc) {
-                rc.renderMode = rm;
-                rc.updateProjection();
-                return rc;
-            };
-        })
-            .subscribe(this._renderCameraOperation$);
-        this._renderCameraHolder$.subscribe();
-        this._size$.subscribe();
-        this._renderMode$.subscribe();
-    }
-    Object.defineProperty(RenderService.prototype, "element", {
-        get: function () {
-            return this._element;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "resize$", {
-        get: function () {
-            return this._resize$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "size$", {
-        get: function () {
-            return this._size$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderMode$", {
-        get: function () {
-            return this._renderMode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCameraFrame$", {
-        get: function () {
-            return this._renderCameraFrame$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCamera$", {
-        get: function () {
-            return this._renderCamera$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return RenderService;
-}());
-exports.RenderService = RenderService;
+},{}],453:[function(require,module,exports){
+"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderService;
 
-},{"../Render":213,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/skip":70,"rxjs/add/operator/startWith":72,"rxjs/add/operator/withLatestFrom":76}],300:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{}],454:[function(require,module,exports){
 "use strict";
-var FrameGenerator = (function () {
-    function FrameGenerator() {
-        if (window.requestAnimationFrame) {
-            this._requestAnimationFrame = window.requestAnimationFrame;
-            this._cancelAnimationFrame = window.cancelAnimationFrame;
-        }
-        else if (window.mozRequestAnimationFrame) {
-            this._requestAnimationFrame = window.mozRequestAnimationFrame;
-            this._cancelAnimationFrame = window.mozCancelAnimationFrame;
-        }
-        else if (window.webkitRequestAnimationFrame) {
-            this._requestAnimationFrame = window.webkitRequestAnimationFrame;
-            this._cancelAnimationFrame = window.webkitCancelAnimationFrame;
-        }
-        else if (window.msRequestAnimationFrame) {
-            this._requestAnimationFrame = window.msRequestAnimationFrame;
-            this._cancelAnimationFrame = window.msCancelRequestAnimationFrame;
-        }
-        else if (window.oRequestAnimationFrame) {
-            this._requestAnimationFrame = window.oRequestAnimationFrame;
-            this._cancelAnimationFrame = window.oCancelAnimationFrame;
-        }
-        else {
-            this._requestAnimationFrame = function (callback) {
-                return window.setTimeout(callback, 1000 / 60);
-            };
-            this._cancelAnimationFrame = window.clearTimeout;
-        }
-    }
-    FrameGenerator.prototype.requestAnimationFrame = function (callback) {
-        return this._requestAnimationFrame.call(window, callback);
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EarthState = void 0;
+var THREE = require("three");
+var State_1 = require("../../State");
+var EarthState = /** @class */ (function (_super) {
+    __extends(EarthState, _super);
+    function EarthState(state) {
+        var _this = _super.call(this, state) || this;
+        var viewingDirection = _this._camera.lookat
+            .clone()
+            .sub(_this._camera.position)
+            .normalize();
+        _this._camera.lookat.copy(_this._camera.position);
+        _this._camera.position.z = state.camera.position.z + 20;
+        _this._camera.position.x = state.camera.position.x - 16 * viewingDirection.x;
+        _this._camera.position.y = state.camera.position.y - 16 * viewingDirection.y;
+        _this._camera.up.set(0, 0, 1);
+        return _this;
+    }
+    EarthState.prototype.traverse = function () {
+        return new State_1.TraversingState(this);
+    };
+    EarthState.prototype.wait = function () {
+        return new State_1.WaitingState(this);
+    };
+    EarthState.prototype.waitInteractively = function () {
+        return new State_1.InteractiveWaitingState(this);
+    };
+    EarthState.prototype.dolly = function (delta) {
+        var camera = this._camera;
+        var offset = new THREE.Vector3()
+            .copy(camera.position)
+            .sub(camera.lookat);
+        var length = offset.length();
+        var scaled = length * Math.pow(2, -delta);
+        var clipped = Math.max(1, Math.min(scaled, 1000));
+        offset.normalize();
+        offset.multiplyScalar(clipped);
+        camera.position.copy(camera.lookat).add(offset);
+    };
+    EarthState.prototype.orbit = function (rotation) {
+        var camera = this._camera;
+        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
+        var qInverse = q.clone().inverse();
+        var offset = new THREE.Vector3();
+        offset.copy(camera.position).sub(camera.lookat);
+        offset.applyQuaternion(q);
+        var length = offset.length();
+        var phi = Math.atan2(offset.y, offset.x);
+        phi += rotation.phi;
+        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
+        theta += rotation.theta;
+        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
+        offset.x = Math.sin(theta) * Math.cos(phi);
+        offset.y = Math.sin(theta) * Math.sin(phi);
+        offset.z = Math.cos(theta);
+        offset.applyQuaternion(qInverse);
+        camera.position.copy(camera.lookat).add(offset.multiplyScalar(length));
     };
-    FrameGenerator.prototype.cancelAnimationFrame = function (id) {
-        this._cancelAnimationFrame.call(window, id);
+    EarthState.prototype.truck = function (direction) {
+        this._camera.position.add(new THREE.Vector3().fromArray(direction));
+        this._camera.lookat.add(new THREE.Vector3().fromArray(direction));
     };
-    return FrameGenerator;
-}());
-exports.FrameGenerator = FrameGenerator;
+    EarthState.prototype.update = function () { };
+    return EarthState;
+}(State_1.StateBase));
+exports.EarthState = EarthState;
+exports.default = EarthState;
 
-},{}],301:[function(require,module,exports){
-"use strict";
-(function (State) {
-    State[State["Traversing"] = 0] = "Traversing";
-    State[State["Waiting"] = 1] = "Waiting";
-})(exports.State || (exports.State = {}));
-var State = exports.State;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = State;
 
-},{}],302:[function(require,module,exports){
+},{"../../State":298,"three":242}],455:[function(require,module,exports){
 "use strict";
-var State_1 = require("../State");
-var Geo_1 = require("../Geo");
-var StateContext = (function () {
-    function StateContext() {
-        this._state = new State_1.TraversingState({
-            alpha: 1,
-            camera: new Geo_1.Camera(),
-            currentIndex: -1,
-            reference: { alt: 0, lat: 0, lon: 0 },
-            trajectory: [],
-            zoom: 0,
-        });
-    }
-    StateContext.prototype.traverse = function () {
-        this._state = this._state.traverse();
-    };
-    StateContext.prototype.wait = function () {
-        this._state = this._state.wait();
-    };
-    Object.defineProperty(StateContext.prototype, "state", {
-        get: function () {
-            if (this._state instanceof State_1.TraversingState) {
-                return State_1.State.Traversing;
-            }
-            else if (this._state instanceof State_1.WaitingState) {
-                return State_1.State.Waiting;
-            }
-            throw new Error("Invalid state");
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "reference", {
-        get: function () {
-            return this._state.reference;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "alpha", {
-        get: function () {
-            return this._state.alpha;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "camera", {
-        get: function () {
-            return this._state.camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "zoom", {
-        get: function () {
-            return this._state.zoom;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentNode", {
-        get: function () {
-            return this._state.currentNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousNode", {
-        get: function () {
-            return this._state.previousNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentCamera", {
-        get: function () {
-            return this._state.currentCamera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentTransform", {
-        get: function () {
-            return this._state.currentTransform;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousTransform", {
-        get: function () {
-            return this._state.previousTransform;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "trajectory", {
-        get: function () {
-            return this._state.trajectory;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentIndex", {
-        get: function () {
-            return this._state.currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "lastNode", {
-        get: function () {
-            return this._state.trajectory[this._state.trajectory.length - 1];
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "nodesAhead", {
-        get: function () {
-            return this._state.trajectory.length - 1 - this._state.currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "motionless", {
-        get: function () {
-            return this._state.motionless;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StateContext.prototype.getCenter = function () {
-        return this._state.getCenter();
-    };
-    StateContext.prototype.setCenter = function (center) {
-        this._state.setCenter(center);
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    StateContext.prototype.setZoom = function (zoom) {
-        this._state.setZoom(zoom);
-    };
-    StateContext.prototype.update = function (fps) {
-        this._state.update(fps);
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InteractiveStateBase = void 0;
+var THREE = require("three");
+var State_1 = require("../../State");
+var InteractiveStateBase = /** @class */ (function (_super) {
+    __extends(InteractiveStateBase, _super);
+    function InteractiveStateBase(state) {
+        var _this = _super.call(this, state) || this;
+        _this._animationSpeed = 1 / 40;
+        _this._rotationDelta = new State_1.RotationDelta(0, 0);
+        _this._requestedRotationDelta = null;
+        _this._basicRotation = [0, 0];
+        _this._requestedBasicRotation = null;
+        _this._requestedBasicRotationUnbounded = null;
+        _this._rotationAcceleration = 0.86;
+        _this._rotationIncreaseAlpha = 0.97;
+        _this._rotationDecreaseAlpha = 0.9;
+        _this._rotationThreshold = 1e-3;
+        _this._unboundedRotationAlpha = 0.8;
+        _this._desiredZoom = state.zoom;
+        _this._minZoom = 0;
+        _this._maxZoom = 3;
+        _this._lookatDepth = 10;
+        _this._desiredLookat = null;
+        _this._desiredCenter = null;
+        return _this;
+    }
+    InteractiveStateBase.prototype.rotate = function (rotationDelta) {
+        if (this._currentNode == null) {
+            return;
+        }
+        if (rotationDelta.phi === 0 && rotationDelta.theta === 0) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedBasicRotation = null;
+        if (this._requestedRotationDelta != null) {
+            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;
+            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;
+        }
+        else {
+            this._requestedRotationDelta = new State_1.RotationDelta(rotationDelta.phi, rotationDelta.theta);
+        }
     };
-    StateContext.prototype.append = function (nodes) {
-        this._state.append(nodes);
+    InteractiveStateBase.prototype.rotateUnbounded = function (delta) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._requestedBasicRotation = null;
+        this._requestedRotationDelta = null;
+        this._applyRotation(delta, this._currentCamera);
+        this._applyRotation(delta, this._previousCamera);
+        if (!this._desiredLookat) {
+            return;
+        }
+        var q = new THREE.Quaternion().setFromUnitVectors(this._currentCamera.up, new THREE.Vector3(0, 0, 1));
+        var qInverse = q.clone().inverse();
+        var offset = new THREE.Vector3()
+            .copy(this._desiredLookat)
+            .sub(this._camera.position)
+            .applyQuaternion(q);
+        var length = offset.length();
+        var phi = Math.atan2(offset.y, offset.x);
+        phi += delta.phi;
+        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
+        theta += delta.theta;
+        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
+        offset.x = Math.sin(theta) * Math.cos(phi);
+        offset.y = Math.sin(theta) * Math.sin(phi);
+        offset.z = Math.cos(theta);
+        offset.applyQuaternion(qInverse);
+        this._desiredLookat
+            .copy(this._camera.position)
+            .add(offset.multiplyScalar(length));
     };
-    StateContext.prototype.prepend = function (nodes) {
-        this._state.prepend(nodes);
+    InteractiveStateBase.prototype.rotateWithoutInertia = function (rotationDelta) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedBasicRotation = null;
+        this._requestedRotationDelta = null;
+        var threshold = Math.PI / (10 * Math.pow(2, this._zoom));
+        var delta = {
+            phi: this._spatial.clamp(rotationDelta.phi, -threshold, threshold),
+            theta: this._spatial.clamp(rotationDelta.theta, -threshold, threshold),
+        };
+        this._applyRotation(delta, this._currentCamera);
+        this._applyRotation(delta, this._previousCamera);
     };
-    StateContext.prototype.remove = function (n) {
-        this._state.remove(n);
+    InteractiveStateBase.prototype.rotateBasic = function (basicRotation) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        if (this._requestedBasicRotation != null) {
+            this._requestedBasicRotation[0] += basicRotation[0];
+            this._requestedBasicRotation[1] += basicRotation[1];
+            var threshold = 0.05 / Math.pow(2, this._zoom);
+            this._requestedBasicRotation[0] =
+                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);
+            this._requestedBasicRotation[1] =
+                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);
+        }
+        else {
+            this._requestedBasicRotation = basicRotation.slice();
+        }
     };
-    StateContext.prototype.cut = function () {
-        this._state.cut();
+    InteractiveStateBase.prototype.rotateBasicUnbounded = function (basicRotation) {
+        if (this._currentNode == null) {
+            return;
+        }
+        if (this._requestedBasicRotationUnbounded != null) {
+            this._requestedBasicRotationUnbounded[0] += basicRotation[0];
+            this._requestedBasicRotationUnbounded[1] += basicRotation[1];
+        }
+        else {
+            this._requestedBasicRotationUnbounded = basicRotation.slice();
+        }
     };
-    StateContext.prototype.set = function (nodes) {
-        this._state.set(nodes);
+    InteractiveStateBase.prototype.rotateBasicWithoutInertia = function (basic) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        this._requestedBasicRotation = null;
+        var threshold = 0.05 / Math.pow(2, this._zoom);
+        var basicRotation = basic.slice();
+        basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold);
+        basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold);
+        this._applyRotationBasic(basicRotation);
     };
-    StateContext.prototype.rotate = function (delta) {
-        this._state.rotate(delta);
+    InteractiveStateBase.prototype.rotateToBasic = function (basic) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        basic[0] = this._spatial.clamp(basic[0], 0, 1);
+        basic[1] = this._spatial.clamp(basic[1], 0, 1);
+        var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
+        this._currentCamera.lookat.fromArray(lookat);
     };
-    StateContext.prototype.rotateBasic = function (basicRotation) {
-        this._state.rotateBasic(basicRotation);
+    InteractiveStateBase.prototype.zoomIn = function (delta, reference) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));
+        var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray());
+        var currentCenterX = currentCenter[0];
+        var currentCenterY = currentCenter[1];
+        var zoom0 = Math.pow(2, this._zoom);
+        var zoom1 = Math.pow(2, this._desiredZoom);
+        var refX = reference[0];
+        var refY = reference[1];
+        if (this.currentTransform.gpano != null &&
+            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
+            if (refX - currentCenterX > 0.5) {
+                refX = refX - 1;
+            }
+            else if (currentCenterX - refX > 0.5) {
+                refX = 1 + refX;
+            }
+        }
+        var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX);
+        var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY);
+        var gpano = this.currentTransform.gpano;
+        if (this._currentNode.fullPano) {
+            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
+            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);
+        }
+        else if (gpano != null &&
+            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
+            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
+            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);
+        }
+        else {
+            newCenterX = this._spatial.clamp(newCenterX, 0, 1);
+            newCenterY = this._spatial.clamp(newCenterY, 0, 1);
+        }
+        this._desiredLookat = new THREE.Vector3()
+            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));
     };
-    StateContext.prototype.rotateToBasic = function (basic) {
-        this._state.rotateToBasic(basic);
+    InteractiveStateBase.prototype.setCenter = function (center) {
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        this._requestedBasicRotation = null;
+        this._desiredZoom = this._zoom;
+        var clamped = [
+            this._spatial.clamp(center[0], 0, 1),
+            this._spatial.clamp(center[1], 0, 1),
+        ];
+        if (this._currentNode == null) {
+            this._desiredCenter = clamped;
+            return;
+        }
+        this._desiredCenter = null;
+        var currentLookat = new THREE.Vector3()
+            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));
+        var previousTransform = this.previousTransform != null ?
+            this.previousTransform :
+            this.currentTransform;
+        var previousLookat = new THREE.Vector3()
+            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));
+        this._currentCamera.lookat.copy(currentLookat);
+        this._previousCamera.lookat.copy(previousLookat);
     };
-    StateContext.prototype.move = function (delta) {
-        this._state.move(delta);
+    InteractiveStateBase.prototype.setZoom = function (zoom) {
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        this._requestedBasicRotation = null;
+        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);
+        this._desiredZoom = this._zoom;
     };
-    StateContext.prototype.moveTo = function (delta) {
-        this._state.moveTo(delta);
+    InteractiveStateBase.prototype._applyRotation = function (delta, camera) {
+        if (camera == null) {
+            return;
+        }
+        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
+        var qInverse = q.clone().inverse();
+        var offset = new THREE.Vector3();
+        offset.copy(camera.lookat).sub(camera.position);
+        offset.applyQuaternion(q);
+        var length = offset.length();
+        var phi = Math.atan2(offset.y, offset.x);
+        phi += delta.phi;
+        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
+        theta += delta.theta;
+        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
+        offset.x = Math.sin(theta) * Math.cos(phi);
+        offset.y = Math.sin(theta) * Math.sin(phi);
+        offset.z = Math.cos(theta);
+        offset.applyQuaternion(qInverse);
+        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));
     };
-    StateContext.prototype.zoomIn = function (delta, reference) {
-        this._state.zoomIn(delta, reference);
+    InteractiveStateBase.prototype._applyRotationBasic = function (basicRotation) {
+        var currentNode = this._currentNode;
+        var previousNode = this._previousNode != null ?
+            this.previousNode :
+            this.currentNode;
+        var currentCamera = this._currentCamera;
+        var previousCamera = this._previousCamera;
+        var currentTransform = this.currentTransform;
+        var previousTransform = this.previousTransform != null ?
+            this.previousTransform :
+            this.currentTransform;
+        var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray());
+        var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray());
+        var currentGPano = currentTransform.gpano;
+        var previousGPano = previousTransform.gpano;
+        if (currentNode.fullPano) {
+            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
+            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95);
+        }
+        else if (currentGPano != null &&
+            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
+            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
+            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
+        }
+        else {
+            currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1);
+            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
+        }
+        if (previousNode.fullPano) {
+            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
+            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95);
+        }
+        else if (previousGPano != null &&
+            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
+            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
+            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1);
+        }
+        else {
+            previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1);
+            previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
+        }
+        var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);
+        currentCamera.lookat.fromArray(currentLookat);
+        var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);
+        previousCamera.lookat.fromArray(previousLookat);
     };
-    return StateContext;
-}());
-exports.StateContext = StateContext;
-
-},{"../Geo":210,"../State":214}],303:[function(require,module,exports){
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pairwise");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-var State_1 = require("../State");
-var StateService = (function () {
-    function StateService() {
-        var _this = this;
-        this._appendNode$ = new Subject_1.Subject();
-        this._start$ = new Subject_1.Subject();
-        this._frame$ = new Subject_1.Subject();
-        this._fpsSampleRate = 30;
-        this._contextOperation$ = new BehaviorSubject_1.BehaviorSubject(function (context) {
-            return context;
-        });
-        this._context$ = this._contextOperation$
-            .scan(function (context, operation) {
-            return operation(context);
-        }, new State_1.StateContext())
-            .publishReplay(1)
-            .refCount();
-        this._state$ = this._context$
-            .map(function (context) {
-            return context.state;
-        })
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._fps$ = this._start$
-            .switchMap(function () {
-            return _this._frame$
-                .filter(function (frameId) {
-                return frameId % _this._fpsSampleRate === 0;
-            })
-                .map(function (frameId) {
-                return new Date().getTime();
-            })
-                .pairwise()
-                .map(function (times) {
-                return Math.max(20, 1000 * _this._fpsSampleRate / (times[1] - times[0]));
-            })
-                .startWith(60);
-        })
-            .share();
-        this._currentState$ = this._frame$
-            .withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
-            return [frameId, fps, context];
-        })
-            .filter(function (fc) {
-            return fc[2].currentNode != null;
-        })
-            .do(function (fc) {
-            fc[2].update(fc[1]);
-        })
-            .map(function (fc) {
-            return { fps: fc[1], id: fc[0], state: fc[2] };
-        })
-            .share();
-        this._lastState$ = this._currentState$
-            .publishReplay(1)
-            .refCount();
-        var nodeChanged$ = this._currentState$
-            .distinctUntilChanged(undefined, function (f) {
-            return f.state.currentNode.key;
-        })
-            .publishReplay(1)
-            .refCount();
-        var nodeChangedSubject$ = new Subject_1.Subject();
-        nodeChanged$.subscribe(nodeChangedSubject$);
-        this._currentNode$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentNode;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentCamera$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentCamera;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentTransform$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentTransform;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._reference$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.reference;
-        })
-            .distinctUntilChanged(function (r1, r2) {
-            return r1.lat === r2.lat && r1.lon === r2.lon;
-        }, function (reference) {
-            return { lat: reference.lat, lon: reference.lon };
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentNodeExternal$ = nodeChanged$
-            .map(function (f) {
-            return f.state.currentNode;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._appendNode$
-            .map(function (node) {
-            return function (context) {
-                context.append([node]);
-                return context;
-            };
-        })
-            .subscribe(this._contextOperation$);
-        this._movingOperation$ = new Subject_1.Subject();
-        nodeChanged$
-            .map(function (frame) {
-            return true;
-        })
-            .subscribe(this._movingOperation$);
-        this._movingOperation$
-            .distinctUntilChanged()
-            .filter(function (moving) {
-            return moving;
-        })
-            .switchMap(function (moving) {
-            return _this._currentState$
-                .filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            })
-                .map(function (frame) {
-                return [frame.state.camera.clone(), frame.state.zoom];
-            })
-                .pairwise()
-                .map(function (pair) {
-                var c1 = pair[0][0];
-                var c2 = pair[1][0];
-                var z1 = pair[0][1];
-                var z2 = pair[1][1];
-                return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;
-            })
-                .first(function (changed) {
-                return !changed;
-            });
-        })
-            .subscribe(this._movingOperation$);
-        this._moving$ = this._movingOperation$
-            .distinctUntilChanged()
-            .share();
-        this._state$.subscribe();
-        this._currentNode$.subscribe();
-        this._currentCamera$.subscribe();
-        this._currentTransform$.subscribe();
-        this._reference$.subscribe();
-        this._currentNodeExternal$.subscribe();
-        this._lastState$.subscribe();
-        this._frameId = null;
-        this._frameGenerator = new State_1.FrameGenerator();
-    }
-    Object.defineProperty(StateService.prototype, "currentState$", {
-        get: function () {
-            return this._currentState$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNode$", {
-        get: function () {
-            return this._currentNode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNodeExternal$", {
-        get: function () {
-            return this._currentNodeExternal$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentCamera$", {
-        get: function () {
-            return this._currentCamera$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentTransform$", {
-        get: function () {
-            return this._currentTransform$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "state$", {
-        get: function () {
-            return this._state$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "reference$", {
-        get: function () {
-            return this._reference$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "moving$", {
-        get: function () {
-            return this._moving$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "appendNode$", {
-        get: function () {
-            return this._appendNode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StateService.prototype.traverse = function () {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.traverse(); });
+    InteractiveStateBase.prototype._updateZoom = function (animationSpeed) {
+        var diff = this._desiredZoom - this._zoom;
+        var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0;
+        if (diff === 0) {
+            return;
+        }
+        else if (Math.abs(diff) < 2e-3) {
+            this._zoom = this._desiredZoom;
+            if (this._desiredLookat != null) {
+                this._desiredLookat = null;
+            }
+        }
+        else {
+            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);
+        }
     };
-    StateService.prototype.wait = function () {
-        this._invokeContextOperation(function (context) { context.wait(); });
+    InteractiveStateBase.prototype._updateLookat = function (animationSpeed) {
+        if (this._desiredLookat === null) {
+            return;
+        }
+        var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);
+        if (Math.abs(diff) < 1e-6) {
+            this._currentCamera.lookat.copy(this._desiredLookat);
+            this._desiredLookat = null;
+        }
+        else {
+            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);
+        }
     };
-    StateService.prototype.appendNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.append(nodes); });
+    InteractiveStateBase.prototype._updateRotation = function () {
+        if (this._requestedRotationDelta != null) {
+            var length_1 = this._rotationDelta.lengthSquared();
+            var requestedLength = this._requestedRotationDelta.lengthSquared();
+            if (requestedLength > length_1) {
+                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);
+            }
+            else {
+                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);
+            }
+            this._requestedRotationDelta = null;
+            return;
+        }
+        if (this._rotationDelta.isZero) {
+            return;
+        }
+        var alpha = this.currentNode.fullPano ? 1 : this._alpha;
+        this._rotationDelta.multiply(this._rotationAcceleration * alpha);
+        this._rotationDelta.threshold(this._rotationThreshold);
     };
-    StateService.prototype.prependNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.prepend(nodes); });
+    InteractiveStateBase.prototype._updateRotationBasic = function () {
+        if (this._requestedBasicRotation != null) {
+            var x = this._basicRotation[0];
+            var y = this._basicRotation[1];
+            var reqX = this._requestedBasicRotation[0];
+            var reqY = this._requestedBasicRotation[1];
+            if (Math.abs(reqX) > Math.abs(x)) {
+                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;
+            }
+            else {
+                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;
+            }
+            if (Math.abs(reqY) > Math.abs(y)) {
+                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;
+            }
+            else {
+                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;
+            }
+            this._requestedBasicRotation = null;
+            return;
+        }
+        if (this._requestedBasicRotationUnbounded != null) {
+            var reqX = this._requestedBasicRotationUnbounded[0];
+            var reqY = this._requestedBasicRotationUnbounded[1];
+            if (Math.abs(reqX) > 0) {
+                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;
+            }
+            if (Math.abs(reqY) > 0) {
+                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;
+            }
+            if (this._desiredLookat != null) {
+                var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray());
+                desiredBasicLookat[0] += reqX;
+                desiredBasicLookat[1] += reqY;
+                this._desiredLookat = new THREE.Vector3()
+                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));
+            }
+            this._requestedBasicRotationUnbounded = null;
+        }
+        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {
+            return;
+        }
+        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];
+        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];
+        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&
+            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {
+            this._basicRotation = [0, 0];
+        }
     };
-    StateService.prototype.removeNodes = function (n) {
-        this._invokeContextOperation(function (context) { context.remove(n); });
+    InteractiveStateBase.prototype._clearRotation = function () {
+        if (this._currentNode.fullPano) {
+            return;
+        }
+        if (this._requestedRotationDelta != null) {
+            this._requestedRotationDelta = null;
+        }
+        if (!this._rotationDelta.isZero) {
+            this._rotationDelta.reset();
+        }
+        if (this._requestedBasicRotation != null) {
+            this._requestedBasicRotation = null;
+        }
+        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {
+            this._basicRotation = [0, 0];
+        }
     };
-    StateService.prototype.cutNodes = function () {
-        this._invokeContextOperation(function (context) { context.cut(); });
+    InteractiveStateBase.prototype._setDesiredCenter = function () {
+        if (this._desiredCenter == null) {
+            return;
+        }
+        var lookatDirection = new THREE.Vector3()
+            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))
+            .sub(this._currentCamera.position);
+        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));
+        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));
+        this._desiredCenter = null;
     };
-    StateService.prototype.setNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.set(nodes); });
+    InteractiveStateBase.prototype._setDesiredZoom = function () {
+        this._desiredZoom =
+            this._currentNode.fullPano || this._previousNode == null ?
+                this._zoom : 0;
     };
-    StateService.prototype.rotate = function (delta) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotate(delta); });
+    return InteractiveStateBase;
+}(State_1.StateBase));
+exports.InteractiveStateBase = InteractiveStateBase;
+exports.default = InteractiveStateBase;
+
+
+},{"../../State":298,"three":242}],456:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    StateService.prototype.rotateBasic = function (basicRotation) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); });
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InteractiveWaitingState = void 0;
+var State_1 = require("../../State");
+var InteractiveWaitingState = /** @class */ (function (_super) {
+    __extends(InteractiveWaitingState, _super);
+    function InteractiveWaitingState(state) {
+        var _this = _super.call(this, state) || this;
+        _this._adjustCameras();
+        _this._motionless = _this._motionlessTransition();
+        return _this;
+    }
+    InteractiveWaitingState.prototype.traverse = function () {
+        return new State_1.TraversingState(this);
     };
-    StateService.prototype.rotateToBasic = function (basic) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateToBasic(basic); });
+    InteractiveWaitingState.prototype.wait = function () {
+        return new State_1.WaitingState(this);
     };
-    StateService.prototype.move = function (delta) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.move(delta); });
+    InteractiveWaitingState.prototype.prepend = function (nodes) {
+        _super.prototype.prepend.call(this, nodes);
+        this._motionless = this._motionlessTransition();
     };
-    StateService.prototype.moveTo = function (position) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.moveTo(position); });
+    InteractiveWaitingState.prototype.set = function (nodes) {
+        _super.prototype.set.call(this, nodes);
+        this._motionless = this._motionlessTransition();
     };
-    /**
-     * Change zoom level while keeping the reference point position approximately static.
-     *
-     * @parameter {number} delta - Change in zoom level.
-     * @parameter {Array<number>} reference - Reference point in basic coordinates.
-     */
-    StateService.prototype.zoomIn = function (delta, reference) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); });
+    InteractiveWaitingState.prototype.move = function (delta) {
+        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
     };
-    StateService.prototype.getCenter = function () {
-        return this._lastState$
-            .first()
-            .map(function (frame) {
-            return frame.state.getCenter();
-        });
+    InteractiveWaitingState.prototype.moveTo = function (position) {
+        this._alpha = Math.max(0, Math.min(1, position));
     };
-    StateService.prototype.getZoom = function () {
-        return this._lastState$
-            .first()
-            .map(function (frame) {
-            return frame.state.zoom;
-        });
+    InteractiveWaitingState.prototype.update = function (fps) {
+        this._updateRotation();
+        if (!this._rotationDelta.isZero) {
+            this._applyRotation(this._rotationDelta, this._previousCamera);
+            this._applyRotation(this._rotationDelta, this._currentCamera);
+        }
+        this._updateRotationBasic();
+        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
+            this._applyRotationBasic(this._basicRotation);
+        }
+        var animationSpeed = this._animationSpeed * (60 / fps);
+        this._updateZoom(animationSpeed);
+        this._updateLookat(animationSpeed);
+        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
     };
-    StateService.prototype.setCenter = function (center) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setCenter(center); });
+    InteractiveWaitingState.prototype._getAlpha = function () {
+        return this._motionless ? Math.round(this._alpha) : this._alpha;
     };
-    StateService.prototype.setZoom = function (zoom) {
-        this._movingOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setZoom(zoom); });
+    InteractiveWaitingState.prototype._setCurrentCamera = function () {
+        _super.prototype._setCurrentCamera.call(this);
+        this._adjustCameras();
     };
-    StateService.prototype.start = function () {
-        if (this._frameId == null) {
-            this._start$.next(null);
-            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-            this._frame$.next(this._frameId);
+    InteractiveWaitingState.prototype._adjustCameras = function () {
+        if (this._previousNode == null) {
+            return;
         }
-    };
-    StateService.prototype.stop = function () {
-        if (this._frameId != null) {
-            this._frameGenerator.cancelAnimationFrame(this._frameId);
-            this._frameId = null;
+        if (this._currentNode.fullPano) {
+            var lookat = this._camera.lookat.clone().sub(this._camera.position);
+            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
+        }
+        if (this._previousNode.fullPano) {
+            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
+            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
         }
     };
-    StateService.prototype._invokeContextOperation = function (action) {
-        this._contextOperation$
-            .next(function (context) {
-            action(context);
-            return context;
-        });
-    };
-    StateService.prototype._frame = function (time) {
-        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-        this._frame$.next(this._frameId);
-    };
-    return StateService;
-}());
-exports.StateService = StateService;
+    return InteractiveWaitingState;
+}(State_1.InteractiveStateBase));
+exports.InteractiveWaitingState = InteractiveWaitingState;
+exports.default = InteractiveWaitingState;
 
-},{"../State":214,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/pairwise":64,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76}],304:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../State":298}],457:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.StateBase = void 0;
 var Error_1 = require("../../Error");
 var Geo_1 = require("../../Geo");
-var StateBase = (function () {
+var State_1 = require("../../State");
+var StateBase = /** @class */ (function () {
     function StateBase(state) {
         this._spatial = new Geo_1.Spatial();
         this._geoCoords = new Geo_1.GeoCoords();
         this._referenceThreshold = 0.01;
+        this._transitionMode = state.transitionMode;
         this._reference = state.reference;
         this._alpha = state.alpha;
         this._camera = state.camera.clone();
@@ -30994,8 +53805,8 @@ var StateBase = (function () {
         this._trajectoryCameras = [];
         for (var _i = 0, _a = this._trajectory; _i < _a.length; _i++) {
             var node = _a[_i];
-            var translation = this._nodeToTranslation(node);
-            var transform = new Geo_1.Transform(node, node.image, translation);
+            var translation = this._nodeToTranslation(node, this._reference);
+            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
             this._trajectoryTransforms.push(transform);
             this._trajectoryCameras.push(new Geo_1.Camera(transform));
         }
@@ -31016,63 +53827,63 @@ var StateBase = (function () {
         get: function () {
             return this._reference;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "alpha", {
         get: function () {
             return this._getAlpha();
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "camera", {
         get: function () {
             return this._camera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "zoom", {
         get: function () {
             return this._zoom;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "trajectory", {
         get: function () {
             return this._trajectory;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentIndex", {
         get: function () {
             return this._currentIndex;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentNode", {
         get: function () {
             return this._currentNode;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "previousNode", {
         get: function () {
             return this._previousNode;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentCamera", {
         get: function () {
             return this._currentCamera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentTransform", {
@@ -31080,7 +53891,7 @@ var StateBase = (function () {
             return this._trajectoryTransforms.length > 0 ?
                 this._trajectoryTransforms[this.currentIndex] : null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "previousTransform", {
@@ -31088,16 +53899,44 @@ var StateBase = (function () {
             return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?
                 this._trajectoryTransforms[this.currentIndex - 1] : null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "motionless", {
         get: function () {
             return this._motionless;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateBase.prototype, "transitionMode", {
+        get: function () {
+            return this._transitionMode;
+        },
+        enumerable: false,
         configurable: true
     });
+    StateBase.prototype.earth = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.traverse = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.wait = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.waitInteractively = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.move = function (delta) { };
+    StateBase.prototype.moveTo = function (position) { };
+    StateBase.prototype.rotate = function (delta) { };
+    StateBase.prototype.rotateUnbounded = function (delta) { };
+    StateBase.prototype.rotateWithoutInertia = function (delta) { };
+    StateBase.prototype.rotateBasic = function (basicRotation) { };
+    StateBase.prototype.rotateBasicUnbounded = function (basicRotation) { };
+    StateBase.prototype.rotateBasicWithoutInertia = function (basicRotation) { };
+    StateBase.prototype.rotateToBasic = function (basic) { };
+    StateBase.prototype.setSpeed = function (speed) { };
+    StateBase.prototype.zoomIn = function (delta, reference) { };
+    StateBase.prototype.update = function (fps) { };
+    StateBase.prototype.setCenter = function (center) { };
+    StateBase.prototype.setZoom = function (zoom) { };
+    StateBase.prototype.dolly = function (delta) { };
+    StateBase.prototype.orbit = function (rotation) { };
+    StateBase.prototype.truck = function (direction) { };
     StateBase.prototype.append = function (nodes) {
         if (nodes.length < 1) {
             throw Error("Trajectory can not be empty");
@@ -31130,14 +53969,26 @@ var StateBase = (function () {
         if (n < 0) {
             throw Error("n must be a positive integer");
         }
-        var length = this._trajectory.length;
-        if (length - (this._currentIndex + 1) < n) {
-            throw Error("Current node can not be removed");
+        if (this._currentIndex - 1 < n) {
+            throw Error("Current and previous nodes can not be removed");
         }
         for (var i = 0; i < n; i++) {
-            this._trajectory.pop();
-            this._trajectoryTransforms.pop();
-            this._trajectoryCameras.pop();
+            this._trajectory.shift();
+            this._trajectoryTransforms.shift();
+            this._trajectoryCameras.shift();
+            this._currentIndex--;
+        }
+        this._setCurrentNode();
+    };
+    StateBase.prototype.clearPrior = function () {
+        if (this._currentIndex > 0) {
+            this.remove(this._currentIndex - 1);
+        }
+    };
+    StateBase.prototype.clear = function () {
+        this.cut();
+        if (this._currentIndex > 0) {
+            this.remove(this._currentIndex - 1);
         }
     };
     StateBase.prototype.cut = function () {
@@ -31159,6 +54010,10 @@ var StateBase = (function () {
             this.currentTransform.projectBasic(this._camera.lookat.toArray()) :
             [0.5, 0.5];
     };
+    StateBase.prototype.setTransitionMode = function (mode) {
+        this._transitionMode = mode;
+    };
+    StateBase.prototype._getAlpha = function () { return 1; };
     StateBase.prototype._setCurrent = function () {
         this._setCurrentNode();
         var referenceReset = this._setReference(this._currentNode);
@@ -31175,10 +54030,10 @@ var StateBase = (function () {
     };
     StateBase.prototype._motionlessTransition = function () {
         var nodesSet = this._currentNode != null && this._previousNode != null;
-        return nodesSet && !(this._currentNode.merged &&
+        return nodesSet && (this._transitionMode === State_1.TransitionMode.Instantaneous || !(this._currentNode.merged &&
             this._previousNode.merged &&
             this._withinOriginalDistance() &&
-            this._sameConnectedComponent());
+            this._sameConnectedComponent()));
     };
     StateBase.prototype._setReference = function (node) {
         // do not reset reference if node is within threshold distance
@@ -31205,7 +54060,7 @@ var StateBase = (function () {
     };
     StateBase.prototype._setTrajectory = function (nodes) {
         if (nodes.length < 1) {
-            throw new Error_1.ParameterMapillaryError("Trajectory can not be empty");
+            throw new Error_1.ArgumentMapillaryError("Trajectory can not be empty");
         }
         if (this._currentNode != null) {
             this._trajectory = [this._currentNode].concat(nodes);
@@ -31225,10 +54080,10 @@ var StateBase = (function () {
         for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
             var node = nodes_1[_i];
             if (!node.assetsCached) {
-                throw new Error_1.ParameterMapillaryError("Assets must be cached when node is added to trajectory");
+                throw new Error_1.ArgumentMapillaryError("Assets must be cached when node is added to trajectory");
             }
-            var translation = this._nodeToTranslation(node);
-            var transform = new Geo_1.Transform(node, node.image, translation);
+            var translation = this._nodeToTranslation(node, this.reference);
+            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
             this._trajectoryTransforms.push(transform);
             this._trajectoryCameras.push(new Geo_1.Camera(transform));
         }
@@ -31237,29 +54092,22 @@ var StateBase = (function () {
         for (var _i = 0, _a = nodes.reverse(); _i < _a.length; _i++) {
             var node = _a[_i];
             if (!node.assetsCached) {
-                throw new Error_1.ParameterMapillaryError("Node must be loaded when added to trajectory");
+                throw new Error_1.ArgumentMapillaryError("Assets must be cached when added to trajectory");
             }
-            var translation = this._nodeToTranslation(node);
-            var transform = new Geo_1.Transform(node, node.image, translation);
+            var translation = this._nodeToTranslation(node, this.reference);
+            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
             this._trajectoryTransforms.unshift(transform);
             this._trajectoryCameras.unshift(new Geo_1.Camera(transform));
         }
     };
-    StateBase.prototype._nodeToTranslation = function (node) {
-        var C = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, this._reference.lat, this._reference.lon, this._reference.alt);
-        var RC = this._spatial.rotate(C, node.rotation);
-        return [-RC.x, -RC.y, -RC.z];
+    StateBase.prototype._nodeToTranslation = function (node, reference) {
+        return Geo_1.Geo.computeTranslation({ alt: node.alt, lat: node.latLon.lat, lon: node.latLon.lon }, node.rotation, reference);
     };
     StateBase.prototype._sameConnectedComponent = function () {
         var current = this._currentNode;
         var previous = this._previousNode;
-        if (!current ||
-            !current.mergeCC ||
-            !previous ||
-            !previous.mergeCC) {
-            return true;
-        }
-        return current.mergeCC === previous.mergeCC;
+        return !!current && !!previous &&
+            current.mergeCC === previous.mergeCC;
     };
     StateBase.prototype._withinOriginalDistance = function () {
         var current = this._currentNode;
@@ -31275,104 +54123,46 @@ var StateBase = (function () {
 }());
 exports.StateBase = StateBase;
 
-},{"../../Error":209,"../../Geo":210}],305:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
+},{"../../Error":293,"../../Geo":294,"../../State":298}],458:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var UnitBezier = require("unitbezier");
-var State_1 = require("../../State");
-var RotationDelta = (function () {
-    function RotationDelta(phi, theta) {
-        this._phi = phi;
-        this._theta = theta;
-    }
-    Object.defineProperty(RotationDelta.prototype, "phi", {
-        get: function () {
-            return this._phi;
-        },
-        set: function (value) {
-            this._phi = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "theta", {
-        get: function () {
-            return this._theta;
-        },
-        set: function (value) {
-            this._theta = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "isZero", {
-        get: function () {
-            return this._phi === 0 && this._theta === 0;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    RotationDelta.prototype.copy = function (delta) {
-        this._phi = delta.phi;
-        this._theta = delta.theta;
-    };
-    RotationDelta.prototype.lerp = function (other, alpha) {
-        this._phi = (1 - alpha) * this._phi + alpha * other.phi;
-        this._theta = (1 - alpha) * this._theta + alpha * other.theta;
-    };
-    RotationDelta.prototype.multiply = function (value) {
-        this._phi *= value;
-        this._theta *= value;
-    };
-    RotationDelta.prototype.threshold = function (value) {
-        this._phi = Math.abs(this._phi) > value ? this._phi : 0;
-        this._theta = Math.abs(this._theta) > value ? this._theta : 0;
-    };
-    RotationDelta.prototype.lengthSquared = function () {
-        return this._phi * this._phi + this._theta * this._theta;
-    };
-    RotationDelta.prototype.reset = function () {
-        this._phi = 0;
-        this._theta = 0;
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    return RotationDelta;
-}());
-var TraversingState = (function (_super) {
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TraversingState = void 0;
+var UnitBezier = require("@mapbox/unitbezier");
+var State_1 = require("../../State");
+var TraversingState = /** @class */ (function (_super) {
     __extends(TraversingState, _super);
     function TraversingState(state) {
-        _super.call(this, state);
-        this._motionless = this._motionlessTransition();
-        this._baseAlpha = this._alpha;
-        this._animationSpeed = 0.025;
-        this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
-        this._useBezier = false;
-        this._rotationDelta = new RotationDelta(0, 0);
-        this._requestedRotationDelta = null;
-        this._basicRotation = [0, 0];
-        this._requestedBasicRotation = null;
-        this._rotationAcceleration = 0.86;
-        this._rotationIncreaseAlpha = 0.97;
-        this._rotationDecreaseAlpha = 0.9;
-        this._rotationThreshold = 0.001;
-        this._desiredZoom = state.zoom;
-        this._minZoom = 0;
-        this._maxZoom = 3;
-        this._lookatDepth = 10;
-        this._desiredLookat = null;
-        this._desiredCenter = null;
-    }
-    TraversingState.prototype.traverse = function () {
-        throw new Error("Not implemented");
+        var _this = _super.call(this, state) || this;
+        _this._adjustCameras();
+        _this._motionless = _this._motionlessTransition();
+        _this._baseAlpha = _this._alpha;
+        _this._speedCoefficient = 1;
+        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
+        _this._useBezier = false;
+        return _this;
+    }
+    TraversingState.prototype.earth = function () {
+        return new State_1.EarthState(this);
     };
     TraversingState.prototype.wait = function () {
         return new State_1.WaitingState(this);
     };
+    TraversingState.prototype.waitInteractively = function () {
+        return new State_1.InteractiveWaitingState(this);
+    };
     TraversingState.prototype.append = function (nodes) {
         var emptyTrajectory = this._trajectory.length === 0;
         if (emptyTrajectory) {
@@ -31406,123 +54196,8 @@ var TraversingState = (function (_super) {
             this._useBezier = true;
         }
     };
-    TraversingState.prototype.move = function (delta) {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.moveTo = function (delta) {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.rotate = function (rotationDelta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedBasicRotation = null;
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;
-            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;
-        }
-        else {
-            this._requestedRotationDelta = new RotationDelta(rotationDelta.phi, rotationDelta.theta);
-        }
-    };
-    TraversingState.prototype.rotateBasic = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation[0] += basicRotation[0];
-            this._requestedBasicRotation[1] += basicRotation[1];
-        }
-        else {
-            this._requestedBasicRotation = basicRotation.slice();
-        }
-    };
-    TraversingState.prototype.rotateToBasic = function (basic) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        basic[0] = this._spatial.clamp(basic[0], 0, 1);
-        basic[1] = this._spatial.clamp(basic[1], 0, 1);
-        var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
-        this._currentCamera.lookat.fromArray(lookat);
-    };
-    TraversingState.prototype.zoomIn = function (delta, reference) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));
-        var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray());
-        var currentCenterX = currentCenter[0];
-        var currentCenterY = currentCenter[1];
-        var zoom0 = Math.pow(2, this._zoom);
-        var zoom1 = Math.pow(2, this._desiredZoom);
-        var refX = reference[0];
-        var refY = reference[1];
-        if (this.currentTransform.gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            if (refX - currentCenterX > 0.5) {
-                refX = refX - 1;
-            }
-            else if (currentCenterX - refX > 0.5) {
-                refX = 1 + refX;
-            }
-        }
-        var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX);
-        var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY);
-        var gpano = this.currentTransform.gpano;
-        if (this._currentNode.fullPano) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);
-        }
-        else {
-            newCenterX = this._spatial.clamp(newCenterX, 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY, 0, 1);
-        }
-        this._desiredLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));
-    };
-    TraversingState.prototype.setCenter = function (center) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._desiredZoom = this._zoom;
-        var clamped = [
-            this._spatial.clamp(center[0], 0, 1),
-            this._spatial.clamp(center[1], 0, 1),
-        ];
-        if (this._currentNode == null) {
-            this._desiredCenter = clamped;
-            return;
-        }
-        this._desiredCenter = null;
-        var currentLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var previousLookat = new THREE.Vector3()
-            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));
-        this._currentCamera.lookat.copy(currentLookat);
-        this._previousCamera.lookat.copy(previousLookat);
-    };
-    TraversingState.prototype.setZoom = function (zoom) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);
-        this._desiredZoom = this._zoom;
+    TraversingState.prototype.setSpeed = function (speed) {
+        this._speedCoefficient = this._spatial.clamp(speed, 0, 10);
     };
     TraversingState.prototype.update = function (fps) {
         if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) {
@@ -31536,7 +54211,7 @@ var TraversingState = (function (_super) {
             this._desiredLookat = null;
         }
         var animationSpeed = this._animationSpeed * (60 / fps);
-        this._baseAlpha = Math.min(1, this._baseAlpha + animationSpeed);
+        this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed);
         if (this._useBezier) {
             this._alpha = this._unitBezier.solve(this._baseAlpha);
         }
@@ -31545,12 +54220,12 @@ var TraversingState = (function (_super) {
         }
         this._updateRotation();
         if (!this._rotationDelta.isZero) {
-            this._applyRotation(this._previousCamera);
-            this._applyRotation(this._currentCamera);
+            this._applyRotation(this._rotationDelta, this._previousCamera);
+            this._applyRotation(this._rotationDelta, this._currentCamera);
         }
         this._updateRotationBasic();
         if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic();
+            this._applyRotationBasic(this._basicRotation);
         }
         this._updateZoom(animationSpeed);
         this._updateLookat(animationSpeed);
@@ -31561,12 +54236,16 @@ var TraversingState = (function (_super) {
     };
     TraversingState.prototype._setCurrentCamera = function () {
         _super.prototype._setCurrentCamera.call(this);
-        if (this._previousNode != null) {
-            var lookat = this._camera.lookat.clone().sub(this._camera.position);
-            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-            if (this._currentNode.fullPano) {
-                this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-            }
+        this._adjustCameras();
+    };
+    TraversingState.prototype._adjustCameras = function () {
+        if (this._previousNode == null) {
+            return;
+        }
+        var lookat = this._camera.lookat.clone().sub(this._camera.position);
+        this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
+        if (this._currentNode.fullPano) {
+            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
         }
     };
     TraversingState.prototype._resetTransition = function () {
@@ -31574,250 +54253,907 @@ var TraversingState = (function (_super) {
         this._baseAlpha = 0;
         this._motionless = this._motionlessTransition();
     };
-    TraversingState.prototype._applyRotation = function (camera) {
-        if (camera == null) {
+    return TraversingState;
+}(State_1.InteractiveStateBase));
+exports.TraversingState = TraversingState;
+exports.default = TraversingState;
+
+},{"../../State":298,"@mapbox/unitbezier":2}],459:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.WaitingState = void 0;
+var State_1 = require("../../State");
+var WaitingState = /** @class */ (function (_super) {
+    __extends(WaitingState, _super);
+    function WaitingState(state) {
+        var _this = _super.call(this, state) || this;
+        _this._zoom = 0;
+        _this._adjustCameras();
+        _this._motionless = _this._motionlessTransition();
+        return _this;
+    }
+    WaitingState.prototype.traverse = function () {
+        return new State_1.TraversingState(this);
+    };
+    WaitingState.prototype.waitInteractively = function () {
+        return new State_1.InteractiveWaitingState(this);
+    };
+    WaitingState.prototype.prepend = function (nodes) {
+        _super.prototype.prepend.call(this, nodes);
+        this._motionless = this._motionlessTransition();
+    };
+    WaitingState.prototype.set = function (nodes) {
+        _super.prototype.set.call(this, nodes);
+        this._motionless = this._motionlessTransition();
+    };
+    WaitingState.prototype.move = function (delta) {
+        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
+    };
+    WaitingState.prototype.moveTo = function (position) {
+        this._alpha = Math.max(0, Math.min(1, position));
+    };
+    WaitingState.prototype.update = function (fps) {
+        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
+    };
+    WaitingState.prototype._getAlpha = function () {
+        return this._motionless ? Math.round(this._alpha) : this._alpha;
+    };
+    WaitingState.prototype._setCurrentCamera = function () {
+        _super.prototype._setCurrentCamera.call(this);
+        this._adjustCameras();
+    };
+    WaitingState.prototype._adjustCameras = function () {
+        if (this._previousNode == null) {
             return;
         }
-        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3();
-        offset.copy(camera.lookat).sub(camera.position);
-        offset.applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += this._rotationDelta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += this._rotationDelta.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));
+        if (this._currentNode.fullPano) {
+            var lookat = this._camera.lookat.clone().sub(this._camera.position);
+            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
+        }
+        if (this._previousNode.fullPano) {
+            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
+            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
+        }
+    };
+    return WaitingState;
+}(State_1.StateBase));
+exports.WaitingState = WaitingState;
+exports.default = WaitingState;
+
+},{"../../State":298}],460:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageTileLoader = void 0;
+var rxjs_1 = require("rxjs");
+/**
+ * @class ImageTileLoader
+ *
+ * @classdesc Represents a loader of image tiles.
+ */
+var ImageTileLoader = /** @class */ (function () {
+    /**
+     * Create a new node image tile loader instance.
+     *
+     * @param {string} scheme - The URI scheme.
+     * @param {string} host - The URI host.
+     * @param {string} [origin] - The origin query param.
+     */
+    function ImageTileLoader(scheme, host, origin) {
+        this._scheme = scheme;
+        this._host = host;
+        this._origin = origin != null ? "?origin=" + origin : "";
+    }
+    /**
+     * Retrieve an image tile.
+     *
+     * @description Retrieve an image tile by specifying the area
+     * as well as the scaled size.
+     *
+     * @param {string} identifier - The identifier of the image.
+     * @param {number} x - The top left x pixel coordinate for the tile
+     * in the original image.
+     * @param {number} y - The top left y pixel coordinate for the tile
+     * in the original image.
+     * @param {number} w - The pixel width of the tile in the original image.
+     * @param {number} h - The pixel height of the tile in the original image.
+     * @param {number} scaledW - The scaled width of the returned tile.
+     * @param {number} scaledH - The scaled height of the returned tile.
+     */
+    ImageTileLoader.prototype.getTile = function (identifier, x, y, w, h, scaledW, scaledH) {
+        var characteristics = "/" + identifier + "/" + x + "," + y + "," + w + "," + h + "/" + scaledW + "," + scaledH + "/0/default.jpg";
+        var url = this._scheme +
+            "://" +
+            this._host +
+            characteristics +
+            this._origin;
+        var xmlHTTP = null;
+        return [rxjs_1.Observable.create(function (subscriber) {
+                xmlHTTP = new XMLHttpRequest();
+                xmlHTTP.open("GET", url, true);
+                xmlHTTP.responseType = "arraybuffer";
+                xmlHTTP.timeout = 15000;
+                xmlHTTP.onload = function (event) {
+                    if (xmlHTTP.status !== 200) {
+                        subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + "). " +
+                            ("Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText)));
+                        return;
+                    }
+                    var image = new Image();
+                    image.crossOrigin = "Anonymous";
+                    image.onload = function (e) {
+                        subscriber.next(image);
+                        subscriber.complete();
+                    };
+                    image.onerror = function (error) {
+                        subscriber.error(new Error("Failed to load tile image (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
+                    };
+                    var blob = new Blob([xmlHTTP.response]);
+                    image.src = window.URL.createObjectURL(blob);
+                };
+                xmlHTTP.onerror = function (error) {
+                    subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
+                };
+                xmlHTTP.ontimeout = function (error) {
+                    subscriber.error(new Error("Tile request timed out (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
+                };
+                xmlHTTP.onabort = function (event) {
+                    subscriber.error(new Error("Tile request was aborted (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
+                };
+                xmlHTTP.send(null);
+            }),
+            function () {
+                if (xmlHTTP != null) {
+                    xmlHTTP.abort();
+                }
+            },
+        ];
+    };
+    return ImageTileLoader;
+}());
+exports.ImageTileLoader = ImageTileLoader;
+exports.default = ImageTileLoader;
+
+},{"rxjs":43}],461:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageTileStore = void 0;
+/**
+ * @class ImageTileStore
+ *
+ * @classdesc Represents a store for image tiles.
+ */
+var ImageTileStore = /** @class */ (function () {
+    /**
+     * Create a new node image tile store instance.
+     */
+    function ImageTileStore() {
+        this._images = {};
+    }
+    /**
+     * Add an image tile to the store.
+     *
+     * @param {HTMLImageElement} image - The image tile.
+     * @param {string} key - The identifier for the tile.
+     * @param {number} level - The level of the tile.
+     */
+    ImageTileStore.prototype.addImage = function (image, key, level) {
+        if (!(level in this._images)) {
+            this._images[level] = {};
+        }
+        this._images[level][key] = image;
+    };
+    /**
+     * Dispose the store.
+     *
+     * @description Disposes all cached assets.
+     */
+    ImageTileStore.prototype.dispose = function () {
+        for (var _i = 0, _a = Object.keys(this._images); _i < _a.length; _i++) {
+            var level = _a[_i];
+            var levelImages = this._images[level];
+            for (var _b = 0, _c = Object.keys(levelImages); _b < _c.length; _b++) {
+                var key = _c[_b];
+                window.URL.revokeObjectURL(levelImages[key].src);
+                delete levelImages[key];
+            }
+            delete this._images[level];
+        }
+    };
+    /**
+     * Get an image tile from the store.
+     *
+     * @param {string} key - The identifier for the tile.
+     * @param {number} level - The level of the tile.
+     */
+    ImageTileStore.prototype.getImage = function (key, level) {
+        return this._images[level][key];
+    };
+    /**
+     * Check if an image tile exist in the store.
+     *
+     * @param {string} key - The identifier for the tile.
+     * @param {number} level - The level of the tile.
+     */
+    ImageTileStore.prototype.hasImage = function (key, level) {
+        return level in this._images && key in this._images[level];
+    };
+    return ImageTileStore;
+}());
+exports.ImageTileStore = ImageTileStore;
+exports.default = ImageTileStore;
+
+},{}],462:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RegionOfInterestCalculator = void 0;
+var Geo_1 = require("../Geo");
+/**
+ * @class RegionOfInterestCalculator
+ *
+ * @classdesc Represents a calculator for regions of interest.
+ */
+var RegionOfInterestCalculator = /** @class */ (function () {
+    function RegionOfInterestCalculator() {
+        this._viewportCoords = new Geo_1.ViewportCoords();
+    }
+    /**
+     * Compute a region of interest based on the current render camera
+     * and the viewport size.
+     *
+     * @param {RenderCamera} renderCamera - Render camera used for unprojections.
+     * @param {ISize} size - Viewport size in pixels.
+     * @param {Transform} transform - Transform used for projections.
+     *
+     * @returns {IRegionOfInterest} A region of interest.
+     */
+    RegionOfInterestCalculator.prototype.computeRegionOfInterest = function (renderCamera, size, transform) {
+        var viewportBoundaryPoints = this._viewportBoundaryPoints(4);
+        var bbox = this._viewportPointsBoundingBox(viewportBoundaryPoints, renderCamera, transform);
+        this._clipBoundingBox(bbox);
+        var viewportPixelWidth = 2 / size.width;
+        var viewportPixelHeight = 2 / size.height;
+        var centralViewportPixel = [
+            [-0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight],
+            [0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight],
+            [0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],
+            [-0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],
+        ];
+        var cpbox = this._viewportPointsBoundingBox(centralViewportPixel, renderCamera, transform);
+        return {
+            bbox: bbox,
+            pixelHeight: cpbox.maxY - cpbox.minY,
+            pixelWidth: cpbox.maxX - cpbox.minX + (cpbox.minX < cpbox.maxX ? 0 : 1),
+        };
     };
-    TraversingState.prototype._applyRotationBasic = function () {
-        var currentNode = this._currentNode;
-        var previousNode = this._previousNode != null ?
-            this.previousNode :
-            this.currentNode;
-        var currentCamera = this._currentCamera;
-        var previousCamera = this._previousCamera;
-        var currentTransform = this.currentTransform;
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray());
-        var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray());
-        var currentGPano = currentTransform.gpano;
-        var previousGPano = previousTransform.gpano;
-        if (currentNode.fullPano) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0.05, 0.95);
+    RegionOfInterestCalculator.prototype._viewportBoundaryPoints = function (pointsPerSide) {
+        var points = [];
+        var os = [[-1, 1], [1, 1], [1, -1], [-1, -1]];
+        var ds = [[2, 0], [0, -2], [-2, 0], [0, 2]];
+        for (var side = 0; side < 4; ++side) {
+            var o = os[side];
+            var d = ds[side];
+            for (var i = 0; i < pointsPerSide; ++i) {
+                points.push([o[0] + d[0] * i / pointsPerSide,
+                    o[1] + d[1] * i / pointsPerSide]);
+            }
         }
-        else if (currentGPano != null &&
-            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
+        return points;
+    };
+    RegionOfInterestCalculator.prototype._viewportPointsBoundingBox = function (viewportPoints, renderCamera, transform) {
+        var _this = this;
+        var basicPoints = viewportPoints
+            .map(function (point) {
+            return _this._viewportCoords
+                .viewportToBasic(point[0], point[1], transform, renderCamera.perspective);
+        });
+        if (transform.gpano != null) {
+            return this._boundingBoxPano(basicPoints);
         }
         else {
-            currentBasic[0] = this._spatial.clamp(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
+            return this._boundingBox(basicPoints);
         }
-        if (previousNode.fullPano) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0.05, 0.95);
+    };
+    RegionOfInterestCalculator.prototype._boundingBox = function (points) {
+        var bbox = {
+            maxX: Number.NEGATIVE_INFINITY,
+            maxY: Number.NEGATIVE_INFINITY,
+            minX: Number.POSITIVE_INFINITY,
+            minY: Number.POSITIVE_INFINITY,
+        };
+        for (var i = 0; i < points.length; ++i) {
+            bbox.minX = Math.min(bbox.minX, points[i][0]);
+            bbox.maxX = Math.max(bbox.maxX, points[i][0]);
+            bbox.minY = Math.min(bbox.minY, points[i][1]);
+            bbox.maxY = Math.max(bbox.maxY, points[i][1]);
         }
-        else if (previousGPano != null &&
-            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0, 1);
+        return bbox;
+    };
+    RegionOfInterestCalculator.prototype._boundingBoxPano = function (points) {
+        var _this = this;
+        var xs = [];
+        var ys = [];
+        for (var i = 0; i < points.length; ++i) {
+            xs.push(points[i][0]);
+            ys.push(points[i][1]);
+        }
+        xs.sort(function (a, b) { return _this._sign(a - b); });
+        ys.sort(function (a, b) { return _this._sign(a - b); });
+        var intervalX = this._intervalPano(xs);
+        return {
+            maxX: intervalX[1],
+            maxY: ys[ys.length - 1],
+            minX: intervalX[0],
+            minY: ys[0],
+        };
+    };
+    /**
+     * Find the max interval between consecutive numbers.
+     * Assumes numbers are between 0 and 1, sorted and that
+     * x is equivalent to x + 1.
+     */
+    RegionOfInterestCalculator.prototype._intervalPano = function (xs) {
+        var maxdx = 0;
+        var maxi = -1;
+        for (var i = 0; i < xs.length - 1; ++i) {
+            var dx = xs[i + 1] - xs[i];
+            if (dx > maxdx) {
+                maxdx = dx;
+                maxi = i;
+            }
+        }
+        var loopdx = xs[0] + 1 - xs[xs.length - 1];
+        if (loopdx > maxdx) {
+            return [xs[0], xs[xs.length - 1]];
         }
         else {
-            previousBasic[0] = this._spatial.clamp(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
+            return [xs[maxi + 1], xs[maxi]];
         }
-        var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);
-        currentCamera.lookat.fromArray(currentLookat);
-        var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);
-        previousCamera.lookat.fromArray(previousLookat);
     };
-    TraversingState.prototype._updateZoom = function (animationSpeed) {
-        var diff = this._desiredZoom - this._zoom;
-        if (diff === 0) {
-            return;
+    RegionOfInterestCalculator.prototype._clipBoundingBox = function (bbox) {
+        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
+        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
+        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
+        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
+    };
+    RegionOfInterestCalculator.prototype._sign = function (n) {
+        return n > 0 ? 1 : n < 0 ? -1 : 0;
+    };
+    return RegionOfInterestCalculator;
+}());
+exports.RegionOfInterestCalculator = RegionOfInterestCalculator;
+exports.default = RegionOfInterestCalculator;
+
+},{"../Geo":294}],463:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TextureProvider = void 0;
+var operators_1 = require("rxjs/operators");
+var THREE = require("three");
+var rxjs_1 = require("rxjs");
+/**
+ * @class TextureProvider
+ *
+ * @classdesc Represents a provider of textures.
+ */
+var TextureProvider = /** @class */ (function () {
+    /**
+     * Create a new node texture provider instance.
+     *
+     * @param {string} key - The identifier of the image for which to request tiles.
+     * @param {number} width - The full width of the original image.
+     * @param {number} height - The full height of the original image.
+     * @param {number} tileSize - The size used when requesting tiles.
+     * @param {HTMLImageElement} background - Image to use as background.
+     * @param {ImageTileLoader} imageTileLoader - Loader for retrieving tiles.
+     * @param {ImageTileStore} imageTileStore - Store for saving tiles.
+     * @param {THREE.WebGLRenderer} renderer - Renderer used for rendering tiles to texture.
+     */
+    function TextureProvider(key, width, height, tileSize, background, imageTileLoader, imageTileStore, renderer) {
+        this._disposed = false;
+        this._key = key;
+        if (width <= 0 || height <= 0) {
+            console.warn("Original image size (" + width + ", " + height + ") is invalid (" + key + "). Tiles will not be loaded.");
+        }
+        this._width = width;
+        this._height = height;
+        this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2));
+        this._currentLevel = -1;
+        this._tileSize = tileSize;
+        this._updated$ = new rxjs_1.Subject();
+        this._createdSubject$ = new rxjs_1.Subject();
+        this._created$ = this._createdSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._createdSubscription = this._created$.subscribe(function () { });
+        this._hasSubject$ = new rxjs_1.Subject();
+        this._has$ = this._hasSubject$.pipe(operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasSubscription = this._has$.subscribe(function () { });
+        this._abortFunctions = [];
+        this._tileSubscriptions = {};
+        this._renderedCurrentLevelTiles = {};
+        this._renderedTiles = {};
+        this._background = background;
+        this._camera = null;
+        this._imageTileLoader = imageTileLoader;
+        this._imageTileStore = imageTileStore;
+        this._renderer = renderer;
+        this._renderTarget = null;
+        this._roi = null;
+    }
+    Object.defineProperty(TextureProvider.prototype, "disposed", {
+        /**
+         * Get disposed.
+         *
+         * @returns {boolean} Value indicating whether provider has
+         * been disposed.
+         */
+        get: function () {
+            return this._disposed;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TextureProvider.prototype, "hasTexture$", {
+        /**
+         * Get hasTexture$.
+         *
+         * @returns {Observable<boolean>} Observable emitting
+         * values indicating when the existance of a texture
+         * changes.
+         */
+        get: function () {
+            return this._has$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TextureProvider.prototype, "key", {
+        /**
+         * Get key.
+         *
+         * @returns {boolean} The identifier of the image for
+         * which to render textures.
+         */
+        get: function () {
+            return this._key;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TextureProvider.prototype, "textureUpdated$", {
+        /**
+         * Get textureUpdated$.
+         *
+         * @returns {Observable<boolean>} Observable emitting
+         * values when an existing texture has been updated.
+         */
+        get: function () {
+            return this._updated$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TextureProvider.prototype, "textureCreated$", {
+        /**
+         * Get textureCreated$.
+         *
+         * @returns {Observable<boolean>} Observable emitting
+         * values when a new texture has been created.
+         */
+        get: function () {
+            return this._created$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Abort all outstanding image tile requests.
+     */
+    TextureProvider.prototype.abort = function () {
+        for (var key in this._tileSubscriptions) {
+            if (!this._tileSubscriptions.hasOwnProperty(key)) {
+                continue;
+            }
+            this._tileSubscriptions[key].unsubscribe();
         }
-        else if (Math.abs(diff) < 0.0001) {
-            this._zoom = this._desiredZoom;
+        this._tileSubscriptions = {};
+        for (var _i = 0, _a = this._abortFunctions; _i < _a.length; _i++) {
+            var abort = _a[_i];
+            abort();
         }
-        else {
-            this._zoom += 5 * animationSpeed * diff;
+        this._abortFunctions = [];
+    };
+    /**
+     * Dispose the provider.
+     *
+     * @description Disposes all cached assets and
+     * aborts all outstanding image tile requests.
+     */
+    TextureProvider.prototype.dispose = function () {
+        if (this._disposed) {
+            console.warn("Texture already disposed (" + this._key + ")");
+            return;
         }
+        this.abort();
+        if (this._renderTarget != null) {
+            this._renderTarget.dispose();
+            this._renderTarget = null;
+        }
+        this._imageTileStore.dispose();
+        this._imageTileStore = null;
+        this._background = null;
+        this._camera = null;
+        this._imageTileLoader = null;
+        this._renderer = null;
+        this._roi = null;
+        this._createdSubscription.unsubscribe();
+        this._hasSubscription.unsubscribe();
+        this._disposed = true;
     };
-    TraversingState.prototype._updateLookat = function (animationSpeed) {
-        if (this._desiredLookat === null) {
+    /**
+     * Set the region of interest.
+     *
+     * @description When the region of interest is set the
+     * the tile level is determined and tiles for the region
+     * are fetched from the store or the loader and renderedLevel
+     * to the texture.
+     *
+     * @param {IRegionOfInterest} roi - Spatial edges to cache.
+     */
+    TextureProvider.prototype.setRegionOfInterest = function (roi) {
+        if (this._width <= 0 || this._height <= 0) {
             return;
         }
-        var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);
-        if (Math.abs(diff) < 0.00001) {
-            this._currentCamera.lookat.copy(this._desiredLookat);
-            this._desiredLookat = null;
+        this._roi = roi;
+        var width = 1 / this._roi.pixelWidth;
+        var height = 1 / this._roi.pixelHeight;
+        var size = Math.max(height, width);
+        var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.ceil(Math.log(size) / Math.log(2))));
+        if (currentLevel !== this._currentLevel) {
+            this.abort();
+            this._currentLevel = currentLevel;
+            if (!(this._currentLevel in this._renderedTiles)) {
+                this._renderedTiles[this._currentLevel] = [];
+            }
+            this._renderedCurrentLevelTiles = {};
+            for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) {
+                var tile = _a[_i];
+                this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
+            }
+        }
+        var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]);
+        var bottomRight = this._getTileCoords([this._roi.bbox.maxX, this._roi.bbox.maxY]);
+        var tiles = this._getTiles(topLeft, bottomRight);
+        if (this._camera == null) {
+            this._camera = new THREE.OrthographicCamera(-this._width / 2, this._width / 2, this._height / 2, -this._height / 2, -1, 1);
+            this._camera.position.z = 1;
+            var gl = this._renderer.getContext();
+            var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
+            var backgroundSize = Math.max(this._width, this._height);
+            var scale = maxTextureSize > backgroundSize ? 1 : maxTextureSize / backgroundSize;
+            var targetWidth = Math.floor(scale * this._width);
+            var targetHeight = Math.floor(scale * this._height);
+            this._renderTarget = new THREE.WebGLRenderTarget(targetWidth, targetHeight, {
+                depthBuffer: false,
+                format: THREE.RGBFormat,
+                magFilter: THREE.LinearFilter,
+                minFilter: THREE.LinearFilter,
+                stencilBuffer: false,
+            });
+            this._renderToTarget(0, 0, this._width, this._height, this._background);
+            this._createdSubject$.next(this._renderTarget.texture);
+            this._hasSubject$.next(true);
         }
-        else {
-            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);
+        this._fetchTiles(tiles);
+    };
+    TextureProvider.prototype.setTileSize = function (tileSize) {
+        this._tileSize = tileSize;
+    };
+    /**
+     * Update the image used as background for the texture.
+     *
+     * @param {HTMLImageElement} background - The background image.
+     */
+    TextureProvider.prototype.updateBackground = function (background) {
+        this._background = background;
+    };
+    /**
+     * Retrieve an image tile.
+     *
+     * @description Retrieve an image tile and render it to the
+     * texture. Add the tile to the store and emit to the updated
+     * observable.
+     *
+     * @param {Array<number>} tile - The tile coordinates.
+     * @param {number} level - The tile level.
+     * @param {number} x - The top left x pixel coordinate of the tile.
+     * @param {number} y - The top left y pixel coordinate of the tile.
+     * @param {number} w - The pixel width of the tile.
+     * @param {number} h - The pixel height of the tile.
+     * @param {number} scaledW - The scaled width of the returned tile.
+     * @param {number} scaledH - The scaled height of the returned tile.
+     */
+    TextureProvider.prototype._fetchTile = function (tile, level, x, y, w, h, scaledX, scaledY) {
+        var _this = this;
+        var getTile = this._imageTileLoader.getTile(this._key, x, y, w, h, scaledX, scaledY);
+        var tile$ = getTile[0];
+        var abort = getTile[1];
+        this._abortFunctions.push(abort);
+        var tileKey = this._tileKey(this._tileSize, tile);
+        var subscription = tile$
+            .subscribe(function (image) {
+            _this._renderToTarget(x, y, w, h, image);
+            _this._removeFromDictionary(tileKey, _this._tileSubscriptions);
+            _this._removeFromArray(abort, _this._abortFunctions);
+            _this._setTileRendered(tile, _this._currentLevel);
+            _this._imageTileStore.addImage(image, tileKey, level);
+            _this._updated$.next(true);
+        }, function (error) {
+            _this._removeFromDictionary(tileKey, _this._tileSubscriptions);
+            _this._removeFromArray(abort, _this._abortFunctions);
+            console.error(error);
+        });
+        if (!subscription.closed) {
+            this._tileSubscriptions[tileKey] = subscription;
         }
     };
-    TraversingState.prototype._updateRotation = function () {
-        if (this._requestedRotationDelta != null) {
-            var length_1 = this._rotationDelta.lengthSquared();
-            var requestedLength = this._requestedRotationDelta.lengthSquared();
-            if (requestedLength > length_1) {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);
+    /**
+     * Retrieve image tiles.
+     *
+     * @description Retrieve a image tiles and render them to the
+     * texture. Retrieve from store if it exists, otherwise Retrieve
+     * from loader.
+     *
+     * @param {Array<Array<number>>} tiles - Array of tile coordinates to
+     * retrieve.
+     */
+    TextureProvider.prototype._fetchTiles = function (tiles) {
+        var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
+        for (var _i = 0, tiles_1 = tiles; _i < tiles_1.length; _i++) {
+            var tile = tiles_1[_i];
+            var tileKey = this._tileKey(this._tileSize, tile);
+            if (tileKey in this._renderedCurrentLevelTiles ||
+                tileKey in this._tileSubscriptions) {
+                continue;
             }
-            else {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);
+            var tileX = tileSize * tile[0];
+            var tileY = tileSize * tile[1];
+            var tileWidth = tileX + tileSize > this._width ? this._width - tileX : tileSize;
+            var tileHeight = tileY + tileSize > this._height ? this._height - tileY : tileSize;
+            if (this._imageTileStore.hasImage(tileKey, this._currentLevel)) {
+                this._renderToTarget(tileX, tileY, tileWidth, tileHeight, this._imageTileStore.getImage(tileKey, this._currentLevel));
+                this._setTileRendered(tile, this._currentLevel);
+                this._updated$.next(true);
+                continue;
             }
-            this._requestedRotationDelta = null;
-            return;
-        }
-        if (this._rotationDelta.isZero) {
-            return;
+            var scaledX = Math.floor(tileWidth / tileSize * this._tileSize);
+            var scaledY = Math.floor(tileHeight / tileSize * this._tileSize);
+            this._fetchTile(tile, this._currentLevel, tileX, tileY, tileWidth, tileHeight, scaledX, scaledY);
         }
-        this._rotationDelta.multiply(this._rotationAcceleration);
-        this._rotationDelta.threshold(this._rotationThreshold);
     };
-    TraversingState.prototype._updateRotationBasic = function () {
-        if (this._requestedBasicRotation != null) {
-            var x = this._basicRotation[0];
-            var y = this._basicRotation[1];
-            var lengthSquared = x * x + y * y;
-            var reqX = this._requestedBasicRotation[0];
-            var reqY = this._requestedBasicRotation[1];
-            var reqLengthSquared = reqX * reqX + reqY * reqY;
-            if (reqLengthSquared > lengthSquared) {
-                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;
-                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;
+    /**
+     * Get tile coordinates for a point using the current level.
+     *
+     * @param {Array<number>} point - Point in basic coordinates.
+     *
+     * @returns {Array<number>} x and y tile coodinates.
+     */
+    TextureProvider.prototype._getTileCoords = function (point) {
+        var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
+        var maxX = Math.ceil(this._width / tileSize) - 1;
+        var maxY = Math.ceil(this._height / tileSize) - 1;
+        return [
+            Math.min(Math.floor(this._width * point[0] / tileSize), maxX),
+            Math.min(Math.floor(this._height * point[1] / tileSize), maxY),
+        ];
+    };
+    /**
+     * Get tile coordinates for all tiles contained in a bounding
+     * box.
+     *
+     * @param {Array<number>} topLeft - Top left tile coordinate of bounding box.
+     * @param {Array<number>} bottomRight - Bottom right tile coordinate of bounding box.
+     *
+     * @returns {Array<Array<number>>} Array of x, y tile coodinates.
+     */
+    TextureProvider.prototype._getTiles = function (topLeft, bottomRight) {
+        var xs = [];
+        if (topLeft[0] > bottomRight[0]) {
+            var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
+            var maxX = Math.ceil(this._width / tileSize) - 1;
+            for (var x = topLeft[0]; x <= maxX; x++) {
+                xs.push(x);
             }
-            else {
-                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;
-                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;
+            for (var x = 0; x <= bottomRight[0]; x++) {
+                xs.push(x);
             }
-            this._requestedBasicRotation = null;
-            return;
         }
-        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {
-            return;
+        else {
+            for (var x = topLeft[0]; x <= bottomRight[0]; x++) {
+                xs.push(x);
+            }
         }
-        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];
-        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];
-        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&
-            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {
-            this._basicRotation = [0, 0];
+        var tiles = [];
+        for (var _i = 0, xs_1 = xs; _i < xs_1.length; _i++) {
+            var x = xs_1[_i];
+            for (var y = topLeft[1]; y <= bottomRight[1]; y++) {
+                tiles.push([x, y]);
+            }
         }
+        return tiles;
     };
-    TraversingState.prototype._clearRotation = function () {
-        if (this._currentNode.fullPano) {
-            return;
-        }
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta = null;
-        }
-        if (!this._rotationDelta.isZero) {
-            this._rotationDelta.reset();
-        }
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation = null;
-        }
-        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {
-            this._basicRotation = [0, 0];
+    /**
+     * Remove an item from an array if it exists in array.
+     *
+     * @param {T} item - Item to remove.
+     * @param {Array<T>} array - Array from which item should be removed.
+     */
+    TextureProvider.prototype._removeFromArray = function (item, array) {
+        var index = array.indexOf(item);
+        if (index !== -1) {
+            array.splice(index, 1);
         }
     };
-    TraversingState.prototype._setDesiredCenter = function () {
-        if (this._desiredCenter == null) {
-            return;
+    /**
+     * Remove an item from a dictionary.
+     *
+     * @param {string} key - Key of the item to remove.
+     * @param {Object} dict - Dictionary from which item should be removed.
+     */
+    TextureProvider.prototype._removeFromDictionary = function (key, dict) {
+        if (key in dict) {
+            delete dict[key];
         }
-        var lookatDirection = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))
-            .sub(this._currentCamera.position);
-        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));
-        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));
-        this._desiredCenter = null;
-    };
-    TraversingState.prototype._setDesiredZoom = function () {
-        this._desiredZoom =
-            this._currentNode.fullPano || this._previousNode == null ?
-                this._zoom : 0;
-    };
-    return TraversingState;
-}(State_1.StateBase));
-exports.TraversingState = TraversingState;
-
-},{"../../State":214,"three":157,"unitbezier":159}],306:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var State_1 = require("../../State");
-var WaitingState = (function (_super) {
-    __extends(WaitingState, _super);
-    function WaitingState(state) {
-        _super.call(this, state);
-        this._motionless = this._motionlessTransition();
-    }
-    WaitingState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    WaitingState.prototype.wait = function () {
-        throw new Error("Not implemented");
-    };
-    WaitingState.prototype.prepend = function (nodes) {
-        _super.prototype.prepend.call(this, nodes);
-        this._motionless = this._motionlessTransition();
     };
-    WaitingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    WaitingState.prototype.rotate = function (delta) { return; };
-    WaitingState.prototype.rotateBasic = function (basicRotation) { return; };
-    WaitingState.prototype.rotateToBasic = function (basic) { return; };
-    WaitingState.prototype.zoomIn = function (delta, reference) { return; };
-    WaitingState.prototype.move = function (delta) {
-        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
-    };
-    WaitingState.prototype.moveTo = function (position) {
-        this._alpha = Math.max(0, Math.min(1, position));
-    };
-    WaitingState.prototype.update = function (fps) {
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    WaitingState.prototype.setCenter = function (center) { return; };
-    WaitingState.prototype.setZoom = function (zoom) { return; };
-    WaitingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.ceil(this._alpha) : this._alpha;
+    /**
+     * Render an image tile to the target texture.
+     *
+     * @param {number} x - The top left x pixel coordinate of the tile.
+     * @param {number} y - The top left y pixel coordinate of the tile.
+     * @param {number} w - The pixel width of the tile.
+     * @param {number} h - The pixel height of the tile.
+     * @param {HTMLImageElement} background - The image tile to render.
+     */
+    TextureProvider.prototype._renderToTarget = function (x, y, w, h, image) {
+        var texture = new THREE.Texture(image);
+        texture.minFilter = THREE.LinearFilter;
+        texture.needsUpdate = true;
+        var geometry = new THREE.PlaneGeometry(w, h);
+        var material = new THREE.MeshBasicMaterial({ map: texture, side: THREE.FrontSide });
+        var mesh = new THREE.Mesh(geometry, material);
+        mesh.position.x = -this._width / 2 + x + w / 2;
+        mesh.position.y = this._height / 2 - y - h / 2;
+        var scene = new THREE.Scene();
+        scene.add(mesh);
+        var target = this._renderer.getRenderTarget();
+        this._renderer.setRenderTarget(this._renderTarget);
+        this._renderer.render(scene, this._camera);
+        this._renderer.setRenderTarget(target);
+        scene.remove(mesh);
+        geometry.dispose();
+        material.dispose();
+        texture.dispose();
     };
-    ;
-    WaitingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        if (this._previousNode != null) {
-            var lookat = this._camera.lookat.clone().sub(this._camera.position);
-            if (this._previousNode.pano) {
-                var lookat_1 = this._camera.lookat.clone().sub(this._camera.position);
-                this._currentCamera.lookat.copy(lookat_1.clone().add(this._currentCamera.position));
+    /**
+     * Mark a tile as rendered.
+     *
+     * @description Clears tiles marked as rendered in other
+     * levels of the tile pyramid  if they were rendered on
+     * top of or below the tile.
+     *
+     * @param {Arrary<number>} tile - The tile coordinates.
+     * @param {number} level - Tile level of the tile coordinates.
+     */
+    TextureProvider.prototype._setTileRendered = function (tile, level) {
+        var otherLevels = Object.keys(this._renderedTiles)
+            .map(function (key) {
+            return parseInt(key, 10);
+        })
+            .filter(function (renderedLevel) {
+            return renderedLevel !== level;
+        });
+        for (var _i = 0, otherLevels_1 = otherLevels; _i < otherLevels_1.length; _i++) {
+            var otherLevel = otherLevels_1[_i];
+            var scale = Math.pow(2, otherLevel - level);
+            if (otherLevel < level) {
+                var x = Math.floor(scale * tile[0]);
+                var y = Math.floor(scale * tile[1]);
+                for (var _a = 0, _b = this._renderedTiles[otherLevel].slice(); _a < _b.length; _a++) {
+                    var otherTile = _b[_a];
+                    if (otherTile[0] === x && otherTile[1] === y) {
+                        var index = this._renderedTiles[otherLevel].indexOf(otherTile);
+                        this._renderedTiles[otherLevel].splice(index, 1);
+                    }
+                }
             }
-            if (this._currentNode.pano) {
-                this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
+            else {
+                var startX = scale * tile[0];
+                var endX = startX + scale - 1;
+                var startY = scale * tile[1];
+                var endY = startY + scale - 1;
+                for (var _c = 0, _d = this._renderedTiles[otherLevel].slice(); _c < _d.length; _c++) {
+                    var otherTile = _d[_c];
+                    if (otherTile[0] >= startX && otherTile[0] <= endX &&
+                        otherTile[1] >= startY && otherTile[1] <= endY) {
+                        var index = this._renderedTiles[otherLevel].indexOf(otherTile);
+                        this._renderedTiles[otherLevel].splice(index, 1);
+                    }
+                }
+            }
+            if (this._renderedTiles[otherLevel].length === 0) {
+                delete this._renderedTiles[otherLevel];
             }
         }
+        this._renderedTiles[level].push(tile);
+        this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
     };
-    return WaitingState;
-}(State_1.StateBase));
-exports.WaitingState = WaitingState;
+    /**
+     * Create a tile key from a tile coordinates.
+     *
+     * @description Tile keys are used as a hash for
+     * storing the tile in a dictionary.
+     *
+     * @param {number} tileSize - The tile size.
+     * @param {Arrary<number>} tile - The tile coordinates.
+     */
+    TextureProvider.prototype._tileKey = function (tileSize, tile) {
+        return tileSize + "-" + tile[0] + "-" + tile[1];
+    };
+    return TextureProvider;
+}());
+exports.TextureProvider = TextureProvider;
+exports.default = TextureProvider;
+
+},{"rxjs":43,"rxjs/operators":241,"three":242}],464:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 
-},{"../../State":214}],307:[function(require,module,exports){
+},{}],465:[function(require,module,exports){
 "use strict";
-var EventEmitter = (function () {
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DOM = void 0;
+var DOM = /** @class */ (function () {
+    function DOM(doc) {
+        this._document = !!doc ? doc : document;
+    }
+    Object.defineProperty(DOM.prototype, "document", {
+        get: function () {
+            return this._document;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    DOM.prototype.createElement = function (tagName, className, container) {
+        var element = this._document.createElement(tagName);
+        if (!!className) {
+            element.className = className;
+        }
+        if (!!container) {
+            container.appendChild(element);
+        }
+        return element;
+    };
+    return DOM;
+}());
+exports.DOM = DOM;
+exports.default = DOM;
+
+},{}],466:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EventEmitter = void 0;
+var EventEmitter = /** @class */ (function () {
     function EventEmitter() {
         this._events = {};
     }
@@ -31871,87 +55207,370 @@ var EventEmitter = (function () {
     return EventEmitter;
 }());
 exports.EventEmitter = EventEmitter;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = EventEmitter;
 
-},{}],308:[function(require,module,exports){
+},{}],467:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Settings = void 0;
 var Viewer_1 = require("../Viewer");
-var Settings = (function () {
+var Settings = /** @class */ (function () {
     function Settings() {
     }
-    Settings.setOptions = function (options) {
-        Settings._baseImageSize = options.baseImageSize != null ?
-            options.baseImageSize :
-            Viewer_1.ImageSize.Size640;
-        Settings._basePanoramaSize = options.basePanoramaSize != null ?
-            options.basePanoramaSize :
-            Viewer_1.ImageSize.Size2048;
-        Settings._maxImageSize = options.maxImageSize != null ?
-            options.maxImageSize :
-            Viewer_1.ImageSize.Size2048;
-    };
     Object.defineProperty(Settings, "baseImageSize", {
         get: function () {
             return Settings._baseImageSize;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Settings, "basePanoramaSize", {
         get: function () {
             return Settings._basePanoramaSize;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Settings, "maxImageSize", {
         get: function () {
             return Settings._maxImageSize;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    Settings.setOptions = function (options) {
+        Settings._baseImageSize = options.baseImageSize != null ?
+            options.baseImageSize :
+            Viewer_1.ImageSize.Size640;
+        Settings._basePanoramaSize = options.basePanoramaSize != null ?
+            options.basePanoramaSize :
+            Viewer_1.ImageSize.Size2048;
+        Settings._maxImageSize = options.maxImageSize != null ?
+            options.maxImageSize :
+            Viewer_1.ImageSize.Size2048;
+    };
     return Settings;
 }());
 exports.Settings = Settings;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Settings;
 
-},{"../Viewer":216}],309:[function(require,module,exports){
+},{"../Viewer":302}],468:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isWebGLSupported = exports.isWebGLSupportedCached = exports.isBlobSupported = exports.isObjectSupported = exports.isJSONSupported = exports.isFunctionSupported = exports.isArraySupported = exports.isBrowser = void 0;
+function isBrowser() {
+    return typeof window !== "undefined" && typeof document !== "undefined";
+}
+exports.isBrowser = isBrowser;
+function isArraySupported() {
+    return !!(Array.prototype &&
+        Array.prototype.filter &&
+        Array.prototype.indexOf &&
+        Array.prototype.map &&
+        Array.prototype.reverse);
+}
+exports.isArraySupported = isArraySupported;
+function isFunctionSupported() {
+    return !!(Function.prototype && Function.prototype.bind);
+}
+exports.isFunctionSupported = isFunctionSupported;
+function isJSONSupported() {
+    return "JSON" in window && "parse" in JSON && "stringify" in JSON;
+}
+exports.isJSONSupported = isJSONSupported;
+function isObjectSupported() {
+    return !!(Object.keys &&
+        Object.assign);
+}
+exports.isObjectSupported = isObjectSupported;
+function isBlobSupported() {
+    return "Blob" in window && "URL" in window;
+}
+exports.isBlobSupported = isBlobSupported;
+var isWebGLSupportedCache = undefined;
+function isWebGLSupportedCached() {
+    if (isWebGLSupportedCache === undefined) {
+        isWebGLSupportedCache = isWebGLSupported();
+    }
+    return isWebGLSupportedCache;
+}
+exports.isWebGLSupportedCached = isWebGLSupportedCached;
+function isWebGLSupported() {
+    var webGLContextAttributes = {
+        alpha: false,
+        antialias: false,
+        depth: true,
+        failIfMajorPerformanceCaveat: false,
+        premultipliedAlpha: true,
+        preserveDrawingBuffer: false,
+        stencil: true,
+    };
+    var canvas = document.createElement("canvas");
+    var context = canvas.getContext("webgl", webGLContextAttributes) ||
+        canvas.getContext("experimental-webgl", webGLContextAttributes);
+    if (!context) {
+        return false;
+    }
+    var requiredExtensions = [
+        "OES_standard_derivatives",
+    ];
+    var supportedExtensions = context.getSupportedExtensions();
+    for (var _i = 0, requiredExtensions_1 = requiredExtensions; _i < requiredExtensions_1.length; _i++) {
+        var requiredExtension = requiredExtensions_1[_i];
+        if (supportedExtensions.indexOf(requiredExtension) === -1) {
+            return false;
+        }
+    }
+    return true;
+}
+exports.isWebGLSupported = isWebGLSupported;
+
+},{}],469:[function(require,module,exports){
 "use strict";
-var Urls = (function () {
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Urls = void 0;
+var Urls = /** @class */ (function () {
     function Urls() {
     }
-    Urls.dynamicImage = function (key, size) {
-        return "https://d2qb1440i7l50o.cloudfront.net/" + key + "/full/!" + size + "," + size + "/0/default.jpg?origin=mapillary.webgl";
+    Object.defineProperty(Urls, "explore", {
+        get: function () {
+            return Urls._scheme + "://" + Urls._exploreHost;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Urls, "origin", {
+        get: function () {
+            return Urls._origin;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Urls, "tileScheme", {
+        get: function () {
+            return Urls._scheme;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Urls, "tileDomain", {
+        get: function () {
+            return Urls._imageTileHost;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Urls.clusterReconstruction = function (key) {
+        return Urls._scheme + "://" + Urls._clusterReconstructionHost + "/" + key + "/v1.0/aligned.jsonz";
     };
-    Urls.thumbnail = function (key, size) {
-        return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=mapillary.webgl";
+    Urls.exporeImage = function (key) {
+        return Urls._scheme + "://" + Urls._exploreHost + "/app/?pKey=" + key + "&focus=photo";
+    };
+    Urls.exporeUser = function (username) {
+        return Urls._scheme + "://" + Urls._exploreHost + "/app/user/" + username;
     };
     Urls.falcorModel = function (clientId) {
-        return "https://a.mapillary.com/v3/model.json?client_id=" + clientId;
+        return Urls._scheme + "://" + Urls._apiHost + "/v3/model.json?client_id=" + clientId;
     };
     Urls.protoMesh = function (key) {
-        return "https://d1brzeo354iq2l.cloudfront.net/v2/mesh/" + key;
+        return Urls._scheme + "://" + Urls._meshHost + "/v2/mesh/" + key;
+    };
+    Urls.thumbnail = function (key, size, origin) {
+        var query = !!origin ? "?origin=" + origin : "";
+        return Urls._scheme + "://" + Urls._imageHost + "/" + key + "/thumb-" + size + ".jpg" + query;
+    };
+    Urls.setOptions = function (options) {
+        if (!options) {
+            return;
+        }
+        if (!!options.apiHost) {
+            Urls._apiHost = options.apiHost;
+        }
+        if (!!options.clusterReconstructionHost) {
+            Urls._clusterReconstructionHost = options.clusterReconstructionHost;
+        }
+        if (!!options.exploreHost) {
+            Urls._exploreHost = options.exploreHost;
+        }
+        if (!!options.imageHost) {
+            Urls._imageHost = options.imageHost;
+        }
+        if (!!options.imageTileHost) {
+            Urls._imageTileHost = options.imageTileHost;
+        }
+        if (!!options.meshHost) {
+            Urls._meshHost = options.meshHost;
+        }
+        if (!!options.scheme) {
+            Urls._scheme = options.scheme;
+        }
     };
+    Urls._apiHost = "a.mapillary.com";
+    Urls._clusterReconstructionHost = "cluster-reconstructions.mapillary.com";
+    Urls._exploreHost = "www.mapillary.com";
+    Urls._imageHost = "images.mapillary.com";
+    Urls._imageTileHost = "loris.mapillary.com";
+    Urls._meshHost = "meshes.mapillary.com";
+    Urls._origin = "mapillary.webgl";
+    Urls._scheme = "https";
     return Urls;
 }());
 exports.Urls = Urls;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Urls;
 
-},{}],310:[function(require,module,exports){
+},{}],470:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Alignment = void 0;
+/**
+ * Enumeration for alignments
+ * @enum {number}
+ * @readonly
+ */
+var Alignment;
+(function (Alignment) {
+    /**
+     * Align to bottom
+     */
+    Alignment[Alignment["Bottom"] = 0] = "Bottom";
+    /**
+     * Align to bottom left
+     */
+    Alignment[Alignment["BottomLeft"] = 1] = "BottomLeft";
+    /**
+     * Align to bottom right
+     */
+    Alignment[Alignment["BottomRight"] = 2] = "BottomRight";
+    /**
+     * Align to center
+     */
+    Alignment[Alignment["Center"] = 3] = "Center";
+    /**
+     * Align to left
+     */
+    Alignment[Alignment["Left"] = 4] = "Left";
+    /**
+     * Align to right
+     */
+    Alignment[Alignment["Right"] = 5] = "Right";
+    /**
+     * Align to top
+     */
+    Alignment[Alignment["Top"] = 6] = "Top";
+    /**
+     * Align to top left
+     */
+    Alignment[Alignment["TopLeft"] = 7] = "TopLeft";
+    /**
+     * Align to top right
+     */
+    Alignment[Alignment["TopRight"] = 8] = "TopRight";
+})(Alignment = exports.Alignment || (exports.Alignment = {}));
+exports.default = Alignment;
+
+},{}],471:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CacheService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Graph_1 = require("../Graph");
+var CacheService = /** @class */ (function () {
+    function CacheService(graphService, stateService) {
+        this._graphService = graphService;
+        this._stateService = stateService;
+        this._started = false;
+    }
+    Object.defineProperty(CacheService.prototype, "started", {
+        get: function () {
+            return this._started;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    CacheService.prototype.start = function () {
+        var _this = this;
+        if (this._started) {
+            return;
+        }
+        this._uncacheSubscription = this._stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        }), operators_1.map(function (frame) {
+            var trajectory = frame.state.trajectory;
+            var trajectoryKeys = trajectory
+                .map(function (n) {
+                return n.key;
+            });
+            var sequenceKey = trajectory[trajectory.length - 1].sequenceKey;
+            return [trajectoryKeys, sequenceKey];
+        }), operators_1.bufferCount(1, 5), operators_1.withLatestFrom(this._graphService.graphMode$), operators_1.switchMap(function (_a) {
+            var keepBuffer = _a[0], graphMode = _a[1];
+            var keepKeys = keepBuffer[0][0];
+            var keepSequenceKey = graphMode === Graph_1.GraphMode.Sequence ?
+                keepBuffer[0][1] : undefined;
+            return _this._graphService.uncache$(keepKeys, keepSequenceKey);
+        }))
+            .subscribe(function () { });
+        this._cacheNodeSubscription = this._graphService.graphMode$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._stateService.currentState$), operators_1.switchMap(function (_a) {
+            var mode = _a[0], frame = _a[1];
+            return mode === Graph_1.GraphMode.Sequence ?
+                _this._keyToEdges(frame.state.currentNode.key, function (node) {
+                    return node.sequenceEdges$;
+                }) :
+                rxjs_1.from(frame.state.trajectory
+                    .map(function (node) {
+                    return node.key;
+                })
+                    .slice(frame.state.currentIndex)).pipe(operators_1.mergeMap(function (key) {
+                    return _this._keyToEdges(key, function (node) {
+                        return node.spatialEdges$;
+                    });
+                }, 6));
+        }))
+            .subscribe(function () { });
+        this._started = true;
+    };
+    CacheService.prototype.stop = function () {
+        if (!this._started) {
+            return;
+        }
+        this._uncacheSubscription.unsubscribe();
+        this._uncacheSubscription = null;
+        this._cacheNodeSubscription.unsubscribe();
+        this._cacheNodeSubscription = null;
+        this._started = false;
+    };
+    CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) {
+        return this._graphService.cacheNode$(key).pipe(operators_1.switchMap(nodeToEdgeMap), operators_1.first(function (status) {
+            return status.cached;
+        }), operators_1.timeout(15000), operators_1.catchError(function (error) {
+            console.error("Failed to cache edges (" + key + ").", error);
+            return rxjs_1.empty();
+        }));
+    };
+    return CacheService;
+}());
+exports.CacheService = CacheService;
+exports.default = CacheService;
+
+},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],472:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ComponentController = void 0;
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../Component");
-var ComponentController = (function () {
-    function ComponentController(container, navigator, key, options) {
+var ComponentController = /** @class */ (function () {
+    function ComponentController(container, navigator, observer, key, options, componentService) {
         var _this = this;
         this._container = container;
+        this._observer = observer;
         this._navigator = navigator;
         this._options = options != null ? options : {};
         this._key = key;
-        this._componentService = new Component_1.ComponentService(this._container, this._navigator);
+        this._navigable = key == null;
+        this._componentService = !!componentService ?
+            componentService :
+            new Component_1.ComponentService(this._container, this._navigator);
         this._coverComponent = this._componentService.getCover();
         this._initializeComponents();
         if (key) {
@@ -31959,17 +55578,28 @@ var ComponentController = (function () {
             this._subscribeCoverComponent();
         }
         else {
-            this._navigator.movedToKey$
-                .first()
-                .subscribe(function (movedToKey) {
-                _this._key = movedToKey;
+            this._navigator.movedToKey$.pipe(operators_1.first(function (k) {
+                return k != null;
+            }))
+                .subscribe(function (k) {
+                _this._key = k;
                 _this._componentService.deactivateCover();
-                _this._coverComponent.configure({ key: _this._key, loading: false, visible: false });
+                _this._coverComponent.configure({ key: _this._key, state: Component_1.CoverState.Hidden });
                 _this._subscribeCoverComponent();
                 _this._navigator.stateService.start();
+                _this._navigator.cacheService.start();
+                _this._navigator.panService.start();
+                _this._observer.startEmit();
             });
         }
     }
+    Object.defineProperty(ComponentController.prototype, "navigable", {
+        get: function () {
+            return this._navigable;
+        },
+        enumerable: false,
+        configurable: true
+    });
     ComponentController.prototype.get = function (name) {
         return this._componentService.get(name);
     };
@@ -31977,16 +55607,13 @@ var ComponentController = (function () {
         this._componentService.activate(name);
     };
     ComponentController.prototype.activateCover = function () {
-        this._coverComponent.configure({ loading: false, visible: true });
+        this._coverComponent.configure({ state: Component_1.CoverState.Visible });
     };
     ComponentController.prototype.deactivate = function (name) {
         this._componentService.deactivate(name);
     };
     ComponentController.prototype.deactivateCover = function () {
-        this._coverComponent.configure({ loading: true, visible: true });
-    };
-    ComponentController.prototype.resize = function () {
-        this._componentService.resize();
+        this._coverComponent.configure({ state: Component_1.CoverState.Loading });
     };
     ComponentController.prototype._initializeComponents = function () {
         var options = this._options;
@@ -31995,9 +55622,10 @@ var ComponentController = (function () {
         this._uFalse(options.image, "image");
         this._uFalse(options.marker, "marker");
         this._uFalse(options.navigation, "navigation");
+        this._uFalse(options.popup, "popup");
         this._uFalse(options.route, "route");
         this._uFalse(options.slider, "slider");
-        this._uFalse(options.stats, "stats");
+        this._uFalse(options.spatialData, "spatialData");
         this._uFalse(options.tag, "tag");
         this._uTrue(options.attribution, "attribution");
         this._uTrue(options.bearing, "bearing");
@@ -32008,6 +55636,8 @@ var ComponentController = (function () {
         this._uTrue(options.loading, "loading");
         this._uTrue(options.mouse, "mouse");
         this._uTrue(options.sequence, "sequence");
+        this._uTrue(options.stats, "stats");
+        this._uTrue(options.zoom, "zoom");
     };
     ComponentController.prototype._initilizeCoverComponent = function () {
         var options = this._options;
@@ -32019,23 +55649,50 @@ var ComponentController = (function () {
             this.deactivateCover();
         }
     };
+    ComponentController.prototype._setNavigable = function (navigable) {
+        if (this._navigable === navigable) {
+            return;
+        }
+        this._navigable = navigable;
+        this._observer.navigable$.next(navigable);
+    };
     ComponentController.prototype._subscribeCoverComponent = function () {
         var _this = this;
-        this._coverComponent.configuration$.subscribe(function (conf) {
-            if (conf.loading) {
-                _this._navigator.moveToKey$(conf.key)
-                    .subscribe(function (node) {
+        this._coverComponent.configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (c) {
+            return c.state;
+        }))
+            .subscribe(function (conf) {
+            if (conf.state === Component_1.CoverState.Loading) {
+                _this._navigator.stateService.currentKey$.pipe(operators_1.first(), operators_1.switchMap(function (key) {
+                    var keyChanged = key == null || key !== conf.key;
+                    if (keyChanged) {
+                        _this._setNavigable(false);
+                    }
+                    return keyChanged ?
+                        _this._navigator.moveToKey$(conf.key) :
+                        _this._navigator.stateService.currentNode$.pipe(operators_1.first());
+                }))
+                    .subscribe(function () {
                     _this._navigator.stateService.start();
-                    _this._coverComponent.configure({ loading: false, visible: false });
+                    _this._navigator.cacheService.start();
+                    _this._navigator.panService.start();
+                    _this._observer.startEmit();
+                    _this._coverComponent.configure({ state: Component_1.CoverState.Hidden });
                     _this._componentService.deactivateCover();
+                    _this._setNavigable(true);
                 }, function (error) {
                     console.error("Failed to deactivate cover.", error);
-                    _this._coverComponent.configure({ loading: false, visible: true });
+                    _this._coverComponent.configure({ state: Component_1.CoverState.Visible });
                 });
             }
-            else if (conf.visible) {
+            else if (conf.state === Component_1.CoverState.Visible) {
+                _this._observer.stopEmit();
                 _this._navigator.stateService.stop();
+                _this._navigator.cacheService.stop();
+                _this._navigator.playService.stop();
+                _this._navigator.panService.stop();
                 _this._componentService.activateCover();
+                _this._setNavigable(conf.key == null);
             }
         });
     };
@@ -32077,96 +55734,77 @@ var ComponentController = (function () {
 }());
 exports.ComponentController = ComponentController;
 
-},{"../Component":207}],311:[function(require,module,exports){
+},{"../Component":291,"rxjs/operators":241}],473:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Container = void 0;
 var Render_1 = require("../Render");
+var Utils_1 = require("../Utils");
 var Viewer_1 = require("../Viewer");
-var Container = (function () {
-    function Container(id, stateService, options) {
-        this.id = id;
-        this.element = document.getElementById(id);
-        this.element.classList.add("mapillary-js");
-        this.renderService = new Render_1.RenderService(this.element, stateService.currentState$, options.renderMode);
-        this.glRenderer = new Render_1.GLRenderer(this.renderService);
-        this.domRenderer = new Render_1.DOMRenderer(this.element, this.renderService, stateService.currentState$);
-        this.mouseService = new Viewer_1.MouseService(this.element);
-        this.touchService = new Viewer_1.TouchService(this.element);
+var Container = /** @class */ (function () {
+    function Container(container, stateService, options, dom) {
+        this._dom = !!dom ? dom : new Utils_1.DOM();
+        if (typeof container === 'string') {
+            this._container = this._dom.document.getElementById(container);
+            if (!this._container) {
+                throw new Error("Container '" + container + "' not found.");
+            }
+        }
+        else if (container instanceof HTMLElement) {
+            this._container = container;
+        }
+        else {
+            throw new Error("Invalid type: 'container' must be a String or HTMLElement.");
+        }
+        this.id = !!this._container.id ? this._container.id : "mapillary-js-fallback-container-id";
+        this._container.classList.add("mapillary-js");
+        this._canvasContainer = this._dom.createElement("div", "mapillary-js-interactive", this._container);
+        this._domContainer = this._dom.createElement("div", "mapillary-js-dom", this._container);
+        this.renderService = new Render_1.RenderService(this._container, stateService.currentState$, options.renderMode);
+        this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService, this._dom);
+        this.domRenderer = new Render_1.DOMRenderer(this._domContainer, this.renderService, stateService.currentState$);
+        this.keyboardService = new Viewer_1.KeyboardService(this._canvasContainer);
+        this.mouseService = new Viewer_1.MouseService(this._container, this._canvasContainer, this._domContainer, document);
+        this.touchService = new Viewer_1.TouchService(this._canvasContainer, this._domContainer);
         this.spriteService = new Viewer_1.SpriteService(options.sprite);
     }
+    Object.defineProperty(Container.prototype, "element", {
+        get: function () {
+            return this._container;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Container.prototype, "canvasContainer", {
+        get: function () {
+            return this._canvasContainer;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Container.prototype, "domContainer", {
+        get: function () {
+            return this._domContainer;
+        },
+        enumerable: false,
+        configurable: true
+    });
     return Container;
 }());
 exports.Container = Container;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = Container;
 
-},{"../Render":213,"../Viewer":216}],312:[function(require,module,exports){
+},{"../Render":297,"../Utils":301,"../Viewer":302}],474:[function(require,module,exports){
 "use strict";
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-var Viewer_1 = require("../Viewer");
-var EventLauncher = (function () {
-    function EventLauncher(eventEmitter, navigator, container) {
-        var _this = this;
-        this._container = container;
-        this._eventEmitter = eventEmitter;
-        this._navigator = navigator;
-        this._loadingSubscription = this._navigator.loadingService.loading$
-            .subscribe(function (loading) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading);
-        });
-        this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$
-            .subscribe(function (node) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node);
-        });
-        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status);
-        });
-        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$
-            .switchMap(function (node) {
-            return node.spatialEdges$;
-        })
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status);
-        });
-        Observable_1.Observable
-            .combineLatest(this._navigator.stateService.moving$, this._container.mouseService.active$)
-            .map(function (values) {
-            return values[0] || values[1];
-        })
-            .distinctUntilChanged()
-            .subscribe(function (started) {
-            if (started) {
-                _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null);
-            }
-            else {
-                _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null);
-            }
-        });
-    }
-    EventLauncher.prototype.dispose = function () {
-        this._loadingSubscription.unsubscribe();
-        this._currentNodeSubscription.unsubscribe();
-    };
-    return EventLauncher;
-}());
-exports.EventLauncher = EventLauncher;
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EventLauncher;
-
-},{"../Viewer":216,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/map":60}],313:[function(require,module,exports){
-"use strict";
+exports.ImageSize = void 0;
 /**
  * Enumeration for image sizes
  * @enum {number}
  * @readonly
  * @description Image sizes in pixels for the long side of the image.
  */
+var ImageSize;
 (function (ImageSize) {
     /**
      * 320 pixels image size
@@ -32184,55 +55822,74 @@ exports.default = EventLauncher;
      * 2048 pixels image size
      */
     ImageSize[ImageSize["Size2048"] = 2048] = "Size2048";
-})(exports.ImageSize || (exports.ImageSize = {}));
-var ImageSize = exports.ImageSize;
-
-},{}],314:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var _ = require("underscore");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var LoadingService = (function () {
+})(ImageSize = exports.ImageSize || (exports.ImageSize = {}));
+
+},{}],475:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeyboardService = void 0;
+var rxjs_1 = require("rxjs");
+var KeyboardService = /** @class */ (function () {
+    function KeyboardService(canvasContainer) {
+        this._keyDown$ = rxjs_1.fromEvent(canvasContainer, "keydown");
+        this._keyUp$ = rxjs_1.fromEvent(canvasContainer, "keyup");
+    }
+    Object.defineProperty(KeyboardService.prototype, "keyDown$", {
+        get: function () {
+            return this._keyDown$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardService.prototype, "keyUp$", {
+        get: function () {
+            return this._keyUp$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return KeyboardService;
+}());
+exports.KeyboardService = KeyboardService;
+exports.default = KeyboardService;
+
+},{"rxjs":43}],476:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.LoadingService = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var LoadingService = /** @class */ (function () {
     function LoadingService() {
-        this._loadersSubject$ = new Subject_1.Subject();
-        this._loaders$ = this._loadersSubject$
-            .scan(function (loaders, loader) {
+        this._loadersSubject$ = new rxjs_1.Subject();
+        this._loaders$ = this._loadersSubject$.pipe(operators_1.scan(function (loaders, loader) {
             if (loader.task !== undefined) {
                 loaders[loader.task] = loader.loading;
             }
             return loaders;
-        }, {})
-            .startWith({})
-            .publishReplay(1)
-            .refCount();
+        }, {}), operators_1.startWith({}), operators_1.publishReplay(1), operators_1.refCount());
     }
     Object.defineProperty(LoadingService.prototype, "loading$", {
         get: function () {
-            return this._loaders$
-                .map(function (loaders) {
-                return _.reduce(loaders, function (loader, acc) {
-                    return (loader || acc);
-                }, false);
-            })
-                .debounceTime(100)
-                .distinctUntilChanged();
+            return this._loaders$.pipe(operators_1.map(function (loaders) {
+                for (var key in loaders) {
+                    if (!loaders.hasOwnProperty(key)) {
+                        continue;
+                    }
+                    if (loaders[key]) {
+                        return true;
+                    }
+                }
+                return false;
+            }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     LoadingService.prototype.taskLoading$ = function (task) {
-        return this._loaders$
-            .map(function (loaders) {
+        return this._loaders$.pipe(operators_1.map(function (loaders) {
             return !!loaders[task];
-        })
-            .debounceTime(100)
-            .distinctUntilChanged();
+        }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
     };
     LoadingService.prototype.startLoading = function (task) {
         this._loadersSubject$.next({ loading: true, task: task });
@@ -32243,436 +55900,1496 @@ var LoadingService = (function () {
     return LoadingService;
 }());
 exports.LoadingService = LoadingService;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = LoadingService;
 
-},{"rxjs/Subject":33,"rxjs/add/operator/debounceTime":51,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72,"underscore":158}],315:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-var MouseService = (function () {
-    function MouseService(element) {
+},{"rxjs":43,"rxjs/operators":241}],477:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MouseService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var MouseService = /** @class */ (function () {
+    function MouseService(container, canvasContainer, domContainer, doc) {
         var _this = this;
-        this._element = element;
-        this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._preventMouseDownOperation$ = new Subject_1.Subject();
-        this._preventMouseDown$ = new Subject_1.Subject();
-        this._mouseMoveOperation$ = new Subject_1.Subject();
-        this._claimMouse$ = new Subject_1.Subject();
-        this._mouseDown$ = Observable_1.Observable.fromEvent(element, "mousedown");
-        this._mouseLeave$ = Observable_1.Observable.fromEvent(element, "mouseleave");
-        this._mouseUp$ = Observable_1.Observable.fromEvent(element, "mouseup");
-        this._mouseOver$ = Observable_1.Observable.fromEvent(element, "mouseover");
-        this._click$ = Observable_1.Observable.fromEvent(element, "click");
-        this._mouseWheel$ = Observable_1.Observable.fromEvent(element, "wheel");
-        this._mouseWheel$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._preventMouseDownOperation$
-            .scan(function (prevent, operation) {
-            return operation(prevent);
-        }, true)
-            .subscribe();
-        this._preventMouseDown$
-            .map(function (prevent) {
-            return function (previous) {
-                return prevent;
-            };
-        })
-            .subscribe(this._preventMouseDownOperation$);
-        this._mouseDown$
-            .map(function (e) {
-            return function (prevent) {
-                if (prevent) {
-                    e.preventDefault();
-                }
-                return prevent;
-            };
-        })
-            .subscribe(this._preventMouseDownOperation$);
-        this._mouseMove$ = this._mouseMoveOperation$
-            .scan(function (e, operation) {
-            return operation(e);
-        }, null);
-        Observable_1.Observable
-            .fromEvent(element, "mousemove")
-            .map(function (e) {
-            return function (previous) {
-                if (previous == null) {
-                    previous = e;
-                }
-                if (e.movementX == null) {
-                    e.movementX = e.clientX - previous.clientX;
-                }
-                if (e.movementY == null) {
-                    e.movementY = e.clientY - previous.clientY;
-                }
-                return e;
-            };
-        })
-            .subscribe(this._mouseMoveOperation$);
-        var dragStop$ = Observable_1.Observable
-            .merge(this._mouseLeave$, this._mouseUp$);
-        this._mouseDragStart$ = this._mouseDown$
-            .mergeMap(function (e) {
-            return _this._mouseMove$
-                .takeUntil(dragStop$)
-                .take(1);
-        });
-        this._mouseDrag$ = this._mouseDown$
-            .mergeMap(function (e) {
-            return _this._mouseMove$
-                .skip(1)
-                .takeUntil(dragStop$);
-        });
-        this._mouseDragEnd$ = this._mouseDragStart$
-            .mergeMap(function (e) {
-            return dragStop$.first();
-        });
-        this._staticClick$ = this._mouseDown$
-            .switchMap(function (e) {
-            return _this._click$
-                .takeUntil(_this._mouseMove$)
-                .take(1);
-        });
-        this._mouseOwner$ = this._claimMouse$
-            .scan(function (claims, mouseClaim) {
-            if (mouseClaim.zindex == null) {
-                delete claims[mouseClaim.name];
+        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
+        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._claimMouse$ = new rxjs_1.Subject();
+        this._claimWheel$ = new rxjs_1.Subject();
+        this._deferPixelClaims$ = new rxjs_1.Subject();
+        this._deferPixels$ = this._deferPixelClaims$.pipe(operators_1.scan(function (claims, claim) {
+            if (claim.deferPixels == null) {
+                delete claims[claim.name];
             }
             else {
-                claims[mouseClaim.name] = mouseClaim.zindex;
+                claims[claim.name] = claim.deferPixels;
             }
             return claims;
-        }, {})
-            .map(function (claims) {
-            var owner = null;
-            var curZ = -1;
-            for (var name_1 in claims) {
-                if (claims.hasOwnProperty(name_1)) {
-                    if (claims[name_1] > curZ) {
-                        curZ = claims[name_1];
-                        owner = name_1;
-                    }
+        }, {}), operators_1.map(function (claims) {
+            var deferPixelMax = -1;
+            for (var key in claims) {
+                if (!claims.hasOwnProperty(key)) {
+                    continue;
+                }
+                var deferPixels = claims[key];
+                if (deferPixels > deferPixelMax) {
+                    deferPixelMax = deferPixels;
                 }
             }
-            return owner;
-        })
-            .publishReplay(1)
-            .refCount();
+            return deferPixelMax;
+        }), operators_1.startWith(-1), operators_1.publishReplay(1), operators_1.refCount());
+        this._deferPixels$.subscribe(function () { });
+        this._documentMouseMove$ = rxjs_1.fromEvent(doc, "mousemove");
+        this._documentMouseUp$ = rxjs_1.fromEvent(doc, "mouseup");
+        this._mouseDown$ = rxjs_1.fromEvent(canvasContainer, "mousedown");
+        this._mouseLeave$ = rxjs_1.fromEvent(canvasContainer, "mouseleave");
+        this._mouseMove$ = rxjs_1.fromEvent(canvasContainer, "mousemove");
+        this._mouseUp$ = rxjs_1.fromEvent(canvasContainer, "mouseup");
+        this._mouseOut$ = rxjs_1.fromEvent(canvasContainer, "mouseout");
+        this._mouseOver$ = rxjs_1.fromEvent(canvasContainer, "mouseover");
+        this._domMouseDown$ = rxjs_1.fromEvent(domContainer, "mousedown");
+        this._domMouseMove$ = rxjs_1.fromEvent(domContainer, "mousemove");
+        this._click$ = rxjs_1.fromEvent(canvasContainer, "click");
+        this._contextMenu$ = rxjs_1.fromEvent(canvasContainer, "contextmenu");
+        this._dblClick$ = rxjs_1.merge(rxjs_1.fromEvent(container, "click"), rxjs_1.fromEvent(canvasContainer, "dblclick")).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
+            var event1 = events[0];
+            var event2 = events[1];
+            var event3 = events[2];
+            return event1.type === "click" &&
+                event2.type === "click" &&
+                event3.type === "dblclick" &&
+                event1.target.parentNode === canvasContainer &&
+                event2.target.parentNode === canvasContainer;
+        }), operators_1.map(function (events) {
+            return events[2];
+        }), operators_1.share());
+        rxjs_1.merge(this._domMouseDown$, this._domMouseMove$, this._dblClick$, this._contextMenu$)
+            .subscribe(function (event) {
+            event.preventDefault();
+        });
+        this._mouseWheel$ = rxjs_1.merge(rxjs_1.fromEvent(canvasContainer, "wheel"), rxjs_1.fromEvent(domContainer, "wheel")).pipe(operators_1.share());
+        this._consistentContextMenu$ = rxjs_1.merge(this._mouseDown$, this._mouseMove$, this._mouseOut$, this._mouseUp$, this._contextMenu$).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
+            // fire context menu on mouse up both on mac and windows
+            return events[0].type === "mousedown" &&
+                events[1].type === "contextmenu" &&
+                events[2].type === "mouseup";
+        }), operators_1.map(function (events) {
+            return events[1];
+        }), operators_1.share());
+        var dragStop$ = rxjs_1.merge(rxjs_1.fromEvent(window, "blur"), this._documentMouseUp$.pipe(operators_1.filter(function (e) {
+            return e.button === 0;
+        }))).pipe(operators_1.share());
+        var mouseDragInitiate$ = this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).pipe(operators_1.share());
+        this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).pipe(operators_1.share());
+        this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).pipe(operators_1.share());
+        this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).pipe(operators_1.share());
+        var domMouseDragInitiate$ = this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).pipe(operators_1.share());
+        this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).pipe(operators_1.share());
+        this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).pipe(operators_1.share());
+        this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).pipe(operators_1.share());
+        this._proximateClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (mouseDown) {
+            return _this._click$.pipe(operators_1.takeUntil(_this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$)), operators_1.take(1));
+        }), operators_1.share());
+        this._staticClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (e) {
+            return _this._click$.pipe(operators_1.takeUntil(_this._documentMouseMove$), operators_1.take(1));
+        }), operators_1.share());
+        this._mouseDragStart$.subscribe();
+        this._mouseDrag$.subscribe();
+        this._mouseDragEnd$.subscribe();
+        this._domMouseDragStart$.subscribe();
+        this._domMouseDrag$.subscribe();
+        this._domMouseDragEnd$.subscribe();
+        this._staticClick$.subscribe();
+        this._mouseOwner$ = this._createOwner$(this._claimMouse$).pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._wheelOwner$ = this._createOwner$(this._claimWheel$).pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._mouseOwner$.subscribe(function () { });
+        this._wheelOwner$.subscribe(function () { });
     }
     Object.defineProperty(MouseService.prototype, "active$", {
         get: function () {
             return this._active$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "activate$", {
         get: function () {
             return this._activeSubject$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "documentMouseMove$", {
+        get: function () {
+            return this._documentMouseMove$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "documentMouseUp$", {
+        get: function () {
+            return this._documentMouseUp$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "domMouseDragStart$", {
+        get: function () {
+            return this._domMouseDragStart$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "domMouseDrag$", {
+        get: function () {
+            return this._domMouseDrag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "domMouseDragEnd$", {
+        get: function () {
+            return this._domMouseDragEnd$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "domMouseDown$", {
+        get: function () {
+            return this._domMouseDown$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "domMouseMove$", {
+        get: function () {
+            return this._domMouseMove$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseOwner$", {
         get: function () {
             return this._mouseOwner$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDown$", {
         get: function () {
             return this._mouseDown$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseMove$", {
         get: function () {
             return this._mouseMove$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseLeave$", {
         get: function () {
             return this._mouseLeave$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "mouseOut$", {
+        get: function () {
+            return this._mouseOut$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "mouseOver$", {
+        get: function () {
+            return this._mouseOver$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseUp$", {
         get: function () {
             return this._mouseUp$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "click$", {
         get: function () {
             return this._click$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "dblClick$", {
+        get: function () {
+            return this._dblClick$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "contextMenu$", {
+        get: function () {
+            return this._consistentContextMenu$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseWheel$", {
         get: function () {
             return this._mouseWheel$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDragStart$", {
         get: function () {
             return this._mouseDragStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDrag$", {
         get: function () {
-            return this._mouseDrag$;
+            return this._mouseDrag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "mouseDragEnd$", {
+        get: function () {
+            return this._mouseDragEnd$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "proximateClick$", {
+        get: function () {
+            return this._proximateClick$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "staticClick$", {
+        get: function () {
+            return this._staticClick$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    MouseService.prototype.claimMouse = function (name, zindex) {
+        this._claimMouse$.next({ name: name, zindex: zindex });
+    };
+    MouseService.prototype.unclaimMouse = function (name) {
+        this._claimMouse$.next({ name: name, zindex: null });
+    };
+    MouseService.prototype.deferPixels = function (name, deferPixels) {
+        this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels });
+    };
+    MouseService.prototype.undeferPixels = function (name) {
+        this._deferPixelClaims$.next({ name: name, deferPixels: null });
+    };
+    MouseService.prototype.claimWheel = function (name, zindex) {
+        this._claimWheel$.next({ name: name, zindex: zindex });
+    };
+    MouseService.prototype.unclaimWheel = function (name) {
+        this._claimWheel$.next({ name: name, zindex: null });
+    };
+    MouseService.prototype.filtered$ = function (name, observable$) {
+        return this._filtered(name, observable$, this._mouseOwner$);
+    };
+    MouseService.prototype.filteredWheel$ = function (name, observable$) {
+        return this._filtered(name, observable$, this._wheelOwner$);
+    };
+    MouseService.prototype._createDeferredMouseMove$ = function (origin, mouseMove$) {
+        return mouseMove$.pipe(operators_1.map(function (mouseMove) {
+            var deltaX = mouseMove.clientX - origin.clientX;
+            var deltaY = mouseMove.clientY - origin.clientY;
+            return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)];
+        }), operators_1.withLatestFrom(this._deferPixels$), operators_1.filter(function (_a) {
+            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
+            return delta > deferPixels;
+        }), operators_1.map(function (_a) {
+            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
+            return mouseMove;
+        }));
+    };
+    MouseService.prototype._createMouseDrag$ = function (mouseDragStartInitiate$, stop$) {
+        var _this = this;
+        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
+            var mouseDown = _a[0], mouseMove = _a[1];
+            return mouseMove;
+        }), operators_1.switchMap(function (mouseMove) {
+            return rxjs_1.concat(rxjs_1.of(mouseMove), _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$));
+        }));
+    };
+    MouseService.prototype._createMouseDragEnd$ = function (mouseDragStart$, stop$) {
+        return mouseDragStart$.pipe(operators_1.switchMap(function (event) {
+            return stop$.pipe(operators_1.first());
+        }));
+    };
+    MouseService.prototype._createMouseDragStart$ = function (mouseDragStartInitiate$) {
+        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
+            var mouseDown = _a[0], mouseMove = _a[1];
+            return mouseDown;
+        }));
+    };
+    MouseService.prototype._createMouseDragInitiate$ = function (mouseDown$, stop$, defer) {
+        var _this = this;
+        return mouseDown$.pipe(operators_1.filter(function (mouseDown) {
+            return mouseDown.button === 0;
+        }), operators_1.switchMap(function (mouseDown) {
+            return rxjs_1.combineLatest(rxjs_1.of(mouseDown), defer ?
+                _this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$) :
+                _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$), operators_1.take(1));
+        }));
+    };
+    MouseService.prototype._createOwner$ = function (claim$) {
+        return claim$.pipe(operators_1.scan(function (claims, claim) {
+            if (claim.zindex == null) {
+                delete claims[claim.name];
+            }
+            else {
+                claims[claim.name] = claim.zindex;
+            }
+            return claims;
+        }, {}), operators_1.map(function (claims) {
+            var owner = null;
+            var zIndexMax = -1;
+            for (var name_1 in claims) {
+                if (!claims.hasOwnProperty(name_1)) {
+                    continue;
+                }
+                if (claims[name_1] > zIndexMax) {
+                    zIndexMax = claims[name_1];
+                    owner = name_1;
+                }
+            }
+            return owner;
+        }), operators_1.startWith(null));
+    };
+    MouseService.prototype._filtered = function (name, observable$, owner$) {
+        return observable$.pipe(operators_1.withLatestFrom(owner$), operators_1.filter(function (_a) {
+            var item = _a[0], owner = _a[1];
+            return owner === name;
+        }), operators_1.map(function (_a) {
+            var item = _a[0], owner = _a[1];
+            return item;
+        }));
+    };
+    return MouseService;
+}());
+exports.MouseService = MouseService;
+exports.default = MouseService;
+
+},{"rxjs":43,"rxjs/operators":241}],478:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Navigator = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var API_1 = require("../API");
+var Graph_1 = require("../Graph");
+var Edge_1 = require("../Edge");
+var Error_1 = require("../Error");
+var State_1 = require("../State");
+var Viewer_1 = require("../Viewer");
+var PanService_1 = require("./PanService");
+var Navigator = /** @class */ (function () {
+    function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService, panService) {
+        this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token);
+        this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService();
+        this._graphService = graphService != null ?
+            graphService :
+            new Graph_1.GraphService(new Graph_1.Graph(this.apiV3), this._imageLoadingService);
+        this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService();
+        this._loadingName = "navigator";
+        this._stateService = stateService != null ? stateService : new State_1.StateService(options.transitionMode);
+        this._cacheService = cacheService != null ?
+            cacheService :
+            new Viewer_1.CacheService(this._graphService, this._stateService);
+        this._playService = playService != null ?
+            playService :
+            new Viewer_1.PlayService(this._graphService, this._stateService);
+        this._panService = panService != null ?
+            panService :
+            new PanService_1.PanService(this._graphService, this._stateService, options.combinedPanning);
+        this._keyRequested$ = new rxjs_1.BehaviorSubject(null);
+        this._movedToKey$ = new rxjs_1.BehaviorSubject(null);
+        this._request$ = null;
+        this._requestSubscription = null;
+        this._nodeRequestSubscription = null;
+    }
+    Object.defineProperty(Navigator.prototype, "apiV3", {
+        get: function () {
+            return this._apiV3;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "cacheService", {
+        get: function () {
+            return this._cacheService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "graphService", {
+        get: function () {
+            return this._graphService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "imageLoadingService", {
+        get: function () {
+            return this._imageLoadingService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "loadingService", {
+        get: function () {
+            return this._loadingService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "movedToKey$", {
+        get: function () {
+            return this._movedToKey$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "panService", {
+        get: function () {
+            return this._panService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "playService", {
+        get: function () {
+            return this._playService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "stateService", {
+        get: function () {
+            return this._stateService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Navigator.prototype.moveToKey$ = function (key) {
+        this._abortRequest("to key " + key);
+        this._loadingService.startLoading(this._loadingName);
+        var node$ = this._moveToKey$(key);
+        return this._makeRequest$(node$);
+    };
+    Navigator.prototype.moveDir$ = function (direction) {
+        var _this = this;
+        this._abortRequest("in dir " + Edge_1.EdgeDirection[direction]);
+        this._loadingService.startLoading(this._loadingName);
+        var node$ = this.stateService.currentNode$.pipe(operators_1.first(), operators_1.mergeMap(function (node) {
+            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+                node.sequenceEdges$ :
+                node.spatialEdges$).pipe(operators_1.first(), operators_1.map(function (status) {
+                for (var _i = 0, _a = status.edges; _i < _a.length; _i++) {
+                    var edge = _a[_i];
+                    if (edge.data.direction === direction) {
+                        return edge.to;
+                    }
+                }
+                return null;
+            }));
+        }), operators_1.mergeMap(function (directionKey) {
+            if (directionKey == null) {
+                _this._loadingService.stopLoading(_this._loadingName);
+                return rxjs_1.throwError(new Error("Direction (" + direction + ") does not exist for current node."));
+            }
+            return _this._moveToKey$(directionKey);
+        }));
+        return this._makeRequest$(node$);
+    };
+    Navigator.prototype.moveCloseTo$ = function (lat, lon) {
+        var _this = this;
+        this._abortRequest("to lat " + lat + ", lon " + lon);
+        this._loadingService.startLoading(this._loadingName);
+        var node$ = this.apiV3.imageCloseTo$(lat, lon).pipe(operators_1.mergeMap(function (fullNode) {
+            if (fullNode == null) {
+                _this._loadingService.stopLoading(_this._loadingName);
+                return rxjs_1.throwError(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
+            }
+            return _this._moveToKey$(fullNode.key);
+        }));
+        return this._makeRequest$(node$);
+    };
+    Navigator.prototype.setFilter$ = function (filter) {
+        var _this = this;
+        this._stateService.clearNodes();
+        return this._movedToKey$.pipe(operators_1.first(), operators_1.mergeMap(function (key) {
+            if (key != null) {
+                return _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
+                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
+                        return _this._cacheKeys$(keys);
+                    }));
+                }), operators_1.last());
+            }
+            return _this._keyRequested$.pipe(operators_1.first(), operators_1.mergeMap(function (requestedKey) {
+                if (requestedKey != null) {
+                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
+                        return _this._graphService.cacheNode$(requestedKey);
+                    }));
+                }
+                return _this._graphService.setFilter$(filter).pipe(operators_1.map(function () {
+                    return undefined;
+                }));
+            }));
+        }), operators_1.map(function (node) {
+            return undefined;
+        }));
+    };
+    Navigator.prototype.setToken$ = function (token) {
+        var _this = this;
+        this._abortRequest("to set token");
+        this._stateService.clearNodes();
+        return this._movedToKey$.pipe(operators_1.first(), operators_1.tap(function (key) {
+            _this._apiV3.setToken(token);
+        }), operators_1.mergeMap(function (key) {
+            return key == null ?
+                _this._graphService.reset$([]) :
+                _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
+                    return _this._graphService.reset$(keys).pipe(operators_1.mergeMap(function () {
+                        return _this._cacheKeys$(keys);
+                    }));
+                }), operators_1.last(), operators_1.map(function (node) {
+                    return undefined;
+                }));
+        }));
+    };
+    Navigator.prototype._cacheKeys$ = function (keys) {
+        var _this = this;
+        var cacheNodes$ = keys
+            .map(function (key) {
+            return _this._graphService.cacheNode$(key);
+        });
+        return rxjs_1.from(cacheNodes$).pipe(operators_1.mergeAll());
+    };
+    Navigator.prototype._abortRequest = function (reason) {
+        if (this._requestSubscription != null) {
+            this._requestSubscription.unsubscribe();
+            this._requestSubscription = null;
+        }
+        if (this._nodeRequestSubscription != null) {
+            this._nodeRequestSubscription.unsubscribe();
+            this._nodeRequestSubscription = null;
+        }
+        if (this._request$ != null) {
+            if (!(this._request$.isStopped || this._request$.hasError)) {
+                this._request$.error(new Error_1.AbortMapillaryError("Request aborted by a subsequent request " + reason + "."));
+            }
+            this._request$ = null;
+        }
+    };
+    Navigator.prototype._makeRequest$ = function (node$) {
+        var _this = this;
+        var request$ = new rxjs_1.ReplaySubject(1);
+        this._requestSubscription = request$
+            .subscribe(undefined, function () { });
+        this._request$ = request$;
+        this._nodeRequestSubscription = node$
+            .subscribe(function (node) {
+            _this._request$ = null;
+            request$.next(node);
+            request$.complete();
+        }, function (error) {
+            _this._request$ = null;
+            request$.error(error);
+        });
+        return request$;
+    };
+    Navigator.prototype._moveToKey$ = function (key) {
+        var _this = this;
+        this._keyRequested$.next(key);
+        return this._graphService.cacheNode$(key).pipe(operators_1.tap(function (node) {
+            _this._stateService.setNodes([node]);
+            _this._movedToKey$.next(node.key);
+        }), operators_1.finalize(function () {
+            _this._loadingService.stopLoading(_this._loadingName);
+        }));
+    };
+    Navigator.prototype._trajectoryKeys$ = function () {
+        return this._stateService.currentState$.pipe(operators_1.first(), operators_1.map(function (frame) {
+            return frame.state.trajectory
+                .map(function (node) {
+                return node.key;
+            });
+        }));
+    };
+    return Navigator;
+}());
+exports.Navigator = Navigator;
+exports.default = Navigator;
+
+},{"../API":290,"../Edge":292,"../Error":293,"../Graph":295,"../State":298,"../Viewer":302,"./PanService":480,"rxjs":43,"rxjs/operators":241}],479:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Observer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Viewer_1 = require("../Viewer");
+var Observer = /** @class */ (function () {
+    function Observer(eventEmitter, navigator, container) {
+        var _this = this;
+        this._container = container;
+        this._eventEmitter = eventEmitter;
+        this._navigator = navigator;
+        this._projection = new Viewer_1.Projection();
+        this._started = false;
+        this._navigable$ = new rxjs_1.Subject();
+        // navigable and loading should always emit, also when cover is activated.
+        this._navigable$
+            .subscribe(function (navigable) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.navigablechanged, navigable);
+        });
+        this._navigator.loadingService.loading$
+            .subscribe(function (loading) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading);
+        });
+    }
+    Object.defineProperty(Observer.prototype, "started", {
+        get: function () {
+            return this._started;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(MouseService.prototype, "mouseDragEnd$", {
+    Object.defineProperty(Observer.prototype, "navigable$", {
         get: function () {
-            return this._mouseDragEnd$;
+            return this._navigable$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(MouseService.prototype, "staticClick$", {
+    Object.defineProperty(Observer.prototype, "projection", {
         get: function () {
-            return this._staticClick$;
+            return this._projection;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(MouseService.prototype, "preventDefaultMouseDown$", {
+    Observer.prototype.project$ = function (latLon) {
+        var _this = this;
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentNode$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function (_a) {
+            var render = _a[0], node = _a[1], reference = _a[2];
+            if (_this._projection.distanceBetweenLatLons(latLon, node.latLon) > 1000) {
+                return null;
+            }
+            var canvasPoint = _this._projection.latLonToCanvas(latLon, _this._container.element, render, reference);
+            return !!canvasPoint ?
+                [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])] :
+                null;
+        }));
+    };
+    Observer.prototype.projectBasic$ = function (basicPoint) {
+        var _this = this;
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
+            var render = _a[0], transform = _a[1];
+            var canvasPoint = _this._projection.basicToCanvas(basicPoint, _this._container.element, render, transform);
+            return !!canvasPoint ?
+                [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])] :
+                null;
+        }));
+    };
+    Observer.prototype.startEmit = function () {
+        var _this = this;
+        if (this._started) {
+            return;
+        }
+        this._started = true;
+        this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$
+            .subscribe(function (node) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node);
+        });
+        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }))
+            .subscribe(function (status) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status);
+        });
+        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
+            return node.spatialEdges$;
+        }))
+            .subscribe(function (status) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status);
+        });
+        this._moveSubscription = rxjs_1.combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (values) {
+            return values[0] || values[1] || values[2];
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (started) {
+            if (started) {
+                _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null);
+            }
+            else {
+                _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null);
+            }
+        });
+        this._bearingSubscription = this._container.renderService.bearing$.pipe(operators_1.auditTime(100), operators_1.distinctUntilChanged(function (b1, b2) {
+            return Math.abs(b2 - b1) < 1;
+        }))
+            .subscribe(function (bearing) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing);
+        });
+        var mouseMove$ = this._container.mouseService.active$.pipe(operators_1.switchMap(function (active) {
+            return active ?
+                rxjs_1.empty() :
+                _this._container.mouseService.mouseMove$;
+        }));
+        this._viewerMouseEventSubscription = rxjs_1.merge(this._mapMouseEvent$(Viewer_1.Viewer.click, this._container.mouseService.staticClick$), this._mapMouseEvent$(Viewer_1.Viewer.contextmenu, this._container.mouseService.contextMenu$), this._mapMouseEvent$(Viewer_1.Viewer.dblclick, this._container.mouseService.dblClick$), this._mapMouseEvent$(Viewer_1.Viewer.mousedown, this._container.mouseService.mouseDown$), this._mapMouseEvent$(Viewer_1.Viewer.mousemove, mouseMove$), this._mapMouseEvent$(Viewer_1.Viewer.mouseout, this._container.mouseService.mouseOut$), this._mapMouseEvent$(Viewer_1.Viewer.mouseover, this._container.mouseService.mouseOver$), this._mapMouseEvent$(Viewer_1.Viewer.mouseup, this._container.mouseService.mouseUp$)).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var _b = _a[0], type = _b[0], event = _b[1], render = _a[1], reference = _a[2], transform = _a[3];
+            var unprojection = _this._projection.eventToUnprojection(event, _this._container.element, render, reference, transform);
+            return {
+                basicPoint: unprojection.basicPoint,
+                latLon: unprojection.latLon,
+                originalEvent: event,
+                pixelPoint: unprojection.pixelPoint,
+                target: _this._eventEmitter,
+                type: type,
+            };
+        }))
+            .subscribe(function (event) {
+            _this._eventEmitter.fire(event.type, event);
+        });
+        this._positionSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (_a, _b) {
+            var x1 = _a[0], y1 = _a[1];
+            var x2 = _b[0], y2 = _b[1];
+            return _this._closeTo(x1, x2, 1e-2) &&
+                _this._closeTo(y1, y2, 1e-2);
+        }, function (rc) {
+            return rc.camera.position.toArray();
+        }))
+            .subscribe(function () {
+            _this._eventEmitter.fire(Viewer_1.Viewer.positionchanged, {
+                target: _this._eventEmitter,
+                type: Viewer_1.Viewer.positionchanged,
+            });
+        });
+        this._povSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (_a, _b) {
+            var phi1 = _a[0], theta1 = _a[1];
+            var phi2 = _b[0], theta2 = _b[1];
+            return _this._closeTo(phi1, phi2, 1e-3) &&
+                _this._closeTo(theta1, theta2, 1e-3);
+        }, function (rc) {
+            return [rc.rotation.phi, rc.rotation.theta];
+        }))
+            .subscribe(function () {
+            _this._eventEmitter.fire(Viewer_1.Viewer.povchanged, {
+                target: _this._eventEmitter,
+                type: Viewer_1.Viewer.povchanged,
+            });
+        });
+        this._fovSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (fov1, fov2) {
+            return _this._closeTo(fov1, fov2, 1e-2);
+        }, function (rc) {
+            return rc.perspective.fov;
+        }))
+            .subscribe(function () {
+            _this._eventEmitter.fire(Viewer_1.Viewer.fovchanged, {
+                target: _this._eventEmitter,
+                type: Viewer_1.Viewer.fovchanged,
+            });
+        });
+    };
+    Observer.prototype.stopEmit = function () {
+        if (!this.started) {
+            return;
+        }
+        this._started = false;
+        this._bearingSubscription.unsubscribe();
+        this._currentNodeSubscription.unsubscribe();
+        this._fovSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._positionSubscription.unsubscribe();
+        this._povSubscription.unsubscribe();
+        this._sequenceEdgesSubscription.unsubscribe();
+        this._spatialEdgesSubscription.unsubscribe();
+        this._viewerMouseEventSubscription.unsubscribe();
+        this._bearingSubscription = null;
+        this._currentNodeSubscription = null;
+        this._fovSubscription = null;
+        this._moveSubscription = null;
+        this._positionSubscription = null;
+        this._povSubscription = null;
+        this._sequenceEdgesSubscription = null;
+        this._spatialEdgesSubscription = null;
+        this._viewerMouseEventSubscription = null;
+    };
+    Observer.prototype.unproject$ = function (canvasPoint) {
+        var _this = this;
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
+            var render = _a[0], reference = _a[1], transform = _a[2];
+            var unprojection = _this._projection.canvasToUnprojection(canvasPoint, _this._container.element, render, reference, transform);
+            return unprojection.latLon;
+        }));
+    };
+    Observer.prototype.unprojectBasic$ = function (canvasPoint) {
+        var _this = this;
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
+            var render = _a[0], transform = _a[1];
+            return _this._projection.canvasToBasic(canvasPoint, _this._container.element, render, transform);
+        }));
+    };
+    Observer.prototype._closeTo = function (v1, v2, absoluteTolerance) {
+        return Math.abs(v1 - v2) <= absoluteTolerance;
+    };
+    Observer.prototype._mapMouseEvent$ = function (type, mouseEvent$) {
+        return mouseEvent$.pipe(operators_1.map(function (event) {
+            return [type, event];
+        }));
+    };
+    return Observer;
+}());
+exports.Observer = Observer;
+exports.default = Observer;
+
+},{"../Viewer":302,"rxjs":43,"rxjs/operators":241}],480:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PanService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Geo = require("../geo/Geo");
+var GeoCoords_1 = require("../geo/GeoCoords");
+var GraphCalculator_1 = require("../graph/GraphCalculator");
+var Spatial_1 = require("../geo/Spatial");
+var Transform_1 = require("../geo/Transform");
+var ViewportCoords_1 = require("../geo/ViewportCoords");
+var PanMode;
+(function (PanMode) {
+    PanMode[PanMode["Disabled"] = 0] = "Disabled";
+    PanMode[PanMode["Enabled"] = 1] = "Enabled";
+    PanMode[PanMode["Started"] = 2] = "Started";
+})(PanMode || (PanMode = {}));
+var PanService = /** @class */ (function () {
+    function PanService(graphService, stateService, enabled, geoCoords, graphCalculator, spatial, viewportCoords) {
+        this._graphService = graphService;
+        this._stateService = stateService;
+        this._geoCoords = !!geoCoords ? geoCoords : new GeoCoords_1.default();
+        this._graphCalculator = !!graphCalculator ? graphCalculator : new GraphCalculator_1.default(this._geoCoords);
+        this._spatial = !!spatial ? spatial : new Spatial_1.default();
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords_1.default();
+        this._mode = enabled !== false ? PanMode.Enabled : PanMode.Disabled;
+        this._panNodesSubject$ = new rxjs_1.Subject();
+        this._panNodes$ = this._panNodesSubject$.pipe(operators_1.startWith([]), operators_1.publishReplay(1), operators_1.refCount());
+        this._panNodes$.subscribe();
+    }
+    Object.defineProperty(PanService.prototype, "panNodes$", {
         get: function () {
-            return this._preventMouseDown$;
+            return this._panNodes$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    MouseService.prototype.claimMouse = function (name, zindex) {
-        this._claimMouse$.next({ name: name, zindex: zindex });
+    PanService.prototype.enable = function () {
+        if (this._mode !== PanMode.Disabled) {
+            return;
+        }
+        this._mode = PanMode.Enabled;
+        this.start();
     };
-    MouseService.prototype.unclaimMouse = function (name) {
-        this._claimMouse$.next({ name: name, zindex: null });
+    PanService.prototype.disable = function () {
+        if (this._mode === PanMode.Disabled) {
+            return;
+        }
+        this.stop();
+        this._mode = PanMode.Disabled;
     };
-    MouseService.prototype.filtered$ = function (name, observable$) {
-        return observable$
-            .withLatestFrom(this.mouseOwner$, function (event, owner) {
-            return [event, owner];
-        })
-            .filter(function (eo) {
-            return eo[1] === name;
-        })
-            .map(function (eo) {
-            return eo[0];
+    PanService.prototype.start = function () {
+        var _this = this;
+        if (this._mode !== PanMode.Enabled) {
+            return;
+        }
+        var panNodes$ = this._stateService.currentNode$.pipe(operators_1.switchMap(function (current) {
+            if (!current.merged) {
+                return rxjs_1.of([]);
+            }
+            var current$ = rxjs_1.of(current);
+            var bounds = _this._graphCalculator.boundingBoxCorners(current.latLon, 20);
+            var adjacent$ = _this._graphService
+                .cacheBoundingBox$(bounds[0], bounds[1]).pipe(operators_1.catchError(function (error) {
+                console.error("Failed to cache periphery bounding box (" + current.key + ")", error);
+                return rxjs_1.empty();
+            }), operators_1.map(function (nodes) {
+                if (current.pano) {
+                    return [];
+                }
+                var potential = [];
+                for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+                    var node = nodes_1[_i];
+                    if (node.key === current.key) {
+                        continue;
+                    }
+                    if (node.mergeCC !== current.mergeCC) {
+                        continue;
+                    }
+                    if (node.pano) {
+                        continue;
+                    }
+                    if (_this._distance(node, current) > 4) {
+                        continue;
+                    }
+                    potential.push(node);
+                }
+                return potential;
+            }));
+            return rxjs_1.combineLatest(current$, adjacent$).pipe(operators_1.withLatestFrom(_this._stateService.reference$), operators_1.map(function (_a) {
+                var _b = _a[0], cn = _b[0], adjacent = _b[1], reference = _a[1];
+                var currentDirection = _this._spatial.viewingDirection(cn.rotation);
+                var currentTranslation = Geo.computeTranslation({ lat: cn.latLon.lat, lon: cn.latLon.lon, alt: cn.alt }, cn.rotation, reference);
+                var currentTransform = _this._createTransform(cn, currentTranslation);
+                var currentAzimuthal = _this._spatial.wrap(_this._spatial.azimuthal(currentDirection.toArray(), currentTransform.upVector().toArray()), 0, 2 * Math.PI);
+                var currentProjectedPoints = _this._computeProjectedPoints(currentTransform);
+                var currentHFov = _this._computeHorizontalFov(currentProjectedPoints) / 180 * Math.PI;
+                var preferredOverlap = Math.PI / 8;
+                var left = undefined;
+                var right = undefined;
+                for (var _i = 0, adjacent_1 = adjacent; _i < adjacent_1.length; _i++) {
+                    var a = adjacent_1[_i];
+                    var translation = Geo.computeTranslation({ lat: a.latLon.lat, lon: a.latLon.lon, alt: a.alt }, a.rotation, reference);
+                    var transform = _this._createTransform(a, translation);
+                    var projectedPoints = _this._computeProjectedPoints(transform);
+                    var hFov = _this._computeHorizontalFov(projectedPoints) / 180 * Math.PI;
+                    var direction = _this._spatial.viewingDirection(a.rotation);
+                    var azimuthal = _this._spatial.wrap(_this._spatial.azimuthal(direction.toArray(), transform.upVector().toArray()), 0, 2 * Math.PI);
+                    var directionChange = _this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, direction.x, direction.y);
+                    var overlap = Number.NEGATIVE_INFINITY;
+                    if (directionChange > 0) {
+                        if (currentAzimuthal > azimuthal) {
+                            overlap = currentAzimuthal - 2 * Math.PI + currentHFov / 2 - (azimuthal - hFov / 2);
+                        }
+                        else {
+                            overlap = currentAzimuthal + currentHFov / 2 - (azimuthal - hFov / 2);
+                        }
+                    }
+                    else {
+                        if (currentAzimuthal < azimuthal) {
+                            overlap = azimuthal + hFov / 2 - (currentAzimuthal + 2 * Math.PI - currentHFov / 2);
+                        }
+                        else {
+                            overlap = azimuthal + hFov / 2 - (currentAzimuthal - currentHFov / 2);
+                        }
+                    }
+                    var nonOverlap = Math.abs(hFov - overlap);
+                    var distanceCost = _this._distance(a, cn);
+                    var timeCost = Math.min(_this._timeDifference(a, cn), 4);
+                    var overlapCost = 20 * Math.abs(overlap - preferredOverlap);
+                    var fovCost = Math.min(5, 1 / Math.min(hFov / currentHFov, 1));
+                    var nonOverlapCost = overlap > 0 ? -2 * nonOverlap : 0;
+                    var cost = distanceCost + timeCost + overlapCost + fovCost + nonOverlapCost;
+                    if (overlap > 0 &&
+                        overlap < 0.5 * currentHFov &&
+                        overlap < 0.5 * hFov &&
+                        nonOverlap > 0.5 * currentHFov) {
+                        if (directionChange > 0) {
+                            if (!left) {
+                                left = [cost, a, transform, hFov];
+                            }
+                            else {
+                                if (cost < left[0]) {
+                                    left = [cost, a, transform, hFov];
+                                }
+                            }
+                        }
+                        else {
+                            if (!right) {
+                                right = [cost, a, transform, hFov];
+                            }
+                            else {
+                                if (cost < right[0]) {
+                                    right = [cost, a, transform, hFov];
+                                }
+                            }
+                        }
+                    }
+                }
+                var panNodes = [];
+                if (!!left) {
+                    panNodes.push([left[1], left[2], left[3]]);
+                }
+                if (!!right) {
+                    panNodes.push([right[1], right[2], right[3]]);
+                }
+                return panNodes;
+            }), operators_1.startWith([]));
+        }));
+        this._panNodesSubscription = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.nodesAhead > 0;
+        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (traversing) {
+            return traversing ? rxjs_1.of([]) : panNodes$;
+        }))
+            .subscribe(function (panNodes) {
+            _this._panNodesSubject$.next(panNodes);
         });
+        this._mode = PanMode.Started;
     };
-    return MouseService;
+    PanService.prototype.stop = function () {
+        if (this._mode !== PanMode.Started) {
+            return;
+        }
+        this._panNodesSubscription.unsubscribe();
+        this._panNodesSubject$.next([]);
+        this._mode = PanMode.Enabled;
+    };
+    PanService.prototype._distance = function (node, reference) {
+        var _a = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, reference.latLon.lat, reference.latLon.lon, reference.alt), x = _a[0], y = _a[1], z = _a[2];
+        return Math.sqrt(x * x + y * y + z * z);
+    };
+    PanService.prototype._timeDifference = function (node, reference) {
+        return Math.abs(node.capturedAt - reference.capturedAt) / (1000 * 60 * 60 * 24 * 30);
+    };
+    PanService.prototype._createTransform = function (node, translation) {
+        return new Transform_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.assetsCached ? node.image : undefined, undefined, node.ck1, node.ck2, node.cameraProjection);
+    };
+    PanService.prototype._computeProjectedPoints = function (transform) {
+        var vertices = [[1, 0]];
+        var directions = [[0, 0.5]];
+        var pointsPerLine = 20;
+        return Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
+    };
+    PanService.prototype._computeHorizontalFov = function (projectedPoints) {
+        var _this = this;
+        var fovs = projectedPoints
+            .map(function (projectedPoint) {
+            return _this._coordToFov(projectedPoint[0]);
+        });
+        var fov = Math.min.apply(Math, fovs);
+        return fov;
+    };
+    PanService.prototype._coordToFov = function (x) {
+        return 2 * Math.atan(x) * 180 / Math.PI;
+    };
+    return PanService;
 }());
-exports.MouseService = MouseService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MouseService;
+exports.PanService = PanService;
 
-},{"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76}],316:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/throw");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-var API_1 = require("../API");
-var Graph_1 = require("../Graph");
+},{"../geo/Geo":415,"../geo/GeoCoords":416,"../geo/Spatial":419,"../geo/Transform":420,"../geo/ViewportCoords":421,"../graph/GraphCalculator":425,"rxjs":43,"rxjs/operators":241}],481:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PlayService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Edge_1 = require("../Edge");
-var State_1 = require("../State");
-var Viewer_1 = require("../Viewer");
-var Navigator = (function () {
-    function Navigator(clientId, apiV3, graphService, imageLoadingService, loadingService, stateService) {
-        this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId);
-        this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService();
-        this._graphService = graphService != null ?
-            graphService :
-            new Graph_1.GraphService(new Graph_1.Graph(this.apiV3), this._imageLoadingService);
-        this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService();
-        this._loadingName = "navigator";
-        this._stateService = stateService != null ? stateService : new State_1.StateService();
-        this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-        this._movedToKey$ = new Subject_1.Subject();
-        this._dirRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-        this._latLonRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-    }
-    Object.defineProperty(Navigator.prototype, "apiV3", {
-        get: function () {
-            return this._apiV3;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "graphService", {
-        get: function () {
-            return this._graphService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "imageLoadingService", {
-        get: function () {
-            return this._imageLoadingService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "keyRequested$", {
+var Graph_1 = require("../Graph");
+var PlayService = /** @class */ (function () {
+    function PlayService(graphService, stateService, graphCalculator) {
+        this._graphService = graphService;
+        this._stateService = stateService;
+        this._graphCalculator = !!graphCalculator ? graphCalculator : new Graph_1.GraphCalculator();
+        this._directionSubject$ = new rxjs_1.Subject();
+        this._direction$ = this._directionSubject$.pipe(operators_1.startWith(Edge_1.EdgeDirection.Next), operators_1.publishReplay(1), operators_1.refCount());
+        this._direction$.subscribe();
+        this._playing = false;
+        this._playingSubject$ = new rxjs_1.Subject();
+        this._playing$ = this._playingSubject$.pipe(operators_1.startWith(this._playing), operators_1.publishReplay(1), operators_1.refCount());
+        this._playing$.subscribe();
+        this._speed = 0.5;
+        this._speedSubject$ = new rxjs_1.Subject();
+        this._speed$ = this._speedSubject$.pipe(operators_1.startWith(this._speed), operators_1.publishReplay(1), operators_1.refCount());
+        this._speed$.subscribe();
+        this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed));
+        this._bridging$ = null;
+    }
+    Object.defineProperty(PlayService.prototype, "playing", {
         get: function () {
-            return this._keyRequested$;
+            return this._playing;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Navigator.prototype, "loadingService", {
+    Object.defineProperty(PlayService.prototype, "direction$", {
         get: function () {
-            return this._loadingService;
+            return this._direction$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Navigator.prototype, "movedToKey$", {
+    Object.defineProperty(PlayService.prototype, "playing$", {
         get: function () {
-            return this._movedToKey$;
+            return this._playing$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Navigator.prototype, "stateService", {
+    Object.defineProperty(PlayService.prototype, "speed$", {
         get: function () {
-            return this._stateService;
+            return this._speed$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Navigator.prototype.moveToKey$ = function (key) {
+    PlayService.prototype.play = function () {
         var _this = this;
-        this.loadingService.startLoading(this._loadingName);
-        this._keyRequested$.next(key);
-        return this._graphService.cacheNode$(key)
-            .do(function (node) {
-            _this.stateService.setNodes([node]);
-            _this._movedToKey$.next(node.key);
-        })
-            .finally(function () {
-            _this.loadingService.stopLoading(_this._loadingName);
+        if (this._playing) {
+            return;
+        }
+        this._stateService.cutNodes();
+        var stateSpeed = this._setSpeed(this._speed);
+        this._stateService.setSpeed(stateSpeed);
+        this._graphModeSubscription = this._speed$.pipe(operators_1.map(function (speed) {
+            return speed > PlayService.sequenceSpeed ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (mode) {
+            _this._graphService.setGraphMode(mode);
         });
-    };
-    Navigator.prototype.moveDir$ = function (direction) {
-        var _this = this;
-        this.loadingService.startLoading(this._loadingName);
-        this._dirRequested$.next(direction);
-        return this.stateService.currentNode$
-            .first()
-            .mergeMap(function (node) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+        this._cacheSubscription = rxjs_1.combineLatest(this._stateService.currentNode$.pipe(operators_1.map(function (node) {
+            return [node.sequenceKey, node.key];
+        }), operators_1.distinctUntilChanged(undefined, function (_a) {
+            var sequenceKey = _a[0], nodeKey = _a[1];
+            return sequenceKey;
+        })), this._graphService.graphMode$, this._direction$).pipe(operators_1.switchMap(function (_a) {
+            var _b = _a[0], sequenceKey = _b[0], nodeKey = _b[1], mode = _a[1], direction = _a[2];
+            if (direction !== Edge_1.EdgeDirection.Next && direction !== Edge_1.EdgeDirection.Prev) {
+                return rxjs_1.of([undefined, direction]);
+            }
+            var sequence$ = (mode === Graph_1.GraphMode.Sequence ?
+                _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) :
+                _this._graphService.cacheSequence$(sequenceKey)).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
+                console.error(error);
+                return rxjs_1.of(undefined);
+            }));
+            return rxjs_1.combineLatest(sequence$, rxjs_1.of(direction));
+        }), operators_1.switchMap(function (_a) {
+            var sequence = _a[0], direction = _a[1];
+            if (sequence === undefined) {
+                return rxjs_1.empty();
+            }
+            var sequenceKeys = sequence.keys.slice();
+            if (direction === Edge_1.EdgeDirection.Prev) {
+                sequenceKeys.reverse();
+            }
+            return _this._stateService.currentState$.pipe(operators_1.map(function (frame) {
+                return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead];
+            }), operators_1.scan(function (_a, _b) {
+                var lastRequestKey = _a[0], previousRequestKeys = _a[1];
+                var lastTrajectoryKey = _b[0], nodesAhead = _b[1];
+                if (lastRequestKey === undefined) {
+                    lastRequestKey = lastTrajectoryKey;
+                }
+                var lastIndex = sequenceKeys.length - 1;
+                if (nodesAhead >= _this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) {
+                    return [lastRequestKey, []];
+                }
+                var current = sequenceKeys.indexOf(lastTrajectoryKey);
+                var start = sequenceKeys.indexOf(lastRequestKey) + 1;
+                var end = Math.min(lastIndex, current + _this._nodesAhead - nodesAhead) + 1;
+                if (end <= start) {
+                    return [lastRequestKey, []];
+                }
+                return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)];
+            }, [undefined, []]), operators_1.mergeMap(function (_a) {
+                var lastRequestKey = _a[0], newRequestKeys = _a[1];
+                return rxjs_1.from(newRequestKeys);
+            }));
+        }), operators_1.mergeMap(function (key) {
+            return _this._graphService.cacheNode$(key).pipe(operators_1.catchError(function () {
+                return rxjs_1.empty();
+            }));
+        }, 6))
+            .subscribe();
+        this._playingSubscription = this._stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead < _this._nodesAhead;
+        }), operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.lastNode.key;
+        }), operators_1.map(function (frame) {
+            var lastNode = frame.state.lastNode;
+            var trajectory = frame.state.trajectory;
+            var increasingTime = undefined;
+            for (var i = trajectory.length - 2; i >= 0; i--) {
+                var node = trajectory[i];
+                if (node.sequenceKey !== lastNode.sequenceKey) {
+                    break;
+                }
+                if (node.capturedAt !== lastNode.capturedAt) {
+                    increasingTime = node.capturedAt < lastNode.capturedAt;
+                    break;
+                }
+            }
+            return [frame.state.lastNode, increasingTime];
+        }), operators_1.withLatestFrom(this._direction$), operators_1.switchMap(function (_a) {
+            var _b = _a[0], node = _b[0], increasingTime = _b[1], direction = _a[1];
+            return rxjs_1.zip(([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
                 node.sequenceEdges$ :
-                node.spatialEdges$)
-                .first()
-                .map(function (status) {
-                for (var _i = 0, _a = status.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
+                node.spatialEdges$).pipe(operators_1.first(function (status) {
+                return status.cached;
+            }), operators_1.timeout(15000)), rxjs_1.of(direction)).pipe(operators_1.map(function (_a) {
+                var s = _a[0], d = _a[1];
+                for (var _i = 0, _b = s.edges; _i < _b.length; _i++) {
+                    var edge = _b[_i];
+                    if (edge.data.direction === d) {
                         return edge.to;
                     }
                 }
                 return null;
-            });
-        })
-            .mergeMap(function (directionKey) {
-            if (directionKey == null) {
-                _this.loadingService.stopLoading(_this._loadingName);
-                return Observable_1.Observable
-                    .throw(new Error("Direction (" + direction + ") does not exist for current node."));
-            }
-            return _this.moveToKey$(directionKey);
+            }), operators_1.switchMap(function (key) {
+                return key != null ?
+                    _this._graphService.cacheNode$(key) :
+                    _this._bridge$(node, increasingTime).pipe(operators_1.filter(function (n) {
+                        return !!n;
+                    }));
+            }));
+        }))
+            .subscribe(function (node) {
+            _this._stateService.appendNodes([node]);
+        }, function (error) {
+            console.error(error);
+            _this.stop();
+        });
+        this._clearSubscription = this._stateService.currentNode$.pipe(operators_1.bufferCount(1, 10))
+            .subscribe(function (nodes) {
+            _this._stateService.clearPriorNodes();
         });
+        this._setPlaying(true);
+        var currentLastNodes$ = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state;
+        }), operators_1.distinctUntilChanged(function (_a, _b) {
+            var kc1 = _a[0], kl1 = _a[1];
+            var kc2 = _b[0], kl2 = _b[1];
+            return kc1 === kc2 && kl1 === kl2;
+        }, function (state) {
+            return [state.currentNode.key, state.lastNode.key];
+        }), operators_1.filter(function (state) {
+            return state.currentNode.key === state.lastNode.key &&
+                state.currentIndex === state.trajectory.length - 1;
+        }), operators_1.map(function (state) {
+            return state.currentNode;
+        }));
+        this._stopSubscription = rxjs_1.combineLatest(currentLastNodes$, this._direction$).pipe(operators_1.switchMap(function (_a) {
+            var node = _a[0], direction = _a[1];
+            var edgeStatus$ = ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+                node.sequenceEdges$ :
+                node.spatialEdges$).pipe(operators_1.first(function (status) {
+                return status.cached;
+            }), operators_1.timeout(15000), operators_1.catchError(function (error) {
+                console.error(error);
+                return rxjs_1.of({ cached: false, edges: [] });
+            }));
+            return rxjs_1.combineLatest(rxjs_1.of(direction), edgeStatus$).pipe(operators_1.map(function (_a) {
+                var d = _a[0], es = _a[1];
+                for (var _i = 0, _b = es.edges; _i < _b.length; _i++) {
+                    var edge = _b[_i];
+                    if (edge.data.direction === d) {
+                        return true;
+                    }
+                }
+                return false;
+            }));
+        }), operators_1.mergeMap(function (hasEdge) {
+            if (hasEdge || !_this._bridging$) {
+                return rxjs_1.of(hasEdge);
+            }
+            return _this._bridging$.pipe(operators_1.map(function (node) {
+                return node != null;
+            }), operators_1.catchError(function (error) {
+                console.error(error);
+                return rxjs_1.of(false);
+            }));
+        }), operators_1.first(function (hasEdge) {
+            return !hasEdge;
+        }))
+            .subscribe(undefined, undefined, function () { _this.stop(); });
+        if (this._stopSubscription.closed) {
+            this._stopSubscription = null;
+        }
     };
-    Navigator.prototype.moveCloseTo$ = function (lat, lon) {
+    PlayService.prototype.setDirection = function (direction) {
+        this._directionSubject$.next(direction);
+    };
+    PlayService.prototype.setSpeed = function (speed) {
+        speed = Math.max(0, Math.min(1, speed));
+        if (speed === this._speed) {
+            return;
+        }
+        var stateSpeed = this._setSpeed(speed);
+        if (this._playing) {
+            this._stateService.setSpeed(stateSpeed);
+        }
+        this._speedSubject$.next(this._speed);
+    };
+    PlayService.prototype.stop = function () {
+        if (!this._playing) {
+            return;
+        }
+        if (!!this._stopSubscription) {
+            if (!this._stopSubscription.closed) {
+                this._stopSubscription.unsubscribe();
+            }
+            this._stopSubscription = null;
+        }
+        this._graphModeSubscription.unsubscribe();
+        this._graphModeSubscription = null;
+        this._cacheSubscription.unsubscribe();
+        this._cacheSubscription = null;
+        this._playingSubscription.unsubscribe();
+        this._playingSubscription = null;
+        this._clearSubscription.unsubscribe();
+        this._clearSubscription = null;
+        this._stateService.setSpeed(1);
+        this._stateService.cutNodes();
+        this._graphService.setGraphMode(Graph_1.GraphMode.Spatial);
+        this._setPlaying(false);
+    };
+    PlayService.prototype._bridge$ = function (node, increasingTime) {
         var _this = this;
-        this.loadingService.startLoading(this._loadingName);
-        this._latLonRequested$.next({ lat: lat, lon: lon });
-        return this.apiV3.imageCloseTo$(lat, lon)
-            .mergeMap(function (fullNode) {
-            if (fullNode == null) {
-                _this.loadingService.stopLoading(_this._loadingName);
-                return Observable_1.Observable
-                    .throw(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
+        if (increasingTime === undefined) {
+            return rxjs_1.of(null);
+        }
+        var boundingBox = this._graphCalculator.boundingBoxCorners(node.latLon, 25);
+        this._bridging$ = this._graphService.cacheBoundingBox$(boundingBox[0], boundingBox[1]).pipe(operators_1.mergeMap(function (nodes) {
+            var nextNode = null;
+            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+                var n = nodes_1[_i];
+                if (n.sequenceKey === node.sequenceKey ||
+                    !n.cameraUuid ||
+                    n.cameraUuid !== node.cameraUuid ||
+                    n.capturedAt === node.capturedAt ||
+                    n.capturedAt > node.capturedAt !== increasingTime) {
+                    continue;
+                }
+                var delta = Math.abs(n.capturedAt - node.capturedAt);
+                if (delta > 15000) {
+                    continue;
+                }
+                if (!nextNode || delta < Math.abs(nextNode.capturedAt - node.capturedAt)) {
+                    nextNode = n;
+                }
             }
-            return _this.moveToKey$(fullNode.key);
-        });
-    };
-    return Navigator;
+            return !!nextNode ?
+                _this._graphService.cacheNode$(nextNode.key) :
+                rxjs_1.of(null);
+        }), operators_1.finalize(function () {
+            _this._bridging$ = null;
+        }), operators_1.publish(), operators_1.refCount());
+        return this._bridging$;
+    };
+    PlayService.prototype._mapSpeed = function (speed) {
+        var x = 2 * speed - 1;
+        return Math.pow(10, x) - 0.2 * x;
+    };
+    PlayService.prototype._mapNodesAhead = function (stateSpeed) {
+        return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed)));
+    };
+    PlayService.prototype._setPlaying = function (playing) {
+        this._playing = playing;
+        this._playingSubject$.next(playing);
+    };
+    PlayService.prototype._setSpeed = function (speed) {
+        this._speed = speed;
+        var stateSpeed = this._mapSpeed(this._speed);
+        this._nodesAhead = this._mapNodesAhead(stateSpeed);
+        return stateSpeed;
+    };
+    PlayService.sequenceSpeed = 0.54;
+    return PlayService;
 }());
-exports.Navigator = Navigator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Navigator;
+exports.PlayService = PlayService;
+exports.default = PlayService;
 
-},{"../API":206,"../Edge":208,"../Graph":211,"../State":214,"../Viewer":216,"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/throw":45,"rxjs/add/operator/do":54,"rxjs/add/operator/finally":57,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeMap":63}],317:[function(require,module,exports){
+},{"../Edge":292,"../Graph":295,"rxjs":43,"rxjs/operators":241}],482:[function(require,module,exports){
 "use strict";
-(function (SpriteAlignment) {
-    SpriteAlignment[SpriteAlignment["Center"] = 0] = "Center";
-    SpriteAlignment[SpriteAlignment["Start"] = 1] = "Start";
-    SpriteAlignment[SpriteAlignment["End"] = 2] = "End";
-})(exports.SpriteAlignment || (exports.SpriteAlignment = {}));
-var SpriteAlignment = exports.SpriteAlignment;
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SpriteAlignment;
+exports.Projection = void 0;
+var THREE = require("three");
+var Geo_1 = require("../Geo");
+var Spatial_1 = require("../geo/Spatial");
+var Projection = /** @class */ (function () {
+    function Projection(geoCoords, viewportCoords, spatial) {
+        this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords();
+        this._spatial = !!spatial ? spatial : new Spatial_1.default();
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+    }
+    Projection.prototype.basicToCanvas = function (basicPoint, container, render, transform) {
+        return this._viewportCoords
+            .basicToCanvasSafe(basicPoint[0], basicPoint[1], container, transform, render.perspective);
+    };
+    Projection.prototype.canvasToBasic = function (canvasPoint, container, render, transform) {
+        var basicPoint = this._viewportCoords
+            .canvasToBasic(canvasPoint[0], canvasPoint[1], container, transform, render.perspective);
+        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {
+            basicPoint = null;
+        }
+        return basicPoint;
+    };
+    Projection.prototype.eventToUnprojection = function (event, container, render, reference, transform) {
+        var pixelPoint = this._viewportCoords.canvasPosition(event, container);
+        return this.canvasToUnprojection(pixelPoint, container, render, reference, transform);
+    };
+    Projection.prototype.canvasToUnprojection = function (canvasPoint, container, render, reference, transform) {
+        var canvasX = canvasPoint[0];
+        var canvasY = canvasPoint[1];
+        var _a = this._viewportCoords.canvasToViewport(canvasX, canvasY, container), viewportX = _a[0], viewportY = _a[1];
+        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
+            .unproject(render.perspective);
+        var basicPoint = transform.projectBasic(point3d.toArray());
+        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {
+            basicPoint = null;
+        }
+        var direction3d = point3d.clone().sub(render.camera.position).normalize();
+        var dist = -2 / direction3d.z;
+        var latLon = null;
+        if (dist > 0 && dist < 100 && !!basicPoint) {
+            var point = direction3d.clone().multiplyScalar(dist).add(render.camera.position);
+            var latLonArray = this._geoCoords
+                .enuToGeodetic(point.x, point.y, point.z, reference.lat, reference.lon, reference.alt)
+                .slice(0, 2);
+            latLon = { lat: latLonArray[0], lon: latLonArray[1] };
+        }
+        var unprojection = {
+            basicPoint: basicPoint,
+            latLon: latLon,
+            pixelPoint: [canvasX, canvasY],
+        };
+        return unprojection;
+    };
+    Projection.prototype.cameraToLatLon = function (render, reference) {
+        var position = render.camera.position;
+        var _a = this._geoCoords.enuToGeodetic(position.x, position.y, position.z, reference.lat, reference.lon, reference.alt), lat = _a[0], lon = _a[1];
+        return { lat: lat, lon: lon };
+    };
+    Projection.prototype.latLonToCanvas = function (latLon, container, render, reference) {
+        var point3d = this._geoCoords.geodeticToEnu(latLon.lat, latLon.lon, 0, reference.lat, reference.lon, reference.alt);
+        var canvas = this._viewportCoords.projectToCanvasSafe(point3d, container, render.perspective);
+        return canvas;
+    };
+    Projection.prototype.distanceBetweenLatLons = function (latLon1, latLon2) {
+        return this._spatial.distanceFromLatLon(latLon1.lat, latLon1.lon, latLon2.lat, latLon2.lon);
+    };
+    return Projection;
+}());
+exports.Projection = Projection;
+exports.default = Projection;
 
-},{}],318:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{"../Geo":294,"../geo/Spatial":419,"three":242}],483:[function(require,module,exports){
 "use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpriteService = void 0;
+var operators_1 = require("rxjs/operators");
 var THREE = require("three");
 var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
+var rxjs_1 = require("rxjs");
 var Viewer_1 = require("../Viewer");
-var SpriteAtlas = (function () {
+var SpriteAtlas = /** @class */ (function () {
     function SpriteAtlas() {
     }
     Object.defineProperty(SpriteAtlas.prototype, "json", {
         set: function (value) {
             this._json = value;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(SpriteAtlas.prototype, "image", {
@@ -32681,14 +57398,14 @@ var SpriteAtlas = (function () {
             this._texture = new THREE.Texture(this._image);
             this._texture.minFilter = THREE.NearestFilter;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(SpriteAtlas.prototype, "loaded", {
         get: function () {
             return !!(this._image && this._json);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     SpriteAtlas.prototype.getGLSprite = function (name) {
@@ -32711,15 +57428,12 @@ var SpriteAtlas = (function () {
         var material = new THREE.SpriteMaterial({ map: texture });
         return new THREE.Sprite(material);
     };
-    SpriteAtlas.prototype.getDOMSprite = function (name, horizontalAlign, verticalAlign) {
+    SpriteAtlas.prototype.getDOMSprite = function (name, float) {
         if (!this.loaded) {
             throw new Error("Sprites cannot be retrieved before the atlas is loaded.");
         }
-        if (horizontalAlign == null) {
-            horizontalAlign = Viewer_1.SpriteAlignment.Start;
-        }
-        if (verticalAlign == null) {
-            verticalAlign = Viewer_1.SpriteAlignment.Start;
+        if (float == null) {
+            float = Viewer_1.Alignment.Center;
         }
         var definition = this._json[name];
         if (!definition) {
@@ -32734,27 +57448,37 @@ var SpriteAtlas = (function () {
         var top = -definition.y;
         var height = this._image.height;
         var width = this._image.width;
-        switch (horizontalAlign) {
-            case Viewer_1.SpriteAlignment.Center:
+        switch (float) {
+            case Viewer_1.Alignment.Bottom:
+            case Viewer_1.Alignment.Center:
+            case Viewer_1.Alignment.Top:
                 left -= definition.width / 2;
                 break;
-            case Viewer_1.SpriteAlignment.End:
+            case Viewer_1.Alignment.BottomLeft:
+            case Viewer_1.Alignment.Left:
+            case Viewer_1.Alignment.TopLeft:
                 left -= definition.width;
                 break;
-            case Viewer_1.SpriteAlignment.Start:
-                break;
+            case Viewer_1.Alignment.BottomRight:
+            case Viewer_1.Alignment.Right:
+            case Viewer_1.Alignment.TopRight:
             default:
                 break;
         }
-        switch (verticalAlign) {
-            case Viewer_1.SpriteAlignment.Center:
+        switch (float) {
+            case Viewer_1.Alignment.Center:
+            case Viewer_1.Alignment.Left:
+            case Viewer_1.Alignment.Right:
                 top -= definition.height / 2;
                 break;
-            case Viewer_1.SpriteAlignment.End:
+            case Viewer_1.Alignment.Top:
+            case Viewer_1.Alignment.TopLeft:
+            case Viewer_1.Alignment.TopRight:
                 top -= definition.height;
                 break;
-            case Viewer_1.SpriteAlignment.Start:
-                break;
+            case Viewer_1.Alignment.Bottom:
+            case Viewer_1.Alignment.BottomLeft:
+            case Viewer_1.Alignment.BottomRight:
             default:
                 break;
         }
@@ -32782,21 +57506,17 @@ var SpriteAtlas = (function () {
     };
     return SpriteAtlas;
 }());
-var SpriteService = (function () {
+var SpriteService = /** @class */ (function () {
     function SpriteService(sprite) {
         var _this = this;
         this._retina = window.devicePixelRatio > 1;
-        this._spriteAtlasOperation$ = new Subject_1.Subject();
-        this._spriteAtlas$ = this._spriteAtlasOperation$
-            .startWith(function (atlas) {
+        this._spriteAtlasOperation$ = new rxjs_1.Subject();
+        this._spriteAtlas$ = this._spriteAtlasOperation$.pipe(operators_1.startWith(function (atlas) {
             return atlas;
-        })
-            .scan(function (atlas, operation) {
+        }), operators_1.scan(function (atlas, operation) {
             return operation(atlas);
-        }, new SpriteAtlas())
-            .publishReplay(1)
-            .refCount();
-        this._spriteAtlas$.subscribe();
+        }, new SpriteAtlas()), operators_1.publishReplay(1), operators_1.refCount());
+        this._spriteAtlas$.subscribe(function () { });
         if (sprite == null) {
             return;
         }
@@ -32838,152 +57558,101 @@ var SpriteService = (function () {
         get: function () {
             return this._spriteAtlas$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return SpriteService;
 }());
 exports.SpriteService = SpriteService;
-Object.defineProperty(exports, "__esModule", { value: true });
 exports.default = SpriteService;
 
-},{"../Viewer":216,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72,"three":157,"virtual-dom":163}],319:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-var TouchMove = (function () {
-    function TouchMove(touch) {
-        this.movementX = 0;
-        this.movementY = 0;
-        if (touch == null) {
-            return;
-        }
-        this.identifier = touch.identifier;
-        this.clientX = touch.clientX;
-        this.clientY = touch.clientY;
-        this.pageX = touch.pageX;
-        this.pageY = touch.pageY;
-        this.screenX = touch.screenX;
-        this.screenY = touch.screenY;
-        this.target = touch.target;
-    }
-    return TouchMove;
-}());
-exports.TouchMove = TouchMove;
-var TouchService = (function () {
-    function TouchService(element) {
+
+},{"../Viewer":302,"rxjs":43,"rxjs/operators":241,"three":242,"virtual-dom":247}],484:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TouchService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var TouchService = /** @class */ (function () {
+    function TouchService(canvasContainer, domContainer) {
         var _this = this;
-        this._element = element;
-        this._touchStart$ = Observable_1.Observable.fromEvent(element, "touchstart");
-        this._touchMove$ = Observable_1.Observable.fromEvent(element, "touchmove");
-        this._touchEnd$ = Observable_1.Observable.fromEvent(element, "touchend");
-        this._touchCancel$ = Observable_1.Observable.fromEvent(element, "touchcancel");
-        this._preventTouchMoveOperation$ = new Subject_1.Subject();
-        this._preventTouchMove$ = new Subject_1.Subject();
-        this._preventTouchMoveOperation$
-            .scan(function (prevent, operation) {
-            return operation(prevent);
-        }, true)
-            .subscribe();
-        this._preventTouchMove$
-            .map(function (prevent) {
-            return function (previous) {
-                return prevent;
-            };
-        })
-            .subscribe(this._preventTouchMoveOperation$);
-        this._touchMove$
-            .map(function (te) {
-            return function (prevent) {
-                if (prevent) {
-                    te.preventDefault();
-                }
-                return prevent;
-            };
-        })
-            .subscribe(this._preventTouchMoveOperation$);
-        this._singleTouchMoveOperation$ = new Subject_1.Subject();
-        this._singleTouchMove$ = this._singleTouchMoveOperation$
-            .scan(function (touch, operation) {
-            return operation(touch);
-        }, new TouchMove());
-        this._touchMove$
-            .filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        })
-            .map(function (te) {
-            return function (previous) {
-                var touch = te.touches[0];
-                var current = new TouchMove(touch);
-                current.movementX = touch.pageX - previous.pageX;
-                current.movementY = touch.pageY - previous.pageY;
-                return current;
-            };
-        })
-            .subscribe(this._singleTouchMoveOperation$);
-        var singleTouchStart$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
+        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
+        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        rxjs_1.fromEvent(domContainer, "touchmove")
+            .subscribe(function (event) {
+            event.preventDefault();
+        });
+        this._touchStart$ = rxjs_1.fromEvent(canvasContainer, "touchstart");
+        this._touchMove$ = rxjs_1.fromEvent(canvasContainer, "touchmove");
+        this._touchEnd$ = rxjs_1.fromEvent(canvasContainer, "touchend");
+        this._touchCancel$ = rxjs_1.fromEvent(canvasContainer, "touchcancel");
+        var tapStart$ = this._touchStart$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 1 && te.targetTouches.length === 1;
+        }), operators_1.share());
+        this._doubleTap$ = tapStart$.pipe(operators_1.bufferWhen(function () {
+            return tapStart$.pipe(operators_1.first(), operators_1.switchMap(function (event) {
+                return rxjs_1.merge(rxjs_1.timer(300), tapStart$).pipe(operators_1.take(1));
+            }));
+        }), operators_1.filter(function (events) {
+            return events.length === 2;
+        }), operators_1.map(function (events) {
+            return events[events.length - 1];
+        }), operators_1.share());
+        this._doubleTap$
+            .subscribe(function (event) {
+            event.preventDefault();
         });
-        var multipleTouchStart$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
+        this._singleTouchMove$ = this._touchMove$.pipe(operators_1.filter(function (te) {
+            return te.touches.length === 1 && te.targetTouches.length === 1;
+        }), operators_1.share());
+        var singleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
+            return te.touches.length === 1 && te.targetTouches.length === 1;
+        }));
+        var multipleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
             return te.touches.length >= 1;
-        });
-        var touchStop$ = Observable_1.Observable
-            .merge(this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
+        }));
+        var touchStop$ = rxjs_1.merge(this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
             return te.touches.length === 0;
-        });
-        this._singleTouch$ = singleTouchStart$
-            .switchMap(function (te) {
-            return _this._singleTouchMove$
-                .skip(1)
-                .takeUntil(Observable_1.Observable
-                .merge(multipleTouchStart$, touchStop$));
-        });
-        var touchesChanged$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
-        var pinchStart$ = touchesChanged$
-            .filter(function (te) {
+        }));
+        this._singleTouchDragStart$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
+            return _this._singleTouchMove$.pipe(operators_1.takeUntil(rxjs_1.merge(touchStop$, multipleTouchStart$)), operators_1.take(1));
+        }));
+        this._singleTouchDragEnd$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
+            return rxjs_1.merge(touchStop$, multipleTouchStart$).pipe(operators_1.first());
+        }));
+        this._singleTouchDrag$ = singleTouchStart$.pipe(operators_1.switchMap(function (te) {
+            return _this._singleTouchMove$.pipe(operators_1.skip(1), operators_1.takeUntil(rxjs_1.merge(multipleTouchStart$, touchStop$)));
+        }));
+        var touchesChanged$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
+        this._pinchStart$ = touchesChanged$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 2 && te.targetTouches.length === 2;
-        });
-        var pinchStop$ = touchesChanged$
-            .filter(function (te) {
+        }));
+        this._pinchEnd$ = touchesChanged$.pipe(operators_1.filter(function (te) {
             return te.touches.length !== 2 || te.targetTouches.length !== 2;
-        });
-        this._pinchOperation$ = new Subject_1.Subject();
-        this._pinch$ = this._pinchOperation$
-            .scan(function (pinch, operation) {
+        }));
+        this._pinchOperation$ = new rxjs_1.Subject();
+        this._pinch$ = this._pinchOperation$.pipe(operators_1.scan(function (pinch, operation) {
             return operation(pinch);
         }, {
-            centerClientX: 0,
-            centerClientY: 0,
-            centerPageX: 0,
-            centerPageY: 0,
-            centerScreenX: 0,
-            centerScreenY: 0,
             changeX: 0,
             changeY: 0,
+            clientX: 0,
+            clientY: 0,
             distance: 0,
             distanceChange: 0,
             distanceX: 0,
             distanceY: 0,
+            originalEvent: null,
+            pageX: 0,
+            pageY: 0,
+            screenX: 0,
+            screenY: 0,
             touch1: null,
             touch2: null,
-        });
-        this._touchMove$
-            .filter(function (te) {
+        }));
+        this._touchMove$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 2 && te.targetTouches.length === 2;
-        })
-            .map(function (te) {
+        }), operators_1.map(function (te) {
             return function (previous) {
                 var touch1 = te.touches[0];
                 var touch2 = te.touches[1];
@@ -33004,138 +57673,557 @@ var TouchService = (function () {
                 var changeX = distanceX - previous.distanceX;
                 var changeY = distanceY - previous.distanceY;
                 var current = {
-                    centerClientX: centerClientX,
-                    centerClientY: centerClientY,
-                    centerPageX: centerPageX,
-                    centerPageY: centerPageY,
-                    centerScreenX: centerScreenX,
-                    centerScreenY: centerScreenY,
                     changeX: changeX,
                     changeY: changeY,
+                    clientX: centerClientX,
+                    clientY: centerClientY,
                     distance: distance,
                     distanceChange: distanceChange,
                     distanceX: distanceX,
                     distanceY: distanceY,
+                    originalEvent: te,
+                    pageX: centerPageX,
+                    pageY: centerPageY,
+                    screenX: centerScreenX,
+                    screenY: centerScreenY,
                     touch1: touch1,
                     touch2: touch2,
                 };
                 return current;
             };
-        })
+        }))
             .subscribe(this._pinchOperation$);
-        this._pinchChange$ = pinchStart$
-            .switchMap(function (te) {
-            return _this._pinch$
-                .skip(1)
-                .takeUntil(pinchStop$);
-        });
+        this._pinchChange$ = this._pinchStart$.pipe(operators_1.switchMap(function (te) {
+            return _this._pinch$.pipe(operators_1.skip(1), operators_1.takeUntil(_this._pinchEnd$));
+        }));
     }
+    Object.defineProperty(TouchService.prototype, "active$", {
+        get: function () {
+            return this._active$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TouchService.prototype, "activate$", {
+        get: function () {
+            return this._activeSubject$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TouchService.prototype, "doubleTap$", {
+        get: function () {
+            return this._doubleTap$;
+        },
+        enumerable: false,
+        configurable: true
+    });
     Object.defineProperty(TouchService.prototype, "touchStart$", {
         get: function () {
             return this._touchStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchMove$", {
         get: function () {
             return this._touchMove$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchEnd$", {
         get: function () {
             return this._touchEnd$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchCancel$", {
         get: function () {
             return this._touchCancel$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(TouchService.prototype, "singleTouchMove$", {
+    Object.defineProperty(TouchService.prototype, "singleTouchDragStart$", {
         get: function () {
-            return this._singleTouch$;
+            return this._singleTouchDragStart$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TouchService.prototype, "singleTouchDrag$", {
+        get: function () {
+            return this._singleTouchDrag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TouchService.prototype, "singleTouchDragEnd$", {
+        get: function () {
+            return this._singleTouchDragEnd$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "pinch$", {
         get: function () {
             return this._pinchChange$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(TouchService.prototype, "preventDefaultTouchMove$", {
+    Object.defineProperty(TouchService.prototype, "pinchStart$", {
         get: function () {
-            return this._preventTouchMove$;
+            return this._pinchStart$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TouchService.prototype, "pinchEnd$", {
+        get: function () {
+            return this._pinchEnd$;
+        },
+        enumerable: false,
         configurable: true
     });
     return TouchService;
 }());
 exports.TouchService = TouchService;
 
-},{"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73}],320:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
+},{"rxjs":43,"rxjs/operators":241}],485:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Viewer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var when = require("when");
 var Viewer_1 = require("../Viewer");
 var Utils_1 = require("../Utils");
 /**
  * @class Viewer
  *
- * @classdesc The Viewer object represents the navigable photo viewer.
- * Create a Viewer by specifying a container, client ID, photo key and
+ * @classdesc The Viewer object represents the navigable image viewer.
+ * Create a Viewer by specifying a container, client ID, image key and
  * other options. The viewer exposes methods and events for programmatic
  * interaction.
+ *
+ * In the case of asynchronous methods, MapillaryJS returns promises to
+ * the results. Notifications are always emitted through JavaScript events.
+ *
+ * The viewer works with a few different coordinate systems.
+ *
+ * Container pixel coordinates
+ *
+ * Pixel coordinates are coordinates on the viewer container. The origin is
+ * in the top left corner of the container. The axes are
+ * directed according to the following for a viewer container with a width
+ * of 640 pixels and height of 480 pixels.
+ *
+ * ```
+ * (0,0)                          (640, 0)
+ *      +------------------------>
+ *      |
+ *      |
+ *      |
+ *      v                        +
+ * (0, 480)                       (640, 480)
+ * ```
+ *
+ * Basic image coordinates
+ *
+ * Basic image coordinates represents points in the original image adjusted for
+ * orientation. They range from 0 to 1 on both axes. The origin is in the top left
+ * corner of the image and the axes are directed
+ * according to the following for all image types.
+ *
+ * ```
+ * (0,0)                          (1, 0)
+ *      +------------------------>
+ *      |
+ *      |
+ *      |
+ *      v                        +
+ * (0, 1)                         (1, 1)
+ * ```
+ *
+ * For every camera viewing direction it is possible to convert between these
+ * two coordinate systems for the current node. The image can be panned and
+ * zoomed independently of the size of the viewer container resulting in
+ * different conversion results for different viewing directions.
  */
-var Viewer = (function (_super) {
+var Viewer = /** @class */ (function (_super) {
     __extends(Viewer, _super);
     /**
-     * Create a new viewer instance.
+     * Create a new viewer instance.
+     *
+     * @description It is possible to initialize the viewer with or
+     * without a key.
+     *
+     * When you want to show a specific image in the viewer from
+     * the start you should initialize it with a key.
+     *
+     * When you do not know the first image key at implementation
+     * time, e.g. in a map-viewer application you should initialize
+     * the viewer without a key and call `moveToKey` instead.
+     *
+     * When initializing with a key the viewer is bound to that key
+     * until the node for that key has been successfully loaded.
+     * Also, a cover with the image of the key will be shown.
+     * If the data for that key can not be loaded because the key is
+     * faulty or other errors occur it is not possible to navigate
+     * to another key because the viewer is not navigable. The viewer
+     * becomes navigable when the data for the key has been loaded and
+     * the image is shown in the viewer. This way of initializing
+     * the viewer is mostly for embedding in blog posts and similar
+     * where one wants to show a specific image initially.
+     *
+     * If the viewer is initialized without a key (with null or
+     * undefined) it is not bound to any particular key and it is
+     * possible to move to any key with `viewer.moveToKey("<my-image-key>")`.
+     * If the first move to a key fails it is possible to move to another
+     * key. The viewer will show a black background until a move
+     * succeeds. This way of intitializing is suited for a map-viewer
+     * application when the initial key is not known at implementation
+     * time.
+     *
+     * @param {string | HTMLElement} container - The HTML element in which
+     * MapillaryJS will render the viewer, or the element's string `id`. The
+     * specified element must have no children.
+     * @param {string} clientId - Required `Mapillary API ClientID`. Can
+     * be obtained from https://www.mapillary.com/app/settings/developers.
+     * @param {string} key - Optional `image-key` to start from. The key
+     * can be any Mapillary image. If a key is provided the viewer is
+     * bound to that key until it has been fully loaded. If null is provided
+     * no image is loaded at viewer initialization and the viewer is not
+     * bound to any particular key. Any image can then be navigated to
+     * with e.g. `viewer.moveToKey("<my-image-key>")`.
+     * @param {IViewerOptions} options - Optional configuration object
+     * specifing Viewer's and the components' initial setup.
+     * @param {string} token - Optional bearer token for API requests of
+     * protected resources.
+     *
+     * @example
+     * ```
+     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<image-key>");
+     * ```
+     */
+    function Viewer(container, clientId, key, options, token) {
+        var _this = _super.call(this) || this;
+        options = options != null ? options : {};
+        Utils_1.Settings.setOptions(options);
+        Utils_1.Urls.setOptions(options.url);
+        _this._navigator = new Viewer_1.Navigator(clientId, options, token);
+        _this._container = new Viewer_1.Container(container, _this._navigator.stateService, options);
+        _this._observer = new Viewer_1.Observer(_this, _this._navigator, _this._container);
+        _this._componentController = new Viewer_1.ComponentController(_this._container, _this._navigator, _this._observer, key, options.component);
+        return _this;
+    }
+    Object.defineProperty(Viewer.prototype, "isNavigable", {
+        /**
+         * Return a boolean indicating if the viewer is in a navigable state.
+         *
+         * @description The navigable state indicates if the viewer supports
+         * moving, i.e. calling the {@link moveToKey}, {@link moveDir}
+         * and {@link moveCloseTo} methods or changing the authentication state,
+         * i.e. calling {@link setAuthToken}. The viewer will not be in a navigable
+         * state if the cover is activated and the viewer has been supplied a key.
+         * When the cover is deactivated or the viewer is activated without being
+         * supplied a key it will be navigable.
+         *
+         * @returns {boolean} Boolean indicating whether the viewer is navigable.
+         */
+        get: function () {
+            return this._componentController.navigable;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Activate the combined panning functionality.
+     *
+     * @description The combined panning functionality is active by default.
+     */
+    Viewer.prototype.activateCombinedPanning = function () {
+        this._navigator.panService.enable();
+    };
+    /**
+     * Activate a component.
+     *
+     * @param {string} name - Name of the component which will become active.
+     *
+     * @example
+     * ```
+     * viewer.activateComponent("marker");
+     * ```
+     */
+    Viewer.prototype.activateComponent = function (name) {
+        this._componentController.activate(name);
+    };
+    /**
+     * Activate the cover (deactivates all other components).
+     */
+    Viewer.prototype.activateCover = function () {
+        this._componentController.activateCover();
+    };
+    /**
+     * Deactivate the combined panning functionality.
+     *
+     * @description Deactivating the combined panning functionality
+     * could be needed in scenarios involving sequence only navigation.
+     */
+    Viewer.prototype.deactivateCombinedPanning = function () {
+        this._navigator.panService.disable();
+    };
+    /**
+     * Deactivate a component.
+     *
+     * @param {string} name - Name of component which become inactive.
+     *
+     * @example
+     * ```
+     * viewer.deactivateComponent("mouse");
+     * ```
+     */
+    Viewer.prototype.deactivateComponent = function (name) {
+        this._componentController.deactivate(name);
+    };
+    /**
+     * Deactivate the cover (activates all components marked as active).
+     */
+    Viewer.prototype.deactivateCover = function () {
+        this._componentController.deactivateCover();
+    };
+    /**
+     * Get the bearing of the current viewer camera.
+     *
+     * @description The bearing depends on how the camera
+     * is currently rotated and does not correspond
+     * to the compass angle of the current node if the view
+     * has been panned.
+     *
+     * Bearing is measured in degrees clockwise with respect to
+     * north.
+     *
+     * @returns {Promise<number>} Promise to the bearing
+     * of the current viewer camera.
+     *
+     * @example
+     * ```
+     * viewer.getBearing().then((b) => { console.log(b); });
+     * ```
+     */
+    Viewer.prototype.getBearing = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.bearing$.pipe(operators_1.first())
+                .subscribe(function (bearing) {
+                resolve(bearing);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Returns the HTML element containing the viewer's <canvas> element.
+     *
+     * @description This is the element to which event bindings for viewer
+     * interactivity (such as panning and zooming) are attached.
+     *
+     * @returns {HTMLElement} The container viewer's <canvas> element.
+     */
+    Viewer.prototype.getCanvasContainer = function () {
+        return this._container.canvasContainer;
+    };
+    /**
+     * Get the basic coordinates of the current image that is
+     * at the center of the viewport.
+     *
+     * @description Basic coordinates are 2D coordinates on the [0, 1] interval
+     * and have the origin point, (0, 0), at the top left corner and the
+     * maximum value, (1, 1), at the bottom right corner of the original
+     * image.
+     *
+     * @returns {Promise<number[]>} Promise to the basic coordinates
+     * of the current image at the center for the viewport.
+     *
+     * @example
+     * ```
+     * viewer.getCenter().then((c) => { console.log(c); });
+     * ```
+     */
+    Viewer.prototype.getCenter = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._navigator.stateService.getCenter()
+                .subscribe(function (center) {
+                resolve(center);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get a component.
+     *
+     * @param {string} name - Name of component.
+     * @returns {Component} The requested component.
+     *
+     * @example
+     * ```
+     * var mouseComponent = viewer.getComponent("mouse");
+     * ```
+     */
+    Viewer.prototype.getComponent = function (name) {
+        return this._componentController.get(name);
+    };
+    /**
+     * Returns the viewer's containing HTML element.
+     *
+     * @returns {HTMLElement} The viewer's container.
+     */
+    Viewer.prototype.getContainer = function () {
+        return this._container.element;
+    };
+    /**
+     * Get the viewer's current vertical field of view.
+     *
+     * @description The vertical field of view rendered on the viewer canvas
+     * measured in degrees.
+     *
+     * @returns {Promise<number>} Promise to the current field of view
+     * of the viewer camera.
+     *
+     * @example
+     * ```
+     * viewer.getFieldOfView().then((fov) => { console.log(fov); });
+     * ```
+     */
+    Viewer.prototype.getFieldOfView = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.renderCamera$.pipe(operators_1.first())
+                .subscribe(function (rc) {
+                resolve(rc.perspective.fov);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get the viewer's current point of view.
      *
-     * @param {string} id - required `id` of an DOM element which will
-     * be transformed into the viewer.
-     * @param {string} clientId - required `Mapillary API ClientID`, can
-     * be obtained from https://www.mapillary.com/app/settings/developers.
-     * @param {string} key - optional `photoId` to start from, can be any
-     * Mapillary photo, if null no image is loaded.
-     * @param {IViewerOptions} options - optional configuration object
-     * specifing Viewer's initial setup.
+     * @returns {Promise<IPointOfView>} Promise to the current point of view
+     * of the viewer camera.
+     *
+     * @example
+     * ```
+     * viewer.getPointOfView().then((pov) => { console.log(pov); });
+     * ```
      */
-    function Viewer(id, clientId, key, options) {
-        _super.call(this);
-        options = options != null ? options : {};
-        Utils_1.Settings.setOptions(options);
-        this._navigator = new Viewer_1.Navigator(clientId);
-        this._container = new Viewer_1.Container(id, this._navigator.stateService, options);
-        this._eventLauncher = new Viewer_1.EventLauncher(this, this._navigator, this._container);
-        this._componentController = new Viewer_1.ComponentController(this._container, this._navigator, key, options.component);
-    }
+    Viewer.prototype.getPointOfView = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._container.renderService.bearing$).pipe(operators_1.first())
+                .subscribe(function (_a) {
+                var rc = _a[0], bearing = _a[1];
+                resolve({
+                    bearing: bearing,
+                    tilt: rc.getTilt(),
+                });
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get the viewer's current position
+     *
+     * @returns {Promise<ILatLon>} Promise to the viewers's current
+     * position.
+     *
+     * @example
+     * ```
+     * viewer.getPosition().then((pos) => { console.log(pos); });
+     * ```
+     */
+    Viewer.prototype.getPosition = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.reference$).pipe(operators_1.first())
+                .subscribe(function (_a) {
+                var render = _a[0], reference = _a[1];
+                resolve(_this._observer.projection.cameraToLatLon(render, reference));
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get the image's current zoom level.
+     *
+     * @returns {Promise<number>} Promise to the viewers's current
+     * zoom level.
+     *
+     * @example
+     * ```
+     * viewer.getZoom().then((z) => { console.log(z); });
+     * ```
+     */
+    Viewer.prototype.getZoom = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._navigator.stateService.getZoom()
+                .subscribe(function (zoom) {
+                resolve(zoom);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
     /**
-     * Navigate to a given photo key.
+     * Move close to given latitude and longitude.
+     *
+     * @description Because the method propagates IO errors, these potential errors
+     * need to be handled by the method caller (see example).
      *
-     * @param {string} key - A valid Mapillary photo key.
+     * @param {Number} lat - Latitude, in degrees.
+     * @param {Number} lon - Longitude, in degrees.
      * @returns {Promise<Node>} Promise to the node that was navigated to.
+     * @throws {Error} If no nodes exist close to provided latitude
+     * longitude.
      * @throws {Error} Propagates any IO errors to the caller.
+     * @throws {Error} When viewer is not navigable.
+     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
+     * before the move close to call has completed.
+     *
+     * @example
+     * ```
+     * viewer.moveCloseTo(0, 0).then(
+     *     (n) => { console.log(n); },
+     *     (e) => { console.error(e); });
+     * ```
      */
-    Viewer.prototype.moveToKey = function (key) {
-        var _this = this;
+    Viewer.prototype.moveCloseTo = function (lat, lon) {
+        var moveCloseTo$ = this.isNavigable ?
+            this._navigator.moveCloseTo$(lat, lon) :
+            rxjs_1.throwError(new Error("Calling moveCloseTo is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.moveToKey$(key).subscribe(function (node) {
+            moveCloseTo$.subscribe(function (node) {
                 resolve(node);
             }, function (error) {
                 reject(error);
@@ -33152,13 +58240,23 @@ var Viewer = (function (_super) {
      * @throws {Error} If the current node does not have the edge direction
      * or the edges has not yet been cached.
      * @throws {Error} Propagates any IO errors to the caller.
+     * @throws {Error} When viewer is not navigable.
+     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
+     * before the move dir call has completed.
      *
-     * @example `viewer.moveDir(Mapillary.EdgeDirection.Next);`
+     * @example
+     * ```
+     * viewer.moveDir(Mapillary.EdgeDirection.Next).then(
+     *     (n) => { console.log(n); },
+     *     (e) => { console.error(e); });
+     * ```
      */
     Viewer.prototype.moveDir = function (dir) {
-        var _this = this;
+        var moveDir$ = this.isNavigable ?
+            this._navigator.moveDir$(dir) :
+            rxjs_1.throwError(new Error("Calling moveDir is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.moveDir$(dir).subscribe(function (node) {
+            moveDir$.subscribe(function (node) {
                 resolve(node);
             }, function (error) {
                 reject(error);
@@ -33166,189 +58264,533 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Move close to given latitude and longitude.
+     * Navigate to a given image key.
      *
-     * @param {Number} lat - Latitude, in degrees.
-     * @param {Number} lon - Longitude, in degrees.
+     * @param {string} key - A valid Mapillary image key.
      * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} If no nodes exist close to provided latitude
-     * longitude.
      * @throws {Error} Propagates any IO errors to the caller.
+     * @throws {Error} When viewer is not navigable.
+     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
+     * before the move to key call has completed.
+     *
+     * @example
+     * ```
+     * viewer.moveToKey("<my key>").then(
+     *     (n) => { console.log(n); },
+     *     (e) => { console.error(e); });
+     * ```
      */
-    Viewer.prototype.moveCloseTo = function (lat, lon) {
-        var _this = this;
+    Viewer.prototype.moveToKey = function (key) {
+        var moveToKey$ = this.isNavigable ?
+            this._navigator.moveToKey$(key) :
+            rxjs_1.throwError(new Error("Calling moveToKey is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.moveCloseTo$(lat, lon).subscribe(function (node) {
+            moveToKey$.subscribe(function (node) {
                 resolve(node);
             }, function (error) {
                 reject(error);
             });
         });
     };
+    /**
+     * Project an ILatLon representing geographicalcoordinates to
+     * canvas pixel coordinates.
+     *
+     * @description The geographical coordinates may not always correspond to pixel
+     * coordinates, e.g. if the geographical coordinates have a position behind the
+     * viewer camera. In the case of no correspondence the returned value will
+     * be `null`.
+     *
+     * If the distance from the viewer camera position to the provided lat-lon
+     * is more than 1000 meters `null` will be returned.
+     *
+     * The projection is performed from the ground plane, i.e.
+     * the altitude with respect to the ground plane for the geographical
+     * point is zero.
+     *
+     * Note that whenever the camera moves, the result of the method will be
+     * different.
+     *
+     * @param {ILatLon} latLon - Geographical coordinates to project.
+     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
+     * to the latLon.
+     *
+     * @example
+     * ```
+     * viewer.project({ lat: 0, lon: 0 })
+     *     .then((pixelPoint) => {
+     *          if (!pixelPoint) {
+     *              console.log("no correspondence");
+     *          }
+     *
+     *          console.log(pixelPoint);
+     *     });
+     * ```
+     */
+    Viewer.prototype.project = function (latLon) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._observer.project$(latLon)
+                .subscribe(function (pixelPoint) {
+                resolve(pixelPoint);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Project basic image coordinates for the current node to canvas pixel
+     * coordinates.
+     *
+     * @description The basic image coordinates may not always correspond to a
+     * pixel point that lies in the visible area of the viewer container. In the
+     * case of no correspondence the returned value can be `null`.
+     *
+     *
+     * @param {Array<number>} basicPoint - Basic images coordinates to project.
+     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
+     * to the basic image point.
+     *
+     * @example
+     * ```
+     * viewer.projectFromBasic([0.3, 0.7])
+     *     .then((pixelPoint) => { console.log(pixelPoint); });
+     * ```
+     */
+    Viewer.prototype.projectFromBasic = function (basicPoint) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._observer.projectBasic$(basicPoint)
+                .subscribe(function (pixelPoint) {
+                resolve(pixelPoint);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
     /**
      * Detect the viewer's new width and height and resize it.
      *
      * @description The components will also detect the viewer's
      * new size and resize their rendered elements if needed.
+     *
+     * @example
+     * ```
+     * viewer.resize();
+     * ```
      */
     Viewer.prototype.resize = function () {
         this._container.renderService.resize$.next(null);
-        this._componentController.resize();
     };
     /**
-     * Set the viewer's render mode.
+     * Set a bearer token for authenticated API requests of
+     * protected resources.
      *
-     * @param {RenderMode} renderMode - Render mode.
+     * @description When the supplied token is null or undefined,
+     * any previously set bearer token will be cleared and the
+     * viewer will make unauthenticated requests.
+     *
+     * Calling setAuthToken aborts all outstanding move requests.
+     * The promises of those move requests will be rejected with a
+     * {@link AbortMapillaryError} the rejections need to be caught.
+     *
+     * Calling setAuthToken also resets the complete viewer cache
+     * so it should not be called repeatedly.
+     *
+     * @param {string} [token] token - Bearer token.
+     * @returns {Promise<void>} Promise that resolves after token
+     * is set.
+     *
+     * @throws {Error} When viewer is not navigable.
      *
-     * @example `viewer.setRenderMode(Mapillary.RenderMode.Letterbox);`
+     * @example
+     * ```
+     * viewer.setAuthToken("<my token>")
+     *     .then(() => { console.log("token set"); });
+     * ```
      */
-    Viewer.prototype.setRenderMode = function (renderMode) {
-        this._container.renderService.renderMode$.next(renderMode);
+    Viewer.prototype.setAuthToken = function (token) {
+        var setToken$ = this.isNavigable ?
+            this._navigator.setToken$(token) :
+            rxjs_1.throwError(new Error("Calling setAuthToken is not supported when viewer is not navigable."));
+        return when.promise(function (resolve, reject) {
+            setToken$
+                .subscribe(function () {
+                resolve(undefined);
+            }, function (error) {
+                reject(error);
+            });
+        });
     };
     /**
-     * Activate a component.
+     * Set the basic coordinates of the current image to be in the
+     * center of the viewport.
      *
-     * @param {string} name - Name of the component which will become active.
+     * @description Basic coordinates are 2D coordinates on the [0, 1] interval
+     * and has the origin point, (0, 0), at the top left corner and the
+     * maximum value, (1, 1), at the bottom right corner of the original
+     * image.
+     *
+     * @param {number[]} The basic coordinates of the current
+     * image to be at the center for the viewport.
+     *
+     * @example
+     * ```
+     * viewer.setCenter([0.5, 0.5]);
+     * ```
      */
-    Viewer.prototype.activateComponent = function (name) {
-        this._componentController.activate(name);
+    Viewer.prototype.setCenter = function (center) {
+        this._navigator.stateService.setCenter(center);
     };
     /**
-     * Deactivate a component.
+     * Set the filter selecting nodes to use when calculating
+     * the spatial edges.
      *
-     * @param {string} name - Name of component which become inactive.
+     * @description The following filter types are supported:
+     *
+     * Comparison
+     *
+     * `["==", key, value]` equality: `node[key] = value`
+     *
+     * `["!=", key, value]` inequality: `node[key] ≠ value`
+     *
+     * `["<", key, value]` less than: `node[key] < value`
+     *
+     * `["<=", key, value]` less than or equal: `node[key] ≤ value`
+     *
+     * `[">", key, value]` greater than: `node[key] > value`
+     *
+     * `[">=", key, value]` greater than or equal: `node[key] ≥ value`
+     *
+     * Set membership
+     *
+     * `["in", key, v0, ..., vn]` set inclusion: `node[key] ∈ {v0, ..., vn}`
+     *
+     * `["!in", key, v0, ..., vn]` set exclusion: `node[key] ∉ {v0, ..., vn}`
+     *
+     * Combining
+     *
+     * `["all", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`
+     *
+     * A key must be a string that identifies a property name of a
+     * simple {@link Node} property. A value must be a string, number, or
+     * boolean. Strictly-typed comparisons are used. The values
+     * `f0, ..., fn` of the combining filter must be filter expressions.
+     *
+     * Clear the filter by setting it to null or empty array.
+     *
+     * Commonly used filter properties (see the {@link Node} class
+     * documentation for a full list of properties that can be used
+     * in a filter) and common use cases:
+     *
+     * ```
+     * fullPano        // Show only full 360 panoramas or not
+     * organizationKey // Show images from one or several organizations
+     * sequenceKey     // Show images from one or several sequences
+     * userKey         // Show images from one or several users
+     * capturedAt      // Show images from a certain time interval
+     * ```
+     *
+     * @param {FilterExpression} filter - The filter expression.
+     * @returns {Promise<void>} Promise that resolves after filter is applied.
+     *
+     * @example
+     * ```
+     * viewer.setFilter(["==", "sequenceKey", "<my sequence key>"]);
+     *
+     * // Other examples
+     * // viewer.setFilter(["==", "organizationKey", "<my organization key>"]);
+     * // viewer.setFilter(["in", "userKey", "<my user key #1>", "<my user key #2>"]);
+     * // viewer.setFilter(["==", "fullPano", true]);
+     * // viewer.setFilter([">=", "capturedAt", <my time stamp>]);
+     * ```
      */
-    Viewer.prototype.deactivateComponent = function (name) {
-        this._componentController.deactivate(name);
+    Viewer.prototype.setFilter = function (filter) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._navigator.setFilter$(filter)
+                .subscribe(function () {
+                resolve(undefined);
+            }, function (error) {
+                reject(error);
+            });
+        });
     };
     /**
-     * Get a component.
+     * Set the viewer's current vertical field of view.
      *
-     * @param {string} name - Name of component.
-     * @returns {Component} The requested component.
+     * @description Sets the vertical field of view rendered
+     * on the viewer canvas measured in degrees. The value
+     * will be clamped to be able to set a valid zoom level
+     * based on the projection model of the current image and
+     * the viewer's current render mode.
+     *
+     * @param {number} fov - Vertical field of view in degrees.
+     *
+     * @example
+     * ```
+     * viewer.setFieldOfView(45);
+     * ```
      */
-    Viewer.prototype.getComponent = function (name) {
-        return this._componentController.get(name);
+    Viewer.prototype.setFieldOfView = function (fov) {
+        var _this = this;
+        this._container.renderService.renderCamera$.pipe(operators_1.first())
+            .subscribe(function (rc) {
+            var zoom = rc.fovToZoom(fov);
+            _this._navigator.stateService.setZoom(zoom);
+        });
     };
     /**
-     * Activate the cover (deactivates all other components).
+     * Set the viewer's render mode.
+     *
+     * @param {RenderMode} renderMode - Render mode.
+     *
+     * @example
+     * ```
+     * viewer.setRenderMode(Mapillary.RenderMode.Letterbox);
+     * ```
      */
-    Viewer.prototype.activateCover = function () {
-        this._componentController.activateCover();
+    Viewer.prototype.setRenderMode = function (renderMode) {
+        this._container.renderService.renderMode$.next(renderMode);
     };
     /**
-     * Deactivate the cover (activates all components marked as active).
+     * Set the viewer's transition mode.
+     *
+     * @param {TransitionMode} transitionMode - Transition mode.
+     *
+     * @example
+     * ```
+     * viewer.setTransitionMode(Mapillary.TransitionMode.Instantaneous);
+     * ```
      */
-    Viewer.prototype.deactivateCover = function () {
-        this._componentController.deactivateCover();
+    Viewer.prototype.setTransitionMode = function (transitionMode) {
+        this._navigator.stateService.setTransitionMode(transitionMode);
     };
     /**
-     * Get the basic coordinates of the current photo that is
-     * at the center of the viewport.
+     * Set the image's current zoom level.
+     *
+     * @description Possible zoom level values are on the [0, 3] interval.
+     * Zero means zooming out to fit the image to the view whereas three
+     * shows the highest level of detail.
      *
-     * @description Basic coordinates are on the [0, 1] interval and
-     * has the origin point, [0, 0], at the top left corner and the
-     * maximum value, [1, 1], at the bottom right corner of the original
-     * photo.
+     * @param {number} The image's current zoom level.
      *
-     * @returns {Promise<number[]>} Promise to the basic coordinates
-     * of the current photo at the center for the viewport.
+     * @example
+     * ```
+     * viewer.setZoom(2);
+     * ```
      */
-    Viewer.prototype.getCenter = function () {
+    Viewer.prototype.setZoom = function (zoom) {
+        this._navigator.stateService.setZoom(zoom);
+    };
+    /**
+     * Unproject canvas pixel coordinates to an ILatLon representing geographical
+     * coordinates.
+     *
+     * @description The pixel point may not always correspond to geographical
+     * coordinates. In the case of no correspondence the returned value will
+     * be `null`.
+     *
+     * The unprojection to a latLon will be performed towards the ground plane, i.e.
+     * the altitude with respect to the ground plane for the returned latLon is zero.
+     *
+     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
+     * @returns {Promise<ILatLon>} Promise to the latLon corresponding to the pixel point.
+     *
+     * @example
+     * ```
+     * viewer.unproject([100, 100])
+     *     .then((latLon) => { console.log(latLon); });
+     * ```
+     */
+    Viewer.prototype.unproject = function (pixelPoint) {
         var _this = this;
         return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.getCenter()
-                .subscribe(function (center) {
-                resolve(center);
+            _this._observer.unproject$(pixelPoint)
+                .subscribe(function (latLon) {
+                resolve(latLon);
             }, function (error) {
                 reject(error);
             });
         });
     };
     /**
-     * Get the photo's current zoom level.
+     * Unproject canvas pixel coordinates to basic image coordinates for the
+     * current node.
      *
-     * @returns {Promise<number>} Promise to the viewers's current
-     * zoom level.
+     * @description The pixel point may not always correspond to basic image
+     * coordinates. In the case of no correspondence the returned value will
+     * be `null`.
+     *
+     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
+     * @returns {Promise<ILatLon>} Promise to the basic coordinates corresponding
+     * to the pixel point.
+     *
+     * @example
+     * ```
+     * viewer.unprojectToBasic([100, 100])
+     *     .then((basicPoint) => { console.log(basicPoint); });
+     * ```
      */
-    Viewer.prototype.getZoom = function () {
+    Viewer.prototype.unprojectToBasic = function (pixelPoint) {
         var _this = this;
         return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.getZoom()
-                .subscribe(function (zoom) {
-                resolve(zoom);
+            _this._observer.unprojectBasic$(pixelPoint)
+                .subscribe(function (basicPoint) {
+                resolve(basicPoint);
             }, function (error) {
                 reject(error);
             });
         });
     };
     /**
-     * Set the basic coordinates of the current photo to be in the
-     * center of the viewport.
+     * Fired when the viewing direction of the camera changes.
      *
-     * @description Basic coordinates are on the [0, 1] interval and
-     * has the origin point, [0, 0], at the top left corner and the
-     * maximum value, [1, 1], at the bottom right corner of the original
-     * photo.
+     * @description Related to the computed compass angle
+     * ({@link Node.computedCA}) from SfM, not the original EXIF compass
+     * angle.
      *
-     * @param {number[]} The basic coordinates of the current
-     * photo to be at the center for the viewport.
+     * @event
+     * @type {number} bearing - Value indicating the current bearing
+     * measured in degrees clockwise with respect to north.
      */
-    Viewer.prototype.setCenter = function (center) {
-        this._navigator.stateService.setCenter(center);
-    };
+    Viewer.bearingchanged = "bearingchanged";
     /**
-     * Set the photo's current zoom level.
-     *
-     * @description Possible zoom level values are on the [0, 3] interval.
-     * Zero means zooming out to fit the photo to the view whereas three
-     * shows the highest level of detail.
+     * Fired when a pointing device (usually a mouse) is pressed and released at
+     * the same point in the viewer.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.click = "click";
+    /**
+     * Fired when the right button of the mouse is clicked within the viewer.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.contextmenu = "contextmenu";
+    /**
+     * Fired when a pointing device (usually a mouse) is clicked twice at
+     * the same point in the viewer.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.dblclick = "dblclick";
+    /**
+     * Fired when the viewer's vertical field of view changes.
      *
-     * @param {number} The photo's current zoom level.
+     * @event
+     * @type  {@link IViewerEvent} event - The event object.
      */
-    Viewer.prototype.setZoom = function (zoom) {
-        this._navigator.stateService.setZoom(zoom);
-    };
+    Viewer.fovchanged = "fovchanged";
     /**
      * Fired when the viewer is loading more data.
      * @event
-     * @type {boolean} loading - Value indicating whether the viewer is loading.
+     * @type {boolean} loading - Boolean indicating whether the viewer is loading.
      */
     Viewer.loadingchanged = "loadingchanged";
     /**
-     * Fired when the viewer starts transitioning from one view to another,
-     * either by changing the node or by interaction such as pan and zoom.
+     * Fired when a pointing device (usually a mouse) is pressed within the viewer.
      * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
-    Viewer.movestart = "movestart";
+    Viewer.mousedown = "mousedown";
+    /**
+     * Fired when a pointing device (usually a mouse) is moved within the viewer.
+     * @description Will not fire when the mouse is actively used, e.g. for drag pan.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.mousemove = "mousemove";
+    /**
+     * Fired when a pointing device (usually a mouse) leaves the viewer's canvas.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.mouseout = "mouseout";
+    /**
+     * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.mouseover = "mouseover";
+    /**
+     * Fired when a pointing device (usually a mouse) is released within the viewer.
+     * @event
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
+     */
+    Viewer.mouseup = "mouseup";
     /**
-     * Fired when the viewer finishes transitioning and is in a fixed
+     * Fired when the viewer motion stops and it is in a fixed
      * position with a fixed point of view.
      * @event
      */
     Viewer.moveend = "moveend";
+    /**
+     * Fired when the motion from one view to another start,
+     * either by changing the position (e.g. when changing node) or
+     * when changing point of view (e.g. by interaction such as pan and zoom).
+     * @event
+     */
+    Viewer.movestart = "movestart";
+    /**
+     * Fired when the navigable state of the viewer changes.
+     *
+     * @description The navigable state indicates if the viewer supports
+     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`
+     * methods. The viewer will not be in a navigable state if the cover
+     * is activated and the viewer has been supplied a key. When the cover
+     * is deactivated or activated without being supplied a key it will
+     * be navigable.
+     *
+     * @event
+     * @type {boolean} navigable - Boolean indicating whether the viewer is navigable.
+     */
+    Viewer.navigablechanged = "navigablechanged";
     /**
      * Fired every time the viewer navigates to a new node.
+     *
      * @event
-     * @type {Node} node - Current node.
+     * @type  {@link Node} node - Current node.
      */
     Viewer.nodechanged = "nodechanged";
+    /**
+     * Fired when the viewer's position changes.
+     *
+     * @description The viewer's position changes when transitioning
+     * between nodes.
+     *
+     * @event
+     * @type  {@link IViewerEvent} event - The event object.
+     */
+    Viewer.positionchanged = "positionchanged";
+    /**
+     * Fired when the viewer's point of view changes. The point of view changes
+     * when the bearing, or tilt changes.
+     *
+     * @event
+     * @type  {@link IViewerEvent} event - The event object.
+     */
+    Viewer.povchanged = "povchanged";
     /**
      * Fired every time the sequence edges of the current node changes.
      * @event
-     * @type {IEdgeStatus} status - The edge status object.
+     * @type  {@link IEdgeStatus} status - The edge status object.
      */
     Viewer.sequenceedgeschanged = "sequenceedgeschanged";
     /**
      * Fired every time the spatial edges of the current node changes.
      * @event
-     * @type {IEdgeStatus} status - The edge status object.
+     * @type  {@link IEdgeStatus} status - The edge status object.
      */
     Viewer.spatialedgeschanged = "spatialedgeschanged";
     return Viewer;
 }(Utils_1.EventEmitter));
 exports.Viewer = Viewer;
 
-},{"../Utils":215,"../Viewer":216,"when":204}]},{},[212])(212)
+},{"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"when":288}],486:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}]},{},[296])(296)
 });
 //# sourceMappingURL=mapillary.js.map