X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/0814b4096c443e2ab3c09baa058aa81a00d205d1..1bbc85354e5db70daed65af4a28df2192a3bf44b:/vendor/assets/iD/iD/mapillary-js/mapillary.js diff --git a/vendor/assets/iD/iD/mapillary-js/mapillary.js b/vendor/assets/iD/iD/mapillary-js/mapillary.js index fb7fe80e2..d40dba782 100644 --- a/vendor/assets/iD/iD/mapillary-js/mapillary.js +++ b/vendor/assets/iD/iD/mapillary-js/mapillary.js @@ -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 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":227}],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 @@ -224,7 +489,7 @@ module.exports = (function split(undef) { return self; })(); -},{}],4:[function(require,module,exports){ +},{}],6:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -395,6 +660,10 @@ 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'); @@ -406,12 +675,11 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],5:[function(require,module,exports){ -(function (global){ +},{}],7:[function(require,module,exports){ /*! * The buffer module from node.js, for the browser. * - * @author Feross Aboukhadijeh + * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ @@ -420,80 +688,57 @@ process.umask = function() { return 0; }; var base64 = require('base64-js') var ieee754 = require('ieee754') -var isArray = require('isarray') 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 Use Object implementation (most compatible, even IE6) + * === 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+. * - * 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. + * 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 = global.TYPED_ARRAY_SUPPORT !== undefined - ? global.TYPED_ARRAY_SUPPORT - : typedArraySupport() +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() -/* - * Export kMaxLength after typed array support is determined. - */ -exports.kMaxLength = kMaxLength() +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 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 && // 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` + return arr.foo() === 42 } catch (e) { return false } } -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { +function createBuffer (length) { + if (length > K_MAX_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 + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf } /** @@ -507,10 +752,6 @@ 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') { @@ -518,33 +759,38 @@ function Buffer (arg, encodingOrOffset, length) { 'If encoding is specified then the first argument must be a string' ) } - return allocUnsafe(this, arg) + return allocUnsafe(arg) } - return from(this, arg, encodingOrOffset, length) + return from(arg, encodingOrOffset, length) } -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 +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) } -function from (that, value, encodingOrOffset, length) { +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) + if (isArrayBuffer(value)) { + return fromArrayBuffer(value, encodingOrOffset, length) } if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) + return fromString(value, encodingOrOffset) } - return fromObject(that, value) + return fromObject(value) } /** @@ -556,22 +802,14 @@ function from (that, value, encodingOrOffset, length) { * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { - return from(null, 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 - }) - } + return from(value, encodingOrOffset, length) } +// 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') @@ -580,20 +818,20 @@ function assertSize (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,34 +839,28 @@ 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' } @@ -638,32 +870,30 @@ function fromString (that, string, 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') } @@ -672,49 +902,43 @@ function fromArrayBuffer (that, array, byteOffset, length) { throw new RangeError('\'length\' is out of 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) + if (isArrayBufferView(obj) || 'length' in obj) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) } - return fromArrayLike(that, obj) + return fromArrayLike(obj) } - if (obj.type === 'Buffer' && isArray(obj.data)) { - return fromArrayLike(that, obj.data) + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) } } @@ -722,11 +946,11 @@ function fromObject (that, obj) { } 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,7 +963,7 @@ function SlowBuffer (length) { } Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) + return b != null && b._isBuffer === true } Buffer.compare = function compare (a, b) { @@ -785,7 +1009,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') } @@ -818,8 +1042,7 @@ 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 (isArrayBufferView(string) || isArrayBuffer(string)) { return string.byteLength } if (typeof string !== 'string') { @@ -929,8 +1152,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,7 +1204,7 @@ 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) @@ -1081,7 +1308,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. - if (isNaN(byteOffset)) { + if (numberIsNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } @@ -1110,8 +1337,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 { @@ -1213,7 +1439,7 @@ function hexWrite (buf, string, offset, length) { } 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 +1478,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' @@ -1459,7 +1684,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 +1710,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 +1725,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 +1740,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 +1756,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 +1784,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 +1794,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 +1812,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 +1830,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 +1861,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 +1871,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 +1902,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 +1921,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 +1940,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 +2011,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 +2034,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 +2043,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 +2088,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 +2106,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) } @@ -1971,7 +2156,7 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) { for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + } else if (len < 1000) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] @@ -2040,7 +2225,7 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) { } else { var bytes = Buffer.isBuffer(val) ? val - : utf8ToBytes(new Buffer(val, encoding).toString()) + : new Buffer(val, encoding) var len = bytes.length for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] @@ -2053,11 +2238,11 @@ 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 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 +2252,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 +2374,28 @@ function blitBuffer (src, dst, offset, length) { return i } -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare +// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check +// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166 +function isArrayBuffer (obj) { + return obj instanceof ArrayBuffer || + (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' && + typeof obj.byteLength === 'number') } -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView` +function isArrayBufferView (obj) { + return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj) +} + +function numberIsNaN (obj) { + return obj !== obj // eslint-disable-line no-self-compare +} -},{"base64-js":1,"ieee754":15,"isarray":19}],6:[function(require,module,exports){ +},{"base64-js":3,"ieee754":17}],8:[function(require,module,exports){ 'use strict'; module.exports = earcut; +module.exports.default = earcut; function earcut(data, holeIndices, dim) { @@ -2216,7 +2408,7 @@ function earcut(data, holeIndices, dim) { if (!outerNode) 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 +2426,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 +2467,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 +2479,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 +2493,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); @@ -2321,16 +2514,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); + 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 +2551,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 +2565,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 +2592,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; } @@ -2424,7 +2629,7 @@ function cureLocalIntersections(start, triangles, dim) { } // 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 +2644,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; @@ -2497,7 +2702,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; @@ -2528,7 +2733,7 @@ function findHoleBridge(hole, outerNode) { p = m.next; while (p !== stop) { - if (hx >= p.x && p.x >= mx && + 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 @@ -2546,10 +2751,10 @@ function findHoleBridge(hole, outerNode) { } // 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 +2787,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 +2819,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; @@ -2711,7 +2907,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); @@ -2846,7 +3043,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 +3065,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 +3166,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 +3195,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 +3212,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 +3241,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 +3464,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;s1&&!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);++e0){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_;_++)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;++rw;){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=ny;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||eo;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_;++_)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++d,_=i(t,l,e,m,x,!0,n,r,o);if(e=_[0],g(e))return _;l=_[1]}while(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.lengthi){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-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&&++n0){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;++d0){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={},_=ex,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++=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;++SS,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++i&&(i=0),n>0&&i>n&&(i=n);for(var s=new Array(i);++oq)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)-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(;cp){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 +3473,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;nn;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 +3581,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 +3605,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 +3629,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,7319 +3882,5032 @@ 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.5.0 + * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor + * + * @author Alex Milevski + * @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) : + (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) + 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; + }; - // Normalize the path - resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; -}; + 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; + } -// path.normalize(path) -// posix version -exports.normalize = function(path) { - var isAbsolute = exports.isAbsolute(path), - trailingSlash = substr(path, -1) === '/'; + 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; + }; - // Normalize the path - path = normalizeArray(filter(path.split('/'), function(p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } + SplayTree.prototype._splay = function _splay (x) { + var this$1 = this; + + while (x.parent) { + var p = x.parent; + if (!p.parent) { + if (p.left === x) { this$1.rotateRight(p); } + else { this$1.rotateLeft(p); } + } else if (p.left === x && p.parent.left === p) { + this$1.rotateRight(p.parent); + this$1.rotateRight(p); + } else if (p.right === x && p.parent.right === p) { + this$1.rotateLeft(p.parent); + this$1.rotateLeft(p); + } else if (p.left === x && p.parent.right === p) { + this$1.rotateRight(p); + this$1.rotateLeft(p); + } else { + this$1.rotateLeft(p); + this$1.rotateRight(p); + } + } + }; - return (isAbsolute ? '/' : '') + path; -}; -// posix version -exports.isAbsolute = function(path) { - return path.charAt(0) === '/'; -}; + SplayTree.prototype.splay = function splay (x) { + var this$1 = this; -// 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('/')); -}; + 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$1._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 && 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; - }, + /* eslint-disable class-methods-use-this */ - readDouble: function() { - var val = ieee754.read(this.buf, this.pos, true, 52, 8); - this.pos += 8; - return val; - }, + /** + * 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; + }; - readVarint: function(isSigned) { - var buf = this.buf, - val, b; - 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; + /** + * 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 */ - return readVarintRemainder(val, isSigned, this); - }, - readVarint64: function() { // for compatibility with v2.0.1 - return this.readVarint(true); - }, + /** + * @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; + }; - readSVarint: function() { - var num = this.readVarint(); - return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding - }, - readBoolean: function() { - return Boolean(this.readVarint()); - }, + /** + * 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 this$1 = this; - readString: function() { - var end = this.readVarint() + this.pos, - str = readUtf8(this.buf, this.pos, end); - this.pos = end; - return str; - }, + var Q = []; + var compare = this._compare; + var node = this._root, cmp; - readBytes: function() { - var end = this.readVarint() + this.pos, - buffer = this.buf.subarray(this.pos, end); - this.pos = end; - return buffer; - }, + 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$1; } // stop if smth is returned + } + node = node.right; + } + } + return this; + }; - // verbose for performance reasons; doesn't affect gzipped size + /** + * Returns all keys in order + * @return {Array} + */ + 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; + }; - 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; - }, - 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); - }, + /** + * Returns `data` fields of all nodes in order. + * @return {Array} + */ + 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; + }; - // === WRITING ================================================================= - writeTag: function(tag, type) { - this.writeVarint((tag << 3) | type); - }, + /** + * 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; + }; - realloc: function(min) { - var length = this.length || 16; + /** + * Bulk-load items. Both array have to be same size + * @param{Array} keys + * @param{Array}[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; + }; - while (length < this.pos + min) length *= 2; - if (length !== this.length) { - var buf = new Uint8Array(length); - buf.set(this.buf); - this.buf = buf; - this.length = length; - } - }, + SplayTree.prototype.min = function min () { + var node = this.minNode(this._root); + if (node) { return node.key; } + else { return null; } + }; - finish: function() { - this.length = this.pos; - this.pos = 0; - return this.buf.subarray(0, this.length); - }, - writeFixed32: function(val) { - this.realloc(4); - writeInt32(this.buf, val, this.pos); - this.pos += 4; - }, + SplayTree.prototype.max = function max () { + var node = this.maxNode(this._root); + if (node) { return node.key; } + else { return null; } + }; - writeSFixed32: 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; }; - 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; - }, - 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; - }, + /** + * Create a tree and load it with items + * @param{Array} keys + * @param{Array?} [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); + }; - writeVarint: function(val) { - val = +val || 0; + Object.defineProperties( SplayTree.prototype, prototypeAccessors ); - if (val > 0xfffffff || val < 0) { - writeBigVarint(val, this); - return; - } - this.realloc(4); + 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.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; - }, - writeSVarint: function(val) { - this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); - }, + function sort(keys, values, left, right, compare) { + if (left >= right) { return; } - writeBoolean: function(val) { - this.writeVarint(Boolean(val)); - }, + var pivot = keys[(left + right) >> 1]; + var i = left - 1; + var j = right + 1; - writeString: function(str) { - str = String(str); - this.realloc(str.length * 4); + while (true) { + do { i++; } while (compare(keys[i], pivot) < 0); + do { j--; } while (compare(keys[j], pivot) > 0); + if (i >= j) { break; } - this.pos++; // reserve 1 byte for short string length + var tmp = keys[i]; + keys[i] = keys[j]; + keys[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; + tmp = values[i]; + values[i] = values[j]; + values[j] = tmp; + } - if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + sort(keys, values, left, j, compare); + sort(keys, values, j + 1, right, compare); + } - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, + var NORMAL = 0; + var NON_CONTRIBUTING = 1; + var SAME_TRANSITION = 2; + var DIFFERENT_TRANSITION = 3; - writeFloat: function(val) { - this.realloc(4); - ieee754.write(this.buf, val, this.pos, true, 23, 4); - this.pos += 4; - }, + var INTERSECTION = 0; + var UNION = 1; + var DIFFERENCE = 2; + var XOR = 3; - writeDouble: function(val) { - this.realloc(8); - ieee754.write(this.buf, val, this.pos, true, 52, 8); - this.pos += 8; - }, + /** + * @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; - 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 same polygon + } else { + if (event.isSubject === prev.isSubject) { + event.inOut = !prev.inOut; + event.otherInOut = prev.otherInOut; - writeRawMessage: function(fn, obj) { - this.pos++; // reserve 1 byte for short message length + // previous line segment in sweepline belongs to the clipping polygon + } else { + event.inOut = !prev.otherInOut; + event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut; + } - // 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; + // compute prevInResult field + if (prev) { + event.prevInResult = (!inResult(prev, operation) || prev.isVertical()) + ? prev.prevInResult : prev; + } + } - if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + // check if the line segment belongs to the Boolean operation + event.inResult = inResult(event, operation); + } - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, - writeMessage: function(tag, fn, obj) { - this.writeTag(tag, Pbf.Bytes); - this.writeRawMessage(fn, obj); - }, + /* 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 */ - 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); }, + var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) { - 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)); - } -}; + /** + * Is left endpoint? + * @type {Boolean} + */ + this.left = left; -function readVarintRemainder(l, s, p) { - var buf = p.buf, - h, b; + /** + * @type {Array.} + */ + this.point = point; - 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); + /** + * Other edge reference + * @type {SweepEvent} + */ + this.otherEvent = otherEvent; - throw new Error('Expected varint not more than 10 bytes'); -} + /** + * Belongs to source or clipping polygon + * @type {Boolean} + */ + this.isSubject = isSubject; -function readPackedEnd(pbf) { - return pbf.type === Pbf.Bytes ? - pbf.readVarint() + pbf.pos : pbf.pos + 1; -} + /** + * Edge contribution type + * @type {Number} + */ + this.type = edgeType || NORMAL; -function toNum(low, high, isSigned) { - if (isSigned) { - return high * 0x100000000 + (low >>> 0); - } - return ((high >>> 0) * 0x100000000) + (low >>> 0); -} + /** + * In-out transition for the sweepline crossing polygon + * @type {Boolean} + */ + this.inOut = false; -function writeBigVarint(val, pbf) { - var low, high; - if (val >= 0) { - low = (val % 0x100000000) | 0; - high = (val / 0x100000000) | 0; - } else { - low = ~(-val % 0x100000000); - high = ~(-val / 0x100000000); + /** + * @type {Boolean} + */ + this.otherInOut = false; - if (low ^ 0xffffffff) { - low = (low + 1) | 0; - } else { - low = 0; - high = (high + 1) | 0; - } - } + /** + * Previous event in result? + * @type {SweepEvent} + */ + this.prevInResult = null; - if (val >= 0x10000000000000000 || val < -0x10000000000000000) { - throw new Error('Given varint doesn\'t fit into 10 bytes'); - } + /** + * Does event belong to result? + * @type {Boolean} + */ + this.inResult = false; - pbf.realloc(10); - writeBigVarintLow(low, high, pbf); - writeBigVarintHigh(high, pbf); -} + // connection step -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; -} + /** + * @type {Boolean} + */ + this.resultInOut = false; -function writeBigVarintHigh(high, pbf) { - var lsb = (high & 0x07) << 4; + this.isExteriorRing = 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.}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.}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); -} + SweepEvent.prototype.clone = function clone () { + var copy = new SweepEvent( + this.point, this.left, this.otherEvent, this.isSubject, this.type); -function readUtf8(buf, pos, end) { - var str = ''; - var i = pos; + copy.inResult = this.inResult; + copy.prevInResult = this.prevInResult; + copy.isExteriorRing = this.isExteriorRing; + copy.inOut = this.inOut; + copy.otherInOut = this.otherInOut; - while (i < end) { - var b0 = buf[i]; - var c = null; // codepoint - var bytesPerSequence = - b0 > 0xEF ? 4 : - b0 > 0xDF ? 3 : - b0 > 0xBF ? 2 : 1; + return copy; + }; - if (i + bytesPerSequence > end) break; + function equals(p1, p2) { + if (p1[0] === p2[0]) { + if (p1[1] === p2[1]) { + return true; + } else { + return false; + } + } + return false; + } - var b1, b2, b3; + // 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; + // }; - 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; - } - } - } + /** + * Signed area of the triangle (p0, p1, p2) + * @param {Array.} p0 + * @param {Array.} p1 + * @param {Array.} p2 + * @return {Number} + */ + function signedArea(p0, p1, p2) { + return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]); + } - if (c === null) { - c = 0xFFFD; - bytesPerSequence = 1; + /** + * @param {SweepEvent} e1 + * @param {SweepEvent} e2 + * @return {Number} + */ + function compareEvents(e1, e2) { + var p1 = e1.point; + var p2 = e2.point; - } else if (c > 0xFFFF) { - c -= 0x10000; - str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); - c = 0xDC00 | c & 0x3FF; - } + // Different x-coordinate + if (p1[0] > p2[0]) { return 1; } + if (p1[0] < p2[0]) { return -1; } - str += String.fromCharCode(c); - i += bytesPerSequence; + // 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; } + + return specialCases(e1, e2, p1, p2); + } + + + /* 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; } + + // 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; } - return str; -} + return (!e1.isSubject && e2.isSubject) ? 1 : -1; + } + /* eslint-enable no-unused-vars */ -function writeUtf8(buf, str, pos) { - for (var i = 0, c, lead; i < str.length; i++) { - c = str.charCodeAt(i); // code point + /** + * @param {SweepEvent} se + * @param {Array.} 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 (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; - } + /* eslint-disable no-console */ + if (equals(se.point, se.otherEvent.point)) { - 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; - } + console.warn('what is that, a collapsed segment?', se); } - return pos; -} + /* eslint-enable no-console */ -},{"ieee754":15}],23:[function(require,module,exports){ -'use strict'; + r.contourId = l.contourId = se.contourId; -module.exports = partialSort; + // 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; + } -// 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] + // avoid a rounding error. The left event would be processed after the right event + // if (compareEvents(se, r) > 0) {} -function partialSort(arr, k, left, right, compare) { - left = left || 0; - right = right || (arr.length - 1); - compare = compare || defaultCompare; + se.otherEvent.otherEvent = l; + se.otherEvent = r; - 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); - } + queue.push(l); + queue.push(r); - var t = arr[k]; - var i = left; - var j = right; + return queue; + } - swap(arr, left, k); - if (compare(arr[right], t) > 0) swap(arr, left, right); + //const EPS = 1e-9; - while (i < j) { - swap(arr, i, j); - i++; - j--; - while (compare(arr[i], t) < 0) i++; - while (compare(arr[j], t) > 0) j--; - } + /** + * 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 (compare(arr[left], t) === 0) swap(arr, left, j); - else { - j++; - swap(arr, j, right); - } + /** + * 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]); + } - if (j <= k) left = j + 1; - if (k <= j) right = j - 1; + /** + * 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.} a1 point of first line + * @param {Array.} a2 point of first line + * @param {Array.} b1 point of second line + * @param {Array.} b2 point of second line + * @param {Boolean=} noEndpointTouch whether to skip single touchpoints + * (meaning connected segments) as + * intersections + * @returns {Array.>|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)]; } -} -function swap(arr, i, j) { - var tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; -} + // 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; -function defaultCompare(a, b) { - return a < b ? -1 : a > b ? 1 : 0; -} + if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) { + // Lines are just parallel, not the same. No overlap. + return null; + } -},{}],24:[function(require,module,exports){ -'use strict'; + 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); -module.exports = rbush; + // this is, essentially, the FindIntersection acting on floats from + // Schneider & Eberly, just inlined into this function. + if (smin <= 1 && smax >= 0) { -var quickselect = require('quickselect'); + // overlap on an end point + if (smin === 1) { + return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)]; + } -function rbush(maxEntries, format) { - if (!(this instanceof rbush)) return new rbush(maxEntries, format); + if (smax === 0) { + return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)]; + } - // 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)); + if (noEndpointTouch && smin === 0 && smax === 1) { return null; } - if (format) { - this._initFormat(format); + // 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) + ]; } - this.clear(); -} + return null; + } -rbush.prototype = { + /** + * @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); + } - all: function () { - return this._all(this.data, []); - }, + // 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; + } - search: function (bbox) { + // The line segments associated to se1 and se2 overlap + var events = []; + var leftCoincide = false; + var rightCoincide = false; - var node = this.data, - result = [], - toBBox = this.toBBox; + if (equals(se1.point, se2.point)) { + leftCoincide = true; // linked + } else if (compareEvents(se1, se2) === 1) { + events.push(se2, se1); + } else { + events.push(se1, se2); + } - if (!intersects(bbox, node)) return result; + 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); + } - var nodesToSearch = [], - i, len, child, childBBox; + 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; - while (node) { - for (i = 0, len = node.children.length; i < len; i++) { + 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; + } - child = node.children[i]; - childBBox = node.leaf ? toBBox(child) : child; + // the line segments share the right endpoint + if (rightCoincide) { + divideSegment(events[0], events[1].point, queue); + return 3; + } - 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(); - } + // 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; + } - return result; - }, + // one line segment includes the other one + divideSegment(events[0], events[1].point, queue); + divideSegment(events[3].otherEvent, events[2].point, queue); - collides: function (bbox) { + return 3; + } - var node = this.data, - toBBox = this.toBBox; + /** + * @param {SweepEvent} le1 + * @param {SweepEvent} le2 + * @return {Number} + */ + function compareSegments(le1, le2) { + if (le1 === le2) { return 0; } - if (!intersects(bbox, node)) return false; + // Segments are not collinear + if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 || + signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) { - var nodesToSearch = [], - i, len, child, childBBox; + // 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; } - while (node) { - for (i = 0, len = node.children.length; i < len; i++) { + // 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; } - child = node.children[i]; - childBBox = node.leaf ? toBBox(child) : child; + // 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; } - if (intersects(bbox, childBBox)) { - if (node.leaf || contains(bbox, childBBox)) return true; - nodesToSearch.push(child); - } - } - node = nodesToSearch.pop(); - } + // 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; + } - return false; - }, + 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; + } - load: function (data) { - if (!(data && data.length)) return this; + return compareEvents(le1, le2) === 1 ? 1 : -1; + } - if (data.length < this._minEntries) { - for (var i = 0, len = data.length; i < len; i++) { - this.insert(data[i]); - } - return this; - } + function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) { + var sweepLine = new SplayTree(compareSegments); + var sortedEvents = []; - // recursively build the tree with the given data from stratch using OMT algorithm - var node = this._build(data.slice(), 0, data.length - 1, 0); + var rightbound = Math.min(sbbox[2], cbbox[2]); - if (!this.data.children.length) { - // save as is if tree is empty - this.data = node; + var prev, next, begin; - } else if (this.data.height === node.height) { - // split root if trees have the same height - this._splitRoot(this.data, node); + while (eventQueue.length !== 0) { + var event = eventQueue.pop(); + sortedEvents.push(event); - } else { - if (this.data.height < node.height) { - // swap trees if inserted one is bigger - var tmpNode = this.data; - this.data = node; - node = tmpNode; - } + // optimization by bboxes for intersection and difference goes here + if ((operation === INTERSECTION && event.point[0] > rightbound) || + (operation === DIFFERENCE && event.point[0] > sbbox[2])) { + break; + } - // insert the small tree into the large tree at appropriate level - this._insert(node, this.data.height - node.height - 1, true); + if (event.left) { + next = prev = sweepLine.insert(event); + begin = sweepLine.minNode(); + + if (prev !== begin) { prev = sweepLine.prev(prev); } + else { prev = null; } + + next = sweepLine.next(next); + + 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); + } } - return this; - }, + if (prev) { + if (possibleIntersection(prev.key, event, eventQueue) === 2) { + var prevprev = prev; + if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); } + else { prevprev = null; } - insert: function (item) { - if (item) this._insert(item, this.data.height - 1); - return this; - }, + prevprevEvent = prevprev ? prevprev.key : null; + computeFields(prevEvent, prevprevEvent, operation); + computeFields(event, prevEvent, operation); + } + } + } else { + event = event.otherEvent; + next = prev = sweepLine.find(event); - clear: function () { - this.data = createNode([]); - return this; - }, + if (prev && next) { - remove: function (item, equalsFn) { - if (!item) return this; + if (prev !== begin) { prev = sweepLine.prev(prev); } + else { prev = null; } - var node = this.data, - bbox = this.toBBox(item), - path = [], - indexes = [], - i, parent, index, goingUp; + next = sweepLine.next(next); + sweepLine.remove(event); - // depth-first iterative tree traversal - while (node || path.length) { + if (next && prev) { + possibleIntersection(prev.key, next.key, eventQueue); + } + } + } + } + return sortedEvents; + } - if (!node) { // go up - node = path.pop(); - parent = path[path.length - 1]; - i = indexes.pop(); - goingUp = true; - } + /** + * @param {Array.} sortedEvents + * @return {Array.} + */ + 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; + } + } + } - if (node.leaf) { // check current node - index = findItem(item, node.children, equalsFn); - 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; - } - } + for (i = 0, len = resultEvents.length; i < len; i++) { + event = resultEvents[i]; + event.pos = i; + } - if (!goingUp && !node.leaf && contains(node, bbox)) { // go down - path.push(node); - indexes.push(i); - i = 0; - parent = node; - node = node.children[0]; + // 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.pos; + event.pos = event.otherEvent.pos; + event.otherEvent.pos = tmp; + } + } - } else if (parent) { // go right - i++; - node = parent.children[i]; - goingUp = false; + return resultEvents; + } - } else node = null; // nothing found - } - return this; - }, + /** + * @param {Number} pos + * @param {Array.} resultEvents + * @param {Object>} processed + * @return {Number} + */ + function nextPos(pos, resultEvents, processed, origIndex) { + var p, p1; + var newPos = pos + 1; + var length = resultEvents.length; - toBBox: function (item) { return item; }, + p = resultEvents[pos].point; - compareMinX: compareNodeMinX, - compareMinY: compareNodeMinY, + if (newPos < length) + { p1 = resultEvents[newPos].point; } - toJSON: function () { return this.data; }, - fromJSON: function (data) { - this.data = data; - return this; - }, + // while in range and not the current one by value + while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) { + if (!processed[newPos]) { + return newPos; + } else { + newPos++; + } + p1 = resultEvents[newPos].point; + } - _all: function (node, result) { - var nodesToSearch = []; - while (node) { - if (node.leaf) result.push.apply(result, node.children); - else nodesToSearch.push.apply(nodesToSearch, node.children); + newPos = pos - 1; - node = nodesToSearch.pop(); - } - return result; - }, + while (processed[newPos] && newPos >= origIndex) { + newPos--; + } + return newPos; + } - _build: function (items, left, right, height) { - var N = right - left + 1, - M = this._maxEntries, - node; + /** + * @param {Array.} sortedEvents + * @return {Array.<*>} polygons + */ + function connectEdges(sortedEvents, operation) { + var i, len; + var resultEvents = orderEvents(sortedEvents); - if (N <= M) { - // reached leaf level; return leaf - node = createNode(items.slice(left, right + 1)); - calcBBox(node, this.toBBox); - return node; - } + // "false"-filled array + var processed = {}; + var result = []; + var event; - if (!height) { - // target height of the bulk-loaded tree - height = Math.ceil(Math.log(N) / Math.log(M)); + for (i = 0, len = resultEvents.length; i < len; i++) { + if (processed[i]) { continue; } + var contour = [[]]; - // target number of root entries to maximize storage utilization - M = Math.ceil(N / Math.pow(M, height - 1)); + if (!resultEvents[i].isExteriorRing) { + if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) { + result.push(contour); + } else if (result.length === 0) { + result.push([[contour]]); + } else { + result[result.length - 1].push(contour[0]); } + } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) { + result[result.length - 1].push(contour[0]); + } else { + result.push(contour); + } - node = createNode([]); - node.leaf = false; - node.height = height; + var ringId = result.length - 1; + var pos = i; - // split the items into M mostly square tiles + var initial = resultEvents[i].point; + contour[0].push(initial); - var N2 = Math.ceil(N / M), - N1 = N2 * Math.ceil(Math.sqrt(M)), - i, j, right2, right3; + while (pos >= i) { + event = resultEvents[pos]; + processed[pos] = true; - multiSelect(items, left, right, N1, this.compareMinX); + if (event.left) { + event.resultInOut = false; + event.contourId = ringId; + } else { + event.otherEvent.resultInOut = true; + event.otherEvent.contourId = ringId; + } - for (i = left; i <= right; i += N1) { + pos = event.pos; + processed[pos] = true; + contour[0].push(resultEvents[pos].point); + pos = nextPos(pos, resultEvents, processed, i); + } - right2 = Math.min(i + N1 - 1, right); + pos = pos === -1 ? i : pos; - multiSelect(items, i, right2, N2, this.compareMinY); + event = resultEvents[pos]; + processed[pos] = processed[event.pos] = true; + event.otherEvent.resultInOut = true; + event.otherEvent.contourId = ringId; + } - for (j = i; j <= right2; j += N2) { + // Handle if the result is a polygon (eg not multipoly) + // Commented it again, let's see what do we mean by that + // if (result.length === 1) result = result[0]; + return result; + } - right3 = Math.min(j + N2 - 1, right2); + var tinyqueue = TinyQueue; + var default_1 = TinyQueue; - // pack each entry recursively - node.children.push(this._build(items, j, right3, height - 1)); - } - } + function TinyQueue(data, compare) { + var this$1 = this; - calcBBox(node, this.toBBox); + if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); } - return node; - }, + this.data = data || []; + this.length = this.data.length; + this.compare = compare || defaultCompare; - _chooseSubtree: function (bbox, node, level, path) { + if (this.length > 0) { + for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); } + } + } - var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; + function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; + } - while (true) { - path.push(node); + TinyQueue.prototype = { - if (node.leaf || path.length - 1 === level) break; + push: function (item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + }, - minArea = minEnlargement = Infinity; + pop: function () { + if (this.length === 0) { return undefined; } - for (i = 0, len = node.children.length; i < len; i++) { - child = node.children[i]; - area = bboxArea(child); - enlargement = enlargedArea(bbox, child) - area; + var top = this.data[0]; + this.length--; - // choose entry with the least area enlargement - if (enlargement < minEnlargement) { - minEnlargement = enlargement; - minArea = area < minArea ? area : minArea; - targetNode = child; + 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; + } - } else if (enlargement === minEnlargement) { - // otherwise choose one with the smallest area - if (area < minArea) { - minArea = area; - targetNode = child; - } - } - } + data[pos] = item; + }, - node = targetNode || node.children[0]; - } + _down: function (pos) { + var this$1 = this; - return node; - }, + var data = this.data; + var compare = this.compare; + var halfLength = this.length >> 1; + var item = data[pos]; - _insert: function (item, level, isNode) { + while (pos < halfLength) { + var left = (pos << 1) + 1; + var right = left + 1; + var best = data[left]; - var toBBox = this.toBBox, - bbox = isNode ? item : toBBox(item), - insertPath = []; + if (right < this$1.length && compare(data[right], best) < 0) { + left = right; + best = data[right]; + } + if (compare(best, item) >= 0) { break; } - // find the best node for accommodating the item, saving all nodes along the path too - var node = this._chooseSubtree(bbox, this.data, level, insertPath); + data[pos] = best; + pos = left; + } - // put the item into the node - node.children.push(item); - extend(node, bbox); + data[pos] = item; + } + }; + tinyqueue.default = default_1; - // 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; - } + var max = Math.max; + var min = Math.min; - // adjust bboxes along the insertion path - this._adjustParentBBoxes(bbox, insertPath, level); - }, + var contourId = 0; - // split overflowed node into two - _split: function (insertPath, level) { - var node = insertPath[level], - M = node.children.length, - m = this._minEntries; + 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; - this._chooseSplitAxis(node, m, M); + if (s1[0] === s2[0] && s1[1] === s2[1]) { + continue; // skip collapsed edges, or it breaks + } - var splitIndex = this._chooseSplitIndex(node, m, M); + 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 newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); - newNode.height = node.height; - newNode.leaf = node.leaf; + 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); - calcBBox(node, this.toBBox); - calcBBox(newNode, this.toBBox); + // 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); + } + } - if (level) insertPath[level - 1].children.push(newNode); - else this._splitRoot(node, newNode); - }, - _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); - }, + function fillQueue(subject, clipping, sbbox, cbbox, operation) { + var eventQueue = new tinyqueue(null, compareEvents); + var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk; - _chooseSplitIndex: function (node, m, M) { + 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); + } + } - var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + 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); + } + } - minOverlap = minArea = Infinity; + return eventQueue; + } - for (i = m; i <= M - m; i++) { - bbox1 = distBBox(node, 0, i, this.toBBox); - bbox2 = distBBox(node, i, M, this.toBBox); + var EMPTY = []; - overlap = intersectionArea(bbox1, bbox2); - area = bboxArea(bbox1) + bboxArea(bbox2); - // choose distribution with minimum overlap - if (overlap < minOverlap) { - minOverlap = overlap; - index = 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 result; + } - minArea = area < minArea ? area : minArea; - } else if (overlap === minOverlap) { - // otherwise choose distribution with minimum area - if (area < minArea) { - minArea = area; - index = i; - } - } - } + 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; + } - return index; - }, - // sorts node children by the best axis for split - _chooseSplitAxis: function (node, m, M) { + 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]; - 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); + //console.time('fill queue'); + var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation); + //console.timeEnd('fill queue'); - // 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); - }, + 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'); - // total margin of all possible split distributions where each node is at least m full - _allDistMargin: function (node, m, M, compare) { + //console.time('connect vertices'); + var result = connectEdges(sortedEvents, operation); + //console.timeEnd('connect vertices'); + return result; + } - node.children.sort(compare); + function union (subject, clipping) { + return boolean(subject, clipping, UNION); + } - var toBBox = this.toBBox, - leftBBox = distBBox(node, 0, m, toBBox), - rightBBox = distBBox(node, M - m, M, toBBox), - margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), - i, child; + function diff (subject, clipping) { + return boolean(subject, clipping, DIFFERENCE); + } - for (i = m; i < M - m; i++) { - child = node.children[i]; - extend(leftBBox, node.leaf ? toBBox(child) : child); - margin += bboxMargin(leftBBox); - } + function xor (subject, clipping){ + return boolean(subject, clipping, XOR); + } - for (i = M - m - 1; i >= m; i--) { - child = node.children[i]; - extend(rightBBox, node.leaf ? toBBox(child) : child); - margin += bboxMargin(rightBBox); - } + function intersection$1 (subject, clipping) { + return boolean(subject, clipping, INTERSECTION); + } - return margin; - }, + /** + * @enum {Number} + */ + var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR }; - _adjustParentBBoxes: function (bbox, path, level) { - // adjust bboxes along the given tree path - for (var i = level; i >= 0; i--) { - extend(path[i], bbox); - } - }, + exports.union = union; + exports.diff = diff; + exports.xor = xor; + exports.intersection = intersection$1; + exports.operations = operations; - _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); + Object.defineProperty(exports, '__esModule', { value: true }); - } else this.clear(); +}))); - } else calcBBox(path[i], this.toBBox); - } - }, - _initFormat: function (format) { - // data format (minX, minY, maxX, maxY accessors) +},{}],23:[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. - // 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 +// 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 compareArr = ['return a', ' - b', ';']; + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } - this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); - this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); + return parts; +} - this.toBBox = new Function('a', - 'return {minX: a' + format[0] + - ', minY: a' + format[1] + - ', maxX: a' + format[2] + - ', maxY: a' + format[3] + '};'); - } +// 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); }; -function findItem(item, items, equalsFn) { - if (!equalsFn) return items.indexOf(item); +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; - for (var i = 0; i < items.length; i++) { - if (equalsFn(item, items[i])) return i; - } - return -1; -} + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); -// calculate node's bbox from bboxes of its children -function calcBBox(node, toBBox) { - distBBox(node, 0, node.children.length, toBBox, node); -} + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } -// 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; + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } - for (var i = k, child; i < p; i++) { - child = node.children[i]; - extend(destNode, node.leaf ? toBBox(child) : child); - } + // 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) - return destNode; -} + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); -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; -} + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; -function compareNodeMinX(a, b) { return a.minX - b.minX; } -function compareNodeMinY(a, b) { return a.minY - b.minY; } +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; -function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); } -function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); } + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); -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)); -} + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } -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); + return (isAbsolute ? '/' : '') + path; +}; - return Math.max(0, maxX - minX) * - Math.max(0, maxY - minY); -} +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; -function contains(a, b) { - return a.minX <= b.minX && - a.minY <= b.minY && - b.maxX <= a.maxX && - b.maxY <= a.maxY; -} - -function intersects(a, b) { - return b.minX <= a.maxX && - b.minY <= a.maxY && - b.maxX >= a.minX && - b.maxY >= a.minY; -} +// 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('/')); +}; -function createNode(children) { - return { - children: children, - height: 1, - leaf: true, - minX: Infinity, - minY: Infinity, - maxX: -Infinity, - maxY: -Infinity - }; -} -// 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 +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); -function multiSelect(arr, left, right, n, compare) { - var stack = [left, right], - mid; + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } - while (stack.length) { - right = stack.pop(); - left = stack.pop(); + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } - if (right - left <= n) continue; + if (start > end) return []; + return arr.slice(start, end - start + 1); + } - mid = left + Math.ceil((right - left) / n / 2) * n; - quickselect(arr, mid, left, right, compare); + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); - stack.push(left, mid, mid, right); + 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; } -} + } -},{"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 outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); }; -var Subject_1 = require('./Subject'); -var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError'); -/** - * @class BehaviorSubject - */ -var BehaviorSubject = (function (_super) { - __extends(BehaviorSubject, _super); - function BehaviorSubject(_value) { - _super.call(this); - this._value = _value; - } - 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; -},{"./Subject":33,"./util/ObjectUnsubscribedError":153}],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 __()); +exports.sep = '/'; +exports.delimiter = ':'; + +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 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; + + +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; +}; + + +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]); } - 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; + return res; +} -},{"./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 - */ -var Notification = (function () { - function Notification(kind, value, error) { - this.kind = kind; - this.value = value; - this.error = error; - this.hasValue = kind === 'N'; +// 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); } - /** - * 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.error); - case 'C': - return observer.complete && observer.complete(); +; + +}).call(this,require('_process')) + +},{"_process":6}],24:[function(require,module,exports){ +'use strict'; + +module.exports = Pbf; + +var ieee754 = require('ieee754'); + +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; +} + +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 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; + +Pbf.prototype = { + + destroy: function() { + this.buf = null; + }, + + // === READING ================================================================= + + readFields: function(readField, result, end) { + end = end || this.length; + + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; + + this.type = val & 0x7; + readField(tag, result, this); + + if (this.pos === startPos) this.skip(val); } - }; - /** - * 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.error); - 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.error); - 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} 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` error. - * @return {Notification} 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} 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; + return result; + }, -},{"./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. - * - * @class Observable - */ -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; - }; - 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.source); - } - 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; + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, -},{"./symbol/observable":148,"./util/root":163,"./util/toSubscriber":165}],29:[function(require,module,exports){ -"use strict"; -exports.empty = { - closed: true, - next: function (value) { }, - error: function (err) { throw err; }, - complete: function () { } -}; + readFixed32: function() { + var val = readUInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, -},{}],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; + readSFixed32: function() { + var val = readInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, -},{"./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 Subscription_1 = require('./Subscription'); -var observeOn_1 = require('./operator/observeOn'); -var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError'); -var SubjectSubscription_1 = require('./SubjectSubscription'); -/** - * @class ReplaySubject - */ -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; - var subscription; - if (this.closed) { - throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError(); - } - else if (this.hasError) { - subscription = Subscription_1.Subscription.EMPTY; - } - else if (this.isStopped) { - 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)); - } - var len = _events.length; - 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; - // 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; -}()); + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) -},{"./Subject":33,"./SubjectSubscription":34,"./Subscription":36,"./operator/observeOn":123,"./scheduler/queue":146,"./util/ObjectUnsubscribedError":153}],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. - * - * Each unit of work in a Scheduler is called an {@link Action}. - * - * ```ts - * class Scheduler { - * now(): number; - * schedule(work, delay?, state?): Subscription; - * } - * ``` - * - * @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; + readFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, -},{}],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 - */ -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; -/** - * @class Subject - */ -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; - } - 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; -/** - * @class AnonymousSubject - */ -var AnonymousSubject = (function (_super) { - __extends(AnonymousSubject, _super); - function AnonymousSubject(destination, source) { - _super.call(this); - this.destination = destination; - this.source = source; - } - 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; + readSFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, -},{"./Observable":28,"./SubjectSubscription":34,"./Subscriber":35,"./Subscription":36,"./symbol/rxSubscriber":149,"./util/ObjectUnsubscribedError":153}],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 __()); -}; -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; + readFloat: function() { + var val = ieee754.read(this.buf, this.pos, true, 23, 4); + this.pos += 4; + return val; + }, -},{"./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 __()); -}; -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 - */ -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} 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":149,"./util/isFunction":159}],36:[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 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. - * - * 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. - * - * @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 || (errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError ? - flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors) : [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(flattenUnsubscriptionErrors(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') { - return sub; - } - else if (this.closed) { - sub.unsubscribe(); - return sub; - } - break; - default: - throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); - } - var childSub = new ChildSubscription(sub, this); - this._subscriptions = this._subscriptions || []; - this._subscriptions.push(childSub); - return childSub; - }; - /** - * 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; -var ChildSubscription = (function (_super) { - __extends(ChildSubscription, _super); - function ChildSubscription(_innerSub, _parent) { - _super.call(this); - this._innerSub = _innerSub; - this._parent = _parent; - } - ChildSubscription.prototype._unsubscribe = function () { - var _a = this, _innerSub = _a._innerSub, _parent = _a._parent; - _parent.remove(this); - _innerSub.unsubscribe(); - }; - return ChildSubscription; -}(Subscription)); -exports.ChildSubscription = ChildSubscription; -function flattenUnsubscriptionErrors(errors) { - return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []); -} - -},{"./util/UnsubscriptionError":155,"./util/errorObject":156,"./util/isArray":157,"./util/isFunction":159,"./util/isObject":160,"./util/tryCatch":166}],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; - -},{"../../Observable":28,"../../observable/combineLatest":93}],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; + readDouble: function() { + var val = ieee754.read(this.buf, this.pos, true, 52, 8); + this.pos += 8; + return val; + }, -},{"../../Observable":28,"../../observable/defer":94}],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; + readVarint: function(isSigned) { + var buf = this.buf, + val, b; -},{"../../Observable":28,"../../observable/empty":95}],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; + 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; -},{"../../Observable":28,"../../observable/from":96}],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; + return readVarintRemainder(val, isSigned, this); + }, -},{"../../Observable":28,"../../observable/fromEvent":97}],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; + readVarint64: function() { // for compatibility with v2.0.1 + return this.readVarint(true); + }, -},{"../../Observable":28,"../../observable/fromPromise":98}],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; + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, -},{"../../Observable":28,"../../observable/merge":99}],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; + readBoolean: function() { + return Boolean(this.readVarint()); + }, -},{"../../Observable":28,"../../observable/of":100}],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; + readString: function() { + var end = this.readVarint() + this.pos, + str = readUtf8(this.buf, this.pos, end); + this.pos = end; + return str; + }, -},{"../../Observable":28,"../../observable/throw":101}],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; + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, -},{"../../Observable":28,"../../observable/zip":102}],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; + // verbose for performance reasons; doesn't affect gzipped size -},{"../../Observable":28,"../../operator/buffer":103}],48:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var bufferCount_1 = require('../../operator/bufferCount'); -Observable_1.Observable.prototype.bufferCount = bufferCount_1.bufferCount; + 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; + }, -},{"../../Observable":28,"../../operator/bufferCount":104}],49:[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; + 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); + }, -},{"../../Observable":28,"../../operator/catch":105}],50:[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; + // === WRITING ================================================================= -},{"../../Observable":28,"../../operator/combineLatest":106}],51:[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; + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, -},{"../../Observable":28,"../../operator/concat":107}],52:[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; + realloc: function(min) { + var length = this.length || 16; -},{"../../Observable":28,"../../operator/debounceTime":108}],53:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var delay_1 = require('../../operator/delay'); -Observable_1.Observable.prototype.delay = delay_1.delay; + while (length < this.pos + min) length *= 2; -},{"../../Observable":28,"../../operator/delay":109}],54:[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 (length !== this.length) { + var buf = new Uint8Array(length); + buf.set(this.buf); + this.buf = buf; + this.length = length; + } + }, -},{"../../Observable":28,"../../operator/distinct":110}],55:[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; + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.subarray(0, this.length); + }, -},{"../../Observable":28,"../../operator/distinctUntilChanged":111}],56:[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; + writeFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, -},{"../../Observable":28,"../../operator/do":112}],57:[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; + writeSFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, -},{"../../Observable":28,"../../operator/expand":113}],58:[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; + 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; + }, -},{"../../Observable":28,"../../operator/filter":114}],59:[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; + 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; + }, -},{"../../Observable":28,"../../operator/finally":115}],60:[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; + writeVarint: function(val) { + val = +val || 0; -},{"../../Observable":28,"../../operator/first":116}],61:[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; + if (val > 0xfffffff || val < 0) { + writeBigVarint(val, this); + return; + } -},{"../../Observable":28,"../../operator/last":117}],62:[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; + this.realloc(4); -},{"../../Observable":28,"../../operator/map":118}],63:[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; + 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; + }, -},{"../../Observable":28,"../../operator/merge":119}],64:[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; + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, -},{"../../Observable":28,"../../operator/mergeAll":120}],65:[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; + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, -},{"../../Observable":28,"../../operator/mergeMap":121}],66:[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; + writeString: function(str) { + str = String(str); + this.realloc(str.length * 4); -},{"../../Observable":28,"../../operator/pairwise":124}],67:[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; + this.pos++; // reserve 1 byte for short string length -},{"../../Observable":28,"../../operator/pluck":125}],68:[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; + 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; -},{"../../Observable":28,"../../operator/publish":126}],69:[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; + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); -},{"../../Observable":28,"../../operator/publishReplay":127}],70:[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; + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, -},{"../../Observable":28,"../../operator/scan":128}],71:[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; + writeFloat: function(val) { + this.realloc(4); + ieee754.write(this.buf, val, this.pos, true, 23, 4); + this.pos += 4; + }, -},{"../../Observable":28,"../../operator/share":129}],72:[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; + writeDouble: function(val) { + this.realloc(8); + ieee754.write(this.buf, val, this.pos, true, 52, 8); + this.pos += 8; + }, -},{"../../Observable":28,"../../operator/skip":130}],73:[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; + 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]; + }, -},{"../../Observable":28,"../../operator/skipUntil":131}],74:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var skipWhile_1 = require('../../operator/skipWhile'); -Observable_1.Observable.prototype.skipWhile = skipWhile_1.skipWhile; + writeRawMessage: function(fn, obj) { + this.pos++; // reserve 1 byte for short message length -},{"../../Observable":28,"../../operator/skipWhile":132}],75:[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; + // 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; -},{"../../Observable":28,"../../operator/startWith":133}],76:[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; + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); -},{"../../Observable":28,"../../operator/switchMap":134}],77:[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; + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, -},{"../../Observable":28,"../../operator/take":135}],78:[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; + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, -},{"../../Observable":28,"../../operator/takeUntil":136}],79:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var throttleTime_1 = require('../../operator/throttleTime'); -Observable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime; + 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); }, -},{"../../Observable":28,"../../operator/throttleTime":137}],80:[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; + 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)); + } +}; -},{"../../Observable":28,"../../operator/withLatestFrom":138}],81:[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; +function readVarintRemainder(l, s, p) { + var buf = p.buf, + h, b; -},{"../../Observable":28,"../../operator/zip":139}],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 __()); -}; -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]; - } + 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); + + throw new Error('Expected varint not more than 10 bytes'); +} + +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); } - 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; + + return ((high >>> 0) * 0x100000000) + (low >>> 0); +} + +function writeBigVarint(val, pbf) { + var low, high; + + if (val >= 0) { + low = (val % 0x100000000) | 0; + high = (val / 0x100000000) | 0; + } else { + low = ~(-val % 0x100000000); + high = ~(-val / 0x100000000); + + if (low ^ 0xffffffff) { + low = (low + 1) | 0; + } else { + low = 0; + high = (high + 1) | 0; } - if (index >= length) { - subscriber.complete(); - return; + } + + if (val >= 0x10000000000000000 || val < -0x10000000000000000) { + throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + + pbf.realloc(10); + + writeBigVarintLow(low, high, pbf); + writeBigVarintHigh(high, pbf); +} + +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; +} + +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 0x07) << 4; + + 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)); + + // 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]); } + +// 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); +} + +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); +} + +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; + + if (i + bytesPerSequence > end) break; + + var b1, b2, b3; + + 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; + } + } } - 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 - }); + + if (c === null) { + c = 0xFFFD; + bytesPerSequence = 1; + + } else if (c > 0xFFFF) { + c -= 0x10000; + str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); + c = 0xDC00 | c & 0x3FF; } - else { - for (var i = 0; i < length && !subscriber.closed; i++) { - subscriber.next(arrayLike[i]); + + str += String.fromCharCode(c); + i += bytesPerSequence; + } + + return str; +} + +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); // code point + + 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; } - subscriber.complete(); + } else if (lead) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = null; } - }; - return ArrayLikeObservable; -}(Observable_1.Observable)); -exports.ArrayLikeObservable = ArrayLikeObservable; -},{"../Observable":28,"./EmptyObservable":86,"./ScalarObservable":92}],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 __()); -}; -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]; + 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; } } - 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. - * - * Emits the arguments you provide, then completes. - * - * - * - * - * 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` IScheduler, which means the `next` - * notifications are sent synchronously, although with a different IScheduler - * it is possible to determine when those notifications will be delivered. - * - * @example Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second. - * 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 IScheduler} to use for scheduling - * the emissions of the `next` notifications. - * @return {Observable} 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; + return pos; +} + +},{"ieee754":17}],25:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.quickselect = factory()); +}(this, (function () { 'use strict'; + +function quickselect(arr, k, left, right, compare) { + quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); +} + +function quickselectStep(arr, k, left, right, compare) { + + 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)); + quickselectStep(arr, k, newLeft, newRight, compare); } - 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 - }); + + var t = arr[k]; + var i = left; + var j = right; + + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); + + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) i++; + while (compare(arr[j], t) > 0) j--; } + + if (compare(arr[left], t) === 0) swap(arr, left, j); else { - for (var i = 0; i < count && !subscriber.closed; i++) { - subscriber.next(array[i]); - } - subscriber.complete(); + j++; + swap(arr, j, right); } - }; - return ArrayObservable; -}(Observable_1.Observable)); -exports.ArrayObservable = ArrayObservable; -},{"../Observable":28,"../util/isScheduler":162,"./EmptyObservable":86,"./ScalarObservable":92}],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 Subject_1 = require('../Subject'); -var Observable_1 = require('../Observable'); -var Subscriber_1 = require('../Subscriber'); -var Subscription_1 = require('../Subscription'); -/** - * @class ConnectableObservable - */ -var ConnectableObservable = (function (_super) { - __extends(ConnectableObservable, _super); - function ConnectableObservable(source, subjectFactory) { - _super.call(this); - this.source = source; - this.subjectFactory = subjectFactory; - this._refCount = 0; + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; } - 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(); +} + +function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +return quickselect; + +}))); + +},{}],26:[function(require,module,exports){ +'use strict'; + +module.exports = rbush; +module.exports.default = rbush; + +var quickselect = require('quickselect'); + +function rbush(maxEntries, format) { + if (!(this instanceof rbush)) return new rbush(maxEntries, format); + + // 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)); + + if (format) { + this._initFormat(format); + } + + this.clear(); +} + +rbush.prototype = { + + all: function () { + return this._all(this.data, []); + }, + + search: function (bbox) { + + var node = this.data, + result = [], + toBBox = this.toBBox; + + if (!intersects(bbox, node)) return result; + + var nodesToSearch = [], + i, len, child, childBBox; + + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child; + + 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(); } - 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; + + return result; + }, + + collides: function (bbox) { + + var node = this.data, + toBBox = this.toBBox; + + if (!intersects(bbox, node)) return false; + + var nodesToSearch = [], + i, len, child, childBBox; + + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child; + + if (intersects(bbox, childBBox)) { + if (node.leaf || contains(bbox, childBBox)) return true; + nodesToSearch.push(child); + } } - else { - this._connection = connection; + node = nodesToSearch.pop(); + } + + return false; + }, + + load: function (data) { + if (!(data && data.length)) return this; + + if (data.length < this._minEntries) { + for (var i = 0, len = data.length; i < len; i++) { + this.insert(data[i]); } + return this; } - return connection; - }; - ConnectableObservable.prototype.refCount = function () { - return this.lift(new RefCountOperator(this)); - }; - return ConnectableObservable; -}(Observable_1.Observable)); -exports.ConnectableObservable = ConnectableObservable; -exports.connectableObservableDescriptor = { - operator: { value: null }, - _refCount: { value: 0, writable: true }, - _subscribe: { value: ConnectableObservable.prototype._subscribe }, - getSubject: { value: ConnectableObservable.prototype.getSubject }, - connect: { value: ConnectableObservable.prototype.connect }, - refCount: { value: ConnectableObservable.prototype.refCount } -}; -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(); + + // recursively build the tree with the given data from scratch using OMT algorithm + var node = this._build(data.slice(), 0, data.length - 1, 0); + + if (!this.data.children.length) { + // save as is if tree is empty + this.data = node; + + } else if (this.data.height === node.height) { + // split root if trees have the same height + this._splitRoot(this.data, node); + + } else { + if (this.data.height < node.height) { + // swap trees if inserted one is bigger + var tmpNode = this.data; + this.data = node; + node = tmpNode; } + + // insert the small tree into the large tree at appropriate level + this._insert(node, this.data.height - node.height - 1, true); } - }; - return ConnectableSubscriber; -}(Subject_1.SubjectSubscriber)); -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) { - _super.call(this, destination); - this.connectable = connectable; - } - 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 downstream 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}],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 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. - * - * Creates the Observable lazily, that is, only when it - * is subscribed. - * - * - * - * - * `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 Subscribe to either an Observable of clicks or an Observable of interval, at random - * 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)); - * - * // Results in the following behavior: - * // If the result of Math.random() is greater than 0.5 it will listen - * // for clicks anywhere on the "document"; when document is clicked it - * // will log a MouseEvent object to the console. If the result is less - * // than 0.5 it will emit ascending numbers, one every second(1000ms). - * - * @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)); + return this; + }, -},{"../Observable":28,"../OuterSubscriber":30,"../util/subscribeToResult":164}],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 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. - * - * Just emits 'complete', and nothing else. - * - * - * - * - * 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 Emit the number 7, then complete. - * var result = Rx.Observable.empty().startWith(7); - * result.subscribe(x => console.log(x)); - * - * @example Map and flatten only odd numbers to the sequence 'a', 'b', 'c' - * 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)); - * - * // Results in the following to the console: - * // x is equal to the count on the interval eg(0,1,2,3,...) - * // x will occur every 1000ms - * // if x % 2 is equal to 1 print abc - * // if x % 2 is not equal to 1 nothing will be output - * - * @see {@link create} - * @see {@link never} - * @see {@link of} - * @see {@link throw} - * - * @param {Scheduler} [scheduler] A {@link IScheduler} 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; + insert: function (item) { + if (item) this._insert(item, this.data.height - 1); + return this; + }, -},{"../Observable":28}],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'); -/** - * We need this JSDoc comment for affecting ESDoc. - * @extends {Ignored} - * @hide true - */ -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. - * - * Just emits 'error', and nothing else. - * - * - * - * - * 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 Emit the number 7, then emit an error. - * var result = Rx.Observable.throw(new Error('oops!')).startWith(7); - * result.subscribe(x => console.log(x), e => console.error(e)); - * - * @example Map and flattens numbers to the sequence 'a', 'b', 'c', but throw an error for 13 - * 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 IScheduler} 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; + clear: function () { + this.data = createNode([]); + return this; + }, -},{"../Observable":28}],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 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'); -var toString = Object.prototype.toString; -function isNodeStyleEventEmmitter(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 isNodeList(sourceObj) { - return !!sourceObj && toString.call(sourceObj) === '[object NodeList]'; -} -function isHTMLCollection(sourceObj) { - return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]'; -} -function isEventTarget(sourceObj) { - return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; -} -/** - * We need this JSDoc comment for affecting ESDoc. - * @extends {Ignored} - * @hide true - */ -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. - * - * Creates an Observable from DOM events, or Node - * EventEmitter events or others. - * - * - * - * 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 Emits clicks happening on the DOM document - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * clicks.subscribe(x => console.log(x)); - * - * // Results in: - * // MouseEvent object logged to console everytime a click - * // occurs on the document. - * - * @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`. - * @param {EventListenerOptions} [options] Options to pass through to addEventListener - * @param {SelectorMethodSignature} [selector] An optional function to - * post-process results. It takes the arguments from the event handler and - * should return a single value. - * @return {Observable} - * @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); }; - } - else { - throw new TypeError('Invalid event target'); - } - 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); + remove: function (item, equalsFn) { + if (!item) return this; + + var node = this.data, + bbox = this.toBBox(item), + path = [], + indexes = [], + i, parent, index, goingUp; + + // depth-first iterative tree traversal + while (node || path.length) { + + if (!node) { // go up + node = path.pop(); + parent = path[path.length - 1]; + i = indexes.pop(); + goingUp = true; } - } : function (e) { return subscriber.next(e); }; - FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options); - }; - return FromEventObservable; -}(Observable_1.Observable)); -exports.FromEventObservable = FromEventObservable; -},{"../Observable":28,"../Subscription":36,"../util/errorObject":156,"../util/isFunction":159,"../util/tryCatch":166}],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 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 - */ -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. - * - * Converts almost anything to an Observable. - * - * - * - * 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 Converts an array to an Observable - * var array = [10, 20, 30]; - * var result = Rx.Observable.from(array); - * result.subscribe(x => console.log(x)); - * - * // Results in the following: - * // 10 20 30 - * - * @example Convert an infinite iterable (from a generator) to an Observable - * 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)); - * - * // Results in the following: - * // 3 6 12 24 48 96 192 384 768 1536 - * - * @see {@link create} - * @see {@link fromEvent} - * @see {@link fromEventPattern} - * @see {@link fromPromise} - * - * @param {ObservableInput} 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} 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; + if (node.leaf) { // check current node + index = findItem(item, node.children, equalsFn); + + 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; } - 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); + + if (!goingUp && !node.leaf && contains(node, bbox)) { // go down + path.push(node); + indexes.push(i); + i = 0; + parent = node; + node = node.children[0]; + + } else if (parent) { // go right + i++; + node = parent.children[i]; + goingUp = false; + + } else node = null; // nothing found } - else { - return ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0)); + + return this; + }, + + toBBox: function (item) { return item; }, + + compareMinX: compareNodeMinX, + compareMinY: compareNodeMinY, + + toJSON: function () { return this.data; }, + + fromJSON: function (data) { + this.data = data; + return this; + }, + + _all: function (node, result) { + var nodesToSearch = []; + while (node) { + if (node.leaf) result.push.apply(result, node.children); + else nodesToSearch.push.apply(nodesToSearch, node.children); + + node = nodesToSearch.pop(); } - }; - return FromObservable; -}(Observable_1.Observable)); -exports.FromObservable = FromObservable; + return result; + }, -},{"../Observable":28,"../operator/observeOn":123,"../symbol/iterator":147,"../symbol/observable":148,"../util/isArray":157,"../util/isPromise":161,"./ArrayLikeObservable":82,"./ArrayObservable":83,"./IteratorObservable":90,"./PromiseObservable":91}],90:[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 - */ -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.'); + _build: function (items, left, right, height) { + + var N = right - left + 1, + M = this._maxEntries, + node; + + if (N <= M) { + // reached leaf level; return leaf + node = createNode(items.slice(left, right + 1)); + calcBBox(node, this.toBBox); + return node; } - this.iterator = getIterator(iterator); - } - 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; + + if (!height) { + // target height of the bulk-loaded tree + height = Math.ceil(Math.log(N) / Math.log(M)); + + // target number of root entries to maximize storage utilization + M = Math.ceil(N / Math.pow(M, height - 1)); } - subscriber.next(result.value); - state.index = index + 1; - if (subscriber.closed) { - if (typeof iterator.return === 'function') { - iterator.return(); + + 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); + + for (i = left; i <= right; i += N1) { + + right2 = Math.min(i + N1 - 1, right); + + multiSelect(items, i, right2, N2, this.compareMinY); + + for (j = i; j <= right2; j += N2) { + + right3 = Math.min(j + N2 - 1, right2); + + // pack each entry recursively + node.children.push(this._build(items, j, right3, height - 1)); } - 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) { - if (typeof iterator.return === 'function') { - iterator.return(); - } - 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); - } - if (!i && obj.length !== undefined) { - return new ArrayIterator(obj); - } - if (!i) { - throw new TypeError('object is not iterable'); - } - 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 (len === 0 || !numberIsFinite(len)) { - return len; - } - len = sign(len) * Math.floor(Math.abs(len)); - if (len <= 0) { - return 0; - } - if (len > maxSafeInteger) { - return maxSafeInteger; - } - 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; - } - if (isNaN(valueAsNumber)) { - return valueAsNumber; - } - return valueAsNumber < 0 ? -1 : 1; -} -},{"../Observable":28,"../symbol/iterator":147,"../util/root":163}],91:[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; - } - /** - * Converts a Promise to an Observable. - * - * Returns an Observable that just emits the Promise's - * resolved value, then completes. - * - * 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 Convert the Promise returned by Fetch to an Observable - * 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} promise The promise to be converted. - * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling - * the delivery of the resolved value (or the rejection). - * @return {Observable} An Observable which wraps the Promise. - * @static true - * @name fromPromise - * @owner Observable - */ - 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); + calcBBox(node, this.toBBox); + + return node; + }, + + _chooseSubtree: function (bbox, node, level, path) { + + var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; + + while (true) { + path.push(node); + + if (node.leaf || path.length - 1 === level) break; + + minArea = minEnlargement = Infinity; + + for (i = 0, len = node.children.length; i < len; i++) { + child = node.children[i]; + area = bboxArea(child); + enlargement = enlargedArea(bbox, child) - area; + + // choose entry with the least area enlargement + if (enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = area < minArea ? area : minArea; + targetNode = child; + + } else if (enlargement === minEnlargement) { + // otherwise choose one with the smallest area + if (area < minArea) { + minArea = area; + targetNode = child; } - }) - .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(); - } -} -function dispatchError(arg) { - var err = arg.err, subscriber = arg.subscriber; - if (!subscriber.closed) { - subscriber.error(err); - } -} -},{"../Observable":28,"../util/root":163}],92:[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 - */ -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; - } - } - 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(); - } + node = targetNode || node.children[0]; } - }; - return ScalarObservable; -}(Observable_1.Observable)); -exports.ScalarObservable = ScalarObservable; -},{"../Observable":28}],93:[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. - * - * 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. - * - * - * - * `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 Dynamically calculate the Body-Mass Index from an Observable of weight and one for height - * 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)); - * - * // With output to console: - * // BMI is 24.212293388429753 - * // BMI is 23.93948099205209 - * // BMI is 23.671253629592222 - * - * @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 IScheduler 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]; - } - var project = null; - var scheduler = null; - if (isScheduler_1.isScheduler(observables[observables.length - 1])) { - scheduler = observables.pop(); - } - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - // 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]; - } - return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project)); -} -exports.combineLatest = combineLatest; + return node; + }, -},{"../operator/combineLatest":106,"../util/isArray":157,"../util/isScheduler":162,"./ArrayObservable":83}],94:[function(require,module,exports){ -"use strict"; -var DeferObservable_1 = require('./DeferObservable'); -exports.defer = DeferObservable_1.DeferObservable.create; + _insert: function (item, level, isNode) { -},{"./DeferObservable":85}],95:[function(require,module,exports){ -"use strict"; -var EmptyObservable_1 = require('./EmptyObservable'); -exports.empty = EmptyObservable_1.EmptyObservable.create; + var toBBox = this.toBBox, + bbox = isNode ? item : toBBox(item), + insertPath = []; -},{"./EmptyObservable":86}],96:[function(require,module,exports){ -"use strict"; -var FromObservable_1 = require('./FromObservable'); -exports.from = FromObservable_1.FromObservable.create; + // find the best node for accommodating the item, saving all nodes along the path too + var node = this._chooseSubtree(bbox, this.data, level, insertPath); -},{"./FromObservable":89}],97:[function(require,module,exports){ -"use strict"; -var FromEventObservable_1 = require('./FromEventObservable'); -exports.fromEvent = FromEventObservable_1.FromEventObservable.create; + // put the item into the node + node.children.push(item); + extend(node, bbox); -},{"./FromEventObservable":88}],98:[function(require,module,exports){ -"use strict"; -var PromiseObservable_1 = require('./PromiseObservable'); -exports.fromPromise = PromiseObservable_1.PromiseObservable.create; + // 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; + } -},{"./PromiseObservable":91}],99:[function(require,module,exports){ -"use strict"; -var merge_1 = require('../operator/merge'); -exports.merge = merge_1.mergeStatic; + // adjust bboxes along the insertion path + this._adjustParentBBoxes(bbox, insertPath, level); + }, -},{"../operator/merge":119}],100:[function(require,module,exports){ -"use strict"; -var ArrayObservable_1 = require('./ArrayObservable'); -exports.of = ArrayObservable_1.ArrayObservable.of; + // split overflowed node into two + _split: function (insertPath, level) { -},{"./ArrayObservable":83}],101:[function(require,module,exports){ -"use strict"; -var ErrorObservable_1 = require('./ErrorObservable'); -exports._throw = ErrorObservable_1.ErrorObservable.create; + var node = insertPath[level], + M = node.children.length, + m = this._minEntries; -},{"./ErrorObservable":87}],102:[function(require,module,exports){ -"use strict"; -var zip_1 = require('../operator/zip'); -exports.zip = zip_1.zipStatic; + this._chooseSplitAxis(node, m, M); -},{"../operator/zip":139}],103:[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. - * - * Collects values from the past as an array, and emits - * that array only when another Observable emits. - * - * - * - * 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 On every click, emit array of most recent interval events - * 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} closingNotifier An Observable that signals the - * buffer to be emitted on the output Observable. - * @return {Observable} An Observable of buffers, which are arrays of - * values. - * @method buffer - * @owner Observable - */ -function buffer(closingNotifier) { - return this.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; -}()); -/** - * 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)); - } - 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)); + var splitIndex = this._chooseSplitIndex(node, m, M); -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],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'); -/** - * Buffers the source Observable values until the size hits the maximum - * `bufferSize` given. - * - * Collects values from the past as an array, and emits - * that array only when its size reaches `bufferSize`. - * - * - * - * Buffers a number of values from the source Observable by `bufferSize` then - * emits the buffer and clears it, and starts a new buffer each - * `startBufferEvery` values. If `startBufferEvery` is not provided or is - * `null`, then new buffers are started immediately at the start of the source - * and when each buffer closes and is emitted. - * - * @example Emit the last two click events as an array - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var buffered = clicks.bufferCount(2); - * buffered.subscribe(x => console.log(x)); - * - * @example On every click, emit the last two click events as an array - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var buffered = clicks.bufferCount(2, 1); - * buffered.subscribe(x => console.log(x)); - * - * @see {@link buffer} - * @see {@link bufferTime} - * @see {@link bufferToggle} - * @see {@link bufferWhen} - * @see {@link pairwise} - * @see {@link windowCount} - * - * @param {number} bufferSize The maximum size of the buffer emitted. - * @param {number} [startBufferEvery] Interval at which to start a new buffer. - * For example if `startBufferEvery` is `2`, then a new buffer will be started - * on every other value from the source. A new buffer is started at the - * beginning of the source by default. - * @return {Observable} An Observable of arrays of buffered values. - * @method bufferCount - * @owner Observable - */ -function bufferCount(bufferSize, startBufferEvery) { - if (startBufferEvery === void 0) { startBufferEvery = null; } - return this.lift(new BufferCountOperator(bufferSize, startBufferEvery)); -} -exports.bufferCount = bufferCount; -var BufferCountOperator = (function () { - function BufferCountOperator(bufferSize, startBufferEvery) { - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - } - BufferCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferCountSubscriber(subscriber, this.bufferSize, this.startBufferEvery)); - }; - return BufferCountOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var BufferCountSubscriber = (function (_super) { - __extends(BufferCountSubscriber, _super); - function BufferCountSubscriber(destination, bufferSize, startBufferEvery) { - _super.call(this, destination); - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - this.buffers = []; - this.count = 0; - } - BufferCountSubscriber.prototype._next = function (value) { - var count = this.count++; - var _a = this, destination = _a.destination, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers; - var startOn = (startBufferEvery == null) ? bufferSize : startBufferEvery; - if (count % startOn === 0) { - buffers.push([]); - } - for (var i = buffers.length; i--;) { - var buffer = buffers[i]; - buffer.push(value); - if (buffer.length === bufferSize) { - buffers.splice(i, 1); - destination.next(buffer); + var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); + newNode.height = node.height; + newNode.leaf = node.leaf; + + calcBBox(node, this.toBBox); + calcBBox(newNode, this.toBBox); + + if (level) insertPath[level - 1].children.push(newNode); + else this._splitRoot(node, newNode); + }, + + _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); + }, + + _chooseSplitIndex: function (node, m, M) { + + var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + + minOverlap = minArea = Infinity; + + for (i = m; i <= M - m; i++) { + bbox1 = distBBox(node, 0, i, this.toBBox); + bbox2 = distBBox(node, i, M, this.toBBox); + + overlap = intersectionArea(bbox1, bbox2); + area = bboxArea(bbox1) + bboxArea(bbox2); + + // choose distribution with minimum overlap + if (overlap < minOverlap) { + minOverlap = overlap; + index = i; + + minArea = area < minArea ? area : minArea; + + } else if (overlap === minOverlap) { + // otherwise choose distribution with minimum area + if (area < minArea) { + minArea = area; + index = i; + } } } - }; - BufferCountSubscriber.prototype._complete = function () { - var destination = this.destination; - var buffers = this.buffers; - while (buffers.length > 0) { - var buffer = buffers.shift(); - if (buffer.length > 0) { - destination.next(buffer); - } + + return index; + }, + + // sorts node children by the best axis for split + _chooseSplitAxis: function (node, m, M) { + + 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 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); + }, + + // total margin of all possible split distributions where each node is at least m full + _allDistMargin: function (node, m, M, compare) { + + node.children.sort(compare); + + var toBBox = this.toBBox, + leftBBox = distBBox(node, 0, m, toBBox), + rightBBox = distBBox(node, M - m, M, toBBox), + margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), + i, child; + + for (i = m; i < M - m; i++) { + child = node.children[i]; + extend(leftBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin(leftBBox); } - _super.prototype._complete.call(this); - }; - return BufferCountSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],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'); -/** - * 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 - * @name catch - * @owner Observable - */ -function _catch(selector) { - var operator = new CatchOperator(selector); - var caught = this.lift(operator); - return (operator.caught = caught); -} -exports._catch = _catch; -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; -}()); -/** - * 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; - } - // 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); + for (i = M - m - 1; i >= m; i--) { + child = node.children[i]; + extend(rightBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin(rightBBox); } - }; - return CatchSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],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 __()); + return margin; + }, + + _adjustParentBBoxes: function (bbox, path, level) { + // adjust bboxes along the given tree path + for (var i = level; i >= 0; i--) { + extend(path[i], bbox); + } + }, + + _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(); + + } else calcBBox(path[i], this.toBBox); + } + }, + + _initFormat: function (format) { + // data format (minX, minY, maxX, maxY accessors) + + // 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', ';']; + + this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); + this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); + + this.toBBox = new Function('a', + 'return {minX: a' + format[0] + + ', minY: a' + format[1] + + ', maxX: a' + format[2] + + ', maxY: a' + format[3] + '};'); + } }; -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 = {}; -/* tslint:disable:max-line-length */ -/** - * Combines multiple Observables to create an Observable whose values are - * calculated from the latest values of each of its input Observables. - * - * 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. - * - * - * - * `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 Dynamically calculate the Body-Mass Index from an Observable of weight and one for height - * 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)); - * - * // With output to console: - * // BMI is 24.212293388429753 - * // BMI is 23.93948099205209 - * // BMI is 23.671253629592222 - * - * @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]; - } - var project = null; - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - // 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]; + +function findItem(item, items, equalsFn) { + if (!equalsFn) return items.indexOf(item); + + for (var i = 0; i < items.length; i++) { + if (equalsFn(item, items[i])) return i; } - observables.unshift(this); - return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project)); + return -1; } -exports.combineLatest = combineLatest; -var CombineLatestOperator = (function () { - function CombineLatestOperator(project) { - this.project = project; + +// 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; + + for (var i = k, child; i < p; i++) { + child = node.children[i]; + extend(destNode, node.leaf ? toBBox(child) : child); } - CombineLatestOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CombineLatestSubscriber(subscriber, this.project)); + + return destNode; +} + +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; +} + +function compareNodeMinX(a, b) { return a.minX - b.minX; } +function compareNodeMinY(a, b) { return a.minY - b.minY; } + +function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); } +function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); } + +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)); +} + +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); + + return Math.max(0, maxX - minX) * + Math.max(0, maxY - minY); +} + +function contains(a, b) { + return a.minX <= b.minX && + a.minY <= b.minY && + b.maxX <= a.maxX && + b.maxY <= a.maxY; +} + +function intersects(a, b) { + return b.minX <= a.maxX && + b.minY <= a.maxY && + b.maxX >= a.minX && + b.maxY >= a.minY; +} + +function createNode(children) { + return { + children: children, + height: 1, + leaf: true, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity }; - 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 = []; +} + +// 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 + +function multiSelect(arr, left, right, n, compare) { + var stack = [left, right], + mid; + + while (stack.length) { + right = stack.pop(); + left = stack.pop(); + + if (right - left <= n) continue; + + mid = left + Math.ceil((right - left) / n / 2) * n; + quickselect(arr, mid, left, right, compare); + + stack.push(left, mid, mid, right); } - CombineLatestSubscriber.prototype._next = function (observable) { - this.values.push(none); - this.observables.push(observable); +} + +},{"quickselect":25}],27:[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; +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 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 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":28,"./internal/BehaviorSubject":29,"./internal/Notification":31,"./internal/Observable":32,"./internal/ReplaySubject":35,"./internal/Scheduler":36,"./internal/Subject":37,"./internal/Subscriber":39,"./internal/Subscription":40,"./internal/config":41,"./internal/observable/ConnectableObservable":42,"./internal/observable/bindCallback":44,"./internal/observable/bindNodeCallback":45,"./internal/observable/combineLatest":46,"./internal/observable/concat":47,"./internal/observable/defer":48,"./internal/observable/empty":49,"./internal/observable/forkJoin":50,"./internal/observable/from":51,"./internal/observable/fromEvent":53,"./internal/observable/fromEventPattern":54,"./internal/observable/generate":58,"./internal/observable/iif":59,"./internal/observable/interval":60,"./internal/observable/merge":61,"./internal/observable/never":62,"./internal/observable/of":63,"./internal/observable/onErrorResumeNext":64,"./internal/observable/pairs":65,"./internal/observable/race":66,"./internal/observable/range":67,"./internal/observable/throwError":69,"./internal/observable/timer":70,"./internal/observable/using":71,"./internal/observable/zip":72,"./internal/operators/groupBy":108,"./internal/scheduler/VirtualTimeScheduler":185,"./internal/scheduler/animationFrame":186,"./internal/scheduler/asap":187,"./internal/scheduler/async":188,"./internal/scheduler/queue":189,"./internal/symbol/observable":191,"./internal/util/ArgumentOutOfRangeError":193,"./internal/util/EmptyError":194,"./internal/util/ObjectUnsubscribedError":196,"./internal/util/TimeoutError":197,"./internal/util/UnsubscriptionError":198,"./internal/util/identity":202,"./internal/util/isObservable":211,"./internal/util/noop":214,"./internal/util/pipe":216}],28:[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 __()); }; - CombineLatestSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); +})(); +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 { - 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 if (this.hasCompleted && this.hasNext) { + subscriber.next(this.value); + subscriber.complete(); + return Subscription_1.Subscription.EMPTY; } + return _super.prototype._subscribe.call(this, subscriber); }; - CombineLatestSubscriber.prototype.notifyComplete = function (unused) { - if ((this.active -= 1) === 0) { - this.destination.complete(); + AsyncSubject.prototype.next = function (value) { + if (!this.hasCompleted) { + this.value = value; + this.hasNext = true; } }; - 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); - } - else { - this.destination.next(values.slice()); - } + AsyncSubject.prototype.error = function (error) { + if (!this.hasCompleted) { + _super.prototype.error.call(this, error); } }; - CombineLatestSubscriber.prototype._tryProject = function (values) { - var result; - try { - result = this.project.apply(this, values); - } - catch (err) { - this.destination.error(err); - return; + AsyncSubject.prototype.complete = function () { + this.hasCompleted = true; + if (this.hasNext) { + _super.prototype.next.call(this, this.value); } - this.destination.next(result); + _super.prototype.complete.call(this); }; - return CombineLatestSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.CombineLatestSubscriber = CombineLatestSubscriber; + return AsyncSubject; +}(Subject_1.Subject)); +exports.AsyncSubject = AsyncSubject; -},{"../OuterSubscriber":30,"../observable/ArrayObservable":83,"../util/isArray":157,"../util/subscribeToResult":164}],107:[function(require,module,exports){ +},{"./Subject":37,"./Subscription":40}],29:[function(require,module,exports){ "use strict"; -var isScheduler_1 = require('../util/isScheduler'); -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var mergeAll_1 = require('./mergeAll'); -/* tslint:disable:max-line-length */ -/** - * Creates an output Observable which sequentially emits all values from every - * given input Observable after the current Observable. - * - * Concatenates multiple Observables together by - * sequentially emitting their values, one Observable after the other. - * - * - * - * 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 Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 - * 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)); - * - * // results in: - * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10 - * - * @example Concatenate 3 Observables - * 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)); - * - * // results in the following: - * // (Prints to console sequentially) - * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9 - * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5 - * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9 - * - * @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 IScheduler 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]; - } - return this.lift.call(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. - * - * Concatenates multiple Observables together by - * sequentially emitting their values, one Observable after the other. - * - * - * - * 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 Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 - * 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)); - * - * // results in: - * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10 - * - * @example Concatenate 3 Observables - * 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)); - * - * // results in the following: - * // (Prints to console sequentially) - * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9 - * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5 - * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9 - * - * @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 IScheduler 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 - */ -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 __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); } - if (scheduler === null && observables.length === 1) { - return observables[0]; + 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; } - return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1)); -} -exports.concatStatic = concatStatic; + 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; -},{"../observable/ArrayObservable":83,"../util/isScheduler":162,"./mergeAll":120}],108:[function(require,module,exports){ +},{"./Subject":37,"./util/ObjectUnsubscribedError":196}],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'); -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. - * - * It's like {@link delay}, but passes only the most - * recent value from each burst of emissions. - * - * - * - * `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 IScheduler} for - * managing timers. - * - * @example Emit the most recent click after a burst of clicks - * 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 IScheduler} 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)); -} -exports.debounceTime = debounceTime; -var DebounceTimeOperator = (function () { - function DebounceTimeOperator(dueTime, scheduler) { - this.dueTime = dueTime; - this.scheduler = scheduler; +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); } - DebounceTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - 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; +})(); +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; } - 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(); + InnerSubscriber.prototype._next = function (value) { + this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); }; - DebounceTimeSubscriber.prototype.debouncedNext = function () { - this.clearDebounce(); - if (this.hasValue) { - this.destination.next(this.lastValue); - this.lastValue = null; - this.hasValue = false; - } + InnerSubscriber.prototype._error = function (error) { + this.parent.notifyError(error, this); + this.unsubscribe(); }; - DebounceTimeSubscriber.prototype.clearDebounce = function () { - var debouncedSubscription = this.debouncedSubscription; - if (debouncedSubscription !== null) { - this.remove(debouncedSubscription); - debouncedSubscription.unsubscribe(); - this.debouncedSubscription = null; - } + InnerSubscriber.prototype._complete = function () { + this.parent.notifyComplete(this); + this.unsubscribe(); }; - return DebounceTimeSubscriber; + return InnerSubscriber; }(Subscriber_1.Subscriber)); -function dispatchNext(subscriber) { - subscriber.debouncedNext(); -} +exports.InnerSubscriber = InnerSubscriber; -},{"../Subscriber":35,"../scheduler/async":145}],109:[function(require,module,exports){ +},{"./Subscriber":39}],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 async_1 = require('../scheduler/async'); -var isDate_1 = require('../util/isDate'); -var Subscriber_1 = require('../Subscriber'); -var Notification_1 = require('../Notification'); -/** - * Delays the emission of items from the source Observable by a given timeout or - * until a given Date. - * - * Time shifts each item by some specified amount of - * milliseconds. - * - * - * - * If the delay argument is a Number, this operator time shifts the source - * Observable by that amount of time expressed in milliseconds. The relative - * time intervals between the values are preserved. - * - * If the delay argument is a Date, this operator time shifts the start of the - * Observable execution until the given date occurs. - * - * @example Delay each click by one second - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second - * delayedClicks.subscribe(x => console.log(x)); - * - * @example Delay all clicks until a future date happens - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var date = new Date('March 15, 2050 12:00:00'); // in the future - * var delayedClicks = clicks.delay(date); // click emitted only after that date - * delayedClicks.subscribe(x => console.log(x)); - * - * @see {@link debounceTime} - * @see {@link delayWhen} - * - * @param {number|Date} delay The delay duration in milliseconds (a `number`) or - * a `Date` until which the emission of the source items is delayed. - * @param {Scheduler} [scheduler=async] The IScheduler to use for - * managing the timers that handle the time-shift for each item. - * @return {Observable} An Observable that delays the emissions of the source - * Observable by the specified timeout or Date. - * @method delay - * @owner Observable - */ -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 this.lift(new DelayOperator(delayFor, scheduler)); -} -exports.delay = delay; -var DelayOperator = (function () { - function DelayOperator(delay, scheduler) { - this.delay = delay; - this.scheduler = scheduler; +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 Notification = (function () { + function Notification(kind, value, error) { + this.kind = kind; + this.value = value; + this.error = error; + this.hasValue = kind === 'N'; } - DelayOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); + 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(); + } }; - return DelayOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DelaySubscriber = (function (_super) { - __extends(DelaySubscriber, _super); - function DelaySubscriber(destination, delay, scheduler) { - _super.call(this, destination); - this.delay = delay; - this.scheduler = scheduler; - this.queue = []; - this.active = false; - this.errored = false; - } - 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); + 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(); } - if (queue.length > 0) { - var delay_1 = Math.max(0, queue[0].time - scheduler.now()); - this.schedule(state, delay_1); + }; + Notification.prototype.accept = function (nextOrObserver, error, complete) { + if (nextOrObserver && typeof nextOrObserver.next === 'function') { + return this.observe(nextOrObserver); } else { - source.active = false; + return this.do(nextOrObserver, error, complete); } }; - DelaySubscriber.prototype._schedule = function (scheduler) { - this.active = true; - this.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); + 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'); }; - DelaySubscriber.prototype._next = function (value) { - this.scheduleNotification(Notification_1.Notification.createNext(value)); + Notification.createNext = function (value) { + if (typeof value !== 'undefined') { + return new Notification('N', value); + } + return Notification.undefinedValueNotification; }; - DelaySubscriber.prototype._error = function (err) { - this.errored = true; - this.queue = []; - this.destination.error(err); + Notification.createError = function (err) { + return new Notification('E', undefined, err); }; - DelaySubscriber.prototype._complete = function () { - this.scheduleNotification(Notification_1.Notification.createComplete()); + Notification.createComplete = function () { + return Notification.completeNotification; }; - return DelaySubscriber; -}(Subscriber_1.Subscriber)); -var DelayMessage = (function () { - function DelayMessage(time, notification) { - this.time = time; - this.notification = notification; - } - return DelayMessage; + Notification.completeNotification = new Notification('C'); + Notification.undefinedValueNotification = new Notification('N', undefined); + return Notification; }()); +exports.Notification = Notification; -},{"../Notification":27,"../Subscriber":35,"../scheduler/async":145,"../util/isDate":158}],110:[function(require,module,exports){ +},{"./observable/empty":49,"./observable/of":63,"./observable/throwError":69}],32:[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'); -var Set_1 = require('../util/Set'); -/** - * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items. - * - * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will - * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the - * source observable directly with an equality check against previous values. - * - * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking. - * - * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the - * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct` - * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so - * that the internal `Set` can be "flushed", basically clearing it of values. - * - * @example A simple example with numbers - * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1) - * .distinct() - * .subscribe(x => console.log(x)); // 1, 2, 3, 4 - * - * @example An example using a keySelector function - * interface Person { - * age: number, - * name: string - * } - * - * Observable.of( - * { age: 4, name: 'Foo'}, - * { age: 7, name: 'Bar'}, - * { age: 5, name: 'Foo'}) - * .distinct((p: Person) => p.name) - * .subscribe(x => console.log(x)); - * - * // displays: - * // { age: 4, name: 'Foo' } - * // { age: 7, name: 'Bar' } - * - * @see {@link distinctUntilChanged} - * @see {@link distinctUntilKeyChanged} - * - * @param {function} [keySelector] optional function to select which value you want to check as distinct. - * @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 - */ -function distinct(keySelector, flushes) { - return this.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; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DistinctSubscriber = (function (_super) { - __extends(DistinctSubscriber, _super); - function DistinctSubscriber(destination, keySelector, flushes) { - _super.call(this, destination); - this.keySelector = keySelector; - this.values = new Set_1.Set(); - if (flushes) { - this.add(subscribeToResult_1.subscribeToResult(this, flushes)); +Object.defineProperty(exports, "__esModule", { value: true }); +var canReportError_1 = require("./util/canReportError"); +var toSubscriber_1 = require("./util/toSubscriber"); +var observable_1 = require("../internal/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; } } - DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values.clear(); - }; - DistinctSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); + Observable.prototype.lift = function (operator) { + var observable = new Observable(); + observable.source = this; + observable.operator = operator; + return observable; }; - DistinctSubscriber.prototype._next = function (value) { - if (this.keySelector) { - this._useKeySelector(value); + 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.source); } else { - this._finalizeNext(value, value); + 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; + } + } } + return sink; }; - DistinctSubscriber.prototype._useKeySelector = function (value) { - var key; - var destination = this.destination; + Observable.prototype._trySubscribe = function (sink) { try { - key = this.keySelector(value); + return this._subscribe(sink); } catch (err) { - destination.error(err); - return; + if (config_1.config.useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; + } + if (canReportError_1.canReportError(sink)) { + sink.error(err); + } + else { + console.warn(err); + } } - 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); + 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); + } + catch (err) { + reject(err); + if (subscription) { + subscription.unsubscribe(); + } + } + }, 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); }; - return DistinctSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.DistinctSubscriber = DistinctSubscriber; - -},{"../OuterSubscriber":30,"../util/Set":154,"../util/subscribeToResult":164}],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 tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -/* tslint:disable:max-line-length */ -/** - * 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. - * - * @example A simple example with numbers - * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4) - * .distinctUntilChanged() - * .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4 - * - * @example An example using a compare function - * interface Person { - * age: number, - * name: string - * } - * - * Observable.of( - * { age: 4, name: 'Foo'}, - * { age: 7, name: 'Bar'}, - * { age: 5, name: 'Foo'}) - * { age: 6, name: 'Foo'}) - * .distinctUntilChanged((p: Person, q: Person) => p.name === q.name) - * .subscribe(x => console.log(x)); - * - * // displays: - * // { age: 4, name: 'Foo' } - * // { age: 7, name: 'Bar' } - * // { age: 5, name: 'Foo' } - * - * @see {@link distinct} - * @see {@link distinctUntilKeyChanged} - * - * @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)); + 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); }); + }); }; - return DistinctUntilChangedOperator; + Observable.create = function (subscribe) { + return new Observable(subscribe); + }; + return Observable; }()); -/** - * 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; - } +exports.Observable = Observable; +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = config_1.config.Promise || Promise; } - 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); - } - } - 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); - } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} + +},{"../internal/symbol/observable":191,"./config":41,"./util/canReportError":199,"./util/pipe":216,"./util/toSubscriber":223}],33:[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 { - this.hasKey = true; - } - if (Boolean(result) === false) { - this.key = key; - this.destination.next(value); + hostReportError_1.hostReportError(err); } - }; - return DistinctUntilChangedSubscriber; -}(Subscriber_1.Subscriber)); + }, + complete: function () { } +}; -},{"../Subscriber":35,"../util/errorObject":156,"../util/tryCatch":166}],112:[function(require,module,exports){ +},{"./config":41,"./util/hostReportError":201}],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 __()); -}; -var Subscriber_1 = require('../Subscriber'); -/* tslint:disable:max-line-length */ -/** - * Perform a side effect for every emission on the source Observable, but return - * an Observable that is identical to the source. - * - * Intercepts each emission on the source and runs a - * function, but returns an output which is identical to the source. - * - * - * - * 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 Map every every click to the clientX position of that click, while also logging the click event - * 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; +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); } - DoOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - 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); - } - else { - this.destination.next(value); - } +})(); +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); }; - DoSubscriber.prototype._error = function (err) { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.error(err); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.error(err); - } + OuterSubscriber.prototype.notifyError = function (error, innerSub) { + this.destination.error(error); }; - DoSubscriber.prototype._complete = function () { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.complete(); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.complete(); - } + OuterSubscriber.prototype.notifyComplete = function (innerSub) { + this.destination.complete(); }; - return DoSubscriber; + return OuterSubscriber; }(Subscriber_1.Subscriber)); +exports.OuterSubscriber = OuterSubscriber; -},{"../Subscriber":35}],113:[function(require,module,exports){ +},{"./Subscriber":39}],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 __()); -}; -var tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); -/* tslint:disable:max-line-length */ -/** - * Recursively projects each source value to an Observable which is merged in - * the output Observable. - * - * It's similar to {@link mergeMap}, but applies the - * projection function to every source value as well as every output value. - * It's recursive. - * - * - * - * 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 Start emitting the powers of two on every click, at most 10 of them - * 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 IScheduler 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; +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); } - ExpandOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - 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 = []; +})(); +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; } - ExpandSubscriber.dispatch = function (arg) { - var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; - subscriber.subscribeToProjection(result, value, index); + 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); }; - ExpandSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (destination.closed) { - this._complete(); - return; + 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(); } - 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)); + 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 { - this.buffer.push(value); + 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; }; - ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { - this.active++; - this.add(subscribeToResult_1.subscribeToResult(this, result, value, index)); + ReplaySubject.prototype._getNow = function () { + return (this.scheduler || queue_1.queue).now(); }; - ExpandSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); + 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++; } - }; - 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 (eventsCount > _bufferSize) { + spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); } - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); + if (spliceCount > 0) { + _events.splice(0, spliceCount); } + return _events; }; - return ExpandSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.ExpandSubscriber = ExpandSubscriber; + return ReplaySubject; +}(Subject_1.Subject)); +exports.ReplaySubject = ReplaySubject; +var ReplayEvent = (function () { + function ReplayEvent(time, value) { + this.time = time; + this.value = value; + } + return ReplayEvent; +}()); -},{"../OuterSubscriber":30,"../util/errorObject":156,"../util/subscribeToResult":164,"../util/tryCatch":166}],114:[function(require,module,exports){ +},{"./Subject":37,"./SubjectSubscription":38,"./Subscription":40,"./operators/observeOn":123,"./scheduler/queue":189,"./util/ObjectUnsubscribedError":196}],36:[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'); -/* tslint:disable:max-line-length */ -/** - * Filter items emitted by the source Observable by only emitting those that - * satisfy a specified predicate. - * - * 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. - * - * - * - * 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 Emit only click events whose target was a DIV element - * 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 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; +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; } - FilterOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); + Scheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { delay = 0; } + return new this.SchedulerAction(this, work).schedule(state, delay); }; - return FilterOperator; + Scheduler.now = function () { return Date.now(); }; + return Scheduler; }()); -/** - * 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++); - } - catch (err) { - this.destination.error(err); - return; - } - if (result) { - this.destination.next(value); - } - }; - return FilterSubscriber; -}(Subscriber_1.Subscriber)); +exports.Scheduler = Scheduler; -},{"../Subscriber":35}],115:[function(require,module,exports){ +},{}],37:[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; +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); } - FinallyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FinallySubscriber(subscriber, this.callback)); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - 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)); +})(); +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; } - return FinallySubscriber; + return SubjectSubscriber; }(Subscriber_1.Subscriber)); - -},{"../Subscriber":35,"../Subscription":36}],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 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. - * - * Emits only the first value. Or emits only the first - * value that passes some test. - * - * - * - * 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 Emit only the first click that happens on the DOM - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.first(); - * result.subscribe(x => console.log(x)); - * - * @example Emits the first click that happens on a DIV - * 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): 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} 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; +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; } - FirstOperator.prototype.call = function (observer, source) { - return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + Subject.prototype[rxSubscriber_1.rxSubscriber] = function () { + return new SubjectSubscriber(this); }; - 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; - this._emitted = false; - } - FirstSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this._tryPredicate(value, index); + 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(); } - else { - this._emit(value, index); + 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); + } } }; - FirstSubscriber.prototype._tryPredicate = function (value, index) { - var result; - try { - result = this.predicate(value, index, this.source); - } - catch (err) { - this.destination.error(err); - return; + Subject.prototype.error = function (err) { + if (this.closed) { + throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError(); } - if (result) { - this._emit(value, index); + 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; }; - FirstSubscriber.prototype._emit = function (value, index) { - if (this.resultSelector) { - this._tryResultSelector(value, index); - return; + 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._emitFinal(value); + this.observers.length = 0; }; - FirstSubscriber.prototype._tryResultSelector = function (value, index) { - var result; - try { - result = this.resultSelector(value, index); + 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(); } - catch (err) { - this.destination.error(err); - return; + else { + return _super.prototype._trySubscribe.call(this, subscriber); } - this._emitFinal(result); }; - FirstSubscriber.prototype._emitFinal = function (value) { - var destination = this.destination; - if (!this._emitted) { - this._emitted = true; - destination.next(value); - destination.complete(); - this.hasCompleted = true; + Subject.prototype._subscribe = function (subscriber) { + if (this.closed) { + throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError(); } - }; - FirstSubscriber.prototype._complete = function () { - var destination = this.destination; - if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') { - destination.next(this.defaultValue); - destination.complete(); + else if (this.hasError) { + subscriber.error(this.thrownError); + return Subscription_1.Subscription.EMPTY; } - else if (!this.hasCompleted) { - destination.error(new EmptyError_1.EmptyError); + else if (this.isStopped) { + subscriber.complete(); + return Subscription_1.Subscription.EMPTY; + } + else { + this.observers.push(subscriber); + return new SubjectSubscription_1.SubjectSubscription(this, subscriber); } }; - return FirstSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":35,"../util/EmptyError":152}],117:[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'); -/* tslint:disable:max-line-length */ -/** - * 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. - * - * - * - * @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)); -} -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)); + Subject.prototype.asObservable = function () { + var observable = new Observable_1.Observable(); + observable.source = this; + return observable; }; - 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; - } + 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; } - 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; + AnonymousSubject.prototype.next = function (value) { + var destination = this.destination; + if (destination && destination.next) { + destination.next(value); } }; - LastSubscriber.prototype._tryPredicate = function (value, index) { - var result; - try { - result = this.predicate(value, index, this.source); - } - catch (err) { + AnonymousSubject.prototype.error = function (err) { + var destination = this.destination; + if (destination && destination.error) { 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; + AnonymousSubject.prototype.complete = function () { + var destination = this.destination; + if (destination && destination.complete) { + this.destination.complete(); } - this.lastValue = result; - this.hasValue = true; }; - LastSubscriber.prototype._complete = function () { - var destination = this.destination; - if (this.hasValue) { - destination.next(this.lastValue); - destination.complete(); + AnonymousSubject.prototype._subscribe = function (subscriber) { + var source = this.source; + if (source) { + return this.source.subscribe(subscriber); } else { - destination.error(new EmptyError_1.EmptyError); + return Subscription_1.Subscription.EMPTY; } }; - return LastSubscriber; -}(Subscriber_1.Subscriber)); + return AnonymousSubject; +}(Subject)); +exports.AnonymousSubject = AnonymousSubject; -},{"../Subscriber":35,"../util/EmptyError":152}],118:[function(require,module,exports){ +},{"../internal/symbol/rxSubscriber":192,"./Observable":32,"./SubjectSubscription":38,"./Subscriber":39,"./Subscription":40,"./util/ObjectUnsubscribedError":196}],38:[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. - * - * 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. - * - * - * - * 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 Map every every click to the clientX position of that click - * 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} 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()`?'); +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 this.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 function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - 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; +})(); +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; } - // 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++); + SubjectSubscription.prototype.unsubscribe = function () { + if (this.closed) { + return; } - catch (err) { - this.destination.error(err); + this.closed = true; + var subject = this.subject; + var observers = subject.observers; + this.subject = null; + if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { return; } - this.destination.next(result); + var subscriberIndex = observers.indexOf(this.subscriber); + if (subscriberIndex !== -1) { + observers.splice(subscriberIndex, 1); + } }; - return MapSubscriber; -}(Subscriber_1.Subscriber)); + return SubjectSubscription; +}(Subscription_1.Subscription)); +exports.SubjectSubscription = SubjectSubscription; -},{"../Subscriber":35}],119:[function(require,module,exports){ +},{"./Subscription":40}],39:[function(require,module,exports){ "use strict"; -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var mergeAll_1 = require('./mergeAll'); -var isScheduler_1 = require('../util/isScheduler'); -/* tslint:disable:max-line-length */ -/** - * Creates an output Observable which concurrently emits all values from every - * given input Observable. - * - * Flattens multiple Observables together by blending - * their values into one Observable. - * - * - * - * `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 Merge together two Observables: 1s interval and clicks - * 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 Merge together 3 Observables, but only 2 run concurrently - * 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 IScheduler 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]; - } - return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables))); -} -exports.merge = merge; -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which concurrently emits all values from every - * given input Observable. - * - * Flattens multiple Observables together by blending - * their values into one Observable. - * - * - * - * `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 Merge together two Observables: 1s interval and clicks - * 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)); - * - * // Results in the following: - * // timer will emit ascending values, one every second(1000ms) to console - * // clicks logs MouseEvents to console everytime the "document" is clicked - * // Since the two streams are merged you see these happening - * // as they occur. - * - * @example Merge together 3 Observables, but only 2 run concurrently - * 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)); - * - * // Results in the following: - * // - First timer1 and timer2 will run concurrently - * // - timer1 will emit a value every 1000ms for 10 iterations - * // - timer2 will emit a value every 2000ms for 6 iterations - * // - after timer1 hits it's max iteration, timer2 will - * // continue, and timer3 will start to run concurrently with timer2 - * // - when timer2 hits it's max iteration it terminates, and - * // timer3 will continue to emit a value every 500ms until it is complete - * - * @see {@link mergeAll} - * @see {@link mergeMap} - * @see {@link mergeMapTo} - * @see {@link mergeScan} - * - * @param {...Observable} observables Input Observables to merge together. - * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input - * Observables being subscribed to concurrently. - * @param {Scheduler} [scheduler=null] The IScheduler 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]; +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); } - 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(); + 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; + _this._parentSubscription = null; + 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; } - else if (typeof last === 'number') { - concurrent = observables.pop(); - } - if (scheduler === null && observables.length === 1) { - return observables[0]; - } - return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent)); -} -exports.mergeStatic = mergeStatic; - -},{"../observable/ArrayObservable":83,"../util/isScheduler":162,"./mergeAll":120}],120:[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'); -/** - * Converts a higher-order Observable into a first-order Observable which - * concurrently delivers all values that are emitted on the inner Observables. - * - * Flattens an Observable-of-Observables. - * - * - * - * `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 Spawn a new interval Observable for each click event, and blend their outputs as one Observable - * 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 Count from 0 to 9 every second for each click, but only allow 2 concurrent timers - * 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 - */ -function mergeAll(concurrent) { - if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } - return this.lift(new MergeAllOperator(concurrent)); -} -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)); + 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; }; - return MergeAllOperator; -}()); -exports.MergeAllOperator = MergeAllOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -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); + Subscriber.prototype.next = function (value) { + if (!this.isStopped) { + this._next(value); } }; - MergeAllSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); + Subscriber.prototype.error = function (err) { + if (!this.isStopped) { + this.isStopped = true; + this._error(err); } }; - 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(); + Subscriber.prototype.complete = function () { + if (!this.isStopped) { + this.isStopped = true; + this._complete(); } }; - return MergeAllSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.MergeAllSubscriber = MergeAllSubscriber; - -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],121:[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'); -/* tslint:disable:max-line-length */ -/** - * Projects each source value to an Observable which is merged in the output - * Observable. - * - * Maps each value to an Observable, then flattens all of - * these inner Observables using {@link mergeAll}. - * - * - * - * 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 Map and flatten each letter to an Observable ticking every 1 second - * 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)); - * - * // Results in the following: - * // a0 - * // b0 - * // c0 - * // a1 - * // b1 - * // c1 - * // continues to list a,b,c with respective ascending integers - * - * @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 - */ -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)); -} -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} - */ -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); + Subscriber.prototype.unsubscribe = function () { + if (this.closed) { return; } - this.active++; - this._innerSub(result, value, index); + this.isStopped = true; + _super.prototype.unsubscribe.call(this); }; - MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { - this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index)); + Subscriber.prototype._next = function (value) { + this.destination.next(value); }; - MergeMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); + 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 _a = this, _parent = _a._parent, _parents = _a._parents; + this._parent = null; + this._parents = null; + this.unsubscribe(); + this.closed = false; + this.isStopped = false; + this._parent = _parent; + this._parents = _parents; + this._parentSubscription = null; + 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; + } + 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(); + } } }; - MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (this.resultSelector) { - this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex); + 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(); + } } - else { - this.destination.next(innerValue); + }; + 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(); + } } }; - MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) { - var result; + SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { try { - result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); + fn.call(this._context, value); } catch (err) { - this.destination.error(err); - return; + this.unsubscribe(); + if (config_1.config.useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + hostReportError_1.hostReportError(err); + } } - 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()); + SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { + if (!config_1.config.useDeprecatedSynchronousErrorHandling) { + throw new Error('bad call'); } - else if (this.active === 0 && this.hasCompleted) { - this.destination.complete(); + 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; }; - return MergeMapSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.MergeMapSubscriber = MergeMapSubscriber; - -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],122:[function(require,module,exports){ -"use strict"; -var ConnectableObservable_1 = require('../observable/ConnectableObservable'); -/* tslint:disable:max-line-length */ -/** - * 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. - * - * - * - * @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 - */ -function multicast(subjectOrSubjectFactory, selector) { - var subjectFactory; - if (typeof subjectOrSubjectFactory === 'function') { - subjectFactory = subjectOrSubjectFactory; - } - else { - subjectFactory = function subjectFactory() { - return subjectOrSubjectFactory; - }; - } - if (typeof selector === 'function') { - return this.lift(new MulticastOperator(subjectFactory, selector)); - } - var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor); - connectable.source = this; - 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; + SafeSubscriber.prototype._unsubscribe = function () { + var _parentSubscriber = this._parentSubscriber; + this._context = null; + this._parentSubscriber = null; + _parentSubscriber.unsubscribe(); }; - return MulticastOperator; -}()); -exports.MulticastOperator = MulticastOperator; + return SafeSubscriber; +}(Subscriber)); +exports.SafeSubscriber = SafeSubscriber; -},{"../observable/ConnectableObservable":84}],123:[function(require,module,exports){ +},{"../internal/symbol/rxSubscriber":192,"./Observer":33,"./Subscription":40,"./config":41,"./util/hostReportError":201,"./util/isFunction":206}],40:[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|WebSocketSubject|Observable} - * @method observeOn - * @owner Observable - */ -function observeOn(scheduler, delay) { - if (delay === void 0) { delay = 0; } - return this.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; -/** - * 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, subscription = arg.subscription; - notification.observe(destination); - if (subscription) { - subscription.unsubscribe(); +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 tryCatch_1 = require("./util/tryCatch"); +var errorObject_1 = require("./util/errorObject"); +var UnsubscriptionError_1 = require("./util/UnsubscriptionError"); +var Subscription = (function () { + function Subscription(unsubscribe) { + this.closed = false; + this._parent = null; + this._parents = null; + this._subscriptions = null; + if (unsubscribe) { + this._unsubscribe = unsubscribe; + } + } + Subscription.prototype.unsubscribe = function () { + var hasErrors = false; + var errors; + if (this.closed) { + return; + } + var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; + this.closed = true; + this._parent = null; + this._parents = null; + this._subscriptions = null; + var index = -1; + var len = _parents ? _parents.length : 0; + while (_parent) { + _parent.remove(this); + _parent = ++index < len && _parents[index] || null; + } + if (isFunction_1.isFunction(_unsubscribe)) { + var trial = tryCatch_1.tryCatch(_unsubscribe).call(this); + if (trial === errorObject_1.errorObject) { + hasErrors = true; + errors = errors || (errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError ? + flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors) : [errorObject_1.errorObject.e]); + } + } + if (isArray_1.isArray(_subscriptions)) { + index = -1; + 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(flattenUnsubscriptionErrors(err.errors)); + } + else { + errors.push(err); + } + } + } + } + } + if (hasErrors) { + throw new UnsubscriptionError_1.UnsubscriptionError(errors); } }; - ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { - var message = new ObserveOnMessage(notification, this.destination); - message.subscription = this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, message)); - }; - ObserveOnSubscriber.prototype._next = function (value) { - this.scheduleMessage(Notification_1.Notification.createNext(value)); - }; - ObserveOnSubscriber.prototype._error = function (err) { - this.scheduleMessage(Notification_1.Notification.createError(err)); + Subscription.prototype.add = function (teardown) { + if (!teardown || (teardown === Subscription.EMPTY)) { + return Subscription.EMPTY; + } + if (teardown === this) { + return this; + } + var subscription = teardown; + switch (typeof teardown) { + case 'function': + subscription = new Subscription(teardown); + case 'object': + if (subscription.closed || typeof subscription.unsubscribe !== 'function') { + return subscription; + } + else if (this.closed) { + subscription.unsubscribe(); + return subscription; + } + else if (typeof subscription._addParent !== 'function') { + var tmp = subscription; + subscription = new Subscription(); + subscription._subscriptions = [tmp]; + } + break; + default: + throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); + } + var subscriptions = this._subscriptions || (this._subscriptions = []); + subscriptions.push(subscription); + subscription._addParent(this); + return subscription; }; - ObserveOnSubscriber.prototype._complete = function () { - this.scheduleMessage(Notification_1.Notification.createComplete()); + Subscription.prototype.remove = function (subscription) { + var subscriptions = this._subscriptions; + if (subscriptions) { + var subscriptionIndex = subscriptions.indexOf(subscription); + if (subscriptionIndex !== -1) { + subscriptions.splice(subscriptionIndex, 1); + } + } }; - return ObserveOnSubscriber; -}(Subscriber_1.Subscriber)); -exports.ObserveOnSubscriber = ObserveOnSubscriber; -var ObserveOnMessage = (function () { - function ObserveOnMessage(notification, destination) { - this.notification = notification; - this.destination = destination; - } - return ObserveOnMessage; + Subscription.prototype._addParent = function (parent) { + var _a = this, _parent = _a._parent, _parents = _a._parents; + if (!_parent || _parent === parent) { + this._parent = parent; + } + else if (!_parents) { + this._parents = [parent]; + } + else if (_parents.indexOf(parent) === -1) { + _parents.push(parent); + } + }; + Subscription.EMPTY = (function (empty) { + empty.closed = true; + return empty; + }(new Subscription())); + return Subscription; }()); -exports.ObserveOnMessage = ObserveOnMessage; +exports.Subscription = Subscription; +function flattenUnsubscriptionErrors(errors) { + return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []); +} -},{"../Notification":27,"../Subscriber":35}],124:[function(require,module,exports){ +},{"./util/UnsubscriptionError":198,"./util/errorObject":200,"./util/isArray":203,"./util/isFunction":206,"./util/isObject":210,"./util/tryCatch":224}],41:[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 __()); +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; + }, }; -var Subscriber_1 = require('../Subscriber'); -/** - * Groups pairs of consecutive emissions together and emits them as an array of - * two values. - * - * Puts the current value and previous value together as - * an array, and emits that. - * - * - * - * 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 On every click (starting from the second), emit the relative distance to the previous click - * 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>} 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() { + +},{}],42:[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); } - PairwiseOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new PairwiseSubscriber(subscriber)); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - return PairwiseOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var PairwiseSubscriber = (function (_super) { - __extends(PairwiseSubscriber, _super); - function PairwiseSubscriber(destination) { - _super.call(this, destination); - this.hasPrev = false; +})(); +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; } - PairwiseSubscriber.prototype._next = function (value) { - if (this.hasPrev) { - this.destination.next([this.prev, value]); - } - else { - this.hasPrev = true; + 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(); } - this.prev = value; + return this._subject; }; - return PairwiseSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":35}],125:[function(require,module,exports){ -"use strict"; -var map_1 = require('./map'); -/** - * Maps each source value (an object) to its specified nested property. - * - * Like {@link map}, but meant only for picking one of - * the nested properties of every emitted object. - * - * - * - * 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 Map every every click to the tagName of the clicked target element - * 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]; - } - var length = properties.length; - if (length === 0) { - throw new Error('list of properties cannot be empty.'); - } - 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; + 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; } else { - return undefined; + this._connection = connection; } } - return currentProp; + return connection; }; - return mapper; -} - -},{"./map":118}],126:[function(require,module,exports){ -"use strict"; -var Subject_1 = require('../Subject'); -var multicast_1 = require('./multicast'); -/* tslint:disable:max-line-length */ -/** - * 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. - * - * - * - * @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 - */ -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()); -} -exports.publish = publish; - -},{"../Subject":33,"./multicast":122}],127:[function(require,module,exports){ -"use strict"; -var ReplaySubject_1 = require('../ReplaySubject'); -var multicast_1 = require('./multicast'); -/** - * @param bufferSize - * @param windowTime - * @param scheduler - * @return {ConnectableObservable} - * @method publishReplay - * @owner Observable - */ -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)); -} -exports.publishReplay = publishReplay; - -},{"../ReplaySubject":31,"./multicast":122}],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 __()); + ConnectableObservable.prototype.refCount = function () { + return refCount_1.refCount()(this); + }; + return ConnectableObservable; +}(Observable_1.Observable)); +exports.ConnectableObservable = ConnectableObservable; +var connectableProto = ConnectableObservable.prototype; +exports.connectableObservableDescriptor = { + 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 Subscriber_1 = require('../Subscriber'); -/* tslint:disable:max-line-length */ -/** - * Applies an accumulator function over the source Observable, and returns each - * intermediate result, with an optional seed value. - * - * It's like {@link reduce}, but emits the current - * accumulation whenever the source emits a value. - * - * - * - * 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 Count the number of click events - * 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} An observable of the accumulated values. - * @method scan - * @owner Observable - */ -function scan(accumulator, seed) { - var hasSeed = false; - // providing a seed of `undefined` *should* be valid and trigger - // hasSeed! so don't use `seed !== undefined` checks! - // For this reason, we have to check it here at the original call site - // otherwise inside Operator/Subscriber we won't know if `undefined` - // means they didn't provide anything or if they literally provided `undefined` - if (arguments.length >= 2) { - hasSeed = true; - } - return this.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; +var ConnectableSubscriber = (function (_super) { + __extends(ConnectableSubscriber, _super); + function ConnectableSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } - ScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + ConnectableSubscriber.prototype._error = function (err) { + this._unsubscribe(); + _super.prototype._error.call(this, err); }; - 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, hasSeed) { - _super.call(this, destination); - this.accumulator = accumulator; - this._seed = _seed; - this.hasSeed = hasSeed; - this.index = 0; - } - 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); - } + ConnectableSubscriber.prototype._complete = function () { + this.connectable._isComplete = true; + this._unsubscribe(); + _super.prototype._complete.call(this); }; - 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); + 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(); + } } - this.seed = result; - this.destination.next(result); }; - return ScanSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":35}],129:[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(). - * - * - * - * @return {Observable} an Observable that upon connection causes the source Observable to emit items to its Observers - * @method share - * @owner Observable - */ -function share() { - return multicast_1.multicast.call(this, shareSubjectFactory).refCount(); -} -exports.share = share; -; - -},{"../Subject":33,"./multicast":122}],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 Subscriber_1 = require('../Subscriber'); -/** - * Returns an Observable that skips `n` items emitted by an Observable. - * - * - * - * @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 - */ -function skip(total) { - return this.lift(new SkipOperator(total)); -} -exports.skip = skip; -var SkipOperator = (function () { - function SkipOperator(total) { - this.total = total; + return ConnectableSubscriber; +}(Subject_1.SubjectSubscriber)); +var RefCountOperator = (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; } - SkipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipSubscriber(subscriber, this.total)); + 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 SkipOperator; + return RefCountOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var SkipSubscriber = (function (_super) { - __extends(SkipSubscriber, _super); - function SkipSubscriber(destination, total) { - _super.call(this, destination); - this.total = total; - this.count = 0; +var RefCountSubscriber = (function (_super) { + __extends(RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } - SkipSubscriber.prototype._next = function (x) { - if (++this.count > this.total) { - this.destination.next(x); + 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 SkipSubscriber; + return RefCountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],131:[function(require,module,exports){ +},{"../Observable":32,"../Subject":37,"../Subscriber":39,"../Subscription":40,"../operators/refCount":134}],43:[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. - * - * - * - * @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} 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)); +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); } - SkipUntilSubscriber.prototype._next = function (value) { - if (this.hasValue) { - _super.prototype._next.call(this, value); - } + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - SkipUntilSubscriber.prototype._complete = function () { - if (this.isInnerStopped) { - _super.prototype._complete.call(this); +})(); +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; } - else { - this.unsubscribe(); + 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); }; - SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.hasValue = true; + SubscribeOnObservable.dispatch = function (arg) { + var source = arg.source, subscriber = arg.subscriber; + return this.add(source.subscribe(subscriber)); }; - SkipUntilSubscriber.prototype.notifyComplete = function () { - this.isInnerStopped = true; - if (this.isStopped) { - _super.prototype._complete.call(this); - } + 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 SkipUntilSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); + return SubscribeOnObservable; +}(Observable_1.Observable)); +exports.SubscribeOnObservable = SubscribeOnObservable; -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],132:[function(require,module,exports){ +},{"../Observable":32,"../scheduler/asap":187,"../util/isNumeric":209}],44:[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 all items emitted by the source Observable as long as a specified condition holds - * true, but emits all further source items as soon as the condition becomes false. - * - * - * - * @param {Function} predicate - a function to test each item emitted from the source Observable. - * @return {Observable} an Observable that begins emitting items emitted by the source Observable when the - * specified predicate becomes false. - * @method skipWhile - * @owner Observable - */ -function skipWhile(predicate) { - return this.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; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var SkipWhileSubscriber = (function (_super) { - __extends(SkipWhileSubscriber, _super); - function SkipWhileSubscriber(destination, predicate) { - _super.call(this, destination); - this.predicate = predicate; - this.skipping = true; - this.index = 0; - } - SkipWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (this.skipping) { - this.tryCallPredicate(value); +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; } - if (!this.skipping) { - destination.next(value); + 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); + } + }); }; - SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { +} +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 { - var result = this.predicate(value, this.index++); - this.skipping = Boolean(result); + callbackFunc.apply(context, args.concat([handler])); } catch (err) { - this.destination.error(err); + subject.error(err); } - }; - return SkipWhileSubscriber; -}(Subscriber_1.Subscriber)); + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(state) { + var value = state.value, subject = state.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(state) { + var err = state.err, subject = state.subject; + subject.error(err); +} -},{"../Subscriber":35}],133:[function(require,module,exports){ +},{"../AsyncSubject":28,"../Observable":32,"../operators/map":112,"../util/canReportError":199,"../util/isArray":203,"../util/isScheduler":213}],45:[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'); -/* tslint:disable:max-line-length */ -/** - * Returns an Observable that emits the items in a specified Iterable before it begins to emit items emitted by the - * source Observable. - * - * - * - * @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 - */ -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; - } - var len = array.length; - if (len === 1) { - return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this); - } - else if (len > 1) { - return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this); +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); })); + }; + } } - else { - return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this); + 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); } -exports.startWith = startWith; -},{"../observable/ArrayObservable":83,"../observable/EmptyObservable":86,"../observable/ScalarObservable":92,"../util/isScheduler":162,"./concat":107}],134:[function(require,module,exports){ +},{"../AsyncSubject":28,"../Observable":32,"../operators/map":112,"../util/canReportError":199,"../util/isArray":203,"../util/isScheduler":213}],46:[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'); -/* tslint:disable:max-line-length */ -/** - * Projects each source value to an Observable which is merged in the output - * Observable, emitting values only from the most recently projected Observable. - * - * Maps each value to an Observable, then flattens all of - * these inner Observables using {@link switch}. - * - * - * - * 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 Rerun an interval Observable on every click event - * 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 - */ -function switchMap(project, resultSelector) { - return this.lift(new SwitchMapOperator(project, resultSelector)); +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]; + } + 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)); } -exports.switchMap = switchMap; -var SwitchMapOperator = (function () { - function SwitchMapOperator(project, resultSelector) { - this.project = project; +exports.combineLatest = combineLatest; +var CombineLatestOperator = (function () { + function CombineLatestOperator(resultSelector) { this.resultSelector = resultSelector; } - SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector)); + CombineLatestOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); }; - return SwitchMapOperator; + return CombineLatestOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -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; +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; } - 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); + CombineLatestSubscriber.prototype._next = function (observable) { + this.values.push(NONE); + this.observables.push(observable); }; - SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscription = this.innerSubscription; - if (innerSubscription) { - innerSubscription.unsubscribe(); + CombineLatestSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); } - 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); + 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)); + } } }; - 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); + CombineLatestSubscriber.prototype.notifyComplete = function (unused) { + if ((this.active -= 1) === 0) { + this.destination.complete(); } }; - SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (this.resultSelector) { - this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex); - } - else { - this.destination.next(innerValue); + 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()); + } } }; - SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + CombineLatestSubscriber.prototype._tryResultSelector = function (values) { var result; try { - result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); + result = this.resultSelector.apply(this, values); } catch (err) { this.destination.error(err); @@ -11010,15311 +8915,26819 @@ var SwitchMapSubscriber = (function (_super) { } this.destination.next(result); }; - return SwitchMapSubscriber; + return CombineLatestSubscriber; }(OuterSubscriber_1.OuterSubscriber)); +exports.CombineLatestSubscriber = CombineLatestSubscriber; -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],135:[function(require,module,exports){ +},{"../OuterSubscriber":34,"../util/isArray":203,"../util/isScheduler":213,"../util/subscribeToResult":222,"./fromArray":52}],47:[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. - * - * Takes the first `count` values from the source, then - * completes. - * - * - * - * `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 Take the first 5 seconds of an infinite 1-second interval Observable - * 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} 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 - */ -function take(count) { - if (count === 0) { - return new EmptyObservable_1.EmptyObservable(); +Object.defineProperty(exports, "__esModule", { value: true }); +var isScheduler_1 = require("../util/isScheduler"); +var of_1 = require("./of"); +var from_1 = require("./from"); +var concatAll_1 = require("../operators/concatAll"); +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - else { - return this.lift(new TakeOperator(count)); + if (observables.length === 1 || (observables.length === 2 && isScheduler_1.isScheduler(observables[1]))) { + return from_1.from(observables[0]); } + return concatAll_1.concatAll()(of_1.of.apply(void 0, observables)); } -exports.take = take; -var TakeOperator = (function () { - function TakeOperator(total) { - this.total = total; - if (this.total < 0) { - throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError; +exports.concat = concat; + +},{"../operators/concatAll":84,"../util/isScheduler":213,"./from":51,"./of":63}],48:[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(); } + catch (err) { + subscriber.error(err); + return undefined; + } + var source = input ? from_1.from(input) : empty_1.empty(); + return source.subscribe(subscriber); + }); +} +exports.defer = defer; + +},{"../Observable":32,"./empty":49,"./from":51}],49:[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(); }); }); +} +exports.emptyScheduled = emptyScheduled; + +},{"../Observable":32}],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); } - TakeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeSubscriber(subscriber, this.total)); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - 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; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var isArray_1 = require("../util/isArray"); +var empty_1 = require("./empty"); +var subscribeToResult_1 = require("../util/subscribeToResult"); +var OuterSubscriber_1 = require("../OuterSubscriber"); +var map_1 = require("../operators/map"); +function forkJoin() { + var sources = []; + for (var _i = 0; _i < arguments.length; _i++) { + sources[_i] = arguments[_i]; } - 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(); + var resultSelector; + if (typeof sources[sources.length - 1] === 'function') { + resultSelector = sources.pop(); + } + if (sources.length === 1 && isArray_1.isArray(sources[0])) { + sources = sources[0]; + } + if (sources.length === 0) { + return empty_1.EMPTY; + } + if (resultSelector) { + return forkJoin(sources).pipe(map_1.map(function (args) { return resultSelector.apply(void 0, args); })); + } + return new Observable_1.Observable(function (subscriber) { + return new ForkJoinSubscriber(subscriber, sources); + }); +} +exports.forkJoin = forkJoin; +var ForkJoinSubscriber = (function (_super) { + __extends(ForkJoinSubscriber, _super); + function ForkJoinSubscriber(destination, sources) { + var _this = _super.call(this, destination) || this; + _this.sources = sources; + _this.completed = 0; + _this.haveValues = 0; + var len = sources.length; + _this.values = new Array(len); + for (var i = 0; i < len; i++) { + var source = sources[i]; + var innerSubscription = subscribeToResult_1.subscribeToResult(_this, source, null, i); + if (innerSubscription) { + _this.add(innerSubscription); } } + return _this; + } + ForkJoinSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values[outerIndex] = innerValue; + if (!innerSub._hasValue) { + innerSub._hasValue = true; + this.haveValues++; + } }; - return TakeSubscriber; -}(Subscriber_1.Subscriber)); + ForkJoinSubscriber.prototype.notifyComplete = function (innerSub) { + var _a = this, destination = _a.destination, haveValues = _a.haveValues, values = _a.values; + var len = values.length; + if (!innerSub._hasValue) { + destination.complete(); + return; + } + this.completed++; + if (this.completed !== len) { + return; + } + if (haveValues === len) { + destination.next(values); + } + destination.complete(); + }; + return ForkJoinSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); -},{"../Subscriber":35,"../observable/EmptyObservable":86,"../util/ArgumentOutOfRangeError":151}],136:[function(require,module,exports){ +},{"../Observable":32,"../OuterSubscriber":34,"../operators/map":112,"../util/isArray":203,"../util/subscribeToResult":222,"./empty":49}],51:[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. - * - * Lets values pass until a second Observable, - * `notifier`, emits something. Then, it completes. - * - * - * - * `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 Tick every second until the first click happens - * 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} An Observable that emits the values from the source - * Observable until such time as `notifier` emits its first value. - * @method takeUntil - * @owner Observable - */ -function takeUntil(notifier) { - return this.lift(new TakeUntilOperator(notifier)); -} -exports.takeUntil = takeUntil; -var TakeUntilOperator = (function () { - function TakeUntilOperator(notifier) { - this.notifier = notifier; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var isPromise_1 = require("../util/isPromise"); +var isArrayLike_1 = require("../util/isArrayLike"); +var isInteropObservable_1 = require("../util/isInteropObservable"); +var isIterable_1 = require("../util/isIterable"); +var fromArray_1 = require("./fromArray"); +var fromPromise_1 = require("./fromPromise"); +var fromIterable_1 = require("./fromIterable"); +var fromObservable_1 = require("./fromObservable"); +var subscribeTo_1 = require("../util/subscribeTo"); +function from(input, scheduler) { + if (!scheduler) { + if (input instanceof Observable_1.Observable) { + return input; + } + return new Observable_1.Observable(subscribeTo_1.subscribeTo(input)); } - 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)); + if (input != null) { + if (isInteropObservable_1.isInteropObservable(input)) { + return fromObservable_1.fromObservable(input, scheduler); + } + else if (isPromise_1.isPromise(input)) { + return fromPromise_1.fromPromise(input, scheduler); + } + else if (isArrayLike_1.isArrayLike(input)) { + return fromArray_1.fromArray(input, scheduler); + } + else if (isIterable_1.isIterable(input) || typeof input === 'string') { + return fromIterable_1.fromIterable(input, scheduler); + } } - TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.complete(); - }; - TakeUntilSubscriber.prototype.notifyComplete = function () { - // noop - }; - return TakeUntilSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); + throw new TypeError((input !== null && typeof input || input) + ' is not observable'); +} +exports.from = from; -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],137:[function(require,module,exports){ +},{"../Observable":32,"../util/isArrayLike":204,"../util/isInteropObservable":207,"../util/isIterable":208,"../util/isPromise":212,"../util/subscribeTo":217,"./fromArray":52,"./fromIterable":55,"./fromObservable":56,"./fromPromise":57}],52:[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, then ignores subsequent source - * values for `duration` milliseconds, then repeats this process. - * - * Lets a value pass, then ignores source values for the - * next `duration` milliseconds. - * - * - * - * `throttleTime` emits the source Observable values on the output Observable - * when its internal timer is disabled, and ignores source values when the timer - * is enabled. Initially, the timer is disabled. As soon as the first source - * value arrives, it is forwarded to the output Observable, and then the timer - * is enabled. After `duration` milliseconds (or the time unit determined - * internally by the optional `scheduler`) has passed, the timer is disabled, - * and this process repeats for the next source value. Optionally takes a - * {@link IScheduler} for managing timers. - * - * @example Emit clicks at a rate of at most one click per second - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.throttleTime(1000); - * result.subscribe(x => console.log(x)); - * - * @see {@link auditTime} - * @see {@link debounceTime} - * @see {@link delay} - * @see {@link sampleTime} - * @see {@link throttle} - * - * @param {number} duration Time to wait before emitting another value after - * emitting the last value, measured in milliseconds or the time unit determined - * internally by the optional `scheduler`. - * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for - * managing the timers that handle the sampling. - * @return {Observable} An Observable that performs the throttle operation to - * limit the rate of emissions from the source. - * @method throttleTime - * @owner Observable - */ -function throttleTime(duration, scheduler) { - if (scheduler === void 0) { scheduler = async_1.async; } - return this.lift(new ThrottleTimeOperator(duration, scheduler)); -} -exports.throttleTime = throttleTime; -var ThrottleTimeOperator = (function () { - function ThrottleTimeOperator(duration, scheduler) { - this.duration = duration; - this.scheduler = scheduler; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var subscribeToArray_1 = require("../util/subscribeToArray"); +function fromArray(input, scheduler) { + if (!scheduler) { + return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input)); } - ThrottleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler)); - }; - return ThrottleTimeOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var ThrottleTimeSubscriber = (function (_super) { - __extends(ThrottleTimeSubscriber, _super); - function ThrottleTimeSubscriber(destination, duration, scheduler) { - _super.call(this, destination); - this.duration = duration; - this.scheduler = scheduler; + else { + 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; + }); } - ThrottleTimeSubscriber.prototype._next = function (value) { - if (!this.throttled) { - this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); - this.destination.next(value); - } - }; - ThrottleTimeSubscriber.prototype.clearThrottle = function () { - var throttled = this.throttled; - if (throttled) { - throttled.unsubscribe(); - this.remove(throttled); - this.throttled = null; - } - }; - return ThrottleTimeSubscriber; -}(Subscriber_1.Subscriber)); -function dispatchNext(arg) { - var subscriber = arg.subscriber; - subscriber.clearThrottle(); } +exports.fromArray = fromArray; -},{"../Subscriber":35,"../scheduler/async":145}],138:[function(require,module,exports){ +},{"../Observable":32,"../Subscription":40,"../util/subscribeToArray":218}],53:[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'); -/* tslint:disable:max-line-length */ -/** - * 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. - * - * 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. - * - * - * - * `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 On every click event, emit an array with the latest timer event plus the click event - * 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 - */ -function withLatestFrom() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; +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 = Object.prototype.toString; +function fromEvent(target, eventName, options, resultSelector) { + if (isFunction_1.isFunction(options)) { + resultSelector = options; + options = undefined; } - var project; - if (typeof args[args.length - 1] === 'function') { - project = args.pop(); + 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); })); } - var observables = args; - return this.lift(new WithLatestFromOperator(observables, project)); + 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.withLatestFrom = withLatestFrom; -var WithLatestFromOperator = (function () { - function WithLatestFromOperator(observables, project) { - this.observables = observables; - this.project = project; +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); }; } - 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} - */ -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)); - } + else if (isJQueryStyleEventEmitter(sourceObj)) { + var source_2 = sourceObj; + sourceObj.on(eventName, handler); + unsubscribe = function () { return source_2.off(eventName, handler); }; } - 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); - } + else if (isNodeStyleEventEmitter(sourceObj)) { + var source_3 = sourceObj; + sourceObj.addListener(eventName, handler); + unsubscribe = function () { return source_3.removeListener(eventName, handler); }; + } + else if (sourceObj && sourceObj.length) { + for (var i = 0, len = sourceObj.length; i < len; i++) { + setupSubscription(sourceObj[i], eventName, handler, subscriber, options); } - }; - 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); + } + else { + throw new TypeError('Invalid event target'); + } + 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'; +} + +},{"../Observable":32,"../operators/map":112,"../util/isArray":203,"../util/isFunction":206}],54:[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]; } - } - }; - WithLatestFromSubscriber.prototype._tryProject = function (args) { - var result; + return subscriber.next(e.length === 1 ? e[0] : e); + }; + var retValue; try { - result = this.project.apply(this, args); + retValue = addHandler(handler); } catch (err) { - this.destination.error(err); - return; + subscriber.error(err); + return undefined; } - this.destination.next(result); - }; - return WithLatestFromSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); + if (!isFunction_1.isFunction(removeHandler)) { + return undefined; + } + return function () { return removeHandler(handler, retValue); }; + }); +} +exports.fromEventPattern = fromEventPattern; -},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],139:[function(require,module,exports){ +},{"../Observable":32,"../operators/map":112,"../util/isArray":203,"../util/isFunction":206}],55:[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'); -/* tslint:disable:max-line-length */ -/** - * @param observables - * @return {Observable} - * @method zip - * @owner Observable - */ -function zipProto() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var iterator_1 = require("../symbol/iterator"); +var subscribeToIterable_1 = require("../util/subscribeToIterable"); +function fromIterable(input, scheduler) { + if (!input) { + throw new Error('Iterable cannot be null'); + } + if (!scheduler) { + return new Observable_1.Observable(subscribeToIterable_1.subscribeToIterable(input)); + } + else { + 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; + }); } - return this.lift.call(zipStatic.apply(void 0, [this].concat(observables))); } -exports.zipProto = zipProto; -/* tslint:enable:max-line-length */ -/** - * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each - * of its input Observables. - * - * If the latest parameter is a function, this function is used to compute the created value from the input values. - * Otherwise, an array of the input values is returned. - * - * @example Combine age and name from different sources - * - * let age$ = Observable.of(27, 25, 29); - * let name$ = Observable.of('Foo', 'Bar', 'Beer'); - * let isDev$ = Observable.of(true, true, false); - * - * Observable - * .zip(age$, - * name$, - * isDev$, - * (age: number, name: string, isDev: boolean) => ({ age, name, isDev })) - * .subscribe(x => console.log(x)); - * - * // outputs - * // { age: 7, name: 'Foo', isDev: true } - * // { age: 5, name: 'Bar', isDev: true } - * // { age: 9, name: 'Beer', isDev: false } - * - * @param observables - * @return {Observable} - * @static true - * @name zip - * @owner Observable - */ -function zipStatic() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; +exports.fromIterable = fromIterable; + +},{"../Observable":32,"../Subscription":40,"../symbol/iterator":190,"../util/subscribeToIterable":219}],56:[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"); +var subscribeToObservable_1 = require("../util/subscribeToObservable"); +function fromObservable(input, scheduler) { + if (!scheduler) { + return new Observable_1.Observable(subscribeToObservable_1.subscribeToObservable(input)); } - var project = observables[observables.length - 1]; - if (typeof project === 'function') { - observables.pop(); + else { + 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; + }); } - return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project)); } -exports.zipStatic = zipStatic; -var ZipOperator = (function () { - function ZipOperator(project) { - this.project = project; +exports.fromObservable = fromObservable; + +},{"../Observable":32,"../Subscription":40,"../symbol/observable":191,"../util/subscribeToObservable":220}],57:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var subscribeToPromise_1 = require("../util/subscribeToPromise"); +function fromPromise(input, scheduler) { + if (!scheduler) { + return new Observable_1.Observable(subscribeToPromise_1.subscribeToPromise(input)); } - 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.iterators = []; - this.active = 0; - this.project = (typeof project === 'function') ? project : null; - this.values = values; + else { + 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; + }); } - ZipSubscriber.prototype._next = function (value) { - var iterators = this.iterators; - 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)); - } - }; - 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 - } +} +exports.fromPromise = fromPromise; + +},{"../Observable":32,"../Subscription":40,"../util/subscribeToPromise":221}],58:[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 + }); } - }; - 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; + do { + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + if (!conditionResult) { + subscriber.complete(); + break; + } } - } - 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; + var value = void 0; + try { + value = resultSelector(state); } - if (result.done) { - destination.complete(); - return; + catch (err) { + subscriber.error(err); + return undefined; } - args.push(result.value); - } - if (this.project) { - this._tryProject(args); - } - else { - destination.next(args); + 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); } - if (shouldComplete) { - destination.complete(); + catch (err) { + subscriber.error(err); + return undefined; } - }; - ZipSubscriber.prototype._tryProject = function (args) { - var result; + } + else { + state.needIterate = true; + } + if (condition) { + var conditionResult = void 0; try { - result = this.project.apply(this, args); + conditionResult = condition(state.state); } catch (err) { - this.destination.error(err); - return; + subscriber.error(err); + return undefined; + } + if (!conditionResult) { + subscriber.complete(); + return undefined; + } + if (subscriber.closed) { + return undefined; } - 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(); } - 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; + var value; + try { + value = state.resultSelector(state.state); } - 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) { - _super.call(this, destination); - this.parent = parent; - this.observable = observable; - this.stillUnsubscribed = true; - this.buffer = []; - this.isComplete = false; + catch (err) { + subscriber.error(err); + return undefined; } - 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 }; + if (subscriber.closed) { + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { + return undefined; + } + return this.schedule(state); +} + +},{"../Observable":32,"../util/identity":202,"../util/isScheduler":213}],59:[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; + +},{"./defer":48,"./empty":49}],60:[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; + }); +} +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); +} + +},{"../Observable":32,"../scheduler/async":188,"../util/isNumeric":209}],61:[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; + +},{"../Observable":32,"../operators/mergeAll":117,"../util/isScheduler":213,"./fromArray":52}],62:[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; + +},{"../Observable":32,"../util/noop":214}],63:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var isScheduler_1 = require("../util/isScheduler"); +var fromArray_1 = require("./fromArray"); +var empty_1 = require("./empty"); +var scalar_1 = require("./scalar"); +function of() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var scheduler = args[args.length - 1]; + if (isScheduler_1.isScheduler(scheduler)) { + args.pop(); + } + else { + scheduler = undefined; + } + switch (args.length) { + case 0: + return empty_1.empty(scheduler); + case 1: + return scheduler ? fromArray_1.fromArray(args, scheduler) : scalar_1.scalar(args[0]); + default: + return fromArray_1.fromArray(args, scheduler); + } +} +exports.of = of; + +},{"../util/isScheduler":213,"./empty":49,"./fromArray":52,"./scalar":68}],64:[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; + +},{"../Observable":32,"../util/isArray":203,"./empty":49,"./from":51}],65:[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 })); } else { - return { value: buffer.shift(), done: false }; + subscriber.complete(); } + } +} +exports.dispatch = dispatch; + +},{"../Observable":32,"../Subscription":40}],66:[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 __()); }; - ZipBufferIterator.prototype.hasValue = function () { - return this.buffer.length > 0; +})(); +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]; + } + } + return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator()); +} +exports.race = race; +var RaceOperator = (function () { + function RaceOperator() { + } + RaceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RaceSubscriber(subscriber)); }; - ZipBufferIterator.prototype.hasCompleted = function () { - return this.buffer.length === 0 && this.isComplete; + 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); }; - ZipBufferIterator.prototype.notifyComplete = function () { - if (this.buffer.length > 0) { - this.isComplete = true; - this.parent.notifyInactive(); + RaceSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); } else { - this.destination.complete(); + 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; } }; - 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":83,"../symbol/iterator":147,"../util/isArray":157,"../util/subscribeToResult":164}],140:[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 extends Subscription { - * new (scheduler: Scheduler, work: (state?: T) => void); - * schedule(state?: T, delay: number = 0): Subscription; - * } - * ``` - * - * @class Action - */ -var Action = (function (_super) { - __extends(Action, _super); - function Action(scheduler, work) { - _super.call(this); - } - /** - * 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}],141:[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 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":163,"./Action":140}],142:[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(); + 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); + } } - throw error; + this.subscriptions = null; } + this.destination.next(innerValue); }; - return AsyncScheduler; -}(Scheduler_1.Scheduler)); -exports.AsyncScheduler = AsyncScheduler; + return RaceSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.RaceSubscriber = RaceSubscriber; -},{"../Scheduler":32}],143:[function(require,module,exports){ +},{"../OuterSubscriber":34,"../util/isArray":203,"../util/subscribeToResult":222,"./fromArray":52}],67:[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 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); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +function range(start, count, scheduler) { + if (start === void 0) { start = 0; } + if (count === void 0) { count = 0; } + return new Observable_1.Observable(function (subscriber) { + var index = 0; + var current = start; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + index: index, count: count, start: start, subscriber: subscriber + }); } - 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 exists and is greater than 0, or if the delay is null (the - // action wasn't rescheduled) but was originally scheduled as an async - // action, then recycle as an async action. - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + else { + do { + if (index++ >= count) { + subscriber.complete(); + break; + } + subscriber.next(current++); + if (subscriber.closed) { + break; + } + } while (true); } - // Otherwise flush the scheduler starting with this action. - return scheduler.flush(this); - }; - return QueueAction; -}(AsyncAction_1.AsyncAction)); -exports.QueueAction = QueueAction; - -},{"./AsyncAction":141}],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 __()); -}; -var AsyncScheduler_1 = require('./AsyncScheduler'); -var QueueScheduler = (function (_super) { - __extends(QueueScheduler, _super); - function QueueScheduler() { - _super.apply(this, arguments); + 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 QueueScheduler; -}(AsyncScheduler_1.AsyncScheduler)); -exports.QueueScheduler = QueueScheduler; - -},{"./AsyncScheduler":142}],145:[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); + subscriber.next(start); + if (subscriber.closed) { + return; + } + state.index = index + 1; + state.start = start + 1; + this.schedule(state); +} +exports.dispatch = dispatch; -},{"./AsyncAction":141,"./AsyncScheduler":142}],146:[function(require,module,exports){ +},{"../Observable":32}],68:[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); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +function scalar(value) { + var result = new Observable_1.Observable(function (subscriber) { + subscriber.next(value); + subscriber.complete(); + }); + result._isScalar = true; + result.value = value; + return result; +} +exports.scalar = scalar; -},{"./QueueAction":143,"./QueueScheduler":144}],147:[function(require,module,exports){ +},{"../Observable":32}],69:[function(require,module,exports){ "use strict"; -var root_1 = require('../util/root'); -function symbolIteratorPonyfill(root) { - var Symbol = root.Symbol; - if (typeof Symbol === 'function') { - if (!Symbol.iterator) { - Symbol.iterator = Symbol('iterator polyfill'); - } - return Symbol.iterator; +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); }); } else { - // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC) - var Set_1 = root.Set; - if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') { - return '@@iterator'; - } - var Map_1 = root.Map; - // required for compatability with es6-shim - if (Map_1) { - var keys = Object.getOwnPropertyNames(Map_1.prototype); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal. - if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) { - return key; - } - } - } - return '@@iterator'; + return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); } } -exports.symbolIteratorPonyfill = symbolIteratorPonyfill; -exports.$$iterator = symbolIteratorPonyfill(root_1.root); +exports.throwError = throwError; +function dispatch(_a) { + var error = _a.error, subscriber = _a.subscriber; + subscriber.error(error); +} -},{"../util/root":163}],148:[function(require,module,exports){ +},{"../Observable":32}],70:[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; - } +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 + }); + }); +} +exports.timer = timer; +function dispatch(state) { + var index = state.index, period = state.period, subscriber = state.subscriber; + subscriber.next(index); + if (subscriber.closed) { + return; } - else { - $$observable = '@@observable'; + else if (period === -1) { + return subscriber.complete(); } - return $$observable; + state.index = index + 1; + this.schedule(state, period); } -exports.getSymbolObservable = getSymbolObservable; -exports.$$observable = getSymbolObservable(root_1.root); -},{"../util/root":163}],149:[function(require,module,exports){ +},{"../Observable":32,"../scheduler/async":188,"../util/isNumeric":209,"../util/isScheduler":213}],71:[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'; - -},{"../util/root":163}],150:[function(require,module,exports){ -"use strict"; -var root_1 = require('./root'); -var RequestAnimationFrameDefinition = (function () { - function RequestAnimationFrameDefinition(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); +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(); } - else if (root.msRequestAnimationFrame) { - this.cancelAnimationFrame = root.msCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.msRequestAnimationFrame.bind(root); + catch (err) { + subscriber.error(err); + return undefined; } - else if (root.oRequestAnimationFrame) { - this.cancelAnimationFrame = root.oCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.oRequestAnimationFrame.bind(root); + var result; + try { + result = observableFactory(resource); } - else { - this.cancelAnimationFrame = root.clearTimeout.bind(root); - this.requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); }; + catch (err) { + subscriber.error(err); + return undefined; } - } - return RequestAnimationFrameDefinition; -}()); -exports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition; -exports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root); - -},{"./root":163}],151:[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; - -},{}],152:[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; - -},{}],153:[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; - -},{}],154:[function(require,module,exports){ -"use strict"; -var root_1 = require('./root'); -function minimalSetImpl() { - // THIS IS NOT a full impl of Set, this is just the minimum - // bits of functionality we need for this library. - return (function () { - function MinimalSet() { - this._values = []; - } - MinimalSet.prototype.add = function (value) { - if (!this.has(value)) { - this._values.push(value); + var source = result ? from_1.from(result) : empty_1.EMPTY; + var subscription = source.subscribe(subscriber); + return function () { + subscription.unsubscribe(); + if (resource) { + resource.unsubscribe(); } }; - MinimalSet.prototype.has = function (value) { - return this._values.indexOf(value) !== -1; - }; - Object.defineProperty(MinimalSet.prototype, "size", { - get: function () { - return this._values.length; - }, - enumerable: true, - configurable: true - }); - MinimalSet.prototype.clear = function () { - this._values.length = 0; - }; - return MinimalSet; - }()); -} -exports.minimalSetImpl = minimalSetImpl; -exports.Set = root_1.root.Set || minimalSetImpl(); - -},{"./root":163}],155:[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; - -},{}],156:[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: {} }; - -},{}],157:[function(require,module,exports){ -"use strict"; -exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); - -},{}],158:[function(require,module,exports){ -"use strict"; -function isDate(value) { - return value instanceof Date && !isNaN(+value); -} -exports.isDate = isDate; - -},{}],159:[function(require,module,exports){ -"use strict"; -function isFunction(x) { - return typeof x === 'function'; -} -exports.isFunction = isFunction; - -},{}],160:[function(require,module,exports){ -"use strict"; -function isObject(x) { - return x != null && typeof x === 'object'; -} -exports.isObject = isObject; - -},{}],161:[function(require,module,exports){ -"use strict"; -function isPromise(value) { - return value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; -} -exports.isPromise = isPromise; - -},{}],162:[function(require,module,exports){ -"use strict"; -function isScheduler(value) { - return value && typeof value.schedule === 'function'; + }); } -exports.isScheduler = isScheduler; +exports.using = using; -},{}],163:[function(require,module,exports){ -(function (global){ +},{"../Observable":32,"./empty":49,"./from":51}],72:[function(require,module,exports){ "use strict"; -/** - * window: browser in DOM main thread - * self: browser in WebWorker - * global: Node.js/other - */ -exports.root = (typeof window == 'object' && window.window === window && window - || typeof self == 'object' && self.self === self && self - || typeof global == 'object' && global.global === global && global); -if (!exports.root) { - throw new Error('RxJS could not find any global context (window, self, global)'); +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]; + } + var resultSelector = observables[observables.length - 1]; + if (typeof resultSelector === 'function') { + observables.pop(); + } + return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector)); } - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],164:[function(require,module,exports){ -"use strict"; -var root_1 = require('./root'); -var isArray_1 = require('./isArray'); -var isPromise_1 = require('./isPromise'); -var isObject_1 = require('./isObject'); -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; +exports.zip = zip; +var ZipOperator = (function () { + function ZipOperator(resultSelector) { + this.resultSelector = resultSelector; } - if (result instanceof Observable_1.Observable) { - if (result._isScalar) { - destination.next(result.value); - destination.complete(); - return null; + 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)); + } + else if (typeof value[iterator_1.iterator] === 'function') { + iterators.push(new StaticIterator(value[iterator_1.iterator]())); } else { - return result.subscribe(destination); + iterators.push(new ZipBufferIterator(this.destination, this, value)); } - } - else if (isArray_1.isArray(result)) { - for (var i = 0, len = result.length; i < len && !destination.closed; i++) { - destination.next(result[i]); + }; + ZipSubscriber.prototype._complete = function () { + var iterators = this.iterators; + var len = iterators.length; + this.unsubscribe(); + if (len === 0) { + this.destination.complete(); + return; } - if (!destination.closed) { - destination.complete(); + 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 if (isPromise_1.isPromise(result)) { - result.then(function (value) { - if (!destination.closed) { - destination.next(value); - destination.complete(); + }; + 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; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { + return; } - }, 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 (result && typeof result[iterator_1.$$iterator] === 'function') { - var iterator = result[iterator_1.$$iterator](); - do { - var item = iterator.next(); - if (item.done) { - destination.complete(); - break; + } + 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; } - destination.next(item.value); - if (destination.closed) { - break; + if (result.done) { + destination.complete(); + return; } - } while (true); - } - else if (result && typeof result[observable_1.$$observable] === 'function') { - var obs = result[observable_1.$$observable](); - if (typeof obs.subscribe !== 'function') { - destination.error(new TypeError('Provided object does not correctly implement Symbol.observable')); + args.push(result.value); + } + if (this.resultSelector) { + this._tryresultSelector(args); } else { - return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex)); + destination.next(args); } - } - 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.'; - destination.error(new TypeError(msg)); - } - return null; -} -exports.subscribeToResult = subscribeToResult; - -},{"../InnerSubscriber":26,"../Observable":28,"../symbol/iterator":147,"../symbol/observable":148,"./isArray":157,"./isObject":160,"./isPromise":161,"./root":163}],165:[function(require,module,exports){ -"use strict"; -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 (shouldComplete) { + destination.complete(); } - if (nextOrObserver[rxSubscriber_1.$$rxSubscriber]) { - return nextOrObserver[rxSubscriber_1.$$rxSubscriber](); + }; + 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(); } - if (!nextOrObserver && !error && !complete) { - return new Subscriber_1.Subscriber(Observer_1.empty); - } - return new Subscriber_1.Subscriber(nextOrObserver, error, complete); -} -exports.toSubscriber = toSubscriber; - -},{"../Observer":29,"../Subscriber":35,"../symbol/rxSubscriber":149}],166:[function(require,module,exports){ -"use strict"; -var errorObject_1 = require('./errorObject'); -var tryCatchTarget; -function tryCatcher() { - try { - return tryCatchTarget.apply(this, arguments); + 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; } - catch (e) { - errorObject_1.errorObject.e = e; - return errorObject_1.errorObject; + 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; } -} -function tryCatch(fn) { - tryCatchTarget = fn; - return tryCatcher; -} -exports.tryCatch = tryCatch; -; - -},{"./errorObject":156}],167:[function(require,module,exports){ -// threejs.org/license -(function(l,oa){"object"===typeof exports&&"undefined"!==typeof module?oa(exports):"function"===typeof define&&define.amd?define(["exports"],oa):oa(l.THREE=l.THREE||{})})(this,function(l){function oa(){}function C(a,b){this.x=a||0;this.y=b||0}function ea(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:Oe++});this.uuid=Q.generateUUID();this.name="";this.image=void 0!==a?a:ea.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ea.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 C(0,0);this.repeat=new C(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=Q.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 ea(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 da(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 H(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);0= -d||0 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")); -z.compileShader(P);z.compileShader(R);z.attachShader(O,P);z.attachShader(O,R);z.linkProgram(O);K=O;t=z.getAttribLocation(K,"position");v=z.getAttribLocation(K,"uv");c=z.getUniformLocation(K,"uvOffset");d=z.getUniformLocation(K,"uvScale");e=z.getUniformLocation(K,"rotation");f=z.getUniformLocation(K,"scale");g=z.getUniformLocation(K,"color");h=z.getUniformLocation(K,"map");k=z.getUniformLocation(K,"opacity");m=z.getUniformLocation(K,"modelViewMatrix");x=z.getUniformLocation(K,"projectionMatrix");p= -z.getUniformLocation(K,"fogType");n=z.getUniformLocation(K,"fogDensity");r=z.getUniformLocation(K,"fogNear");w=z.getUniformLocation(K,"fogFar");l=z.getUniformLocation(K,"fogColor");F=z.getUniformLocation(K,"alphaTest");O=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");O.width=8;O.height=8;P=O.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);la=new ea(O);la.needsUpdate=!0}z.useProgram(K);A.initAttributes();A.enableAttribute(t);A.enableAttribute(v);A.disableUnusedAttributes(); -A.disable(z.CULL_FACE);A.enable(z.BLEND);z.bindBuffer(z.ARRAY_BUFFER,I);z.vertexAttribPointer(t,2,z.FLOAT,!1,16,0);z.vertexAttribPointer(v,2,z.FLOAT,!1,16,8);z.bindBuffer(z.ELEMENT_ARRAY_BUFFER,E);z.uniformMatrix4fv(x,!1,Na.projectionMatrix.elements);A.activeTexture(z.TEXTURE0);z.uniform1i(h,0);P=O=0;(R=q.fog)?(z.uniform3f(l,R.color.r,R.color.g,R.color.b),R.isFog?(z.uniform1f(r,R.near),z.uniform1f(w,R.far),z.uniform1i(p,1),P=O=1):R.isFogExp2&&(z.uniform1f(n,R.density),z.uniform1i(p,2),P=O=2)):(z.uniform1i(p, -0),P=O=0);for(var R=0,T=b.length;R/g,function(a,c){var d=Z[c];if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Md(d)})}function De(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 zf(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 x="ENVMAP_TYPE_CUBE",p="ENVMAP_MODE_REFLECTION",n="ENVMAP_BLENDING_MULTIPLY";if(d.envMap){switch(c.envMap.mapping){case 301:case 302:x="ENVMAP_TYPE_CUBE";break;case 306:case 307:x="ENVMAP_TYPE_CUBE_UV"; -break;case 303:case 304:x="ENVMAP_TYPE_EQUIREC";break;case 305:x="ENVMAP_TYPE_SPHERE"}switch(c.envMap.mapping){case 302:case 304:p="ENVMAP_MODE_REFRACTION"}switch(c.combine){case 0:n="ENVMAP_BLENDING_MULTIPLY";break;case 1:n="ENVMAP_BLENDING_MIX";break;case 2:n="ENVMAP_BLENDING_ADD"}}var r=0b||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 Q.isPowerOfTwo(a.width)&&Q.isPowerOfTwo(a.height)}function m(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function x(b){b=b.target;b.removeEventListener("dispose",x);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 p(b){b=b.target; -b.removeEventListener("dispose",p);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.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 n(b, -g){var m=d.get(b);if(0w;w++)l[w]=n||p?p?b.image[w].image:b.image[w]:h(b.image[w],e.maxCubemapSize);var u=k(l[0]),t=f(b.format),ca=f(b.type);r(a.TEXTURE_CUBE_MAP,b,u);for(w=0;6>w;w++)if(n)for(var y,C=l[w].mipmaps,D=0,O=C.length;Dm;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=!0===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);n(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(),u(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),u(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 Ff(){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 Gf(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=ma.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+ma.maxTextures);ea+=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);va.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);va.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?va.setTextureCube(b,c):va.setTextureCubeDynamic(b,c)}}();this.getCurrentRenderTarget=function(){return V};this.setRenderTarget=function(a){(V=a)&&void 0===ha.get(a).__webglFramebuffer&&va.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ha.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,X.copy(a.scissor),Ta=a.scissorTest,Z.copy(a.viewport)):(c=null,X.copy(fa).multiplyScalar(Sa),Ta= -ka,Z.copy(ia).multiplyScalar(Sa));S!==c&&(B.bindFramebuffer(B.FRAMEBUFFER,c),S=c);Y.scissor(X);Y.setScissorTest(Ta);Y.viewport(Z);b&&(b=ha.get(a.texture),B.framebufferTexture2D(B.FRAMEBUFFER,B.COLOR_ATTACHMENT0,B.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=ha.get(a).__webglFramebuffer; -if(g){var h=!1;g!==S&&(B.bindFramebuffer(B.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&t(m)!==B.getParameter(B.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||t(n)===B.getParameter(B.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ja.get("OES_texture_float")||ja.get("WEBGL_color_buffer_float"))||1016===n&&ja.get("EXT_color_buffer_half_float")?B.checkFramebufferStatus(B.FRAMEBUFFER)=== -B.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&B.readPixels(b,c,d,e,t(m),t(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&&B.bindFramebuffer(B.FRAMEBUFFER,S)}}}}}function Ib(a,b){this.name="";this.color=new N(a);this.density=void 0!==b?b:2.5E-4}function Jb(a, -b,c){this.name="";this.color=new N(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function jb(){G.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Od(a,b,c,d,e){G.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){W.call(this);this.type="SpriteMaterial";this.color=new N(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)} -function zc(a){G.call(this);this.type="Sprite";this.material=void 0!==a?a:new kb}function Ac(){G.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function hd(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new H;a=a||[];this.bones=a.slice(0);this.useVertexTexture?(a=Math.sqrt(4*this.bones.length),a=Q.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 db(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.HAVE_CURRENT_DATA&&(x.needsUpdate=!0)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var x=this;m()}function Lb(a,b,c,d,e,f,g,h,k,m,x,p){ea.call(this,null,f,g,h,k,m,d,e,x,p);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function ld(a,b,c,d,e,f,g,h,k){ea.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Cc(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");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);ea.call(this,null,d,e,f,g,h,m,c,k);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 Mb(a){function b(a,b){return a-b}D.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;ap;p++){c[0]=x[e[p]];c[1]=x[e[(p+1)%3]];c.sort(b);var n=c.toString();void 0===d[n]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;ap;p++)d=f[k[2*a+p]],h=6*a+3*p,c[h+0]=d.x,c[h+1]=d.y,c[h+2]=d.z;this.addAttribute("position",new y(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(x= -e.length;gp;p++)c[0]=m[a+p],c[1]=m[a+(p+1)%3],c.sort(b),n=c.toString(),void 0===d[n]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;ap;p++)h=6*a+3*p,d=k[2*a+p],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;ap;p++)h=18*a+6*p,k=9*a+3*p,c[h+0]=f[k],c[h+1]=f[k+1],c[h+2]=f[k+ -2],d=9*a+(p+1)%3*3,c[h+3]=f[d],c[h+4]=f[d+1],c[h+5]=f[d+2];this.addAttribute("position",new y(c,3))}}function Nb(a,b,c){D.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f,g,h,k,m,x=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 p;for(f=0;fd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}D.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;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new X(h,3));this.addAttribute("normal",new X(h.slice(),3));this.addAttribute("uv",new X(k,2));this.normalizeNormals();this.boundingSphere= -new Fa(new q,c)}function Ob(a,b){xa.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 Ec(a,b){S.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function lb(a,b){xa.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 Fc(a,b){S.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new lb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;xa.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 Gc(a,b){S.call(this);this.type="IcosahedronGeometry";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,d=1/c;xa.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 Hc(a,b){S.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Ic(a,b,c,d){S.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b, -radius:c,detail:d};this.fromBufferGeometry(new xa(a,b,c,d));this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(p=0;p<=d;p++){var x=p/d*Math.PI*2,l=Math.sin(x),x=-Math.cos(x);k.x=x*m.x+l*e.x;k.y=x*m.y+l*e.y;k.z=x*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;n.push(h.x,h.y,h.z)}}D.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 C,x,p,n=[],r=[],l=[],u=[];for(x=0;xn;n++){e[0]=p[g[n]];e[1]=p[g[(n+1)%3]];e.sort(c);var r=e.toString();void 0===f[r]?f[r]={vert1:e[0],vert2:e[1],face1:m,face2:void 0}:f[r].face2=m}e=[];for(r in f)if(g=f[r],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 X(e,3))}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f,k,n=new C,p=new q,l=0,x=!0=== -c?a:b,M=!0===c?1:-1;f=t;for(e=1;e<=d;e++)w.setXYZ(t,0,z*M,0),u.setXYZ(t,0,M,0),n.x=.5,n.y=.5,F.setXY(t,n.x,n.y),t++;k=t;for(e=0;e<=d;e++){var y=e/d*h+g,D=Math.cos(y),y=Math.sin(y);p.x=x*y;p.y=z*M;p.z=x*D;w.setXYZ(t,p.x,p.y,p.z);u.setXYZ(t,0,M,0);n.x=.5*D+.5;n.y=.5*y*M+.5;F.setXY(t,n.x,n.y);t++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Ad(a){this.manager= -void 0!==a?a:va;this.textures={}}function Sd(a){this.manager=void 0!==a?a:va}function wb(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function Td(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:va;this.withCredentials=!1}function Fe(a){this.manager=void 0!==a?a:va;this.texturePath=""}function wa(){}function Qa(a,b){this.v1=a;this.v2=b}function Yc(){this.curves= -[];this.autoClose=!1}function Xa(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(){Zc.apply(this,arguments);this.holes=[]}function Zc(a){Yc.call(this);this.currentPoint=new C;a&&this.fromPoints(a)}function Ud(){this.subPaths=[];this.currentPath= -null}function Vd(a){this.data=a}function Ge(a){this.manager=void 0!==a?a:va}function Wd(a){this.manager=void 0!==a?a:va}function Xd(a,b,c,d){na.call(this,a,b);this.type="RectAreaLight";this.position.set(0,1,0);this.updateMatrix();this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function He(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Ha;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Ha;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate= -!1}function Bd(a,b,c){G.call(this);this.type="CubeCamera";var d=new Ha(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new q(1,0,0));this.add(d);var e=new Ha(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new q(-1,0,0));this.add(e);var f=new Ha(90,1,a,b);f.up.set(0,0,1);f.lookAt(new q(0,1,0));this.add(f);var g=new Ha(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new q(0,-1,0));this.add(g);var h=new Ha(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new q(0,0,1));this.add(h);var k=new Ha(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,n=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=n;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function Yd(){G.call(this); -this.type="AudioListener";this.context=Zd.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function ec(a){G.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function $d(a){ec.call(this,a);this.panner= -this.context.createPanner();this.panner.connect(this.gain)}function ae(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 Cd(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 ka(a,b,c){this.path=b;this.parsedPath=c||ka.parseTrackName(b);this.node=ka.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function be(a){this.uuid=Q.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 ce(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 de(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Dd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Bb(){D.call(this); -this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function ee(a,b,c,d){this.uuid=Q.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function fc(a,b){this.uuid=Q.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.onUploadCallback=function(){};this.version=0}function gc(a,b,c){fc.call(this,a,b);this.meshPerAttribute=c||1}function hc(a,b,c){y.call(this,a,b);this.meshPerAttribute= -c||1}function fe(a,b,c,d){this.ray=new bb(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 Ie(a,b){return a.distance-b.distance}function ge(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;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 X(b,3));b=new ia({fog:!1});this.cone=new fa(a,b);this.add(this.cone);this.update()}function jc(a){this.bones=this.getBoneList(a);for(var b=new D,c=[],d=[],e=new N(0,0,1),f=new N(0,1,0),g=0;ga?-1:0e;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)},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*Q.DEG2RAD},radToDeg:function(a){return a*Q.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}};C.prototype={constructor:C, -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 C,b=new C);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&&console.warn("THREE.Vector2: offset has been removed from .fromAttribute().");this.x=a.getX(b);this.y=a.getY(b);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}};var Oe=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;ea.prototype={constructor:ea,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=Q.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=2048a.x||1a.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||1a.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(ea.prototype, -oa.prototype);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&&console.warn("THREE.Vector4: offset has been removed from .fromAttribute().");this.x=a.getX(b); -this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}};Object.assign(Db.prototype,oa.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;da.prototype={constructor:da,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;0f&&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(da,{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],p=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==l||m!==p){f=1-g;var n=h*d+k*l+m*p+c*e,r=0<= -n?1:-1,w=1-n*n;w>Number.EPSILON&&(w=Math.sqrt(w),n=Math.atan2(w,n*r),f=Math.sin(f*n)/w,g=Math.sin(g*n)/w);r*=g;h=h*f+d*r;k=k*f+l*r;m=m*f+p*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 da);return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new da);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 H);a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new H); -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(Q.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},setFromCylindrical:function(a){this.x= -a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*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&&console.warn("THREE.Vector3: offset has been removed from .fromAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}}; -H.prototype={constructor:H,isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,l,p,n,r,w,u){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]=p;q[3]=n;q[7]=r;q[11]=w;q[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 H).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],p=c[9],n=c[13],r=c[2],w=c[6],u=c[10],q=c[14],t=c[3],v=c[7],M=c[11],c=c[15],z=d[0],A=d[4],I=d[8],E=d[12],K=d[1],y=d[5],J=d[9],C=d[13],D=d[2],G=d[6], -H=d[10],O=d[14],P=d[3],R=d[7],T=d[11],d=d[15];e[0]=f*z+g*K+h*D+k*P;e[4]=f*A+g*y+h*G+k*R;e[8]=f*I+g*J+h*H+k*T;e[12]=f*E+g*C+h*O+k*d;e[1]=m*z+l*K+p*D+n*P;e[5]=m*A+l*y+p*G+n*R;e[9]=m*I+l*J+p*H+n*T;e[13]=m*E+l*C+p*O+n*d;e[2]=r*z+w*K+u*D+q*P;e[6]=r*A+w*y+u*G+q*R;e[10]=r*I+w*J+u*H+q*T;e[14]=r*E+w*C+u*O+q*d;e[3]=t*z+v*K+M*D+c*P;e[7]=t*A+v*y+M*G+c*R;e[11]=t*I+v*J+M*H+c*T;e[15]=t*E+v*C+M*O+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;ethis.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(Q.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}};Za.prototype=Object.create(ea.prototype);Za.prototype.constructor=Za;Za.prototype.isCubeTexture=!0;Object.defineProperty(Za.prototype, -"images",{get:function(){return this.image},set:function(a){this.image=a}});var se=new ea,te=new Za,pe=[],re=[];xe.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 Id=/([\w\d_]+)(\])?(\[|\.)?/g;$a.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};$a.prototype.set=function(a,b,c){var d=this.map[c];void 0!==d&&d.setValue(a,b[c],this.renderer)};$a.prototype.setOptional=function(a,b,c){b=b[c]; -void 0!==b&&this.setValue(a,c,b)};$a.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)}};$a.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 Ja={merge:function(a){for(var b={},c=0;c 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}\nvec2 ltcTextureCoords( const in GeometricContext geometry, 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\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\n\tint config = 0;\n\tif ( L[0].z > 0.0 ) config += 1;\n\tif ( L[1].z > 0.0 ) config += 2;\n\tif ( L[2].z > 0.0 ) config += 4;\n\tif ( L[3].z > 0.0 ) config += 8;\n\tn = 0;\n\tif ( config == 0 ) {\n\t} else if ( config == 1 ) {\n\t\tn = 3;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 2 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 3 ) {\n\t\tn = 4;\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 4 ) {\n\t\tn = 3;\n\t\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t} else if ( config == 5 ) {\n\t\tn = 0;\n\t} else if ( config == 6 ) {\n\t\tn = 4;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 7 ) {\n\t\tn = 5;\n\t\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 8 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] = L[3];\n\t} else if ( config == 9 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\n\t} else if ( config == 10 ) {\n\t\tn = 0;\n\t} else if ( config == 11 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 12 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t} else if ( config == 13 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = L[2];\n\t\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t} else if ( config == 14 ) {\n\t\tn = 5;\n\t\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t} else if ( config == 15 ) {\n\t\tn = 4;\n\t}\n\tif ( n == 3 )\n\t\tL[3] = L[0];\n\tif ( n == 4 )\n\t\tL[4] = L[0];\n}\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\n\tfloat cosTheta = dot( v1, v2 );\n\tfloat theta = acos( cosTheta );\n\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\n\treturn res;\n}\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\n\trectPoints[0] = pos - halfWidth - halfHeight;\n\trectPoints[1] = pos + halfWidth - halfHeight;\n\trectPoints[2] = pos + halfWidth + halfHeight;\n\trectPoints[3] = pos - halfWidth + halfHeight;\n}\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tvec3 T1, T2;\n\tT1 = normalize(V - N * dot( V, N ));\n\tT2 = - cross( N, T1 );\n\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\n\tvec3 clippedRect[5];\n\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\n\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\n\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\n\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\n\tint n;\n\tclipQuadToHorizon(clippedRect, n);\n\tif ( n == 0 )\n\t\treturn vec3( 0, 0, 0 );\n\tclippedRect[0] = normalize( clippedRect[0] );\n\tclippedRect[1] = normalize( clippedRect[1] );\n\tclippedRect[2] = normalize( clippedRect[2] );\n\tclippedRect[3] = normalize( clippedRect[3] );\n\tclippedRect[4] = normalize( clippedRect[4] );\n\tfloat sum = 0.0;\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\n\tif (n >= 4)\n\t\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\n\tif (n == 5)\n\t\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\n\tsum = max( 0.0, sum );\n\tvec3 Lo_i = vec3( sum, sum, sum );\n\treturn Lo_i;\n}\nvec3 Rect_Area_Light_Specular_Reflectance(\n\t\tconst in GeometricContext geometry,\n\t\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\n\t\tconst in float roughness,\n\t\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\n\tvec3 rectPoints[4];\n\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\n\tvec2 uv = ltcTextureCoords( geometry, roughness );\n\tvec4 brdfLtcApproxParams, t;\n\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\n\tt = texture2D( ltcMat, uv );\n\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\n\tmat3 brdfLtcApproxMat = mat3(\n\t\tvec3( 1, 0, t.y ),\n\t\tvec3( 0, t.z, 0 ),\n\t\tvec3( t.w, 0, t.x )\n\t);\n\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\n\tspecularReflectance *= brdfLtcScalar;\n\treturn specularReflectance;\n}\nvec3 Rect_Area_Light_Diffuse_Reflectance(\n\t\tconst in GeometricContext geometry,\n\t\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\n\tvec3 rectPoints[4];\n\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\n\tmat3 diffuseBrdfMat = mat3(1);\n\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\n\treturn diffuseReflectance;\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 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#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}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\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 envMapIntensity;\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", -gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",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_RECT_AREA_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\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\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\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 ( 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 ltcMat;\tuniform sampler2D ltcMag;\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\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\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\tvec3 queryVec = 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\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, 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\tvec3 queryReflectVec = 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( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, 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 = 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};\n#if NUM_RECT_AREA_LIGHTS > 0\n void RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 matDiffColor = material.diffuseColor;\n vec3 matSpecColor = material.specularColor;\n vec3 lightColor = rectAreaLight.color;\n float roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n vec3 spec = Rect_Area_Light_Specular_Reflectance(\n geometry,\n rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\n roughness,\n ltcMat, ltcMag );\n vec3 diff = Rect_Area_Light_Diffuse_Reflectance(\n geometry,\n rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\n reflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\n reflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;\n }\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\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_Direct_RectArea\t\tRE_Direct_RectArea_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}\n#if NUM_RECT_AREA_LIGHTS > 0\n void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 matDiffColor = material.diffuseColor;\n vec3 matSpecColor = material.specularColor;\n vec3 lightColor = rectAreaLight.color;\n float roughness = material.specularRoughness;\n vec3 spec = Rect_Area_Light_Specular_Reflectance(\n geometry,\n rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\n roughness,\n ltcMat, ltcMag );\n vec3 diff = Rect_Area_Light_Diffuse_Reflectance(\n geometry,\n rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\n reflectedLight.directSpecular += lightColor * matSpecColor * spec;\n reflectedLight.directDiffuse += lightColor * matDiffColor * diff;\n }\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#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_Direct_RectArea\t\tRE_Direct_RectArea_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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\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#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 #if NUM_RECT_AREA_LIGHTS > 0\n #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 #if NUM_RECT_AREA_LIGHTS > 0\n #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 #if NUM_RECT_AREA_LIGHTS > 0\n #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#if NUM_RECT_AREA_LIGHTS > 0\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 \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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n", -equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", -linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n}\n",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \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\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n}\n", -normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#include \n\t#include \n}\n", -normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", -points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n}\n", -shadow_frag:"uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"};N.prototype={constructor:N, -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);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, -c,d){b=Q.euclideanModulo(b,1);c=Q.clamp(c,0,1);d=Q.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=h?k/(e+f): -k/(2-e-f);switch(e){case b:g=(c-d)/k+(cthis.max.x||a.ythis.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){return(b||new C).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.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new C;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)}};var pf=0;W.prototype={constructor:W,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);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);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); -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);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;0e&&(e=m);l>f&&(f=l);p>g&&(g=p)}this.min.set(b,c,d);this.max.set(e,f,g)},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;he&&(e=m);l>f&&(f=l);p>g&&(g=p)}this.min.set(b,c,d);this.max.set(e,f,g)},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y||a.zthis.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){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.xthis.max.x||a.max.ythis.max.y||a.max.zthis.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.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 Fa;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)}};Fa.prototype={constructor:Fa,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new ya;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=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 ya;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}};za.prototype={constructor:za,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;ec;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}};ma.prototype={constructor:ma,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||1b&&0a&&0c;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],p=c[9],n=c[10],r=c[11],q=c[12],u=c[13],F=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+p,c+u).normalize();b[3].setComponents(f-d,m-h,r-p,c-u).normalize();b[4].setComponents(f-e,m-k,r-n,c-F).normalize();b[5].setComponents(f+e,m+k,r+n,c+F).normalize();return this},intersectsObject:function(){var a=new Fa;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 Fa;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)e;e++){var f=d[e];a.x=0g&&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}};bb.prototype={constructor:bb,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),p=c.lengthSq(),n=Math.abs(1-k*k),r;0=-r?e<=r?(h=1/n,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+p):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+p):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+p):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0f)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(fg||e>d)return null;if(e>c||c!==c)c=e;if(gd?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(0f)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)}};cb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");cb.DefaultOrder="XYZ";cb.prototype={constructor:cb,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=Q.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],p=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(p,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(p,-1,1)),.99999>Math.abs(p)?(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(p,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(p,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 H);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 da;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(){}};gd.prototype={constructor:gd,set:function(a){this.mask=1<=b.x+b.y}}();Aa.prototype={constructor:Aa,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 Aa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new ma).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Aa.barycoordFromPoint(a, -this.a,this.b,this.c,b)},containsPoint:function(a){return Aa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a,b,c,d;return function(e,f){void 0===a&&(a=new ma,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;kd;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;cb.far?null:{distance:c,point:t.clone(),object:a}}function c(c,d,e,f,m,l,p,q){g.fromArray(f,3*l);h.fromArray(f,3*p);k.fromArray(f,3*q);if(c=b(c,d,e,g,h,k,F))m&&(n.fromArray(m,2*l),r.fromArray(m,2*p),w.fromArray(m,2*q),c.uv=a(F,g,h,k,n,r,w)),c.face= -new ha(l,p,q,Aa.normal(g,h,k)),c.faceIndex=l;return c}var d=new H,e=new bb,f=new Fa,g=new q,h=new q,k=new q,m=new q,l=new q,p=new q,n=new C,r=new C,w=new C,u=new q,F=new q,t=new q;return function(q,u){var t=this.geometry,A=this.material,I=this.matrixWorld;if(void 0!==A&&(null===t.boundingSphere&&t.computeBoundingSphere(),f.copy(t.boundingSphere),f.applyMatrix4(I),!1!==q.ray.intersectsSphere(f)&&(d.getInverse(I),e.copy(q.ray).applyMatrix4(d),null===t.boundingBox||!1!==e.intersectsBox(t.boundingBox)))){var E, -K;if(t.isBufferGeometry){var y,J,A=t.index,I=t.attributes,t=I.position.array;void 0!==I.uv&&(E=I.uv.array);if(null!==A)for(var I=A.array,C=0,D=I.length;Cthis.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)}}); -Ac.prototype=Object.assign(Object.create(G.prototype),{constructor:Ac,copy:function(a){G.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break; -for(;ef||(l.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(l),ud.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,w=r.length/3-1;gf||(l.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(l),ud.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;gf||(l.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(l),ud.far||e.push({distance:u,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)}});fa.prototype=Object.assign(Object.create(Va.prototype),{constructor:fa,isLineSegments:!0});Oa.prototype=Object.create(W.prototype);Oa.prototype.constructor=Oa;Oa.prototype.isPointsMaterial=!0;Oa.prototype.copy= -function(a){W.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(G.prototype),{constructor:Kb,isPoints:!0,raycast:function(){var a=new H,b=new bb,c=new Fa;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(fd.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.isBufferGeometry){var p=h.index,h=h.attributes.position.array;if(null!==p)for(var n=p.array,p=0,r=n.length;pc)return null;var d=[],e=[],f=[],g,h,k;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 p,n,r,q,u,F,t,v;p=a[e[g]].x;n=a[e[g]].y;r=a[e[h]].x;q=a[e[h]].y;u=a[e[k]].x;F=a[e[k]].y;if(0>=(r-p)*(F-n)-(q-n)*(u-p))l= -!1;else{var M,z,A,I,E,K,y,C,D,G;M=u-r;z=F-q;A=p-u;I=n-F;E=r-p;K=q-n;for(l=0;l=-Number.EPSILON&&C>=-Number.EPSILON&&y>=-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;kNumber.EPSILON){if(0q||q>p)return[];k=m*l-k*n;if(0>k||k>p)return[]}else{if(0c?[]: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,0e&&(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;cO){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(n=C;nk;k++)l=m[k].x+":"+m[k].y,l=p[l],void 0!==l&&(m[k]=l);return n.concat()},isClockWise:function(a){return 0>pa.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}}()};La.prototype=Object.create(S.prototype);La.prototype.constructor=La;La.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;dNumber.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 C(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 C(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;eMath.abs(b.y-c.y)?[new C(b.x,1-b.z),new C(c.x,1-c.z),new C(d.x,1-d.z),new C(e.x,1-e.z)]:[new C(b.y,1-b.z),new C(c.y,1-c.z),new C(d.y,1-d.z),new C(e.y,1-e.z)]}};Mc.prototype=Object.create(La.prototype);Mc.prototype.constructor= -Mc;mb.prototype=Object.create(D.prototype);mb.prototype.constructor=mb;Nc.prototype=Object.create(S.prototype);Nc.prototype.constructor=Nc;Ub.prototype=Object.create(D.prototype);Ub.prototype.constructor=Ub;Oc.prototype=Object.create(S.prototype);Oc.prototype.constructor=Oc;Pc.prototype=Object.create(S.prototype);Pc.prototype.constructor=Pc;Vb.prototype=Object.create(D.prototype);Vb.prototype.constructor=Vb;Qc.prototype=Object.create(S.prototype);Qc.prototype.constructor=Qc;Wb.prototype=Object.create(D.prototype); -Wb.prototype.constructor=Wb;Xb.prototype=Object.create(S.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(D.prototype);Yb.prototype.constructor=Yb;Wa.prototype=Object.create(D.prototype);Wa.prototype.constructor=Wa;nb.prototype=Object.create(S.prototype);nb.prototype.constructor=nb;Rc.prototype=Object.create(nb.prototype);Rc.prototype.constructor=Rc;Sc.prototype=Object.create(Wa.prototype);Sc.prototype.constructor=Sc;Zb.prototype=Object.create(D.prototype);Zb.prototype.constructor= -Zb;Tc.prototype=Object.create(S.prototype);Tc.prototype.constructor=Tc;$b.prototype=Object.create(S.prototype);$b.prototype.constructor=$b;var Ea=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Dc,ParametricBufferGeometry:Nb,TetrahedronGeometry:Ec,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Fc,OctahedronBufferGeometry:lb,IcosahedronGeometry:Gc,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Hc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:xa,TubeGeometry:Jc, -TubeBufferGeometry:Rb,TorusKnotGeometry:Kc,TorusKnotBufferGeometry:Sb,TorusGeometry:Lc,TorusBufferGeometry:Tb,TextGeometry:Mc,SphereBufferGeometry:mb,SphereGeometry:Nc,RingGeometry:Oc,RingBufferGeometry:Ub,PlaneBufferGeometry:ib,PlaneGeometry:Pc,LatheGeometry:Qc,LatheBufferGeometry:Vb,ShapeGeometry:Xb,ShapeBufferGeometry:Wb,ExtrudeGeometry:La,EdgesGeometry:Yb,ConeGeometry:Rc,ConeBufferGeometry:Sc,CylinderGeometry:nb,CylinderBufferGeometry:Wa,CircleBufferGeometry:Zb,CircleGeometry:Tc,BoxBufferGeometry:hb, -BoxGeometry:$b});ac.prototype=Object.create(Ia.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial=!0;bc.prototype=Object.create(Ia.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Uc.prototype={constructor:Uc,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)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),d=this.getValueSize(),this.times=ba.arraySlice(c,e,f),this.values=ba.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&&ba.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;gk.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;cg;g++)n=v[k++],t=F[2*n],n=F[2*n+1],t=new C(t,n),2!==g&&c.faceVertexUvs[d][h].push(t),0!==g&&c.faceVertexUvs[d][h+1].push(t);p&&(p=3*v[k++],r.normal.set(y[p++],y[p++],y[p]),u.normal.copy(r.normal));if(w)for(d=0;4>d;d++)p=3*v[k++],w=new q(y[p++],y[p++],y[p]),2!==d&&r.vertexNormals.push(w),0!==d&&u.vertexNormals.push(w);l&&(l=v[k++], -l=z[l],r.color.setHex(l),u.color.setHex(l));if(b)for(d=0;4>d;d++)l=v[k++],l=z[l],2!==d&&r.vertexColors.push(new N(l)),0!==d&&u.vertexColors.push(new N(l));c.faces.push(r);c.faces.push(u)}else{r=new ha;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;dg;g++)n=v[k++],t=F[2*n],n=F[2*n+1],t=new C(t,n),c.faceVertexUvs[d][h].push(t);p&&(p=3*v[k++],r.normal.set(y[p++],y[p++],y[p]));if(w)for(d=0;3>d;d++)p=3* -v[k++],w=new q(y[p++],y[p++],y[p]),r.vertexNormals.push(w);l&&(l=v[k++],r.color.setHex(z[l]));if(b)for(d=0;3>d;d++)l=v[k++],r.vertexColors.push(new N(z[l]));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;dk)g=d+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(Q.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(Q.clamp(e[0].dot(e[a]),-1,1)),c/=a,0=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;cc;)c+=b;for(;c>b;)c-=b;cb.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=ed.interpolate;return new C(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a))};yb.prototype=Object.create(wa.prototype);yb.prototype.constructor=yb;yb.prototype.getPoint=function(a){var b=pa.b3;return new C(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=ed.tangentCubicBezier;return(new C(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(wa.prototype);zb.prototype.constructor=zb;zb.prototype.getPoint=function(a){var b=pa.b2;return new C(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= -ed.tangentQuadraticBezier;return(new C(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))).normalize()};var oe=Object.assign(Object.create(Yc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;bNumber.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(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=pa.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new Ab,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var p=[],n=[],q=0,w;p[q]=void 0;n[q]=[];for(var u=0,y=f.length;ud&& -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){da.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}}};ka.prototype={constructor:ka,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=ka.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=c){var p=c++,n=b[p];d[n.uuid]=q;b[q]=n;d[l]=p;b[p]= -k;k=0;for(l=f;k!==l;++k){var n=e[k],r=n[q];n[q]=n[p];n[p]=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],qb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.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=0a,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(de.prototype,oa.prototype,{clipAction:function(a,b){var c=b||this._root, -d=c.uuid,e="string"===typeof a?ta.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 ce(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?ta.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(de.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],p=q.name,n=l[p];if(void 0===n){n=f[k];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,h,p));continue}n=new Cd(ka.create(c,p,b&&b._propertyBindings[k].binding.parsedPath),q.ValueTypeName,q.getValueSize());++n.referenceCount;this._addInactiveBinding(n,h,p)}f[k]=n;g[k].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&&ah.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};ua.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ua.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ua.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ua.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/ -c.duration)};ua.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ua.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ua.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ua.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ua.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()")};ua.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ua.prototype.update=function(a){for(var b=0,c=this.animationsList.length;bd.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+Q.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}}};$c.prototype=Object.create(G.prototype); -$c.prototype.constructor=$c;$c.prototype.isImmediateRenderObject=!0;ad.prototype=Object.create(fa.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){var a=new q,b=new q,c=new za;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;lc.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)};Fd.prototype=Object.create(fa.prototype);Fd.prototype.constructor=Fd;var ke=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,p){this.init(b,c,((b-a)/e-(c-a)/(e+l)+(c-b)/l)*l,((c-b)/l-(d-b)/(l+p)+(d-c)/p)*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 wa.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+=0h&&(h=1);1E-4>k&&(k=h);1E-4>n&&(n=h);c.initNonuniformCatmullRom(l.x,x.x,p.x,g.x,k,h,n);d.initNonuniformCatmullRom(l.y,x.y,p.y,g.y,k,h,n);e.initNonuniformCatmullRom(l.z,x.z,p.z,g.z,k,h,n)}else"catmullrom"===this.type&&(k=void 0!==this.tension?this.tension:.5,c.initCatmullRom(l.x,x.x,p.x,g.x,k),d.initCatmullRom(l.y,x.y,p.y,g.y,k),e.initCatmullRom(l.z,x.z,p.z,g.z,k));return new q(c.calc(a), -d.calc(a),e.calc(a))})}(),Nf=wa.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=ed.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))}),Of=wa.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b= -pa.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))}),Pf=wa.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b=pa.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))}),Qf=wa.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});Gd.prototype=Object.create(Xa.prototype);Gd.prototype.constructor=Gd;Le.prototype=Object.create(ke.prototype);bd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};Object.assign(pc.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(ya.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)}});gb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter()."); -return this.getCenter(a)};Q.random16=function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()};Object.assign(za.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(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)}});Object.assign(H.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(){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)}}(),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(){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.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)}});ma.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."); -return this.intersectsLine(a)};da.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(bb.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 La(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xb(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)}});S.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(G.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)}});Object.defineProperties(G.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.defineProperties(Ac.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Ha.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(na.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(y.prototype, -{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(D.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(D.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(Dd.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(W.prototype,{wrapAround:{get:function(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set:function(){console.warn("THREE."+this.type+ -": .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE."+this.type+": .wrapRGB has been removed.");return new N}}});Object.defineProperties(Ca.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(Ia.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}}});oa.prototype=Object.assign(Object.create({constructor:oa,apply:function(a){console.warn("THREE.EventDispatcher: .apply is deprecated, just inherit or Object.assign the prototype to mix-in.");Object.assign(a,this)}}),oa.prototype);Object.assign(Nd.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(){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.")}});Object.defineProperties(Nd.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(ye.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}}});ec.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new Wd).load(a,function(a){b.setBuffer(a)});return this}; -ae.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};l.WebGLRenderTargetCube=Eb;l.WebGLRenderTarget=Db;l.WebGLRenderer=Nd;l.ShaderLib=Gb;l.UniformsLib=U;l.UniformsUtils=Ja;l.ShaderChunk=Z;l.FogExp2=Ib;l.Fog=Jb;l.Scene=jb;l.LensFlare=Od;l.Sprite=zc;l.LOD=Ac;l.SkinnedMesh=jd;l.Skeleton=hd;l.Bone=id;l.Mesh=Ba;l.LineSegments=fa;l.Line=Va;l.Points=Kb;l.Group=Bc;l.VideoTexture=kd;l.DataTexture=db;l.CompressedTexture= -Lb;l.CubeTexture=Za;l.CanvasTexture=ld;l.DepthTexture=Cc;l.Texture=ea;l.CompressedTextureLoader=Ee;l.BinaryTextureLoader=Qd;l.DataTextureLoader=Qd;l.CubeTextureLoader=Rd;l.TextureLoader=md;l.ObjectLoader=Fe;l.MaterialLoader=Ad;l.BufferGeometryLoader=Sd;l.DefaultLoadingManager=va;l.LoadingManager=Pd;l.JSONLoader=Td;l.ImageLoader=Vc;l.FontLoader=Ge;l.FileLoader=Ma;l.Loader=wb;l.Cache=ne;l.AudioLoader=Wd;l.SpotLightShadow=od;l.SpotLight=pd;l.PointLight=qd;l.RectAreaLight=Xd;l.HemisphereLight=nd;l.DirectionalLightShadow= -rd;l.DirectionalLight=sd;l.AmbientLight=td;l.LightShadow=tb;l.Light=na;l.StereoCamera=He;l.PerspectiveCamera=Ha;l.OrthographicCamera=Hb;l.CubeCamera=Bd;l.Camera=sa;l.AudioListener=Yd;l.PositionalAudio=$d;l.AudioContext=Zd;l.AudioAnalyser=ae;l.Audio=ec;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=xd;l.QuaternionKeyframeTrack=Xc;l.NumberKeyframeTrack=dc;l.ColorKeyframeTrack=zd;l.BooleanKeyframeTrack=yd;l.PropertyMixer=Cd;l.PropertyBinding=ka;l.KeyframeTrack=vb;l.AnimationUtils=ba;l.AnimationObjectGroup= -be;l.AnimationMixer=de;l.AnimationClip=ta;l.Uniform=Dd;l.InstancedBufferGeometry=Bb;l.BufferGeometry=D;l.GeometryIdCount=function(){return Kd++};l.Geometry=S;l.InterleavedBufferAttribute=ee;l.InstancedInterleavedBuffer=gc;l.InterleavedBuffer=fc;l.InstancedBufferAttribute=hc;l.Face3=ha;l.Object3D=G;l.Raycaster=fe;l.Layers=gd;l.EventDispatcher=oa;l.Clock=he;l.QuaternionLinearInterpolant=wd;l.LinearInterpolant=Wc;l.DiscreteInterpolant=vd;l.CubicInterpolant=ud;l.Interpolant=qa;l.Triangle=Aa;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,x,p,n;this.initFromArray=function(a){this.points=[];for(var b=0;bthis.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]]; -x=this.points[c[1]];p=this.points[c[2]];n=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,x.x,p.x,n.x,g,h,k);d.y=b(l.y,x.y,p.y,n.y,g,h,k);d.z=b(l.z,x.z,p.z,n.z,g,h,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a 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)); - // 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 = _; +},{"../../internal/symbol/iterator":190,"../OuterSubscriber":34,"../Subscriber":39,"../util/isArray":203,"../util/subscribeToResult":222,"./fromArray":52}],73:[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); } - exports._ = _; - } else { - root._ = _; - } - - // Current version. - _.VERSION = '1.8.3'; - - // 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 (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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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; } - return function() { - return func.apply(context, arguments); + AuditOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); }; - }; - - // 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); - }; - - // 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]; + 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 = tryCatch_1.tryCatch(this.durationSelector)(value); + if (duration === errorObject_1.errorObject) { + this.destination.error(errorObject_1.errorObject.e); + } + else { + var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration); + if (!innerSubscription || innerSubscription.closed) { + this.clearThrottle(); + } + else { + this.add(this.throttled = innerSubscription); + } + } } - } - 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]; + 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)); - // 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; - }; +},{"../OuterSubscriber":34,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],74:[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; - // 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); - } +},{"../observable/timer":70,"../scheduler/async":188,"./audit":73}],75:[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 obj; - }; - - // 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; - }; - - // 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); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - } - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. - _.reduce = _.foldl = _.inject = createReduce(1); - - // The right-associative version of reduce, also known as `foldr`. - _.reduceRight = _.foldr = createReduce(-1); - - // 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); +})(); +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; } - if (key !== void 0 && key !== -1) return obj[key]; - }; - - // 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; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, predicate, context) { - return _.filter(obj, _.negate(cb(predicate)), context); - }; - - // 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; + 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; } - return true; - }; + 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)); - // 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; +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],76:[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 false; - }; - - // 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; - }; - - // 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); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, _.property(key)); - }; - - // 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)); - }; - - // 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)); - }; - - // 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; + 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)); + }; +} +exports.bufferCount = bufferCount; +var BufferCountOperator = (function () { + function BufferCountOperator(bufferSize, startBufferEvery) { + this.bufferSize = bufferSize; + this.startBufferEvery = startBufferEvery; + if (!startBufferEvery || bufferSize === startBufferEvery) { + this.subscriberClass = BufferCountSubscriber; } - } - } 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; + else { + this.subscriberClass = BufferSkipCountSubscriber; } - }); } - return result; - }; - - // 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; + 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 = []; } - } - } 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; + }; + BufferCountSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer.length > 0) { + this.destination.next(buffer); } - }); + _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; } - 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; - }; + 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); + } + } + _super.prototype._complete.call(this); + }; + return BufferSkipCountSubscriber; +}(Subscriber_1.Subscriber)); - // 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)]; +},{"../Subscriber":39}],77:[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 _.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; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - }; - - // 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); - }; - - // 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))); - }; - - // 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)); - }; - - // 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; - } +})(); +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; } - 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; + 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 = []; } - 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 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 { + 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; } - 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); + 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; + } + } + 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); } - 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); - - for (var index = 0; index < length; index++) { - result[index] = _.pluck(array, index); + if (!subscriber.closed) { + state.context = subscriber.openContext(); + state.context.closeAction = this.schedule(state, state.bufferTimeSpan); } - return result; - }; - - // 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]; - } +} +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); } - return result; - }; +} +function dispatchBufferClose(arg) { + var subscriber = arg.subscriber, context = arg.context; + subscriber.closeContext(context); +} - // 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; +},{"../Subscriber":39,"../scheduler/async":188,"../util/isScheduler":213}],78:[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 __()); }; - } - - // Returns the first index on an array-like that passes a predicate test - _.findIndex = createPredicateIndexFinder(1); - _.findLastIndex = createPredicateIndexFinder(-1); - - // 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; - }; - - // 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; - } - } 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; +})(); +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)); }; - } - - // 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; +} +exports.bufferToggle = bufferToggle; +var BufferToggleOperator = (function () { + function BufferToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - - return range; - }; - - // 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; - }; - - // 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; - }; - - // 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); + BufferToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return bound; - }; - - // 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; - }; - - // 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]; + 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); + } }; - memoize.cache = {}; - return memoize; - }; - - // 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); - }; - - // 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; + 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); }; - }; - - // 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; - - var later = function() { - var last = _.now() - timestamp; - - 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; + 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); }; - - 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; - } - - return result; + BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); }; - }; - - // 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); - }; - - // Returns a negated version of the passed-in predicate. - _.negate = function(predicate) { - return function() { - return !predicate.apply(this, arguments); + BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { + this.closeBuffer(innerSub.context); }; - }; - - // 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; + 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); + } }; - }; - - // 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); - } + 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(); + } }; - }; - - // 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; + 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); + } }; - }; - - // 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); - - // Object Functions - // ---------------- - - // 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']; - - function collectNonEnumProps(obj, keys) { - var nonEnumIdx = nonEnumerableProps.length; - var constructor = obj.constructor; - var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; - - // Constructor is a special case. - var prop = 'constructor'; - if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + return BufferToggleSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); - while (nonEnumIdx--) { - prop = nonEnumerableProps[nonEnumIdx]; - if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { - keys.push(prop); - } +},{"../OuterSubscriber":34,"../Subscription":40,"../util/subscribeToResult":222}],79:[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); } - } - - // 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; - }; - - // 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]]; + 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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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; } - 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; - }; - - // 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]]]; + 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; } - return pairs; - }; + 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 = tryCatch_1.tryCatch(this.closingSelector)(); + if (closingNotifier === errorObject_1.errorObject) { + this.error(errorObject_1.errorObject.e); + } + else { + 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)); - // 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]; +},{"../OuterSubscriber":34,"../Subscription":40,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],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 result; - }; - - // 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 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; } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = createAssigner(_.allKeys); - - // 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); - - // 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; + 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); + subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber); + } + }; + return CatchSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); - // 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); - } 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; - } - return result; - }; +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../util/subscribeToResult":222}],81:[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; - // 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); - }; +},{"../observable/combineLatest":46}],82:[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]; } - return _.pick(obj, iteratee, context); - }; + 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; - // Fill in a given object with default properties. - _.defaults = createAssigner(_.allKeys, true); +},{"../observable/combineLatest":46,"../observable/from":51,"../util/isArray":203}],83:[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; - // 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; - }; +},{"../observable/concat":47}],84:[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; - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; +},{"./mergeAll":117}],85:[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; - // 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; - }; +},{"./mergeMap":118}],86:[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; - // 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; +},{"./concatMap":85}],87:[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 true; - }; - - - // 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; - } + 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; } - // 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; - } + 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; } - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - return true; - }; - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b); - }; - - // 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; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType === 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) === '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - var type = typeof obj; - return type === 'function' || type === 'object' && !!obj; - }; - - // 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 + ']'; + CountSubscriber.prototype._next = function (value) { + if (this.predicate) { + this._tryPredicate(value); + } + else { + this.count++; + } }; - }); - - // 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'); + 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++; + } }; - } - - // 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; + CountSubscriber.prototype._complete = function () { + this.destination.next(this.count); + this.destination.complete(); }; - } - - // Is a given object a finite number? - _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); - }; - - // Is the given value `NaN`? (NaN is the only number which does not equal itself). - _.isNaN = function(obj) { - return _.isNumber(obj) && obj !== +obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // 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); - }; - - // Utility Functions - // ----------------- - - // 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; - }; - - // Keep the identity function around for default iteratees. - _.identity = function(value) { - return value; - }; + return CountSubscriber; +}(Subscriber_1.Subscriber)); - // Predicate-generating functions. Often useful outside of Underscore. - _.constant = function(value) { - return function() { - return value; +},{"../Subscriber":39}],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 __()); }; - }; - - _.noop = function(){}; - - _.property = property; - - // Generates a function for a given object that returns a given property. - _.propertyOf = function(obj) { - return obj == null ? function(){} : function(key) { - return obj[key]; +})(); +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)); }; - }; - - // 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); + 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); + } }; - }; - - // 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; - }; + 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)); - // Return a random integer between min and max (inclusive). - _.random = function(min, max) { - if (max == null) { - max = min; - min = 0; +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],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 min + Math.floor(Math.random() * (max - min + 1)); - }; - - // A (possibly faster) way to get the current timestamp as an integer. - _.now = Date.now || function() { - return new Date().getTime(); - }; - - // List of HTML entities for escaping. - var escapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`' - }; - var unescapeMap = _.invert(escapeMap); - - // Functions for escaping and unescaping strings to/from HTML interpolation. - var createEscaper = function(map) { - var escaper = function(match) { - return map[match]; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - // 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; +})(); +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)); }; - }; - _.escape = createEscaper(escapeMap); - _.unescape = createEscaper(unescapeMap); - - // 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; + 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; } - 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; - }; - - // 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 - }; - - // 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' - }; - - var escaper = /\\|'|\r|\n|\u2028|\u2029/g; - - var escapeChar = function(match) { - return '\\' + escapes[match]; - }; - - // 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+='"; - } - - // Adobe VMs need the match returned to produce the correct offest. - return match; - }); - 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'; + 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(); +} - try { - var render = new Function(settings.variable || 'obj', '_', source); - } catch (e) { - e.source = source; - throw e; +},{"../Subscriber":39,"../scheduler/async":188}],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); } - - var template = function(data) { - return render.call(this, data, _); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - - // 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); +})(); +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)); }; - }); - - // 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)); + 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); }; - }); - - // 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)); - -},{}],169:[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; + DefaultIfEmptySubscriber.prototype._complete = function () { + if (this.isEmpty) { + this.destination.next(this.defaultValue); + } + this.destination.complete(); + }; + return DefaultIfEmptySubscriber; +}(Subscriber_1.Subscriber)); - this.p1x = p1x; - this.p1y = p2y; - this.p2x = p2x; - this.p2y = p2y; +},{"../Subscriber":39}],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 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)); }; } - -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; +exports.delay = delay; +var DelayOperator = (function () { + function DelayOperator(delay, scheduler) { + this.delay = delay; + this.scheduler = scheduler; } - - // 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; + 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); } - - t2 = (t1 - t0) * 0.5 + t0; + 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; +}()); - // Failure. - return t2; -}; - -UnitBezier.prototype.solve = function(x, epsilon) { - return this.sampleCurveY(this.solveCurveX(x, epsilon)); -}; - -},{}],170:[function(require,module,exports){ -var createElement = require("./vdom/create-element.js") - -module.exports = createElement - -},{"./vdom/create-element.js":176}],171:[function(require,module,exports){ -var diff = require("./vtree/diff.js") - -module.exports = diff - -},{"./vtree/diff.js":196}],172:[function(require,module,exports){ -var h = require("./virtual-hyperscript/index.js") - -module.exports = h - -},{"./virtual-hyperscript/index.js":183}],173:[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":170,"./diff.js":171,"./h.js":172,"./patch.js":174,"./vnode/vnode.js":192,"./vnode/vtext.js":194}],174:[function(require,module,exports){ -var patch = require("./vdom/patch.js") - -module.exports = patch - -},{"./vdom/patch.js":179}],175:[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) - } - } else { - if (isObject(propValue)) { - patchObject(node, props, previous, propName, propValue); - } else { - node[propName] = propValue - } - } +},{"../Notification":31,"../Subscriber":39,"../scheduler/async":188,"../util/isDate":205}],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 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)); }; } - -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) - } - } else if (propName === "style") { - for (var i in previousValue) { - node.style[i] = "" - } - } else if (typeof previousValue === "string") { - node[propName] = "" - } else { - node[propName] = null +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); } - } else if (previousValue.unhook) { - previousValue.unhook(node, propName, propValue) } + 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; } -} - -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) - } + 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)); - return +},{"../Observable":32,"../OuterSubscriber":34,"../Subscriber":39,"../util/subscribeToResult":222}],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); } - - if(previousValue && isObject(previousValue) && - getPrototype(previousValue) !== getPrototype(propValue)) { - node[propName] = propValue - return + 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() { } - - if (!isObject(node[propName])) { - node[propName] = {} + 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)); - var replacer = propName === "style" ? "" : undefined - - for (var k in propValue) { - var value = propValue[k] - node[propName][k] = (value === undefined) ? replacer : value +},{"../Subscriber":39}],94:[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)); }; } - -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 +exports.distinct = distinct; +var DistinctOperator = (function () { + function DistinctOperator(keySelector, flushes) { + this.keySelector = keySelector; + this.flushes = flushes; } -} - -},{"../vnode/is-vhook.js":187,"is-object":18}],176:[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) + 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 null + return _this; } - - 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) + 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); } - } - - return node -} - -},{"../vnode/handle-thunk.js":185,"../vnode/is-vnode.js":188,"../vnode/is-vtext.js":189,"../vnode/is-widget.js":190,"./apply-properties":175,"global/document":14}],177:[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 + 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 domIndex(rootNode, tree, indices, nodes) { - if (!indices || indices.length === 0) { - return {} - } else { - indices.sort(ascending) - return recurse(rootNode, tree, indices, nodes, 0) +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],95:[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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +function distinctUntilChanged(compare, keySelector) { + return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; } - -function recurse(rootNode, tree, indices, nodes, rootIndex) { - nodes = nodes || {} - - - if (rootNode) { - if (indexInRange(indices, rootIndex, rootIndex)) { - nodes[rootIndex] = rootNode +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; } - - 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 + return _this; + } + 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); } } - } - - return nodes -} - -// Binary search for an index in the interval [left, right] -function indexInRange(indices, left, right) { - if (indices.length === 0) { - return false - } - - 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 + 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); + } } - } - - return false; -} - -function ascending(a, b) { - return a > b ? 1 : -1 -} - -},{}],178:[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 + else { + this.hasKey = true; + } + if (Boolean(result) === false) { + this.key = key; + this.destination.next(value); + } + }; + return DistinctUntilChangedSubscriber; +}(Subscriber_1.Subscriber)); - 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":39,"../util/errorObject":200,"../util/tryCatch":224}],96:[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; -function removeNode(domNode, vNode) { - var parentNode = domNode.parentNode - - if (parentNode) { - parentNode.removeChild(domNode) +},{"./distinctUntilChanged":95}],97:[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(); } - - destroyWidget(domNode, vNode); - - return null + 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; -function insertNode(parentNode, vNode, renderOptions) { - var newNode = renderOptions.render(vNode, renderOptions) - - if (parentNode) { - parentNode.appendChild(newNode) +},{"../util/ArgumentOutOfRangeError":193,"./defaultIfEmpty":90,"./filter":103,"./take":155,"./throwIfEmpty":162}],98:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var fromArray_1 = require("../observable/fromArray"); +var scalar_1 = require("../observable/scalar"); +var empty_1 = require("../observable/empty"); +var concat_1 = require("../observable/concat"); +var isScheduler_1 = require("../util/isScheduler"); +function endWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; } - - return parentNode + return function (source) { + var scheduler = array[array.length - 1]; + if (isScheduler_1.isScheduler(scheduler)) { + array.pop(); + } + else { + scheduler = null; + } + var len = array.length; + if (len === 1 && !scheduler) { + return concat_1.concat(source, scalar_1.scalar(array[0])); + } + else if (len > 0) { + return concat_1.concat(source, fromArray_1.fromArray(array, scheduler)); + } + else { + return concat_1.concat(source, empty_1.empty(scheduler)); + } + }; } +exports.endWith = endWith; -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) - } +},{"../observable/concat":47,"../observable/empty":49,"../observable/fromArray":52,"../observable/scalar":68,"../util/isScheduler":213}],99:[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 newNode + 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)); }; } - -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) +exports.every = every; +var EveryOperator = (function () { + function EveryOperator(predicate, thisArg, source) { + this.predicate = predicate; + this.thisArg = thisArg; + this.source = source; } - - var parentNode = domNode.parentNode - - if (parentNode && newNode !== domNode) { - parentNode.replaceChild(newNode, domNode) + 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)); - if (!updating) { - destroyWidget(domNode, leftVNode) +},{"../Subscriber":39}],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 newNode + 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()); }; } - -function vNodePatch(domNode, leftVNode, vNode, renderOptions) { - var parentNode = domNode.parentNode - var newNode = renderOptions.render(vNode, renderOptions) - - if (parentNode && newNode !== domNode) { - parentNode.replaceChild(newNode, domNode) +exports.exhaust = exhaust; +var SwitchFirstOperator = (function () { + function SwitchFirstOperator() { } - - return newNode -} - -function destroyWidget(domNode, w) { - if (typeof w.destroy === "function" && isWidget(w)) { - w.destroy(domNode) + 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; } -} - -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 + SwitchFirstSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.hasSubscription = true; + this.add(subscribeToResult_1.subscribeToResult(this, value)); } - domNode.removeChild(node) - } + }; + 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)); - 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]) - } -} - -function replaceRoot(oldRoot, newRoot) { - if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { - oldRoot.parentNode.replaceChild(newRoot, oldRoot) +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],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 newRoot; -} - -},{"../vnode/is-widget.js":190,"../vnode/vpatch.js":193,"./apply-properties":175,"./update-widget":180}],179:[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 patchRecursive(rootNode, patches, renderOptions) { - var indices = patchIndices(patches) - - if (indices.length === 0) { - return rootNode + 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 ExhauseMapOperator(project)); + }; +} +exports.exhaustMap = exhaustMap; +var ExhauseMapOperator = (function () { + function ExhauseMapOperator(project) { + this.project = project; } - - var index = domIndex(rootNode, patches.a, indices) - var ownerDocument = rootNode.ownerDocument - - if (!renderOptions.document && ownerDocument !== document) { - renderOptions.document = ownerDocument + ExhauseMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); + }; + return ExhauseMapOperator; +}()); +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, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, result, value, index, innerSubscriber); + }; + 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)); - for (var i = 0; i < indices.length; i++) { - var nodeIndex = indices[i] - rootNode = applyPatch(rootNode, - index[nodeIndex], - patches[nodeIndex], - renderOptions) +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/subscribeToResult":222,"./map":112}],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 rootNode + 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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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)); }; } - -function applyPatch(rootNode, domNode, patchList, renderOptions) { - if (!domNode) { - return rootNode +exports.expand = expand; +var ExpandOperator = (function () { + function ExpandOperator(project, concurrent, scheduler) { + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; } - - var newNode - - if (isArray(patchList)) { - for (var i = 0; i < patchList.length; i++) { - newNode = patchOp(patchList[i], domNode, renderOptions) - - if (domNode === rootNode) { - rootNode = newNode + 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); + 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 }; + var destination_1 = this.destination; + destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); } } - } else { - newNode = patchOp(patchList, domNode, renderOptions) - - if (domNode === rootNode) { - rootNode = newNode + else { + this.buffer.push(value); } - } - - return rootNode -} - -function patchIndices(patches) { - var indices = [] - - for (var key in patches) { - if (key !== "a") { - indices.push(Number(key)) + }; + 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; - return indices +},{"../OuterSubscriber":34,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],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 filter(predicate, thisArg) { + return function filterOperatorFunction(source) { + return source.lift(new FilterOperator(predicate, thisArg)); + }; } - -},{"./create-element":176,"./dom-index":177,"./patch-op":178,"global/document":14,"x-is-array":215}],180:[function(require,module,exports){ -var isWidget = require("../vnode/is-widget.js") - -module.exports = updateWidget - -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 - } +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)); - return false +},{"../Subscriber":39}],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 Subscriber_1 = require("../Subscriber"); +var Subscription_1 = require("../Subscription"); +function finalize(callback) { + return function (source) { return source.lift(new FinallyOperator(callback)); }; } - -},{"../vnode/is-widget.js":190}],181:[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); +exports.finalize = finalize; +var FinallyOperator = (function () { + function FinallyOperator(callback) { + this.callback = callback; } - - this.value = value; -} - -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}],182:[function(require,module,exports){ -'use strict'; - -module.exports = SoftSetHook; - -function SoftSetHook(value) { - if (!(this instanceof SoftSetHook)) { - return new SoftSetHook(value); + 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)); - this.value = value; +},{"../Subscriber":39,"../Subscription":40}],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"); +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)); }; } - -SoftSetHook.prototype.hook = function (node, propertyName) { - if (node[propertyName] !== this.value) { - node[propertyName] = this.value; +exports.find = find; +var FindValueOperator = (function () { + function FindValueOperator(predicate, source, yieldIndex, thisArg) { + this.predicate = predicate; + this.source = source; + this.yieldIndex = yieldIndex; + this.thisArg = thisArg; } -}; - -},{}],183:[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 = {}; + 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; - props = props || properties || {}; - tag = parseTag(tagName, props); +},{"../Subscriber":39}],106:[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; - // support keys - if (props.hasOwnProperty('key')) { - key = props.key; - props.key = undefined; - } +},{"../operators/find":105}],107:[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; - // support namespace - if (props.hasOwnProperty('namespace')) { - namespace = props.namespace; - props.namespace = undefined; +},{"../util/EmptyError":194,"../util/identity":202,"./defaultIfEmpty":90,"./filter":103,"./take":155,"./throwIfEmpty":162}],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); } - - // fix cursor bug - if (tag === 'INPUT' && - !namespace && - props.hasOwnProperty('value') && - props.value !== undefined && - !isHook(props.value) - ) { - props.value = softSetHook(props.value); + 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; } - - transformProperties(props); - - if (children !== undefined && children !== null) { - addChild(children, childNodes, tag, props); + 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; } - - - return new VNode(tag, props, childNodes, key, namespace); -} - -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); + GroupBySubscriber.prototype._next = function (value) { + var key; + try { + key = this.keySelector(value); } - } else if (c === null || c === undefined) { - return; - } else { - throw UnexpectedVirtualElement({ - foreignObject: c, - parentVnode: { - tagName: tag, - properties: props + 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); } - }); - } -} - -function transformProperties(props) { - for (var propName in props) { - if (props.hasOwnProperty(propName)) { - var value = props[propName]; - - if (isHook(value)) { - continue; + catch (err) { + this.error(err); } - - if (propName.substr(0, 3) === 'ev-') { - // add ev-foo support - props[propName] = evHook(value); + } + 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)); -function isChild(x) { - return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x); +},{"../Observable":32,"../Subject":37,"../Subscriber":39,"../Subscription":40}],109:[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)); -function isChildren(x) { - return typeof x === 'string' || isArray(x) || isChild(x); +},{"../Subscriber":39}],110:[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)); -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; +},{"../Subscriber":39}],111:[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; -function errorString(obj) { - try { - return JSON.stringify(obj, null, ' '); - } catch (e) { - return String(obj); +},{"../util/EmptyError":194,"../util/identity":202,"./defaultIfEmpty":90,"./filter":103,"./takeLast":156,"./throwIfEmpty":162}],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 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)); + }; } - -},{"../vnode/is-thunk":186,"../vnode/is-vhook":187,"../vnode/is-vnode":188,"../vnode/is-vtext":189,"../vnode/is-widget":190,"../vnode/vnode.js":192,"../vnode/vtext.js":194,"./hooks/ev-hook.js":181,"./hooks/soft-set-hook.js":182,"./parse-tag.js":184,"x-is-array":215}],184:[function(require,module,exports){ -'use strict'; - -var split = require('browser-split'); - -var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/; -var notClassId = /^\.|#/; - -module.exports = parseTag; - -function parseTag(tag, props) { - if (!tag) { - return 'DIV'; +exports.map = map; +var MapOperator = (function () { + function MapOperator(project, thisArg) { + this.project = project; + this.thisArg = thisArg; } - - var noId = !(props.hasOwnProperty('id')); - - var tagParts = split(tag, classIdSplit); - var tagName = null; - - if (notClassId.test(tagParts[1])) { - tagName = 'DIV'; + 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; } - - var classes, part, type, i; - - for (i = 0; i < tagParts.length; i++) { - part = tagParts[i]; - - if (!part) { - continue; - } - - 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); + MapSubscriber.prototype._next = function (value) { + var result; + try { + result = this.project.call(this.thisArg, value, this.count++); } - } - - if (classes) { - if (props.className) { - classes.push(props.className); + catch (err) { + this.destination.error(err); + return; } + this.destination.next(result); + }; + return MapSubscriber; +}(Subscriber_1.Subscriber)); - props.className = classes.join(' '); +},{"../Subscriber":39}],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 props.namespace ? tagName : tagName.toUpperCase(); + 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)); }; } - -},{"browser-split":3}],185:[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.mapTo = mapTo; +var MapToOperator = (function () { + function MapToOperator(value) { + this.value = value; } - - if (isThunk(a)) { - renderedA = renderThunk(a, null) + 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)); - return { - a: renderedA, - b: renderedB +},{"../Subscriber":39}],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 Subscriber_1 = require("../Subscriber"); +var Notification_1 = require("../Notification"); +function materialize() { + return function materializeOperatorFunction(source) { + return source.lift(new MaterializeOperator()); + }; } - -function renderThunk(thunk, previous) { - var renderedThunk = thunk.vnode - - if (!renderedThunk) { - renderedThunk = thunk.vnode = thunk.render(previous) +exports.materialize = materialize; +var MaterializeOperator = (function () { + function MaterializeOperator() { } - - if (!(isVNode(renderedThunk) || - isVText(renderedThunk) || - isWidget(renderedThunk))) { - throw new Error("thunk did not return a valid node"); + 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 renderedThunk -} - -},{"./is-thunk":186,"./is-vnode":188,"./is-vtext":189,"./is-widget":190}],186:[function(require,module,exports){ -module.exports = isThunk - -function isThunk(t) { - return t && t.type === "Thunk" -} - -},{}],187:[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")) +},{"../Notification":31,"../Subscriber":39}],115:[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; -},{}],188:[function(require,module,exports){ -var version = require("./version") - -module.exports = isVirtualNode - -function isVirtualNode(x) { - return x && x.type === "VirtualNode" && x.version === version +},{"./reduce":133}],116:[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; -},{"./version":191}],189:[function(require,module,exports){ -var version = require("./version") - -module.exports = isVirtualText - -function isVirtualText(x) { - return x && x.type === "VirtualText" && x.version === version +},{"../observable/merge":61}],117:[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; -},{"./version":191}],190:[function(require,module,exports){ -module.exports = isWidget - -function isWidget(w) { - return w && w.type === "Widget" +},{"../util/identity":202,"./mergeMap":118}],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 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)); }; } - -},{}],191:[function(require,module,exports){ -module.exports = "2" - -},{}],192:[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 - } - } +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, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, ish, value, index, innerSubscriber); + }; + 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; - for (var i = 0; i < count; i++) { - var child = children[i] - if (isVNode(child)) { - descendants += child.count || 0 +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/subscribeToResult":222,"./map":112}],119:[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; - if (!hasWidgets && child.hasWidgets) { - hasWidgets = true +},{"./mergeMap":118}],120:[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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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 ish = tryCatch_1.tryCatch(this.accumulator)(this.acc, value); + var destination = this.destination; + if (ish === errorObject_1.errorObject) { + destination.error(errorObject_1.errorObject.e); } - - if (!hasThunks && child.hasThunks) { - hasThunks = true + else { + this.active++; + this._innerSub(ish, value, index); } - - if (!descendantHooks && (child.hooks || child.descendantHooks)) { - descendantHooks = true + } + else { + this.buffer.push(value); + } + }; + MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, ish, value, index, innerSubscriber); + }; + MergeScanSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + if (this.hasValue === false) { + this.destination.next(this.acc); } - } else if (!hasWidgets && isWidget(child)) { - if (typeof child.destroy === "function") { - hasWidgets = true + 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); } - } else if (!hasThunks && isThunk(child)) { - hasThunks = true; + this.destination.complete(); } - } - - this.count = count + descendants - this.hasWidgets = hasWidgets - this.hasThunks = hasThunks - this.hooks = hooks - this.descendantHooks = descendantHooks -} - -VirtualNode.prototype.version = version -VirtualNode.prototype.type = "VirtualNode" - -},{"./is-thunk":186,"./is-vhook":187,"./is-vnode":188,"./is-widget":190,"./version":191}],193:[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":191}],194:[function(require,module,exports){ -var version = require("./version") - -module.exports = VirtualText + }; + return MergeScanSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.MergeScanSubscriber = MergeScanSubscriber; -function VirtualText(text) { - this.text = String(text) +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],121:[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; -VirtualText.prototype.version = version -VirtualText.prototype.type = "VirtualText" - -},{"./version":191}],195:[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 +},{"./reduce":133}],122:[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; } - - 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 { + subjectFactory = function subjectFactory() { + return subjectOrSubjectFactory; + }; } - } - - for (var bKey in b) { - if (!(bKey in a)) { - diff = diff || {} - diff[bKey] = b[bKey] + if (typeof selector === 'function') { + return source.lift(new MulticastOperator(subjectFactory, selector)); } - } - - return diff + 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; -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 - } +},{"../observable/ConnectableObservable":42}],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"); +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; -},{"../vnode/is-vhook":187,"is-object":18}],196:[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 +},{"../Notification":31,"../Subscriber":39}],124:[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)); }; } - -function walk(a, b, patch, index) { - if (a === b) { - return +exports.onErrorResumeNext = onErrorResumeNext; +function onErrorResumeNextStatic() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; } - - 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] + 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); + subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber); } - - 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 + else { + this.destination.complete(); } - } 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)) + }; + return OnErrorResumeNextSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/isArray":203,"../util/subscribeToResult":222}],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 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) { + if (this.hasPrev) { + this.destination.next([this.prev, value]); } - } else if (isWidget(b)) { - if (!isWidget(a)) { - applyClear = true + else { + this.hasPrev = true; } + this.prev = value; + }; + return PairwiseSubscriber; +}(Subscriber_1.Subscriber)); - apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b)) - } +},{"../Subscriber":39}],126:[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 (apply) { - patch[index] = apply +},{"../util/not":215,"./filter":103}],127:[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]; } - - if (applyClear) { - clearState(a, patch, index) + 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; } -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 +},{"./map":112}],128:[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; - for (var i = 0; i < len; i++) { - var leftNode = aChildren[i] - var rightNode = bChildren[i] - index += 1 +},{"../Subject":37,"./multicast":122}],129:[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; - 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) - } +},{"../BehaviorSubject":29,"./multicast":122}],130:[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; - if (isVNode(leftNode) && leftNode.count) { - index += leftNode.count - } +},{"../AsyncSubject":28,"./multicast":122}],131:[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; - if (orderedSet.moves) { - // Reorder nodes last - apply = appendPatch(apply, new VPatch( - VPatch.ORDER, - a, - orderedSet.moves - )) +},{"../ReplaySubject":35,"./multicast":122}],132:[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 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) - ) + return function raceOperatorFunction(source) { + if (observables.length === 1 && isArray_1.isArray(observables[0])) { + observables = observables[0]; } - } 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) + return source.lift.call(race_1.race.apply(void 0, [source].concat(observables))); + }; +} +exports.race = race; - if (isVNode(child) && child.count) { - index += child.count - } - } - } else if (isThunk(vNode)) { - thunks(vNode, null, patch, index) +},{"../observable/race":66,"../util/isArray":203}],133:[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; -// 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) +},{"../util/pipe":216,"./defaultIfEmpty":90,"./scan":141,"./takeLast":156}],134:[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)); + }; } - -function hasPatches(patch) { - for (var index in patch) { - if (index !== "a") { - return true +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; } - - 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) - ) - ) + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + 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 - } - } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; } - } else if (isThunk(vNode)) { - thunks(vNode, null, patch, index) - } -} - -function undefinedKeys(obj) { - var result = {} + 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)); - for (var key in obj) { - result[key] = undefined +},{"../Subscriber":39}],135:[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 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 + 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(); } - } - - // 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 + 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; } - - // 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) + 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 { - // 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) + else if (count > -1) { + this.count = count - 1; } + source.subscribe(this._unsubscribeAndRecycle()); } - } - - 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] + }; + return RepeatSubscriber; +}(Subscriber_1.Subscriber)); - 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) - } +},{"../Subscriber":39,"../observable/empty":49}],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 Subject_1 = require("../Subject"); +var tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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 = tryCatch_1.tryCatch(this.notifier)(this.notifications); + if (retries === errorObject_1.errorObject) { + return _super.prototype.complete.call(this); + } + this.retries = retries; + this.retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries); + }; + return RepeatWhenSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); - 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] +},{"../OuterSubscriber":34,"../Subject":37,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],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 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)); - 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}) +},{"../Subscriber":39}],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 Subject_1 = require("../Subject"); +var tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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(); + retries = tryCatch_1.tryCatch(this.notifier)(errors); + if (retries === errorObject_1.errorObject) { + return _super.prototype.error.call(this, errorObject_1.errorObject.e); } - k++ + retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries); } - // a key in simulate has no matching wanted key, remove it - else if (simulateItem && simulateItem.key) { - removes.push(remove(simulate, simulateIndex, simulateItem.key)) + else { + this.errors = null; + this.retriesSubscription = null; } + this._unsubscribeAndRecycle(); + this.errors = errors; + this.retries = retries; + this.retriesSubscription = retriesSubscription; + errors.next(err); } - else { - simulateIndex++ - k++ + }; + 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)); - // remove all the remaining nodes from simulate - while(simulateIndex < simulate.length) { - simulateItem = simulate[simulateIndex] - removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key)) +},{"../OuterSubscriber":34,"../Subject":37,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],139:[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); } - - // 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 - } + 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; } - - return { - children: newChildren, - moves: { - removes: removes, - inserts: inserts + 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)); + +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],140:[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)); }; } - -function remove(arr, index, key) { - arr.splice(index, 1) - - return { - from: index, - key: key +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); } -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) - } +},{"../Subscriber":39,"../scheduler/async":188}],141:[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 { - keys: keys, // A hash of key name to index - free: free // An array of unkeyed item indices + 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)); + }; } - -function appendPatch(apply, patch) { - if (apply) { - if (isArray(apply)) { - apply.push(patch) - } else { - apply = [apply, patch] +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)); - return apply - } else { - return patch +},{"../Subscriber":39}],142:[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); } -} - -},{"../vnode/handle-thunk":185,"../vnode/is-thunk":186,"../vnode/is-vnode":188,"../vnode/is-vtext":189,"../vnode/is-widget":190,"../vnode/vpatch":193,"./diff-props":195,"x-is-array":215}],197:[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) - }); + 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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +function sequenceEqual(compareTo, comparor) { + return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparor)); }; +} +exports.sequenceEqual = sequenceEqual; +var SequenceEqualOperator = (function () { + function SequenceEqualOperator(compareTo, comparor) { + this.compareTo = compareTo; + this.comparor = comparor; + } + SequenceEqualOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparor)); + }; + return SequenceEqualOperator; +}()); +exports.SequenceEqualOperator = SequenceEqualOperator; +var SequenceEqualSubscriber = (function (_super) { + __extends(SequenceEqualSubscriber, _super); + function SequenceEqualSubscriber(destination, compareTo, comparor) { + var _this = _super.call(this, destination) || this; + _this.compareTo = compareTo; + _this.comparor = comparor; + _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, comparor = _c.comparor; + while (_a.length > 0 && _b.length > 0) { + var a = _a.shift(); + var b = _b.shift(); + var areEqual = false; + if (comparor) { + areEqual = tryCatch_1.tryCatch(comparor)(a, b); + if (areEqual === errorObject_1.errorObject) { + this.destination.error(errorObject_1.errorObject.e); + } + } + else { + areEqual = a === b; + } + 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)); -}); -})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); +},{"../Subscriber":39,"../util/errorObject":200,"../util/tryCatch":224}],143:[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; -},{"./Scheduler":198,"./env":210,"./makePromise":212}],198:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +},{"../Subject":37,"./multicast":122,"./refCount":134}],144:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ReplaySubject_1 = require("../ReplaySubject"); +function shareReplay(bufferSize, windowTime, scheduler) { + if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; } + if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; } + return function (source) { return source.lift(shareReplayOperator(bufferSize, windowTime, scheduler)); }; +} +exports.shareReplay = shareReplay; +function shareReplayOperator(bufferSize, windowTime, 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; + subject.complete(); + }, + }); + } + var innerSub = subject.subscribe(this); + return function () { + refCount--; + innerSub.unsubscribe(); + if (subscription && refCount === 0 && isComplete) { + subscription.unsubscribe(); + } + }; + }; +} -(function(define) { 'use strict'; -define(function() { +},{"../ReplaySubject":35}],145:[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)); - // Credit to Twisol (https://github.com/Twisol) for suggesting - // this type of extensible queue + trampoline approach for next-tick conflation. +},{"../Subscriber":39,"../util/EmptyError":194}],146:[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)); - /** - * Async task scheduler - * @param {function} async function to schedule a single async function - * @constructor - */ - function Scheduler(async) { - this._async = async; - this._running = false; +},{"../Subscriber":39}],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"); +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)); - this._queue = this; - this._queueLen = 0; - this._afterQueue = {}; - this._afterQueueLen = 0; +},{"../Subscriber":39,"../util/ArgumentOutOfRangeError":193}],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 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; + subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber); + 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)); - var self = this; - this.drain = function() { - self._drain(); - }; - } +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../util/subscribeToResult":222}],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 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)); - /** - * 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; - } +},{"../Subscriber":39}],150:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var fromArray_1 = require("../observable/fromArray"); +var scalar_1 = require("../observable/scalar"); +var empty_1 = require("../observable/empty"); +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]; + } + return function (source) { + var scheduler = array[array.length - 1]; + if (isScheduler_1.isScheduler(scheduler)) { + array.pop(); + } + else { + scheduler = null; + } + var len = array.length; + if (len === 1 && !scheduler) { + return concat_1.concat(scalar_1.scalar(array[0]), source); + } + else if (len > 0) { + return concat_1.concat(fromArray_1.fromArray(array, scheduler), source); + } + else { + return concat_1.concat(empty_1.empty(scheduler), source); + } + }; +} +exports.startWith = startWith; - this._queueLen = 0; - this._running = false; +},{"../observable/concat":47,"../observable/empty":49,"../observable/fromArray":52,"../observable/scalar":68,"../util/isScheduler":213}],151:[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; +}()); - for (i = 0; i < this._afterQueueLen; ++i) { - this._afterQueue[i].run(); - this._afterQueue[i] = void 0; - } +},{"../observable/SubscribeOnObservable":43}],152:[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; - this._afterQueueLen = 0; - }; +},{"../util/identity":202,"./switchMap":153}],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 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, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index, innerSubscriber); + }; + 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 Scheduler; +},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/subscribeToResult":222,"./map":112}],154:[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; -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); +},{"./switchMap":153}],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"); +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)); -},{}],199:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +},{"../Subscriber":39,"../observable/empty":49,"../util/ArgumentOutOfRangeError":193}],156:[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(define) { 'use strict'; -define(function() { +},{"../Subscriber":39,"../observable/empty":49,"../util/ArgumentOutOfRangeError":193}],157:[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)); - /** - * 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(); })); -},{}],200:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],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"); +function takeWhile(predicate) { + return function (source) { return source.lift(new TakeWhileOperator(predicate)); }; +} +exports.takeWhile = takeWhile; +var TakeWhileOperator = (function () { + function TakeWhileOperator(predicate) { + this.predicate = predicate; + } + TakeWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate)); + }; + return TakeWhileOperator; +}()); +var TakeWhileSubscriber = (function (_super) { + __extends(TakeWhileSubscriber, _super); + function TakeWhileSubscriber(destination, predicate) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _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 { + destination.complete(); + } + }; + return TakeWhileSubscriber; +}(Subscriber_1.Subscriber)); -(function(define) { 'use strict'; -define(function() { +},{"../Subscriber":39}],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"); +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)); - makeApply.tryCatchResolve = tryCatchResolve; +},{"../Subscriber":39,"../util/isFunction":206,"../util/noop":214}],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 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)); - return makeApply; +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],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 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); + } + } + }; + 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(); +} - function makeApply(Promise, call) { - if(arguments.length < 2) { - call = tryCatchResolve; - } +},{"../Subscriber":39,"../scheduler/async":188,"./throttle":160}],162:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tap_1 = require("./tap"); +var EmptyError_1 = require("../util/EmptyError"); +exports.throwIfEmpty = function (errorFactory) { + if (errorFactory === void 0) { errorFactory = defaultErrorFactory; } + return tap_1.tap({ + hasValue: false, + next: function () { this.hasValue = true; }, + complete: function () { + if (!this.hasValue) { + throw errorFactory(); + } + } + }); +}; +function defaultErrorFactory() { + return new EmptyError_1.EmptyError(); +} - return apply; +},{"../util/EmptyError":194,"./tap":159}],163:[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; - 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); +},{"../observable/defer":48,"../scheduler/async":188,"./map":112,"./scan":141}],164:[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; - return p; - } +},{"../observable/throwError":69,"../scheduler/async":188,"../util/TimeoutError":197,"./timeoutWith":165}],165:[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 callAndResolve(c, h) { - if(c.i < 0) { - return call(c.f, c.thisArg, c.params, h); - } +},{"../OuterSubscriber":34,"../scheduler/async":188,"../util/isDate":205,"../util/subscribeToResult":222}],166:[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 handler = Promise._handler(c.args[c.i]); - handler.fold(callAndResolveNext, c, void 0, h); - } +},{"../scheduler/async":188,"./map":112}],167:[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; - 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); - } - } +},{"./reduce":133}],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 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)); -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); +},{"../OuterSubscriber":34,"../Subject":37,"../util/subscribeToResult":222}],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 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)); +},{"../Subject":37,"../Subscriber":39}],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 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); +} + +},{"../Subject":37,"../Subscriber":39,"../scheduler/async":188,"../util/isNumeric":209,"../util/isScheduler":213}],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 Subject_1 = require("../Subject"); +var Subscription_1 = require("../Subscription"); +var tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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 closingSelector = this.closingSelector; + var closingNotifier = tryCatch_1.tryCatch(closingSelector)(innerValue); + if (closingNotifier === errorObject_1.errorObject) { + return this.error(errorObject_1.errorObject.e); + } + else { + 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)); +},{"../OuterSubscriber":34,"../Subject":37,"../Subscription":40,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],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 Subject_1 = require("../Subject"); +var tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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 = tryCatch_1.tryCatch(this.closingSelector)(); + if (closingNotifier === errorObject_1.errorObject) { + var err = errorObject_1.errorObject.e; + this.destination.error(err); + this.window.error(err); + } + else { + this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier)); + } + }; + return WindowSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); -},{}],201:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +},{"../OuterSubscriber":34,"../Subject":37,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],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"); +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)); -(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; +},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],174:[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; - Promise.map = map; - Promise.filter = filter; - Promise.reduce = reduce; - Promise.reduceRight = reduceRight; +},{"../observable/zip":72}],175:[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; - /** - * 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); - }); - }; +},{"../observable/zip":72}],176:[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; - return Promise; +},{"../Subscription":40}],177:[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; - /** - * 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; +},{"./AsyncAction":181}],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 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 pending = l; - var errors = []; +},{"./AsyncScheduler":182}],179:[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; - for (var h, x, i = 0; i < l; ++i) { - x = promises[i]; - if(x === void 0 && !(i in promises)) { - --pending; - continue; - } +},{"../util/Immediate":195,"./AsyncAction":181}],180:[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; - h = Promise._handler(x); - if(h.state() > 0) { - resolver.become(h); - Promise._visitRemaining(promises, i, h); - break; - } else { - h.visit(resolver, handleFulfill, handleReject); - } - } +},{"./AsyncScheduler":182}],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 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); + }; + 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; - if(pending === 0) { - resolver.reject(new RangeError('any(): array must not be empty')); - } +},{"./Action":176}],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 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; - return p; +},{"../Scheduler":36}],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 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; - function handleFulfill(x) { - /*jshint validthis:true*/ - errors = null; - this.resolve(x); // this === resolver - } +},{"./AsyncAction":181}],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 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; - function handleReject(e) { - /*jshint validthis:true*/ - if(this.resolved) { // this === resolver - return; - } +},{"./AsyncScheduler":182}],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 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.shift()) && (this.frame = action.delay) <= maxFrames) { + 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; - errors.push(e); - if(--pending === 0) { - this.reject(errors); - } - } - } +},{"./AsyncAction":181,"./AsyncScheduler":182}],186:[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); - /** - * 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; +},{"./AnimationFrameAction":177,"./AnimationFrameScheduler":178}],187:[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); - var results = []; - var errors = []; +},{"./AsapAction":179,"./AsapScheduler":180}],188:[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); - var l = promises.length>>>0; - var nFulfill = 0; - var nReject; - var x, i; // reused in both for() loops +},{"./AsyncAction":181,"./AsyncScheduler":182}],189:[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); - // First pass: count actual array items - for(i=0; i nFulfill) { - resolver.reject(new RangeError('some(): array must contain at least ' - + n + ' item(s), but had ' + nFulfill)); - } else if(nFulfill === 0) { - resolver.resolve(results); - } +},{}],192:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rxSubscriber = typeof Symbol === 'function' + ? Symbol('rxSubscriber') + : '@@rxSubscriber_' + Math.random(); +exports.$$rxSubscriber = exports.rxSubscriber; - // Second pass: observe each array item, make progress toward goals - for(i=0; i 2 ? ar.call(promises, liftCombine(f), arguments[2]) - : ar.call(promises, liftCombine(f)); - } +},{}],207:[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; - /** - * 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)); - } +},{"../symbol/observable":191}],208:[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 liftCombine(f) { - return function(z, x, i) { - return applyFold(f, void 0, [z,x,i]); - }; - } - }; +},{"../symbol/iterator":190}],209:[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":203}],210:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isObject(x) { + return x != null && typeof x === 'object'; +} +exports.isObject = isObject; -},{"../apply":200,"../state":213}],202:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +},{}],211:[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":32}],212:[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 flow(Promise) { +},{}],213:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isScheduler(value) { + return value && typeof value.schedule === 'function'; +} +exports.isScheduler = isScheduler; - var resolve = Promise.resolve; - var reject = Promise.reject; - var origCatch = Promise.prototype['catch']; +},{}],214:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function noop() { } +exports.noop = noop; - /** - * 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); - }; +},{}],215:[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; - /** - * 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); - } +},{}],216:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var noop_1 = require("./noop"); +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) { + return noop_1.noop; + } + if (fns.length === 1) { + return fns[0]; + } + return function piped(input) { + return fns.reduce(function (prev, fn) { return fn(prev); }, input); + }; +} +exports.pipeFromArray = pipeFromArray; - if(typeof onRejected !== 'function') { - return this.ensure(rejectInvalidPredicate); - } +},{"./noop":214}],217:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +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 instanceof Observable_1.Observable) { + return function (subscriber) { + if (result._isScalar) { + subscriber.next(result.value); + subscriber.complete(); + return undefined; + } + else { + return result.subscribe(subscriber); + } + }; + } + else 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); + } +}; - return origCatch.call(this, createCatchFilter(arguments[1], onRejected)); - }; +},{"../Observable":32,"../symbol/iterator":190,"../symbol/observable":191,"./isArrayLike":204,"./isObject":210,"./isPromise":212,"./subscribeToArray":218,"./subscribeToIterable":219,"./subscribeToObservable":220,"./subscribeToPromise":221}],218:[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]); + } + if (!subscriber.closed) { + subscriber.complete(); + } +}; }; - /** - * 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); - }; - } +},{}],219:[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; +}; }; - /** - * 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; - } +},{"../symbol/iterator":190}],220:[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); + } +}; }; - return this.then(function(x) { - return runSideEffect(handler, this, identity, x); - }, function(e) { - return runSideEffect(handler, this, reject, e); - }); - }; +},{"../symbol/observable":191}],221:[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; +}; }; - function runSideEffect (handler, thisArg, propagate, value) { - var result = handler.call(thisArg); - return maybeThenable(result) - ? propagateValue(result, propagate, value) - : propagate(value); - } +},{"./hostReportError":201}],222:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var InnerSubscriber_1 = require("../InnerSubscriber"); +var subscribeTo_1 = require("./subscribeTo"); +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); } + if (destination.closed) { + return; + } + return subscribeTo_1.subscribeTo(result)(destination); +} +exports.subscribeToResult = subscribeToResult; - function propagateValue (result, propagate, x) { - return resolve(result).then(function () { - return propagate(x); - }); - } +},{"../InnerSubscriber":30,"./subscribeTo":217}],223:[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; - /** - * 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; - }); - }; +},{"../Observer":33,"../Subscriber":39,"../symbol/rxSubscriber":192}],224:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; - /** - * 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; - }); - }; +},{"./errorObject":200}],225:[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":73,"../internal/operators/auditTime":74,"../internal/operators/buffer":75,"../internal/operators/bufferCount":76,"../internal/operators/bufferTime":77,"../internal/operators/bufferToggle":78,"../internal/operators/bufferWhen":79,"../internal/operators/catchError":80,"../internal/operators/combineAll":81,"../internal/operators/combineLatest":82,"../internal/operators/concat":83,"../internal/operators/concatAll":84,"../internal/operators/concatMap":85,"../internal/operators/concatMapTo":86,"../internal/operators/count":87,"../internal/operators/debounce":88,"../internal/operators/debounceTime":89,"../internal/operators/defaultIfEmpty":90,"../internal/operators/delay":91,"../internal/operators/delayWhen":92,"../internal/operators/dematerialize":93,"../internal/operators/distinct":94,"../internal/operators/distinctUntilChanged":95,"../internal/operators/distinctUntilKeyChanged":96,"../internal/operators/elementAt":97,"../internal/operators/endWith":98,"../internal/operators/every":99,"../internal/operators/exhaust":100,"../internal/operators/exhaustMap":101,"../internal/operators/expand":102,"../internal/operators/filter":103,"../internal/operators/finalize":104,"../internal/operators/find":105,"../internal/operators/findIndex":106,"../internal/operators/first":107,"../internal/operators/groupBy":108,"../internal/operators/ignoreElements":109,"../internal/operators/isEmpty":110,"../internal/operators/last":111,"../internal/operators/map":112,"../internal/operators/mapTo":113,"../internal/operators/materialize":114,"../internal/operators/max":115,"../internal/operators/merge":116,"../internal/operators/mergeAll":117,"../internal/operators/mergeMap":118,"../internal/operators/mergeMapTo":119,"../internal/operators/mergeScan":120,"../internal/operators/min":121,"../internal/operators/multicast":122,"../internal/operators/observeOn":123,"../internal/operators/onErrorResumeNext":124,"../internal/operators/pairwise":125,"../internal/operators/partition":126,"../internal/operators/pluck":127,"../internal/operators/publish":128,"../internal/operators/publishBehavior":129,"../internal/operators/publishLast":130,"../internal/operators/publishReplay":131,"../internal/operators/race":132,"../internal/operators/reduce":133,"../internal/operators/refCount":134,"../internal/operators/repeat":135,"../internal/operators/repeatWhen":136,"../internal/operators/retry":137,"../internal/operators/retryWhen":138,"../internal/operators/sample":139,"../internal/operators/sampleTime":140,"../internal/operators/scan":141,"../internal/operators/sequenceEqual":142,"../internal/operators/share":143,"../internal/operators/shareReplay":144,"../internal/operators/single":145,"../internal/operators/skip":146,"../internal/operators/skipLast":147,"../internal/operators/skipUntil":148,"../internal/operators/skipWhile":149,"../internal/operators/startWith":150,"../internal/operators/subscribeOn":151,"../internal/operators/switchAll":152,"../internal/operators/switchMap":153,"../internal/operators/switchMapTo":154,"../internal/operators/take":155,"../internal/operators/takeLast":156,"../internal/operators/takeUntil":157,"../internal/operators/takeWhile":158,"../internal/operators/tap":159,"../internal/operators/throttle":160,"../internal/operators/throttleTime":161,"../internal/operators/throwIfEmpty":162,"../internal/operators/timeInterval":163,"../internal/operators/timeout":164,"../internal/operators/timeoutWith":165,"../internal/operators/timestamp":166,"../internal/operators/toArray":167,"../internal/operators/window":168,"../internal/operators/windowCount":169,"../internal/operators/windowTime":170,"../internal/operators/windowToggle":171,"../internal/operators/windowWhen":172,"../internal/operators/withLatestFrom":173,"../internal/operators/zip":174,"../internal/operators/zipAll":175}],226:[function(require,module,exports){ +// threejs.org/license +(function(l,ya){"object"===typeof exports&&"undefined"!==typeof module?ya(exports):"function"===typeof define&&define.amd?define(["exports"],ya):ya(l.THREE={})})(this,function(l){function ya(){}function z(a,b){this.x=a||0;this.y=b||0}function I(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0b&&(b=a[c]);return b}function C(){Object.defineProperty(this,"id",{value:If+=2});this.uuid=H.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};this.userData={}}function Ib(a,b,c,d,e,f){R.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e, +depthSegments:f};this.fromBufferGeometry(new kb(a,b,c,d,e,f));this.mergeVertices()}function kb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,N,O,Jf){var r=f/N,v=g/O,P=f/2,y=g/2,w=l/2;g=N+1;var E=O+1,x=f=0,B,z,A=new p;for(z=0;zm;m++){if(n=d[m])if(h=n[0],k=n[1]){q&&e.addAttribute("morphTarget"+m,q[h]);f&&e.addAttribute("morphNormal"+ +m,f[h]);c[m]=k;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Vf(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function Ua(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];T.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Jb(a,b,c){var d=a[0];if(0>=d||0/gm, +function(a,c){a=S[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Xd(a)})}function Xe(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);cb||a.height>b){if("data"in a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+")."); +return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height);return c}return a}function k(a){return H.isPowerOfTwo(a.width)&&H.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!== +a.minFilter&&1006!==a.minFilter}function q(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,f))*Math.LOG2E}function n(b,c){if(!e.isWebGL2)return b;if(b===a.RGB){if(c===a.FLOAT)return a.RGB32F;if(c===a.HALF_FLOAT)return a.RGB16F;if(c===a.UNSIGNED_BYTE)return a.RGB8}if(b===a.RGBA){if(c===a.FLOAT)return a.RGBA32F;if(c===a.HALF_FLOAT)return a.RGBA16F;if(c===a.UNSIGNED_BYTE)return a.RGBA8}return b}function t(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function u(b){b= +b.target;b.removeEventListener("dispose",u);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.remove(b)}b.isVideoTexture&&delete B[b.id];g.memory.textures--}function r(b){b=b.target;b.removeEventListener("dispose",r);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.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.remove(b.texture);d.remove(b)}g.memory.textures--}function l(b,t){var r=d.get(b);if(b.isVideoTexture){var l=b.id,v=g.render.frame;B[l]!==v&&(B[l]=v,b.update())}if(0w;w++)v[w]=t||l?l?b.image[w].image:b.image[w]:h(b.image[w],e.maxCubemapSize);var y=v[0],E=k(y),P=f.convert(b.format),x=f.convert(b.type),N=n(P,x);p(a.TEXTURE_CUBE_MAP,b,E);for(w=0;6>w;w++)if(t)for(var B,z=v[w].mipmaps,A=0,D=z.length;At;t++)e.__webglFramebuffer[t]=a.createFramebuffer()}else e.__webglFramebuffer= +a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);p(a.TEXTURE_CUBE_MAP,b.texture,n);for(t=0;6>t;t++)x(e.__webglFramebuffer[t],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+t);m(b.texture,n)&&q(a.TEXTURE_CUBE_MAP,b.texture,b.width,b.height);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),p(a.TEXTURE_2D,b.texture,n),x(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,n)&&q(a.TEXTURE_2D,b.texture,b.width,b.height), +c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===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);l(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(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);if(m(e,f)){f=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D;var g=d.get(e).__webglTexture; +c.bindTexture(f,g);q(f,e,b.width,b.height);c.bindTexture(f,null)}}}function $e(a,b,c){return{convert:function(d){if(1E3===d)return a.REPEAT;if(1001===d)return a.CLAMP_TO_EDGE;if(1002===d)return a.MIRRORED_REPEAT;if(1003===d)return a.NEAREST;if(1004===d)return a.NEAREST_MIPMAP_NEAREST;if(1005===d)return a.NEAREST_MIPMAP_LINEAR;if(1006===d)return a.LINEAR;if(1007===d)return a.LINEAR_MIPMAP_NEAREST;if(1008===d)return a.LINEAR_MIPMAP_LINEAR;if(1009===d)return a.UNSIGNED_BYTE;if(1017===d)return a.UNSIGNED_SHORT_4_4_4_4; +if(1018===d)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===d)return a.UNSIGNED_SHORT_5_6_5;if(1010===d)return a.BYTE;if(1011===d)return a.SHORT;if(1012===d)return a.UNSIGNED_SHORT;if(1013===d)return a.INT;if(1014===d)return a.UNSIGNED_INT;if(1015===d)return a.FLOAT;if(1016===d){if(c.isWebGL2)return a.HALF_FLOAT;var e=b.get("OES_texture_half_float");if(null!==e)return e.HALF_FLOAT_OES}if(1021===d)return a.ALPHA;if(1022===d)return a.RGB;if(1023===d)return a.RGBA;if(1024===d)return a.LUMINANCE;if(1025=== +d)return a.LUMINANCE_ALPHA;if(1026===d)return a.DEPTH_COMPONENT;if(1027===d)return a.DEPTH_STENCIL;if(100===d)return a.FUNC_ADD;if(101===d)return a.FUNC_SUBTRACT;if(102===d)return a.FUNC_REVERSE_SUBTRACT;if(200===d)return a.ZERO;if(201===d)return a.ONE;if(202===d)return a.SRC_COLOR;if(203===d)return a.ONE_MINUS_SRC_COLOR;if(204===d)return a.SRC_ALPHA;if(205===d)return a.ONE_MINUS_SRC_ALPHA;if(206===d)return a.DST_ALPHA;if(207===d)return a.ONE_MINUS_DST_ALPHA;if(208===d)return a.DST_COLOR;if(209=== +d)return a.ONE_MINUS_DST_COLOR;if(210===d)return a.SRC_ALPHA_SATURATE;if(33776===d||33777===d||33778===d||33779===d)if(e=b.get("WEBGL_compressed_texture_s3tc"),null!==e){if(33776===d)return e.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===d)return e.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===d)return e.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===d)return e.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===d||35841===d||35842===d||35843===d)if(e=b.get("WEBGL_compressed_texture_pvrtc"),null!==e){if(35840===d)return e.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; +if(35841===d)return e.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===d)return e.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===d)return e.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===d&&(e=b.get("WEBGL_compressed_texture_etc1"),null!==e))return e.COMPRESSED_RGB_ETC1_WEBGL;if(37808===d||37809===d||37810===d||37811===d||37812===d||37813===d||37814===d||37815===d||37816===d||37817===d||37818===d||37819===d||37820===d||37821===d)if(e=b.get("WEBGL_compressed_texture_astc"),null!==e)return d;if(103===d||104=== +d){if(c.isWebGL2){if(103===d)return a.MIN;if(104===d)return a.MAX}e=b.get("EXT_blend_minmax");if(null!==e){if(103===d)return e.MIN_EXT;if(104===d)return e.MAX_EXT}}if(1020===d){if(c.isWebGL2)return a.UNSIGNED_INT_24_8;e=b.get("WEBGL_depth_texture");if(null!==e)return e.UNSIGNED_INT_24_8_WEBGL}return 0}}}function Kb(){D.call(this);this.type="Group"}function Z(a,b,c,d){Na.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 yc(a){Z.call(this);this.cameras=a||[]}function af(a){function b(){return null!==e&&!0===e.isPresenting}function c(){if(b()){var c=e.getEyeParameters("left"),f=c.renderWidth;c=c.renderHeight;x=a.getPixelRatio();y=a.getSize();a.setDrawingBufferSize(2*f,c,1);B.start()}else d.enabled&&(a.setDrawingBufferSize(y.width,y.height,x),B.stop())}var d=this,e=null,f=null,g=null,h= +[],k=new I,m=new I;"undefined"!==typeof window&&"VRFrameData"in window&&(f=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",c,!1));var q=new I,n=new fa,t=new p,u=new Z;u.bounds=new V(0,0,.5,1);u.layers.enable(1);var r=new Z;r.bounds=new V(.5,0,.5,1);r.layers.enable(2);var l=new yc([u,r]);l.layers.enable(1);l.layers.enable(2);var y,x,w=[];this.enabled=!1;this.userHeight=1.6;this.getController=function(a){var b=h[a];void 0===b&&(b=new Kb,b.matrixAutoUpdate=!1,b.visible=!1,h[a]= +b);return b};this.getDevice=function(){return e};this.setDevice=function(a){void 0!==a&&(e=a);B.setContext(a)};this.setPoseTarget=function(a){void 0!==a&&(g=a)};this.getCamera=function(a){if(null===e)return a.position.set(0,d.userHeight,0),a;e.depthNear=a.near;e.depthFar=a.far;e.getFrameData(f);var b=e.stageParameters;b?k.fromArray(b.sittingToStandingTransform):k.makeTranslation(0,d.userHeight,0);b=f.pose;var c=null!==g?g:a;c.matrix.copy(k);c.matrix.decompose(c.position,c.quaternion,c.scale);null!== +b.orientation&&(n.fromArray(b.orientation),c.quaternion.multiply(n));null!==b.position&&(n.setFromRotationMatrix(k),t.fromArray(b.position),t.applyQuaternion(n),c.position.add(t));c.updateMatrixWorld();if(!1===e.isPresenting)return a;u.near=a.near;r.near=a.near;u.far=a.far;r.far=a.far;l.matrixWorld.copy(a.matrixWorld);l.matrixWorldInverse.copy(a.matrixWorldInverse);u.matrixWorldInverse.fromArray(f.leftViewMatrix);r.matrixWorldInverse.fromArray(f.rightViewMatrix);m.getInverse(k);u.matrixWorldInverse.multiply(m); +r.matrixWorldInverse.multiply(m);a=c.parent;null!==a&&(q.getInverse(a.matrixWorld),u.matrixWorldInverse.multiply(q),r.matrixWorldInverse.multiply(q));u.matrixWorld.getInverse(u.matrixWorldInverse);r.matrixWorld.getInverse(r.matrixWorldInverse);u.projectionMatrix.fromArray(f.leftProjectionMatrix);r.projectionMatrix.fromArray(f.rightProjectionMatrix);l.projectionMatrix.copy(u.projectionMatrix);a=e.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&u.bounds.fromArray(a.leftBounds), +null!==a.rightBounds&&4===a.rightBounds.length&&r.bounds.fromArray(a.rightBounds));a:for(a=0;af.normalMatrix.determinant();ba.setMaterial(e,h);var k=t(a,c,e,f),m=!1;if(b!==d.id||S!==k.id||nd!==(!0===e.wireframe))b=d.id,S=k.id,nd=!0===e.wireframe,m=!0;f.morphTargetInfluences&&(va.update(f,d,e,k),m=!0);h=d.index;var q=d.attributes.position;c=1;!0===e.wireframe&& +(h=ra.getWireframeAttribute(d),c=2);a=xa;if(null!==h){var n=pa.get(h);a=ya;a.setIndex(n)}if(m){if(d&&d.isInstancedBufferGeometry&!ua.isWebGL2&&null===ha.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{ba.initAttributes();m=d.attributes;k=k.getAttributes();var u=e.defaultAttributeValues;for(N in k){var l=k[N];if(0<=l){var r=m[N];if(void 0!==r){var v=r.normalized, +p=r.itemSize,w=pa.get(r);if(void 0!==w){var y=w.buffer,E=w.type;w=w.bytesPerElement;if(r.isInterleavedBufferAttribute){var x=r.data,B=x.stride;r=r.offset;x&&x.isInstancedInterleavedBuffer?(ba.enableAttributeAndDivisor(l,x.meshPerAttribute),void 0===d.maxInstancedCount&&(d.maxInstancedCount=x.meshPerAttribute*x.count)):ba.enableAttribute(l);F.bindBuffer(F.ARRAY_BUFFER,y);F.vertexAttribPointer(l,p,E,v,B*w,r*w)}else r.isInstancedBufferAttribute?(ba.enableAttributeAndDivisor(l,r.meshPerAttribute),void 0=== +d.maxInstancedCount&&(d.maxInstancedCount=r.meshPerAttribute*r.count)):ba.enableAttribute(l),F.bindBuffer(F.ARRAY_BUFFER,y),F.vertexAttribPointer(l,p,E,v,0,0)}}else if(void 0!==u&&(v=u[N],void 0!==v))switch(v.length){case 2:F.vertexAttrib2fv(l,v);break;case 3:F.vertexAttrib3fv(l,v);break;case 4:F.vertexAttrib4fv(l,v);break;default:F.vertexAttrib1fv(l,v)}}}ba.disableUnusedAttributes()}null!==h&&F.bindBuffer(F.ELEMENT_ARRAY_BUFFER,n.buffer)}n=Infinity;null!==h?n=h.count:void 0!==q&&(n=q.count);h=d.drawRange.start* +c;q=null!==g?g.start*c:0;var N=Math.max(h,q);g=Math.max(0,Math.min(n,h+d.drawRange.count*c,q+(null!==g?g.count*c:Infinity))-1-N+1);if(0!==g){if(f.isMesh)if(!0===e.wireframe)ba.setLineWidth(e.wireframeLinewidth*(null===R?U:1)),a.setMode(F.LINES);else switch(f.drawMode){case 0:a.setMode(F.TRIANGLES);break;case 1:a.setMode(F.TRIANGLE_STRIP);break;case 2:a.setMode(F.TRIANGLE_FAN)}else f.isLine?(e=e.linewidth,void 0===e&&(e=1),ba.setLineWidth(e*(null===R?U:1)),f.isLineSegments?a.setMode(F.LINES):f.isLineLoop? +a.setMode(F.LINE_LOOP):a.setMode(F.LINE_STRIP)):f.isPoints?a.setMode(F.POINTS):f.isSprite&&a.setMode(F.TRIANGLES);d&&d.isInstancedBufferGeometry?0=ua.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+ua.maxTextures);X+=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);ia.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);ia.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?ia.setTextureCube(b,c):ia.setTextureCubeDynamic(b,c)}}();this.setFramebuffer=function(a){L=a};this.getRenderTarget=function(){return R};this.setRenderTarget=function(a){(R=a)&&void 0===Ba.get(a).__webglFramebuffer&&ia.setupRenderTarget(a);var b=L,c=!1;a?(b= +Ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),T.copy(a.viewport),wc.copy(a.scissor),ea=a.scissorTest):(T.copy(od).multiplyScalar(U),wc.copy(fa).multiplyScalar(U),ea=qa);Q!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),Q=b);ba.viewport(T);ba.scissor(wc);ba.setScissorTest(ea);c&&(c=Ba.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels= +function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=Ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==Q&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&da.convert(m)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===q||da.convert(q)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ua.isWebGL2||ha.get("OES_texture_float")|| +ha.get("WEBGL_color_buffer_float"))||1016===q&&(ua.isWebGL2?ha.get("EXT_color_buffer_float"):ha.get("EXT_color_buffer_half_float"))?F.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,da.convert(m),da.convert(q),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&& +F.bindFramebuffer(F.FRAMEBUFFER,Q)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=da.convert(b.format);this.setTexture2D(b,0);F.copyTexImage2D(F.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=da.convert(c.format),h=da.convert(c.type);this.setTexture2D(c,0);b.isDataTexture?F.texSubImage2D(F.TEXTURE_2D, +d||0,a.x,a.y,e,f,g,h,b.image.data):F.texSubImage2D(F.TEXTURE_2D,d||0,a.x,a.y,g,h,b.image)}}function Lb(a,b){this.name="";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Mb(a,b,c){this.name="";this.color=new G(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function qd(){D.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function ob(a,b){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 zc(a,b,c,d){this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function cb(a){J.call(this);this.type="SpriteMaterial";this.color=new G(16777215);this.map=null;this.rotation=0;this.lights=!1;this.transparent=!0;this.setValues(a)}function Ac(a){D.call(this);this.type="Sprite";if(void 0===Nb){Nb=new C;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 ob(b,5);Nb.setIndex([0,1,2,0,2,3]);Nb.addAttribute("position", +new zc(b,3,0,!1));Nb.addAttribute("uv",new zc(b,2,3,!1))}this.geometry=Nb;this.material=void 0!==a?a:new cb;this.center=new z(.5,.5)}function Bc(){D.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Cc(a,b){a=a||[];this.bones=a.slice(0);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 boneInverses is the wrong length."), +this.boneInverses=[],a=0,b=this.bones.length;ac;c++){var n=q[h[c]];var t=q[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){k=a.attributes.position;q=a.index;var u=a.groups;0===u.length&&(u=[{start:0, +count:q.count,materialIndex:0}]);a=0;for(e=u.length;ac;c++)n=q.getX(m+c),t=q.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(k,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,m.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position,m=0,d=k.count/3;mc;c++)g=3*m+c,h.fromBufferAttribute(k,g),b.push(h.x, +h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z);this.addAttribute("position",new A(b,3))}function Fc(a,b,c){R.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Rb(a,b,c));this.mergeVertices()}function Rb(a,b,c){C.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,k=new p,m=new p,q=new p,n=new p,t,u;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter."); +var r=b+1;for(t=0;t<=c;t++){var l=t/c;for(u=0;u<=b;u++){var y=u/b;a(y,l,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(a(y-1E-5,l,m),q.subVectors(k,m)):(a(y+1E-5,l,m),q.subVectors(m,k));0<=l-1E-5?(a(y,l-1E-5,m),n.subVectors(k,m)):(a(y,l+1E-5,m),n.subVectors(m,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(y,l)}}for(t=0;td&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}C.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a, +indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new A(h,3));this.addAttribute("normal",new A(h.slice(),3));this.addAttribute("uv",new A(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Hc(a, +b){R.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sb(a,b));this.mergeVertices()}function Sb(a,b){na.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 Ic(a,b){R.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new pb(a,b));this.mergeVertices()}function pb(a,b){na.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 Jc(a,b){R.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tb(a,b));this.mergeVertices()}function Tb(a,b){var c=(1+Math.sqrt(5))/2;na.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 Kc(a,b){R.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;na.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 Lc(a,b,c,d,e,f){R.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 Vb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Vb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);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);k.x=m*f.x+n*e.x;k.y=m*f.y+n*e.y;k.z=m*f.z+n*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z= +q.z+c*k.z;l.push(h.x,h.y,h.z)}}C.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,k=new p,m=new z,q=new p,n,t,l=[],r=[],v=[],y=[];for(n=0;n=b;e-=d)f=cf(e,a[e],a[e+1],f);f&&qb(f,f.next)&&(Oc(f),f=f.next);return f}function Pc(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!qb(a,a.next)&&0!==ma(a.prev,a,a.next))a=a.next;else{Oc(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b} +function Qc(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,k=h;do null===k.z&&(k.z=ae(k.x,k.y,d,e,f)),k.prevZ=k.prev,k=k.nextZ=k.next;while(k!==h);k.prevZ.nextZ=null;k.prevZ=null;h=k;var m,q,n,t,l=1;do{k=h;var r=h=null;for(q=0;k;){q++;var v=k;for(m=n=0;mn.x?q.x>l.x?q.x:l.x:n.x>l.x?n.x:l.x,B=q.y>n.y?q.y>l.y?q.y:l.y:n.y>l.y?n.y:l.y;m=ae(q.x=m;){if(p!==r.prev&&p!==r.next&&ud(q.x,q.y,n.x,n.y,l.x,l.y,p.x,p.y)&&0<=ma(p.prev,p,p.next)){r=!1;break a}p= +p.prevZ}r=!0}}else a:if(r=a,q=r.prev,n=r,l=r.next,0<=ma(q,n,l))r=!1;else{for(m=r.next.next;m!==r.prev;){if(ud(q.x,q.y,n.x,n.y,l.x,l.y,m.x,m.y)&&0<=ma(m.prev,m,m.next)){r=!1;break a}m=m.next}r=!0}if(r)b.push(k.i/c),b.push(a.i/c),b.push(v.i/c),Oc(a),h=a=v.next;else if(a=v,a===h){if(!g)Qc(Pc(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;k=a;do v=k.prev,r=k.next.next,!qb(v,r)&&df(v,k,k.next,r)&&Rc(v,r)&&Rc(r,v)&&(g.push(v.i/h),g.push(k.i/h),g.push(r.i/h),Oc(k),Oc(k.next),k=a=r),k=k.next;while(k!==a);a=k;Qc(a, +b,c,d,e,f,2)}else if(2===g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(k=g.i!==h.i){k=g;v=h;if(r=k.next.i!==v.i&&k.prev.i!==v.i){b:{r=k;do{if(r.i!==k.i&&r.next.i!==k.i&&r.i!==v.i&&r.next.i!==v.i&&df(r,r.next,k,v)){r=!0;break b}r=r.next}while(r!==k);r=!1}r=!r}if(r=r&&Rc(k,v)&&Rc(v,k)){r=k;q=!1;n=(k.x+v.x)/2;v=(k.y+v.y)/2;do r.y>v!==r.next.y>v&&r.next.y!==r.y&&n<(r.next.x-r.x)*(v-r.y)/(r.next.y-r.y)+r.x&&(q=!q),r=r.next;while(r!==k);r=q}k=r}if(k){a=ef(g,h);g=Pc(g,g.next);a=Pc(a,a.next);Qc(g,b,c,d,e, +f);Qc(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ng(a,b){return a.x-b.x}function Og(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.x&&c.x>=g&&d!==c.x&&ud(eh.x)&&Rc(c,a)&&(h=c,m=q)}c=c.next}return h}function ae(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 Pg(a){var b=a,c=a;do b.xma(a.prev,a,a.next)?0<=ma(a,b,a.next)&&0<=ma(a,a.prev,b):0>ma(a,b,a.prev)||0>ma(a,a.next,b)}function ef(a,b){var c=new be(a.i,a.x,a.y),d=new be(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 cf(a,b,c,d){a=new be(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 Oc(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 be(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 ff(a){var b=a.length;2Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/k;b=b.y+d/k; +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 z(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 z(f/e,d/e)}function h(a,b){for(M=a.length;0<=--M;){var c=M;var f=M-1;0>f&&(f=a.length-1);var g,h=w+2*O;for(g=0;gq;q++){var n=m[f[q]];var l=m[f[(q+1)%3]];d[0]=Math.min(n,l);d[1]=Math.max(n,l);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.addAttribute("position",new A(c,3))}function vb(a,b,c,d,e,f,g,h){R.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 Wa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f=new z,k=new p,t=0,v=!0===c?a:b,w=!0===c?1:-1;var A=r;for(e=1;e<=d;e++)n.push(0,y*w,0),l.push(0,w,0),u.push(.5,.5),r++;var C= +r;for(e=0;e<=d;e++){var D=e/d*h+g,H=Math.cos(D);D=Math.sin(D);k.x=v*D;k.y=y*w;k.z=v*H;n.push(k.x,k.y,k.z);l.push(0,w,0);f.x=.5*H+.5;f.y=.5*D*w+.5;u.push(f.x,f.y);r++}for(e=0;ethis.duration&&this.resetDuration()}function Rg(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return ec;case "vector":case "vector2":case "vector3":case "vector4":return fc; +case "color":return Hd;case "quaternion":return cd;case "bool":case "boolean":return Gd;case "string":return Jd}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function Sg(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=Rg(a.type);if(void 0===a.times){var c=[],d=[];ia.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 Kd(a){this.manager=void 0!== +a?a:ka;this.textures={}}function ge(a){this.manager=void 0!==a?a:ka}function gc(){}function he(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:ka;this.withCredentials=!1}function mf(a){this.manager=void 0!==a?a:ka;this.texturePath=""}function ie(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."); +this.manager=void 0!==a?a:ka;this.options=void 0}function je(){this.type="ShapePath";this.color=new G;this.subPaths=[];this.currentPath=null}function ke(a){this.type="Font";this.data=a}function nf(a){this.manager=void 0!==a?a:ka}function le(a){this.manager=void 0!==a?a:ka}function of(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Z;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Z;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate= +!1}function dd(a,b,c){D.call(this);this.type="CubeCamera";var d=new Z(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new Z(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new Z(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new Z(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new Z(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new Z(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k); +this.renderTarget=new Gb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,m=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=m;c.activeCubeFace=5;a.render(b, +k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function me(){D.call(this);this.type="AudioListener";this.context=ne.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function hc(a){D.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay= +!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function oe(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function pe(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 qe(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 pf(a,b,c){c=c||pa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function pa(a,b,c){this.path=b;this.parsedPath=c||pa.parseTrackName(b);this.node=pa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function qf(){this.uuid= +H.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 rf(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 re(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ld(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function se(){C.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function te(a,b,c){ob.call(this,a,b);this.meshPerAttribute=c||1}function ue(a,b,c){Q.call(this, +a,b);this.meshPerAttribute=c||1}function sf(a,b,c,d){this.ray=new mb(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 tf(a,b){return a.distance-b.distance}function ve(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;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 A(b,3));b=new Y({fog:!1});this.cone=new W(a,b);this.add(this.cone);this.update()}function xf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca?-1:0b;b++)a[b]=(16>b?"0":"")+b.toString(16);return function(){var b=4294967295*Math.random()|0,d=4294967295*Math.random()|0,e=4294967295*Math.random()|0,f=4294967295*Math.random()|0;return(a[b&255]+a[b>>8&255]+a[b>>16&255]+a[b>>24&255]+"-"+a[d&255]+a[d>>8&255]+"-"+a[d>> +16&15|64]+a[d>>24&255]+"-"+a[e&63|128]+a[e>>8&255]+"-"+a[e>>16&255]+a[e>>24&255]+a[f&255]+a[f>>8&255]+a[f>>16&255]+a[f>>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*H.DEG2RAD},radToDeg:function(a){return a*H.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))}};Object.defineProperties(z.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(z.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(){var a=new z,b=new z;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),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(){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},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){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},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}});Object.assign(I.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,n,l,u,r,p){var t=this.elements;t[0]=a;t[4]=b;t[8]=c;t[12]=d;t[1]=e;t[5]=f;t[9]=g;t[13]=h;t[2]=k;t[6]=m;t[10]=q;t[14]=n;t[3]=l;t[7]=u;t[11]=r;t[15]=p;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 I).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(){var a=new p;return function(b){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[3]=0;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[7]=0;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[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 k=f*e,m=c*h,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*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]=q+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]= +q-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,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+q,b[1]=g*e,b[5]=q*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,q=c*d,b[0]=g*h,b[4]=q-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-q*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*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(){var a= +new p(0,0,0),b=new p(1,1,1);return function(c){return this.compose(a,c,b)}}(),lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.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;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],m=c[9],q=c[13],n=c[2],l=c[6],u=c[10],r=c[14],p=c[3],y=c[7],x=c[11];c=c[15];var w=d[0],B=d[4],E=d[8],P=d[12],N=d[1],z=d[5],A=d[9],D=d[13],C=d[2], +H=d[6],G=d[10],K=d[14],L=d[3],I=d[7],J=d[11];d=d[15];b[0]=a*w+e*N+f*C+g*L;b[4]=a*B+e*z+f*H+g*I;b[8]=a*E+e*A+f*G+g*J;b[12]=a*P+e*D+f*K+g*d;b[1]=h*w+k*N+m*C+q*L;b[5]=h*B+k*z+m*H+q*I;b[9]=h*E+k*A+m*G+q*J;b[13]=h*P+k*D+m*K+q*d;b[2]=n*w+l*N+u*C+r*L;b[6]=n*B+l*z+u*H+r*I;b[10]=n*E+l*A+u*G+r*J;b[14]=n*P+l*D+u*K+r*d;b[3]=p*w+y*N+x*C+c*L;b[7]=p*B+y*z+x*H+c*I;b[11]=p*E+y*A+x*G+c*J;b[15]=p*P+y*D+x*K+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},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;f=1/h;var 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}}(),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),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}});Object.assign(fa,{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 q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var t=h*d+k*q+m*l+c*e,u=0<=t?1:-1,r=1-t*t;r>Number.EPSILON&&(r=Math.sqrt(r),t=Math.atan2(r,t*u),f=Math.sin(f*t)/r,g=Math.sin(g* +t)/r);u*=g;h=h*f+d*u;k=k*f+q*u;m=m*f+l*u;c=c*f+e*u;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}});Object.defineProperties(fa.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(fa.prototype,{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),k=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x=c*k*f+ +h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!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],k=b[6];b=b[10];var m=c+f+b;0f&&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=new p,b;return function(c,d){void 0===a&&(a=new p);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()}}(),angleTo:function(a){return 2*Math.acos(Math.abs(H.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();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},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});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(){var a=new fa;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new fa;return function(b, +c){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;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=new I;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new I;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(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=new p,b=new p;return function(c,d){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.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){return this.subVectors(b,a).multiplyScalar(c).add(a)},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.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a= +new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){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(H.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){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},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);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)},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}});Object.assign(ra.prototype,{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){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},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},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cc;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 eb={getDataURL:function(a){if(a instanceof HTMLCanvasElement)var b=a;else{"undefined"!==typeof OffscreenCanvas?b=new OffscreenCanvas(a.width,a.height):(b=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),b.width=a.width,b.height=a.height);var c=b.getContext("2d");a instanceof ImageData?c.putImageData(a,0,0):c.drawImage(a,0,0,a.width,a.height)}return 2048a.x||1a.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||1a.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.defineProperty(T.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(V.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 k=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.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+k)/4;b>f&&b>m?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>m?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>m?(h=k=.707106781,c=0):(c=Math.sqrt(m),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-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(){var a,b;return function(c,d){void 0===a&&(a=new V,b=new V);a.set(c, +c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),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){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},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}});fb.prototype=Object.assign(Object.create(ya.prototype),{constructor:fb,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"})}});Gb.prototype=Object.create(fb.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isWebGLRenderTargetCube=!0;gb.prototype=Object.create(T.prototype);gb.prototype.constructor=gb;gb.prototype.isDataTexture=!0;Object.assign(Sa.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,k=a.length;he&&(e=m);q>f&&(f=q);l>g&&(g=l)}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,k=a.count;he&&(e=m);l>f&&(f=l);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;bthis.max.x||a.ythis.max.y||a.zthis.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.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, +a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0=a.constant},intersectsTriangle:function(){function a(a){var e; +var f=0;for(e=a.length-3;f<=e;f+=3){h.fromArray(a,f);var g=m.x*Math.abs(h.x)+m.y*Math.abs(h.y)+m.z*Math.abs(h.z),k=b.dot(h),l=c.dot(h),q=d.dot(h);if(Math.max(-Math.max(k,l,q),Math.min(k,l,q))>g)return!1}return!0}var b=new p,c=new p,d=new p,e=new p,f=new p,g=new p,h=new p,k=new p,m=new p,l=new p;return function(h){if(this.isEmpty())return!1;this.getCenter(k);m.subVectors(this.max,k);b.subVectors(h.a,k);c.subVectors(h.b,k);d.subVectors(h.c,k);e.subVectors(c,b);f.subVectors(d,c);g.subVectors(b,d);h= +[0,-e.z,e.y,0,-f.z,f.y,0,-g.z,g.y,e.z,0,-e.x,f.z,0,-f.x,g.z,0,-g.x,-e.y,e.x,0,-f.y,f.x,0,-g.y,g.x,0];if(!a(h))return!1;h=[1,0,0,0,1,0,0,0,1];if(!a(h))return!1;l.crossVectors(e,f);h=[l.x,l.y,l.z];return a(h)}}(),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(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a= +new p;return function(b){void 0===b&&(console.warn("THREE.Box3: .getBoundingSphere() target is now required"),b=new Da);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(a){if(this.isEmpty())return this;a=a.elements;var b=a[0]*this.min.x,c=a[1]*this.min.x,d=a[2]*this.min.x,e= +a[0]*this.max.x,f=a[1]*this.max.x,g=a[2]*this.max.x,h=a[4]*this.min.y,k=a[5]*this.min.y,m=a[6]*this.min.y,l=a[4]*this.max.y,n=a[5]*this.max.y,t=a[6]*this.max.y,u=a[8]*this.min.z,r=a[9]*this.min.z,p=a[10]*this.min.z,y=a[8]*this.max.z,x=a[9]*this.max.z,w=a[10]*this.max.z;this.min.x=Math.min(b,e)+Math.min(h,l)+Math.min(u,y)+a[12];this.min.y=Math.min(c,f)+Math.min(k,n)+Math.min(r,x)+a[13];this.min.z=Math.min(d,g)+Math.min(m,t)+Math.min(p,w)+a[14];this.max.x=Math.max(b,e)+Math.max(h,l)+Math.max(u,y)+a[12]; +this.max.y=Math.max(c,f)+Math.max(k,n)+Math.max(r,x)+a[13];this.max.z=Math.max(d,g)+Math.max(m,t)+Math.max(p,w)+a[14];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)}});Object.assign(Da.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Sa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e= +c=0,f=b.length;e=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(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 Sa);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}});Object.assign(Ma.prototype,{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 p,b=new p;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){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(){var a= +new p;return function(b,c){void 0===c&&(console.warn("THREE.Plane: .intersectLine() target is now required"),c=new p);var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1b&&0a&&0c;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],t=c[10],p=c[11],r=c[12],v=c[13],y=c[14];c=c[15];b[0].setComponents(f-a,m-g,p-l,c-r).normalize();b[1].setComponents(f+a,m+g,p+l,c+r).normalize();b[2].setComponents(f+d,m+h,p+n,c+v).normalize();b[3].setComponents(f-d,m-h,p-n,c-v).normalize();b[4].setComponents(f-e,m-k,p-t,c-y).normalize();b[5].setComponents(f+e,m+k,p+t,c+y).normalize();return this},intersectsObject:function(){var a=new Da;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 Da;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)d;d++){var e=c[d]; +a.x=0e.distanceToPoint(a))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 S={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:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\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}\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 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 = 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\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\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 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#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}\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}\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( sampler2D envMap, 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:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\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 += normalize( objectNormal ) * ( 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\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\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.w );\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.w );\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.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, 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.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.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 = value.rgb * cLogLuvM;\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 = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn 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, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\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\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 envMapIntensity;\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\tuniform int maxMipLevel;\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_physical_pars_fragment:"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\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\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, 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\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, 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\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, 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 = 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", +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_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\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\n",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\n", +gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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_begin:"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\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\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\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\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 ( 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\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\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\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}\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#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_Direct_RectArea\t\tRE_Direct_RectArea_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_fragment_begin:"\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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\t#pragma unroll_loop\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\t#pragma unroll_loop\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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\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#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\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#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n", +lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\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 defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n", +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, 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\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= 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\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\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.b;\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_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#endif\n",normal_fragment_maps:"#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\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\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif\n", +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}\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}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( 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\n", +roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\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\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\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( 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\tshadow = (\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\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 )\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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 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\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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\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:"#ifndef saturate\n\t#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}\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 mat3 uvTransform;\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 = ( 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#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - 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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", +distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \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\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n}\n", +shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}\n", +sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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\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\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"}, +Aa={merge:function(a){for(var b={},c=0;c>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);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, +c,d){b=H.euclideanModulo(b,1);c=H.clamp(c,0,1);d=H.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)){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}a&&0a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}return function(b){this.r=a(b.r);this.g=a(b.g);this.b=a(b.b);return this}}(),copyLinearToSRGB:function(){function a(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}return function(b){this.r=a(b.r);this.g=a(b.g);this.b=a(b.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 k=e-f;f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c- +d)/k+(cMath.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=new I;return function(b,c,d){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 fa;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 p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Rd.prototype,{set:function(a){this.mask=1<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;cthis.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.rotation&&(d.rotation=this.rotation);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);0a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;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 p,b=new p,c=new p;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(),t=Math.abs(1-k*k);if(0=-p?e<=p?(h=1/t,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<=-p?(d=Math.max(0,-(-k*h+m)),e=0b)return null;b=Math.sqrt(b-e);e=d-b;d+=b;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){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(da||h>c)return null;if(h>g||g!==g)g=h;if(ac?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a= +new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;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(0f)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.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(ja,{getNormal:function(){var a=new p;return function(b,c,d,e){void 0===e&&(console.warn("THREE.Triangle: .getNormal() target is now required"),e=new p);e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0=a.x+a.y}}()});Object.assign(ja.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(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).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 ja.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 p);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return ja.getBarycoord(a,this.a,this.b,this.c,b)},containsPoint:function(a){return ja.containsPoint(a, +this.a,this.b,this.c)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(){var a=new p,b=new p,c=new p,d=new p,e=new p,f=new p;return function(g,h){void 0===h&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),h=new p);var k=this.a,m=this.b,l=this.c;a.subVectors(m,k);b.subVectors(l,k);d.subVectors(g,k);var n=a.dot(d),t=b.dot(d);if(0>=n&&0>=t)return h.copy(k);e.subVectors(g,m);var u=a.dot(e),r=b.dot(e);if(0<=u&&r<=u)return h.copy(m); +var v=n*r-u*t;if(0>=v&&0<=n&&0>=u)return m=n/(n-u),h.copy(k).addScaledVector(a,m);f.subVectors(g,l);g=a.dot(f);var y=b.dot(f);if(0<=y&&g<=y)return h.copy(l);n=g*t-n*y;if(0>=n&&0<=t&&0>=y)return v=t/(t-y),h.copy(k).addScaledVector(b,v);t=u*y-g*r;if(0>=t&&0<=r-u&&0<=g-y)return c.subVectors(l,m),v=(r-u)/(r-u+(g-y)),h.copy(m).addScaledVector(c,v);l=1/(t+n+v);m=n*l;v*=l;return h.copy(k).addScaledVector(a,m).addScaledVector(b,v)}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}}); +la.prototype=Object.assign(Object.create(D.prototype),{constructor:la,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){D.prototype.copy.call(this,a);this.drawMode=a.drawMode;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(0c.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,m,l,n,q,p){g.fromBufferAttribute(m,n);h.fromBufferAttribute(m,q);k.fromBufferAttribute(m, +p);if(c=b(c,d,e,f,g,h,k,y))l&&(t.fromBufferAttribute(l,n),u.fromBufferAttribute(l,q),r.fromBufferAttribute(l,p),c.uv=a(y,g,h,k,t,u,r)),l=new Ta(n,q,p),ja.getNormal(g,h,k,l.normal),c.face=l;return c}var d=new I,e=new mb,f=new Da,g=new p,h=new p,k=new p,m=new p,l=new p,n=new p,t=new z,u=new z,r=new z,v=new p,y=new p,x=new p;return function(q,p){var v=this.geometry,w=this.material,x=this.matrixWorld;if(void 0!==w&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(x), +!1!==q.ray.intersectsSphere(f)&&(d.getInverse(x),e.copy(q.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox))))if(v.isBufferGeometry){var z=v.index,B=v.attributes.position,A=v.attributes.uv,D=v.groups;v=v.drawRange;var C;if(null!==z)if(Array.isArray(w)){var H=0;for(C=D.length;He.far||f.push({distance:q,point:b.clone(),face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){D.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}}); +Bc.prototype=Object.assign(Object.create(D.prototype),{constructor:Bc,copy:function(a){D.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break; +for(;ef||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),vd.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}else for(g=0,r=u.length/3-1;gf||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),vd.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld), +index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;gf||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),vd.far||e.push({distance:v,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)}});W.prototype=Object.assign(Object.create(sa.prototype), +{constructor:W,isLineSegments:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===c.index){for(var d=c.attributes.position,e=[],f=0,g=d.count;fd.far||e.push({distance:a,distanceToRay:Math.sqrt(f),point:n.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);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);m/=(this.scale.x+this.scale.y+this.scale.z)/3;var l=m*m;m=new p;var n=new p;if(h.isBufferGeometry){var t=h.index;h=h.attributes.position.array;if(null!==t){var u=t.array;t=0;for(var r=u.length;t=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Pb.prototype=Object.create(T.prototype);Pb.prototype.constructor=Pb;Pb.prototype.isCompressedTexture=!0;Dc.prototype=Object.create(T.prototype);Dc.prototype.constructor=Dc;Dc.prototype.isCanvasTexture=!0;Ec.prototype= +Object.create(T.prototype);Ec.prototype.constructor=Ec;Ec.prototype.isDepthTexture=!0;Qb.prototype=Object.create(C.prototype);Qb.prototype.constructor=Qb;Fc.prototype=Object.create(R.prototype);Fc.prototype.constructor=Fc;Rb.prototype=Object.create(C.prototype);Rb.prototype.constructor=Rb;Gc.prototype=Object.create(R.prototype);Gc.prototype.constructor=Gc;na.prototype=Object.create(C.prototype);na.prototype.constructor=na;Hc.prototype=Object.create(R.prototype);Hc.prototype.constructor=Hc;Sb.prototype= +Object.create(na.prototype);Sb.prototype.constructor=Sb;Ic.prototype=Object.create(R.prototype);Ic.prototype.constructor=Ic;pb.prototype=Object.create(na.prototype);pb.prototype.constructor=pb;Jc.prototype=Object.create(R.prototype);Jc.prototype.constructor=Jc;Tb.prototype=Object.create(na.prototype);Tb.prototype.constructor=Tb;Kc.prototype=Object.create(R.prototype);Kc.prototype.constructor=Kc;Ub.prototype=Object.create(na.prototype);Ub.prototype.constructor=Ub;Lc.prototype=Object.create(R.prototype); +Lc.prototype.constructor=Lc;Vb.prototype=Object.create(C.prototype);Vb.prototype.constructor=Vb;Mc.prototype=Object.create(R.prototype);Mc.prototype.constructor=Mc;Wb.prototype=Object.create(C.prototype);Wb.prototype.constructor=Wb;Nc.prototype=Object.create(R.prototype);Nc.prototype.constructor=Nc;Xb.prototype=Object.create(C.prototype);Xb.prototype.constructor=Xb;var Ug={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=bf(a,0,e,c,!0),g=[];if(!f)return g;var h;if(d){var k= +c;d=[];var m;var l=0;for(m=b.length;l80*c){var p=h=a[0];var r=d=a[1];for(k=c;kh&&(h=l),b>d&&(d=b);h=Math.max(h-p,d-r);h=0!==h?1/h:0}Qc(f,g,c,p,r,h);return g}},Va={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;eVa.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];ff(a);gf(c,a);var f=a.length;b.forEach(ff);for(a=0;aMath.abs(g-k)?[new z(a,1-c),new z(h,1-d),new z(m,1-e),new z(n,1-b)]:[new z(g,1-c),new z(k,1-d),new z(l,1-e),new z(t,1-b)]}};Sc.prototype=Object.create(R.prototype);Sc.prototype.constructor=Sc;Yb.prototype=Object.create(Oa.prototype);Yb.prototype.constructor=Yb;Tc.prototype=Object.create(R.prototype);Tc.prototype.constructor=Tc;sb.prototype=Object.create(C.prototype);sb.prototype.constructor=sb;Uc.prototype=Object.create(R.prototype);Uc.prototype.constructor=Uc;Zb.prototype=Object.create(C.prototype); +Zb.prototype.constructor=Zb;Vc.prototype=Object.create(R.prototype);Vc.prototype.constructor=Vc;$b.prototype=Object.create(C.prototype);$b.prototype.constructor=$b;tb.prototype=Object.create(R.prototype);tb.prototype.constructor=tb;tb.prototype.toJSON=function(){var a=R.prototype.toJSON.call(this);return jf(this.parameters.shapes,a)};ub.prototype=Object.create(C.prototype);ub.prototype.constructor=ub;ub.prototype.toJSON=function(){var a=C.prototype.toJSON.call(this);return jf(this.parameters.shapes, +a)};ac.prototype=Object.create(C.prototype);ac.prototype.constructor=ac;vb.prototype=Object.create(R.prototype);vb.prototype.constructor=vb;Wa.prototype=Object.create(C.prototype);Wa.prototype.constructor=Wa;Wc.prototype=Object.create(vb.prototype);Wc.prototype.constructor=Wc;Xc.prototype=Object.create(Wa.prototype);Xc.prototype.constructor=Xc;Yc.prototype=Object.create(R.prototype);Yc.prototype.constructor=Yc;bc.prototype=Object.create(C.prototype);bc.prototype.constructor=bc;var xa=Object.freeze({WireframeGeometry:Qb, +ParametricGeometry:Fc,ParametricBufferGeometry:Rb,TetrahedronGeometry:Hc,TetrahedronBufferGeometry:Sb,OctahedronGeometry:Ic,OctahedronBufferGeometry:pb,IcosahedronGeometry:Jc,IcosahedronBufferGeometry:Tb,DodecahedronGeometry:Kc,DodecahedronBufferGeometry:Ub,PolyhedronGeometry:Gc,PolyhedronBufferGeometry:na,TubeGeometry:Lc,TubeBufferGeometry:Vb,TorusKnotGeometry:Mc,TorusKnotBufferGeometry:Wb,TorusGeometry:Nc,TorusBufferGeometry:Xb,TextGeometry:Sc,TextBufferGeometry:Yb,SphereGeometry:Tc,SphereBufferGeometry:sb, +RingGeometry:Uc,RingBufferGeometry:Zb,PlaneGeometry:uc,PlaneBufferGeometry:lb,LatheGeometry:Vc,LatheBufferGeometry:$b,ShapeGeometry:tb,ShapeBufferGeometry:ub,ExtrudeGeometry:rb,ExtrudeBufferGeometry:Oa,EdgesGeometry:ac,ConeGeometry:Wc,ConeBufferGeometry:Xc,CylinderGeometry:vb,CylinderBufferGeometry:Wa,CircleGeometry:Yc,CircleBufferGeometry:bc,BoxGeometry:Ib,BoxBufferGeometry:kb});wb.prototype=Object.create(J.prototype);wb.prototype.constructor=wb;wb.prototype.isShadowMaterial=!0;wb.prototype.copy= +function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);return this};cc.prototype=Object.create(ta.prototype);cc.prototype.constructor=cc;cc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(J.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){J.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;return this};xb.prototype=Object.create(Pa.prototype);xb.prototype.constructor=xb;xb.prototype.isMeshPhysicalMaterial= +!0;xb.prototype.copy=function(a){Pa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Fa.prototype=Object.create(J.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isMeshPhongMaterial=!0;Fa.prototype.copy=function(a){J.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};yb.prototype=Object.create(Fa.prototype);yb.prototype.constructor=yb;yb.prototype.isMeshToonMaterial=!0;yb.prototype.copy=function(a){Fa.prototype.copy.call(this, +a);this.gradientMap=a.gradientMap;return this};zb.prototype=Object.create(J.prototype);zb.prototype.constructor=zb;zb.prototype.isMeshNormalMaterial=!0;zb.prototype.copy=function(a){J.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};Ab.prototype=Object.create(J.prototype);Ab.prototype.constructor=Ab;Ab.prototype.isMeshLambertMaterial=!0;Ab.prototype.copy=function(a){J.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}; +Bb.prototype=Object.create(Y.prototype);Bb.prototype.constructor=Bb;Bb.prototype.isLineDashedMaterial=!0;Bb.prototype.copy=function(a){Y.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Vg=Object.freeze({ShadowMaterial:wb,SpriteMaterial:cb,RawShaderMaterial:cc,ShaderMaterial:ta,PointsMaterial:Ea,MeshPhysicalMaterial:xb,MeshStandardMaterial:Pa,MeshPhongMaterial:Fa,MeshToonMaterial:yb,MeshNormalMaterial:zb,MeshLambertMaterial:Ab,MeshDepthMaterial:$a, +MeshDistanceMaterial:ab,MeshBasicMaterial:da,LineDashedMaterial:Bb,LineBasicMaterial:Y,Material:J}),Fb={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={}}},ka=new ce,Ya={};Object.assign(Ga.prototype,{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=Fb.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!==Ya[a])Ya[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=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":var m=new Uint8Array(g.length);for(h=0;hg)e=a+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(H.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(H.clamp(e[0].dot(e[a]),-1,1)),c/=a,0d;)d+=c;for(;d>c;)d-=c;de&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);Ae.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);Be.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);Ce.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(Ae.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),Be.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),Ce.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(Ae.calc(a), +Be.calc(a),Ce.calc(a));return b};ca.prototype.copy=function(a){L.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;bc.length-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(lf(d,e.x,f.x,g.x,c.x),lf(d,e.y,f.y,g.y,c.y));return b};Ka.prototype.copy=function(a){L.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b=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=e)break a;else{f=b[1];a=e)break b}d=c;c= +0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=ia.arraySlice(c,e,f),this.values=ia.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&&ia.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=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;gm.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});var De={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;cf;f++){var E=h[u++];var A=B[2*E];E=B[2*E+1];A=new z(A,E);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}y&&(y=3*h[u++],r.normal.set(m[y++],m[y++],m[y]),w.normal.copy(r.normal));if(x)for(e=0;4>e;e++)y=3*h[u++],x=new p(m[y++], +m[y++],m[y]),2!==e&&r.vertexNormals.push(x),0!==e&&w.vertexNormals.push(x);n&&(n=h[u++],n=l[n],r.color.setHex(n),w.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[u++],n=l[n],2!==e&&r.vertexColors.push(new G(n)),0!==e&&w.vertexColors.push(new G(n));c.faces.push(r);c.faces.push(w)}else{r=new Ta;r.a=h[u++];r.b=h[u++];r.c=h[u++];v&&(v=h[u++],r.materialIndex=v);v=c.faces.length;if(e)for(e=0;ef;f++)E=h[u++],A=B[2*E],E=B[2*E+1],A=new z(A,E),c.faceVertexUvs[e][v].push(A); +y&&(y=3*h[u++],r.normal.set(m[y++],m[y++],m[y]));if(x)for(e=0;3>e;e++)y=3*h[u++],x=new p(m[y++],m[y++],m[y]),r.vertexNormals.push(x);n&&(n=h[u++],r.color.setHex(l[n]));if(k)for(e=0;3>e;e++)n=h[u++],r.vertexColors.push(new G(l[n]));c.faces.push(r)}}d=a;u=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;g +Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(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=Va.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 db;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints());k=a?!k:k;h=[];var m=[],l=[],n=0;m[n]=void 0;l[n]=[];for(var p= +0,u=f.length;pd&&this._mixBufferRegion(c,a,3*b,1-d,b);d=b;for(var 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){fa.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}}});Object.assign(pf.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(pa,{Composite:pf,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new pa.Composite(a,b,c):new pa(a,b,c)},sanitizeNodeName:function(){var a= +/[\[\]\.:\/]/g;return function(b){return b.replace(/\s/g,"_").replace(a,"")}}(),parseTrackName:function(){var a="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",b=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]");a=/(WCOD+)?/.source.replace("WCOD",a);var c=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),d=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),e=new RegExp("^"+b+a+c+d+"$"),f=["material","materials","bones"];return function(a){var b=e.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!==f.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||"root"===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=b){var p=b++,n=a[p];c[n.uuid]=l;a[l]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var t=n[l];n[l]=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,l=d[k];if(void 0!==l)if(delete d[k],lb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.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 break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;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,b=0a,this._setEndings(a,!a,f)):this._setEndings(!1,!1,f),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:d}))}if(f&&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}});re.prototype=Object.assign(Object.create(ya.prototype),{constructor:re,_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 l=d[h],p=l.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 qe(pa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.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&&athis.max.x||a.ythis.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 z);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.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new z);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new z; +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)}});Object.assign(xe.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(){var a=new p,b=new p;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=H.clamp(c,0,1));return c}}(),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)}});ed.prototype=Object.create(D.prototype);ed.prototype.constructor=ed;ed.prototype.isImmediateRenderObject=!0;fd.prototype=Object.create(W.prototype);fd.prototype.constructor=fd;fd.prototype.update=function(){var a=new p,b=new p,c=new ra;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,p=k.length;lMath.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);D.prototype.updateMatrixWorld.call(this,a)};var Nd,ye;Eb.prototype=Object.create(D.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999c.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))}}();Eb.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()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};ld.prototype=Object.create(W.prototype); +ld.prototype.constructor=ld;L.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(L.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(Xa.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 R,c=0,d=a.length;c 0) { + for (var i = (this.length >> 1); i >= 0; i--) this._down(i); + } +} - function isError(predicate) { - return predicate === Error - || (predicate != null && predicate.prototype instanceof Error); - } +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} - function maybeThenable(x) { - return (typeof x === 'object' || typeof x === 'function') && x !== null; - } +TinyQueue.prototype = { - function identity(x) { - return x; - } + push: function (item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + }, -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + 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; + }, -},{}],203:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ -/** @author Jeff Escalante */ + peek: function () { + return this.data[0]; + }, -(function(define) { 'use strict'; -define(function() { + _up: function (pos) { + var data = this.data; + var compare = this.compare; + var item = data[pos]; - return function fold(Promise) { + while (pos > 0) { + var parent = (pos - 1) >> 1; + var current = data[parent]; + if (compare(item, current) >= 0) break; + data[pos] = current; + pos = parent; + } - Promise.prototype.fold = function(f, z) { - var promise = this._beget(); + data[pos] = item; + }, - 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); + _down: function (pos) { + var data = this.data; + var compare = this.compare; + var len = this.length; + var halfLen = len >> 1; + var item = data[pos]; - return promise; - }; + while (pos < halfLen) { + var left = (pos << 1) + 1; + var right = left + 1; + var best = data[left]; - return Promise; - }; + if (right < len && compare(data[right], best) < 0) { + left = right; + best = data[right]; + } + if (compare(best, item) >= 0) break; -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + data[pos] = best; + pos = left; + } -},{}],204:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ + data[pos] = item; + } +}; -(function(define) { 'use strict'; -define(function(require) { +},{}],228:[function(require,module,exports){ +var createElement = require("./vdom/create-element.js") - var inspect = require('../state').inspect; +module.exports = createElement - return function inspection(Promise) { +},{"./vdom/create-element.js":234}],229:[function(require,module,exports){ +var diff = require("./vtree/diff.js") - Promise.prototype.inspect = function() { - return inspect(Promise._handler(this)); - }; +module.exports = diff - return Promise; - }; +},{"./vtree/diff.js":254}],230:[function(require,module,exports){ +var h = require("./virtual-hyperscript/index.js") -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); +module.exports = h -},{"../state":213}],205:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +},{"./virtual-hyperscript/index.js":241}],231:[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') -(function(define) { 'use strict'; -define(function() { +module.exports = { + diff: diff, + patch: patch, + h: h, + create: create, + VNode: VNode, + VText: VText +} - return function generate(Promise) { +},{"./create-element.js":228,"./diff.js":229,"./h.js":230,"./patch.js":232,"./vnode/vnode.js":250,"./vnode/vtext.js":252}],232:[function(require,module,exports){ +var patch = require("./vdom/patch.js") - var resolve = Promise.resolve; +module.exports = patch - Promise.iterate = iterate; - Promise.unfold = unfold; +},{"./vdom/patch.js":237}],233:[function(require,module,exports){ +var isObject = require("is-object") +var isHook = require("../vnode/is-vhook.js") - 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); - } +module.exports = applyProperties - /** - * @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 applyProperties(node, props, previous) { + for (var propName in props) { + var propValue = props[propName] - function next(item, newSeed) { - return resolve(handler(item)).then(function() { - return unfold(unspool, condition, handler, newSeed); - }); - } - } - }; + 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 + } + } + } +} -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); +function removeProperty(node, propName, propValue, previous) { + if (previous) { + var previousValue = previous[propName] -},{}],206:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ + 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) + } + } +} -(function(define) { 'use strict'; -define(function() { +function patchObject(node, props, previous, propName, propValue) { + var previousValue = previous ? previous[propName] : undefined - return function progress(Promise) { + // Set attributes + if (propName === "attributes") { + for (var attrName in propValue) { + var attrValue = propValue[attrName] - /** - * @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); - }; + if (attrValue === undefined) { + node.removeAttribute(attrName) + } else { + node.setAttribute(attrName, attrValue) + } + } - return Promise; - }; + return + } -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + if(previousValue && isObject(previousValue) && + getPrototype(previousValue) !== getPrototype(propValue)) { + node[propName] = propValue + return + } -},{}],207:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ + if (!isObject(node[propName])) { + node[propName] = {} + } -(function(define) { 'use strict'; -define(function(require) { + var replacer = propName === "style" ? "" : undefined - var env = require('../env'); - var TimeoutError = require('../TimeoutError'); + for (var k in propValue) { + var value = propValue[k] + node[propName][k] = (value === undefined) ? replacer : value + } +} - function setTimeout(f, ms, x, y) { - return env.setTimer(function() { - f(x, y, ms); - }, ms); - } +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 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; - }; +},{"../vnode/is-vhook.js":245,"is-object":20}],234:[function(require,module,exports){ +var document = require("global/document") - function handleDelay(ms, x, h) { - setTimeout(resolveDelay, ms, x, h); - } +var applyProperties = require("./apply-properties") - function resolveDelay(x, h) { - h.resolve(x); - } +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") - /** - * 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; +module.exports = createElement - var t = setTimeout(onTimeout, ms, reason, p._handler); +function createElement(vnode, opts) { + var doc = opts ? opts.document || document : document + var warn = opts ? opts.warn : null - 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); + vnode = handleThunk(vnode).a - return p; - }; + 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 + } - function onTimeout(reason, h, ms) { - var e = typeof reason === 'undefined' - ? new TimeoutError('timed out after ' + ms + 'ms') - : reason; - h.reject(e); - } + var node = (vnode.namespace === null) ? + doc.createElement(vnode.tagName) : + doc.createElementNS(vnode.namespace, vnode.tagName) - return Promise; - }; + var props = vnode.properties + applyProperties(node, props) -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); + var children = vnode.children -},{"../TimeoutError":199,"../env":210}],208:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ + for (var i = 0; i < children.length; i++) { + var childNode = createElement(children[i], opts) + if (childNode) { + node.appendChild(childNode) + } + } -(function(define) { 'use strict'; -define(function(require) { + return node +} - var setTimer = require('../env').setTimer; - var format = require('../format'); +},{"../vnode/handle-thunk.js":243,"../vnode/is-vnode.js":246,"../vnode/is-vtext.js":247,"../vnode/is-widget.js":248,"./apply-properties":233,"global/document":16}],235:[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. - return function unhandledRejection(Promise) { +var noChild = {} - var logError = noop; - var logInfo = noop; - var localConsole; +module.exports = domIndex - 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); }; +function domIndex(rootNode, tree, indices, nodes) { + if (!indices || indices.length === 0) { + return {} + } else { + indices.sort(ascending) + return recurse(rootNode, tree, indices, nodes, 0) + } +} - logInfo = typeof localConsole.info !== 'undefined' - ? function (e) { localConsole.info(e); } - : function (e) { localConsole.log(e); }; - } +function recurse(rootNode, tree, indices, nodes, rootIndex) { + nodes = nodes || {} - Promise.onPotentiallyUnhandledRejection = function(rejection) { - enqueue(report, rejection); - }; - Promise.onPotentiallyUnhandledRejectionHandled = function(rejection) { - enqueue(unreport, rejection); - }; + if (rootNode) { + if (indexInRange(indices, rootIndex, rootIndex)) { + nodes[rootIndex] = rootNode + } - Promise.onFatalRejection = function(rejection) { - enqueue(throwit, rejection.value); - }; + var vChildren = tree.children - var tasks = []; - var reported = []; - var running = null; + if (vChildren) { - function report(r) { - if(!r.handled) { - reported.push(r); - logError('Potentially unhandled rejection [' + r.id + '] ' + format.formatError(r.value)); - } - } + var childNodes = rootNode.childNodes - 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)); - } - } + for (var i = 0; i < tree.children.length; i++) { + rootIndex += 1 - function enqueue(f, x) { - tasks.push(f, x); - if(running === null) { - running = setTimer(flush, 0); - } - } + var vChild = vChildren[i] || noChild + var nextIndex = rootIndex + (vChild.count || 0) - function flush() { - running = null; - while(tasks.length > 0) { - tasks.shift()(tasks.shift()); - } - } + // skip recursion down the tree if there are no nodes down here + if (indexInRange(indices, rootIndex, nextIndex)) { + recurse(childNodes[i], vChild, indices, nodes, rootIndex) + } - return Promise; - }; + rootIndex = nextIndex + } + } + } - function throwit(e) { - throw e; - } + return nodes +} - function noop() {} +// Binary search for an index in the interval [left, right] +function indexInRange(indices, left, right) { + if (indices.length === 0) { + return false + } -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); + var minIndex = 0 + var maxIndex = indices.length - 1 + var currentIndex + var currentItem -},{"../env":210,"../format":211}],209:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ + while (minIndex <= maxIndex) { + currentIndex = ((maxIndex + minIndex) / 2) >> 0 + currentItem = indices[currentIndex] -(function(define) { 'use strict'; -define(function() { + 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 + } + } - 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 false; +} - return Promise; - }; +function ascending(a, b) { + return a > b ? 1 : -1 +} -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); +},{}],236:[function(require,module,exports){ +var applyProperties = require("./apply-properties") +var isWidget = require("../vnode/is-widget.js") +var VPatch = require("../vnode/vpatch.js") -},{}],210:[function(require,module,exports){ -(function (process){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +var updateWidget = require("./update-widget") -/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/ -(function(define) { 'use strict'; -define(function(require) { - /*jshint maxcomplexity:6*/ +module.exports = applyPatch - // 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 +function applyPatch(vpatch, domNode, renderOptions) { + var type = vpatch.type + var vNode = vpatch.vNode + var patch = vpatch.patch - var MutationObs; - var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout; + 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 + } +} - // 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); }; +function removeNode(domNode, vNode) { + var parentNode = domNode.parentNode - // Detect specific env - if (isNode()) { // Node - asap = function (f) { return process.nextTick(f); }; + if (parentNode) { + parentNode.removeChild(domNode) + } - } else if (MutationObs = hasMutationObserver()) { // Modern browser - asap = initMutationObserver(MutationObs); + destroyWidget(domNode, vNode); - } 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 null +} - return { - setTimer: setTimer, - clearTimer: clearTimer, - asap: asap - }; +function insertNode(parentNode, vNode, renderOptions) { + var newNode = renderOptions.render(vNode, renderOptions) - function isNode () { - return typeof process !== 'undefined' && - Object.prototype.toString.call(process) === '[object process]'; - } + if (parentNode) { + parentNode.appendChild(newNode) + } - function hasMutationObserver () { - return (typeof MutationObserver === 'function' && MutationObserver) || - (typeof WebKitMutationObserver === 'function' && WebKitMutationObserver); - } + return parentNode +} - function initMutationObserver(MutationObserver) { - var scheduled; - var node = document.createTextNode(''); - var o = new MutationObserver(run); - o.observe(node, { characterData: true }); +function stringPatch(domNode, leftVNode, vText, renderOptions) { + var newNode - 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); })); + if (domNode.nodeType === 3) { + domNode.replaceData(0, domNode.length, vText.text) + newNode = domNode + } else { + var parentNode = domNode.parentNode + newNode = renderOptions.render(vText, renderOptions) -}).call(this,require('_process')) + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + } -},{"_process":4}],211:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ + return newNode +} -(function(define) { 'use strict'; -define(function() { +function widgetPatch(domNode, leftVNode, widget, renderOptions) { + var updating = updateWidget(leftVNode, widget) + var newNode - return { - formatError: formatError, - formatObject: formatObject, - tryStringify: tryStringify - }; + if (updating) { + newNode = widget.update(leftVNode, domNode) || domNode + } else { + newNode = renderOptions.render(widget, renderOptions) + } - /** - * 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)'; - } + var parentNode = domNode.parentNode - /** - * 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; - } + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } - /** - * 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; - } - } + if (!updating) { + destroyWidget(domNode, leftVNode) + } -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + return newNode +} -},{}],212:[function(require,module,exports){ -(function (process){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ -/** @author Brian Cavalier */ -/** @author John Hann */ +function vNodePatch(domNode, leftVNode, vNode, renderOptions) { + var parentNode = domNode.parentNode + var newNode = renderOptions.render(vNode, renderOptions) -(function(define) { 'use strict'; -define(function() { + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } - return function makePromise(environment) { + return newNode +} - var tasks = environment.scheduler; - var emitRejection = initEmitRejection(); +function destroyWidget(domNode, w) { + if (typeof w.destroy === "function" && isWidget(w)) { + w.destroy(domNode) + } +} - var objectCreate = Object.create || - function(proto) { - function Child() {} - Child.prototype = proto; - return new Child(); - }; +function reorderChildren(domNode, moves) { + var childNodes = domNode.childNodes + var keyMap = {} + var node + var remove + var insert - /** - * 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); - } + 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) + } - /** - * Run the supplied resolver - * @param resolver - * @returns {Pending} - */ - function init(resolver) { - var handler = new Pending(); + 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]) + } +} - try { - resolver(promiseResolve, promiseReject, promiseNotify); - } catch (e) { - promiseReject(e); - } +function replaceRoot(oldRoot, newRoot) { + if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { + oldRoot.parentNode.replaceChild(newRoot, oldRoot) + } - return handler; + return newRoot; +} - /** - * 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); - } +},{"../vnode/is-widget.js":248,"../vnode/vpatch.js":251,"./apply-properties":233,"./update-widget":238}],237:[function(require,module,exports){ +var document = require("global/document") +var isArray = require("x-is-array") - /** - * @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); - } - } +var render = require("./create-element") +var domIndex = require("./dom-index") +var patchOp = require("./patch-op") +module.exports = patch - // Creation +function patch(rootNode, patches, renderOptions) { + renderOptions = renderOptions || {} + renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch + ? renderOptions.patch + : patchRecursive + renderOptions.render = renderOptions.render || render - Promise.resolve = resolve; - Promise.reject = reject; - Promise.never = never; + return renderOptions.patch(rootNode, patches, renderOptions) +} - Promise._defer = defer; - Promise._handler = getHandler; +function patchRecursive(rootNode, patches, renderOptions) { + var indices = patchIndices(patches) - /** - * 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))); - } + if (indices.length === 0) { + return rootNode + } - /** - * 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))); - } + var index = domIndex(rootNode, patches.a, indices) + var ownerDocument = rootNode.ownerDocument - /** - * Return a promise that remains pending forever - * @returns {Promise} forever-pending promise. - */ - function never() { - return foreverPendingPromise; // Should be frozen - } + if (!renderOptions.document && ownerDocument !== document) { + renderOptions.document = ownerDocument + } - /** - * Creates an internal {promise, resolver} pair - * @private - * @returns {Promise} - */ - function defer() { - return new Promise(Handler, new Pending()); - } + for (var i = 0; i < indices.length; i++) { + var nodeIndex = indices[i] + rootNode = applyPatch(rootNode, + index[nodeIndex], + patches[nodeIndex], + renderOptions) + } - // Transformation and flow control + return rootNode +} - /** - * 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(); +function applyPatch(rootNode, domNode, patchList, renderOptions) { + if (!domNode) { + return rootNode + } - 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 newNode - var p = this._beget(); - var child = p._handler; + if (isArray(patchList)) { + for (var i = 0; i < patchList.length; i++) { + newNode = patchOp(patchList[i], domNode, renderOptions) - parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress); + if (domNode === rootNode) { + rootNode = newNode + } + } + } else { + newNode = patchOp(patchList, domNode, renderOptions) - return p; - }; + if (domNode === rootNode) { + rootNode = newNode + } + } - /** - * 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); - }; + return rootNode +} - /** - * 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 patchIndices(patches) { + var indices = [] - function begetFrom(parent, Promise) { - var child = new Pending(parent.receiver, parent.join().context); - return new Promise(Handler, child); - } + for (var key in patches) { + if (key !== "a") { + indices.push(Number(key)) + } + } - // Array combinators + return indices +} - Promise.all = all; - Promise.race = race; - Promise._traverse = traverse; +},{"./create-element":234,"./dom-index":235,"./patch-op":236,"global/document":16,"x-is-array":273}],238:[function(require,module,exports){ +var isWidget = require("../vnode/is-widget.js") - /** - * 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); - } +module.exports = updateWidget - /** - * Array> -> Promise> - * @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 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 traverseWith(tryMap, f, promises) { - var handler = typeof f === 'function' ? mapAt : settleAt; + return false +} - var resolver = new Pending(); - var pending = promises.length >>> 0; - var results = new Array(pending); +},{"../vnode/is-widget.js":248}],239:[function(require,module,exports){ +'use strict'; - for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) { - x = promises[i]; +var EvStore = require('ev-store'); - if (x === void 0 && !(i in promises)) { - --pending; - continue; - } +module.exports = EvHook; - traverseAt(promises, handler, i, x, resolver); - } +function EvHook(value) { + if (!(this instanceof EvHook)) { + return new EvHook(value); + } - if(pending === 0) { - resolver.become(new Fulfilled(results)); - } + this.value = value; +} - return new Promise(Handler, resolver); +EvHook.prototype.hook = function (node, propertyName) { + var es = EvStore(node); + var propName = propertyName.substr(3); - function mapAt(i, x, resolver) { - if(!resolver.resolved) { - traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver); - } - } + es[propName] = this.value; +}; - function settleAt(i, x, resolver) { - results[i] = x; - if(--pending === 0) { - resolver.become(new Fulfilled(results)); - } - } - } +EvHook.prototype.unhook = function(node, propertyName) { + var es = EvStore(node); + var propName = propertyName.substr(3); - function traverseAt(promises, handler, i, x, resolver) { - if (maybeThenable(x)) { - var h = getHandlerMaybeThenable(x); - var s = h.state(); + es[propName] = undefined; +}; - 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); - } - } +},{"ev-store":9}],240:[function(require,module,exports){ +'use strict'; - Promise._visitRemaining = visitRemaining; - function visitRemaining(promises, start, handler) { - for(var i=start; i bLen ? aLen : bLen - function inspect(handler) { - var state = handler.state(); - return state === 0 ? toPendingState() - : state > 0 ? toFulfilledState(handler.value) - : toRejectedState(handler.value); - } + for (var i = 0; i < len; i++) { + var leftNode = aChildren[i] + var rightNode = bChildren[i] + index += 1 -}); -}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + 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) + } -},{}],214:[function(require,module,exports){ -/** @license MIT License (c) copyright 2010-2014 original author or authors */ + if (isVNode(leftNode) && leftNode.count) { + index += leftNode.count + } + } -/** - * 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) { + if (orderedSet.moves) { + // Reorder nodes last + apply = appendPatch(apply, new VPatch( + VPatch.ORDER, + a, + orderedSet.moves + )) + } - 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'); + return apply +} - var Promise = [array, flow, fold, generate, progress, - inspect, withThis, timed, unhandledRejection] - .reduce(function(Promise, feature) { - return feature(Promise); - }, require('./lib/Promise')); +function clearState(vNode, patch, index) { + // TODO: Make this a single walk, not two + unhook(vNode, patch, index) + destroyWidgets(vNode, patch, index) +} - var apply = require('./lib/apply')(Promise); +// 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 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 - // Public API + destroyWidgets(child, patch, index) - 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 + if (isVNode(child) && child.count) { + index += child.count + } + } + } else if (isThunk(vNode)) { + thunks(vNode, null, patch, index) + } +} - 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 +// 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) + } +} - when.join = join; // Join 2 or more promises +function hasPatches(patch) { + for (var index in patch) { + if (index !== "a") { + return true + } + } - when.all = all; // Resolve a list of promises - when.settle = settle; // Settle a list of promises + return false +} - 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 +// 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) + ) + ) + } - 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 + 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 - when.isPromiseLike = isPromiseLike; // Is something promise-like, aka thenable + unhook(child, patch, index) - when.Promise = Promise; // Promise constructor - when.defer = defer; // Create a {promise, resolve, reject} tuple + if (isVNode(child) && child.count) { + index += child.count + } + } + } + } else if (isThunk(vNode)) { + thunks(vNode, null, patch, index) + } +} - // Error types +function undefinedKeys(obj) { + var result = {} - when.TimeoutError = TimeoutError; + for (var key in obj) { + result[key] = undefined + } - /** - * 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 result +} - return p.then(onFulfilled, onRejected, onProgress); - } +// 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 - /** - * 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); - } + if (bFree.length === bChildren.length) { + return { + children: bChildren, + moves: null + } + } - /** - * 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= bFree.length ? + bChildren.length : + bFree[freeIndex] - /** - * 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); - } + // Iterate through b and append any new keys + // O(M) time + for (var j = 0; j < bChildren.length; j++) { + var newItem = bChildren[j] - /** - * 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 + 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++ + } + // a key in simulate has no matching wanted key, remove it + else if (simulateItem && simulateItem.key) { + removes.push(remove(simulate, simulateIndex, simulateItem.key)) + } + } + else { + simulateIndex++ + k++ + } + } + + // 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 + } + } + + return { + children: newChildren, + moves: { + removes: removes, + inserts: inserts + } + } +} + +function remove(arr, index, key) { + arr.splice(index, 1) + + return { + from: index, + key: key + } +} + +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 appendPatch(apply, patch) { + if (apply) { + if (isArray(apply)) { + apply.push(patch) + } else { + apply = [apply, patch] + } + + return apply + } else { + return patch + } +} + +},{"../vnode/handle-thunk":243,"../vnode/is-thunk":244,"../vnode/is-vnode":246,"../vnode/is-vtext":247,"../vnode/is-widget":248,"../vnode/vpatch":251,"./diff-props":253,"x-is-array":273}],255:[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":256,"./env":268,"./makePromise":270}],256:[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 settle(promises) { - return when(promises, Promise.settle); + 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(); + }; } /** - * 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. + * Enqueue a task + * @param {{ run:function }} task */ - function map(promises, mapFunc) { - return when(promises, function(promises) { - return Promise.map(promises, mapFunc); - }); - } + Scheduler.prototype.enqueue = function(task) { + this._queue[this._queueLen++] = task; + this.run(); + }; /** - * 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. + * Enqueue a task to run after the main task queue + * @param {{ run:function }} task */ - function filter(promises, predicate) { - return when(promises, function(promises) { - return Promise.filter(promises, predicate); - }); - } + Scheduler.prototype.afterQueue = function(task) { + this._afterQueue[this._afterQueueLen++] = task; + this.run(); + }; - return when; -}); -})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); + Scheduler.prototype.run = function() { + if (!this._running) { + this._running = true; + this._async(this.drain); + } + }; -},{"./lib/Promise":197,"./lib/TimeoutError":199,"./lib/apply":200,"./lib/decorators/array":201,"./lib/decorators/flow":202,"./lib/decorators/fold":203,"./lib/decorators/inspect":204,"./lib/decorators/iterate":205,"./lib/decorators/progress":206,"./lib/decorators/timed":207,"./lib/decorators/unhandledRejection":208,"./lib/decorators/with":209}],215:[function(require,module,exports){ -var nativeIsArray = Array.isArray -var toString = Object.prototype.toString + /** + * 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; + } -module.exports = nativeIsArray || isArray + this._queueLen = 0; + this._running = false; -function isArray(obj) { - return toString.call(obj) === "[object Array]" -} + for (i = 0; i < this._afterQueueLen; ++i) { + this._afterQueue[i].run(); + this._afterQueue[i] = void 0; + } -},{}],216:[function(require,module,exports){ -"use strict"; -var APIv3_1 = require("./api/APIv3"); -exports.APIv3 = APIv3_1.APIv3; -var ModelCreator_1 = require("./api/ModelCreator"); -exports.ModelCreator = ModelCreator_1.ModelCreator; + this._afterQueueLen = 0; + }; -},{"./api/APIv3":228,"./api/ModelCreator":229}],217:[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; + return Scheduler; -},{"./component/AttributionComponent":230,"./component/BackgroundComponent":231,"./component/BearingComponent":232,"./component/CacheComponent":233,"./component/Component":234,"./component/ComponentService":235,"./component/CoverComponent":236,"./component/DebugComponent":237,"./component/ImageComponent":238,"./component/KeyboardComponent":239,"./component/LoadingComponent":240,"./component/MouseComponent":241,"./component/NavigationComponent":242,"./component/RouteComponent":243,"./component/StatsComponent":244,"./component/direction/DirectionComponent":245,"./component/direction/DirectionDOMCalculator":246,"./component/direction/DirectionDOMRenderer":247,"./component/imageplane/ImagePlaneComponent":248,"./component/imageplane/ImagePlaneFactory":249,"./component/imageplane/ImagePlaneGLRenderer":250,"./component/imageplane/ImagePlaneScene":251,"./component/imageplane/ImagePlaneShaders":252,"./component/imageplane/SliderComponent":253,"./component/marker/Marker":254,"./component/marker/MarkerComponent":255,"./component/marker/SimpleMarker":256,"./component/sequence/SequenceComponent":257,"./component/sequence/SequenceDOMInteraction":258,"./component/sequence/SequenceDOMRenderer":259,"./component/tag/TagComponent":261,"./component/tag/TagCreator":262,"./component/tag/TagDOMRenderer":263,"./component/tag/TagGLRenderer":264,"./component/tag/TagOperation":265,"./component/tag/TagSet":266,"./component/tag/error/GeometryTagError":267,"./component/tag/geometry/Geometry":268,"./component/tag/geometry/PointGeometry":269,"./component/tag/geometry/PolygonGeometry":270,"./component/tag/geometry/RectGeometry":271,"./component/tag/geometry/VertexGeometry":272,"./component/tag/tag/Alignment":273,"./component/tag/tag/OutlineCreateTag":274,"./component/tag/tag/OutlineRenderTag":275,"./component/tag/tag/OutlineTag":276,"./component/tag/tag/RenderTag":277,"./component/tag/tag/SpotRenderTag":278,"./component/tag/tag/SpotTag":279,"./component/tag/tag/Tag":280}],218:[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; +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{"./graph/edge/EdgeCalculator":298,"./graph/edge/EdgeCalculatorCoefficients":299,"./graph/edge/EdgeCalculatorDirections":300,"./graph/edge/EdgeCalculatorSettings":301,"./graph/edge/EdgeDirection":302}],219:[function(require,module,exports){ -"use strict"; -var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError"); -exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError; -var GraphMapillaryError_1 = require("./error/GraphMapillaryError"); -exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError; -var MapillaryError_1 = require("./error/MapillaryError"); -exports.MapillaryError = MapillaryError_1.MapillaryError; +},{}],257:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ -},{"./error/ArgumentMapillaryError":281,"./error/GraphMapillaryError":282,"./error/MapillaryError":283}],220:[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 ViewportCoords_1 = require("./geo/ViewportCoords"); -exports.ViewportCoords = ViewportCoords_1.ViewportCoords; -var Spatial_1 = require("./geo/Spatial"); -exports.Spatial = Spatial_1.Spatial; -var Transform_1 = require("./geo/Transform"); -exports.Transform = Transform_1.Transform; +(function(define) { 'use strict'; +define(function() { -},{"./geo/Camera":284,"./geo/GeoCoords":285,"./geo/Spatial":286,"./geo/Transform":287,"./geo/ViewportCoords":288}],221:[function(require,module,exports){ -"use strict"; -var FilterCreator_1 = require("./graph/FilterCreator"); -exports.FilterCreator = FilterCreator_1.FilterCreator; -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 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; + /** + * 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); + } + } -},{"./graph/FilterCreator":289,"./graph/Graph":290,"./graph/GraphCalculator":291,"./graph/GraphService":292,"./graph/ImageLoadingService":293,"./graph/MeshReader":294,"./graph/Node":295,"./graph/NodeCache":296,"./graph/Sequence":297}],222:[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; + TimeoutError.prototype = Object.create(Error.prototype); + TimeoutError.prototype.constructor = TimeoutError; -},{"./Edge":218,"./Render":223,"./Viewer":227,"./component/tag/Tag":260}],223:[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; + return TimeoutError; +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); +},{}],258:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ -},{"./render/DOMRenderer":303,"./render/GLRenderStage":304,"./render/GLRenderer":305,"./render/RenderCamera":306,"./render/RenderMode":307,"./render/RenderService":308}],224:[function(require,module,exports){ -"use strict"; -var State_1 = require("./state/State"); -exports.State = State_1.State; -var StateBase_1 = require("./state/states/StateBase"); -exports.StateBase = StateBase_1.StateBase; -var StateContext_1 = require("./state/StateContext"); -exports.StateContext = StateContext_1.StateContext; -var StateService_1 = require("./state/StateService"); -exports.StateService = StateService_1.StateService; -var TraversingState_1 = require("./state/states/TraversingState"); -exports.TraversingState = TraversingState_1.TraversingState; -var WaitingState_1 = require("./state/states/WaitingState"); -exports.WaitingState = WaitingState_1.WaitingState; +(function(define) { 'use strict'; +define(function() { -},{"./state/State":309,"./state/StateContext":310,"./state/StateService":311,"./state/states/StateBase":312,"./state/states/TraversingState":313,"./state/states/WaitingState":314}],225:[function(require,module,exports){ -"use strict"; -var ImageTileLoader_1 = require("./tiles/ImageTileLoader"); -exports.ImageTileLoader = ImageTileLoader_1.ImageTileLoader; -var ImageTileStore_1 = require("./tiles/ImageTileStore"); -exports.ImageTileStore = ImageTileStore_1.ImageTileStore; -var TextureProvider_1 = require("./tiles/TextureProvider"); -exports.TextureProvider = TextureProvider_1.TextureProvider; -var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator"); -exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator; + makeApply.tryCatchResolve = tryCatchResolve; -},{"./tiles/ImageTileLoader":315,"./tiles/ImageTileStore":316,"./tiles/RegionOfInterestCalculator":317,"./tiles/TextureProvider":318}],226:[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; + return makeApply; -},{"./utils/EventEmitter":319,"./utils/Settings":320,"./utils/Urls":321}],227:[function(require,module,exports){ -"use strict"; -var Container_1 = require("./viewer/Container"); -exports.Container = Container_1.Container; -var CacheService_1 = require("./viewer/CacheService"); -exports.CacheService = CacheService_1.CacheService; -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; + function makeApply(Promise, call) { + if(arguments.length < 2) { + call = tryCatchResolve; + } -},{"./viewer/CacheService":322,"./viewer/ComponentController":323,"./viewer/Container":324,"./viewer/EventLauncher":325,"./viewer/ImageSize":326,"./viewer/LoadingService":327,"./viewer/MouseService":328,"./viewer/Navigator":329,"./viewer/SpriteAlignment":330,"./viewer/SpriteService":331,"./viewer/TouchService":332,"./viewer/Viewer":333}],228:[function(require,module,exports){ -/// -"use strict"; -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 API_1 = require("../API"); -var APIv3 = (function () { - 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", - ]; - this._propertiesFill = [ - "captured_at", - "user", - "project", - ]; - 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; - } - } - } - 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.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._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; + return apply; -},{"../API":216,"rxjs/Observable":28,"rxjs/add/observable/defer":38,"rxjs/add/observable/fromPromise":42,"rxjs/add/operator/catch":49,"rxjs/add/operator/map":62}],229:[function(require,module,exports){ -/// -"use strict"; -var falcor = require("falcor"); -var HttpDataSource = require("falcor-http-datasource"); -var Utils_1 = require("../Utils"); -var ModelCreator = (function () { - function ModelCreator() { - } - 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 HttpDataSource(Utils_1.Urls.falcorModel(clientId), configuration), - }); - }; - return ModelCreator; -}()); -exports.ModelCreator = ModelCreator; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ModelCreator; + 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); -},{"../Utils":226,"falcor":13,"falcor-http-datasource":8}],230:[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 AttributionComponent = (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 = 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", - }, []), - ]); - }; - return AttributionComponent; -}(Component_1.Component)); -AttributionComponent.componentName = "attribution"; -exports.AttributionComponent = AttributionComponent; -Component_1.ComponentService.register(AttributionComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = AttributionComponent; + return p; + } -},{"../Component":217,"virtual-dom":173}],231:[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 BackgroundComponent = (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 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 }, []), - ]); - }; - return BackgroundComponent; -}(Component_1.Component)); -BackgroundComponent.componentName = "background"; -exports.BackgroundComponent = BackgroundComponent; -Component_1.ComponentService.register(BackgroundComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = BackgroundComponent; + function callAndResolve(c, h) { + if(c.i < 0) { + return call(c.f, c.thisArg, c.params, h); + } -},{"../Component":217,"virtual-dom":173}],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 vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); -var Component_1 = require("../Component"); -var Geo_1 = require("../Geo"); -var BearingComponent = (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._svgNamespace = "http://www.w3.org/2000/svg"; - _this._distinctThreshold = Math.PI / 90; - return _this; - } - BearingComponent.prototype._activate = function () { - var _this = this; - var nodeBearingFov$ = this._navigator.stateService.currentState$ - .distinctUntilChanged(undefined, function (frame) { - return frame.state.currentNode.key; - }) - .map(function (frame) { - var node = frame.state.currentNode; - var transform = frame.state.currentTransform; - if (node.pano) { - var hFov_1 = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels; - return [_this._spatial.degToRad(node.ca), hFov_1]; - } - var size = Math.max(transform.basicWidth, transform.basicHeight); - if (size <= 0) { - console.warn("Original image size (" + transform.basicWidth + ", " + transform.basicHeight + ") is invalid (" + node.key + ". " + - "Not showing available fov."); - } - var hFov = size > 0 ? - 2 * Math.atan(0.5 * transform.basicWidth / (size * transform.focal)) : - 0; - return [_this._spatial.degToRad(node.ca), hFov]; - }) - .distinctUntilChanged(function (a1, a2) { - return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold && - Math.abs(a2[1] - a1[1]) < _this._distinctThreshold; - }); - var cameraBearingFov$ = this._container.renderService.renderCamera$ - .map(function (rc) { - var vFov = _this._spatial.degToRad(rc.perspective.fov); - var hFov = Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2; - return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov]; - }) - .distinctUntilChanged(function (a1, a2) { - return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold && - Math.abs(a2[1] - a1[1]) < _this._distinctThreshold; - }); - this._renderSubscription = Observable_1.Observable - .combineLatest(nodeBearingFov$, cameraBearingFov$) - .map(function (args) { - var background = vd.h("div.BearingIndicatorBackground", {}, [ - vd.h("div.BearingIndicatorBackgroundRectangle", {}, []), - vd.h("div.BearingIndicatorBackgroundCircle", {}, []), - ]); - var north = vd.h("div.BearingIndicatorNorth", {}, []); - var nodeSector = _this._createCircleSector(args[0][0], args[0][1], "#000"); - var cameraSector = _this._createCircleSector(args[1][0], args[1][1], "#fff"); - var compass = _this._createCircleSectorCompass(nodeSector, cameraSector); - return { - name: _this._name, - vnode: vd.h("div.BearingIndicator", {}, [ - background, - north, - compass, - ]), - }; - }) - .subscribe(this._container.domRenderer.render$); - }; - BearingComponent.prototype._deactivate = function () { - this._renderSubscription.unsubscribe(); - }; - BearingComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - BearingComponent.prototype._createCircleSectorCompass = function (nodeSector, cameraSector) { - var group = vd.h("g", { - attributes: { transform: "translate(1,1)" }, - namespace: this._svgNamespace, - }, [nodeSector, cameraSector]); - var centerCircle = vd.h("circle", { - attributes: { - cx: "1", - cy: "1", - fill: "#abb1b9", - r: "0.291667", - stroke: "#000", - "stroke-width": "0.0833333", - }, - namespace: this._svgNamespace, - }, []); - var svg = vd.h("svg", { - attributes: { viewBox: "0 0 2 2" }, - namespace: this._svgNamespace, - style: { - bottom: "4px", - height: "48px", - left: "4px", - position: "absolute", - width: "48px", - }, - }, [group, centerCircle]); - return svg; - }; - BearingComponent.prototype._createCircleSector = function (bearing, 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 = bearing - fov / 2 - Math.PI / 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, - }, []); - }; - return BearingComponent; -}(Component_1.Component)); -BearingComponent.componentName = "bearing"; -exports.BearingComponent = BearingComponent; -Component_1.ComponentService.register(BearingComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = BearingComponent; - -},{"../Component":217,"../Geo":220,"rxjs/Observable":28,"virtual-dom":173}],233:[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/from"); -require("rxjs/add/observable/merge"); -require("rxjs/add/observable/of"); -require("rxjs/add/observable/zip"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/distinct"); -require("rxjs/add/operator/expand"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -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) { - 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 = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentNode$ - .switchMap(function (node) { - return node.sequenceEdges$; - }) - .filter(function (status) { - return status.cached; - }), this._configuration$) - .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 Observable_1.Observable - .merge(next$, prev$) - .catch(function (error, caught) { - console.error("Failed to cache sequence edges.", error); - return Observable_1.Observable.empty(); - }); - }) - .subscribe(function () { }); - this._spatialSubscription = this._navigator.stateService.currentNode$ - .switchMap(function (node) { - return Observable_1.Observable - .combineLatest(Observable_1.Observable.of(node), node.spatialEdges$ - .filter(function (status) { - return status.cached; - })); - }) - .combineLatest(this._configuration$, function (ns, configuration) { - return [ns[0], ns[1], configuration]; - }) - .switchMap(function (args) { - var node = args[0]; - var edges = args[1].edges; - var depth = args[2].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 Observable_1.Observable - .merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$) - .catch(function (error, caught) { - console.error("Failed to cache spatial edges.", error); - return Observable_1.Observable.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 Observable_1.Observable - .zip(Observable_1.Observable.of(edges), 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; - }); - }; - return CacheComponent; -}(Component_1.Component)); -CacheComponent.componentName = "cache"; -exports.CacheComponent = CacheComponent; -Component_1.ComponentService.register(CacheComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = CacheComponent; + var handler = Promise._handler(c.args[c.i]); + handler.fold(callAndResolveNext, c, void 0, h); + } -},{"../Component":217,"../Edge":218,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/from":40,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/catch":49,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/distinct":54,"rxjs/add/operator/expand":57,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeAll":64,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/skip":72,"rxjs/add/operator/switchMap":76}],234:[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) { - var _this = _super.call(this) || 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(function () { }); - return _this; - } - 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; - } - if (conf !== undefined) { - this._configurationSubject$.next(conf); - } - 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; - } - 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; }; - return Component; -}(Utils_1.EventEmitter)); -/** - * Component name. Used when interacting with component through the Viewer's API. - */ -Component.componentName = "not_worthy"; -exports.Component = Component; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Component; + function callAndResolveNext(c, x, h) { + c.params[c.i] = x; + c.i -= 1; + callAndResolve(c, h); + } + } -},{"../Utils":226,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75}],235:[function(require,module,exports){ -/// -"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; - } - 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; - } - 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(); - } - } - 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(); - } - }; - 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); - } - }; - return ComponentService; -}()); -ComponentService.registeredComponents = {}; -exports.ComponentService = ComponentService; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ComponentService; + function tryCatchResolve(f, thisArg, args, resolver) { + try { + resolver.resolve(f.apply(thisArg, args)); + } catch(e) { + resolver.reject(e); + } + } -},{"../Error":219,"underscore":168}],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 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) { - return _super.call(this, name, container, navigator) || this; - } - 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); - }; - return CoverComponent; -}(Component_1.Component)); -CoverComponent.componentName = "cover"; -exports.CoverComponent = CoverComponent; -Component_1.ComponentService.registerCover(CoverComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = CoverComponent; +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{"../Component":217,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/withLatestFrom":80,"virtual-dom":173}],237:[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 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) { - var _this = _super.call(this, name, container, navigator) || this; - _this._open$ = new BehaviorSubject_1.BehaviorSubject(false); - _this._displaying = false; - return _this; - } - 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++; - } - } - 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); - }; - return DebugComponent; -}(Component_1.Component)); -DebugComponent.componentName = "debug"; -exports.DebugComponent = DebugComponent; -Component_1.ComponentService.register(DebugComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = DebugComponent; -},{"../Component":217,"rxjs/BehaviorSubject":25,"rxjs/add/operator/combineLatest":50,"underscore":168,"virtual-dom":173}],238:[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"); -require("rxjs/add/operator/combineLatest"); -var Component_1 = require("../Component"); -var ImageComponent = (function (_super) { - __extends(ImageComponent, _super); - function ImageComponent(name, container, navigator) { - var _this = _super.call(this, name, container, navigator) || this; - _this._canvasId = container.id + "-" + _this._name; - return _this; - } - 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 {}; - }; - return ImageComponent; -}(Component_1.Component)); -ImageComponent.componentName = "image"; -exports.ImageComponent = ImageComponent; -Component_1.ComponentService.register(ImageComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ImageComponent; -},{"../Component":217,"rxjs/add/operator/combineLatest":50,"virtual-dom":173}],239:[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) { - var _this = _super.call(this, name, container, navigator) || this; - _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, - ]; - return _this; - } - 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; - } - 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; - } - } - 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; - } - this._moveInDir(direction, spatialEdges); - }; - KeyboardComponent.prototype._moveInDir = function (direction, edgeStatus) { - if (!edgeStatus.cached) { - return; - } - 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; - } - } - }; - return KeyboardComponent; -}(Component_1.Component)); -KeyboardComponent.componentName = "keyboard"; -exports.KeyboardComponent = KeyboardComponent; -Component_1.ComponentService.register(KeyboardComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = KeyboardComponent; +},{}],259:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ -},{"../Component":217,"../Edge":218,"../Geo":220,"rxjs/Observable":28,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/withLatestFrom":80}],240:[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 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) { - return _super.call(this, name, container, navigator) || this; - } - 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) }; - } - 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; - } - } - 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 }, [])]); - }; - return LoadingComponent; -}(Component_1.Component)); -LoadingComponent.componentName = "loading"; -exports.LoadingComponent = LoadingComponent; -Component_1.ComponentService.register(LoadingComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = LoadingComponent; +(function(define) { 'use strict'; +define(function(require) { -},{"../Component":217,"rxjs/add/operator/combineLatest":50,"underscore":168,"virtual-dom":173}],241:[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 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) { - var _this = _super.call(this, name, container, navigator) || this; - _this._basicDistanceThreshold = 1e-3; - _this._basicRotationThreshold = 5e-2; - _this._bounceCoeff = 1e-1; - _this._forceCoeff = 2e-1; - _this._viewportCoords = new Geo_1.ViewportCoords(); - _this._spatial = new Geo_1.Spatial(); - return _this; - } - 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._activeMouseSubscription = dragging$ - .subscribe(this._container.mouseService.activate$); - var touchMovingStarted$ = this._container.touchService.singleTouchMoveStart$ - .map(function (event) { - return true; - }); - var touchMovingStopped$ = this._container.touchService.singleTouchMoveEnd$ - .map(function (event) { - return false; - }); - var touchMoving$ = Observable_1.Observable - .merge(touchMovingStarted$, touchMovingStopped$) - .startWith(false) - .share(); - this._activeTouchSubscription = touchMoving$ - .subscribe(this._container.touchService.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._viewportCoords.unprojectFromCanvas(canvasX, canvasY, offsetWidth, offsetHeight, render.perspective) - .sub(render.perspective.position); - var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movement.movementX, canvasY, offsetWidth, offsetHeight, render.perspective) - .sub(render.perspective.position); - var directionY = _this._viewportCoords.unprojectFromCanvas(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; - } - var rotationThreshold = _this._basicRotationThreshold; - x = _this._spatial.clamp(x, -rotationThreshold, rotationThreshold); - y = _this._spatial.clamp(y, -rotationThreshold, rotationThreshold); - if (transform.fullPano) { - return [x, y]; - } - var pixelDistances = _this._viewportCoords.getPixelDistances(_this._container.element.offsetWidth, _this._container.element.offsetHeight, transform, render.perspective); - var coeff = _this._forceCoeff; - if (pixelDistances[0] > 0 && y < 0 && basic[1] < 0.5) { - y /= Math.max(1, coeff * pixelDistances[0]); - } - if (pixelDistances[1] > 0 && x > 0 && basic[0] > 0.5) { - x /= Math.max(1, coeff * pixelDistances[1]); - } - if (pixelDistances[2] > 0 && y > 0 && basic[1] > 0.5) { - y /= Math.max(1, coeff * pixelDistances[2]); - } - if (pixelDistances[3] > 0 && x < 0 && basic[0] < 0.5) { - x /= Math.max(1, coeff * pixelDistances[3]); - } - 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._viewportCoords.unprojectFromCanvas(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._viewportCoords.unprojectFromCanvas(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._bounceSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$) - .map(function (noForce) { - return noForce[0] || noForce[1] || noForce[2]; - }) - .distinctUntilChanged() - .switchMap(function (noForce) { - return noForce ? - Observable_1.Observable.empty() : - Observable_1.Observable.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.first()); - }) - .subscribe(function (args) { - var renderCamera = args[0]; - var perspectiveCamera = renderCamera.perspective; - var transform = args[1]; - var distanceThreshold = _this._basicDistanceThreshold / Math.pow(2, renderCamera.zoom); - var basicCenter = _this._viewportCoords.viewportToBasic(0, 0, transform, perspectiveCamera); - if (Math.abs(basicCenter[0] - 0.5) < distanceThreshold && Math.abs(basicCenter[1] - 0.5) < distanceThreshold) { - return; - } - var basicDistances = _this._viewportCoords.getBasicDistances(transform, perspectiveCamera); - var basicX = 0; - var basicY = 0; - if (basicDistances[0] < distanceThreshold && basicDistances[1] < distanceThreshold && - basicDistances[2] < distanceThreshold && basicDistances[3] < distanceThreshold) { - return; - } - if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold && - Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) { - return; - } - var coeff = _this._bounceCoeff; - if (basicDistances[1] > 0 && basicDistances[3] === 0) { - basicX = -coeff * basicDistances[1]; - } - else if (basicDistances[1] === 0 && basicDistances[3] > 0) { - basicX = coeff * basicDistances[3]; - } - else if (basicDistances[1] > 0 && basicDistances[3] > 0) { - basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2; - } - if (basicDistances[0] > 0 && basicDistances[2] === 0) { - basicY = coeff * basicDistances[0]; - } - else if (basicDistances[0] === 0 && basicDistances[2] > 0) { - basicY = -coeff * basicDistances[2]; - } - else if (basicDistances[0] > 0 && basicDistances[2] > 0) { - basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2; - } - var rotationThreshold = _this._basicRotationThreshold; - basicX = _this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold); - basicY = _this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold); - _this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]); - }); - this._container.mouseService.claimMouse(this._name, 0); - }; - MouseComponent.prototype._deactivate = function () { - this._container.mouseService.unclaimMouse(this._name); - this._activeMouseSubscription.unsubscribe(); - this._activeTouchSubscription.unsubscribe(); - this._bounceSubscription.unsubscribe(); - this._cursorSubscription.unsubscribe(); - this._movementSubscription.unsubscribe(); - this._mouseWheelSubscription.unsubscribe(); - this._pinchSubscription.unsubscribe(); - }; - MouseComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - return MouseComponent; -}(Component_1.Component)); -/** @inheritdoc */ -MouseComponent.componentName = "mouse"; -exports.MouseComponent = MouseComponent; -Component_1.ComponentService.register(MouseComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MouseComponent; + var state = require('../state'); + var applier = require('../apply'); -},{"../Component":217,"../Geo":220,"rxjs/Observable":28,"rxjs/add/observable/merge":43,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/withLatestFrom":80,"three":167,"virtual-dom":173}],242:[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"); -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) { - var _this = _super.call(this, name, container, navigator) || this; - _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"; - return _this; - } - 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); }); - }, - }, []); - }; - return NavigationComponent; -}(Component_1.Component)); -NavigationComponent.componentName = "navigation"; -exports.NavigationComponent = NavigationComponent; -Component_1.ComponentService.register(NavigationComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = NavigationComponent; + return function array(Promise) { -},{"../Component":217,"../Edge":218,"rxjs/Observable":28,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"virtual-dom":173}],243:[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 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 DescriptionState; -}()); -var RouteState = (function () { - function RouteState() { - } - return RouteState; -}()); -var RouteTrack = (function () { - function RouteTrack() { - this.nodeInstructions = []; - this.nodeInstructionsOrdered = []; - } - return RouteTrack; -}()); -var RouteComponent = (function (_super) { - __extends(RouteComponent, _super); - function RouteComponent(name, container, navigator) { - return _super.call(this, name, container, navigator) || this; - } - 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 (p) { - return p.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", {}, [ - vd.h("p", { textContent: description }, []), - ]); - }; - return RouteComponent; -}(Component_1.Component)); -RouteComponent.componentName = "route"; -exports.RouteComponent = RouteComponent; -Component_1.ComponentService.register(RouteComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = RouteComponent; + var applyFold = applier(Promise); + var toPromise = Promise.resolve; + var all = Promise.all; -},{"../Component":217,"rxjs/Observable":28,"rxjs/add/observable/fromPromise":42,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/distinct":54,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/pluck":67,"rxjs/add/operator/scan":70,"underscore":168,"virtual-dom":173}],244:[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) { - return _super.call(this, name, container, navigator) || this; - } - StatsComponent.prototype._activate = function () { - 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; - } - 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(function () { }); - 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; - } - } - 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(function () { }); - }; - StatsComponent.prototype._deactivate = function () { - this._sequenceSubscription.unsubscribe(); - this._imageSubscription.unsubscribe(); - }; - StatsComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - return StatsComponent; -}(Component_1.Component)); -StatsComponent.componentName = "stats"; -exports.StatsComponent = StatsComponent; -Component_1.ComponentService.register(StatsComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = StatsComponent; + var ar = Array.prototype.reduce; + var arr = Array.prototype.reduceRight; + var slice = Array.prototype.slice; -},{"../Component":217,"rxjs/Observable":28,"rxjs/add/operator/buffer":47,"rxjs/add/operator/debounceTime":52,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/scan":70}],245:[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 Component_1 = require("../../Component"); -/** - * @class DirectionComponent - * @classdesc Component showing navigation arrows for steps and turns. - */ -var DirectionComponent = (function (_super) { - __extends(DirectionComponent, _super); - function DirectionComponent(name, container, navigator) { - var _this = _super.call(this, name, container, navigator) || this; - _this._renderer = new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, container.element); - _this._hoveredKeySubject$ = new Subject_1.Subject(); - _this._hoveredKey$ = _this._hoveredKeySubject$.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} - */ - get: function () { - return this._hoveredKey$; - }, - enumerable: true, - 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 }); - }; - /** @inheritdoc */ - DirectionComponent.prototype.resize = function () { - this._renderer.resize(this._container.element); - }; - DirectionComponent.prototype._activate = function () { - var _this = this; - this._configurationSubscription = this._configuration$ - .subscribe(function (configuration) { - _this._renderer.setConfiguration(configuration); - }); - 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._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) }; - }) - .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"); - } - } - return null; - }) - .distinctUntilChanged() - .subscribe(this._hoveredKeySubject$); - }; - DirectionComponent.prototype._deactivate = function () { - this._configurationSubscription.unsubscribe(); - this._nodeSubscription.unsubscribe(); - this._renderCameraSubscription.unsubscribe(); - this._hoveredKeySubscription.unsubscribe(); - }; - DirectionComponent.prototype._getDefaultConfiguration = function () { - return { - distinguishSequence: false, - maxWidth: 460, - minWidth: 260, - }; - }; - return DirectionComponent; -}(Component_1.Component)); -/** @inheritdoc */ -DirectionComponent.componentName = "direction"; -exports.DirectionComponent = DirectionComponent; -Component_1.ComponentService.register(DirectionComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = DirectionComponent; + // Additional array combinators -},{"../../Component":217,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/share":71,"virtual-dom":173}],246:[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", { - get: function () { - return this._turnCircleSize; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", { - get: function () { - return this._turnCircleSizeCss; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", { - get: function () { - return this._outerRadius; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", { - get: function () { - return this._innerRadius; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", { - get: function () { - return this._shadowOffset; - }, - enumerable: true, - 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 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(); - }; - /** - * Calculates the coordinates on the unit circle for an angle. - * - * @param {number} angle Angle in radians. - * @returns {Array} 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} 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 (element) { - this._elementWidth = element.offsetWidth; - this._elementHeight = element.offsetHeight; - }; - 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; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = DirectionDOMCalculator; + Promise.any = any; + Promise.some = some; + Promise.settle = settle; -},{"../../Geo":220}],247:[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; - 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: true, - 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 {HTMLElement} element Viewer container element. - */ - DirectionDOMRenderer.prototype.resize = function (element) { - this._calculator.resize(element); - 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(function (node) { return; }, function (error) { 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(function (node) { return; }, function (error) { 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(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"; - } - 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 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; + Promise.map = map; + Promise.filter = filter; + Promise.reduce = reduce; + Promise.reduceRight = reduceRight; -},{"../../Component":217,"../../Edge":218,"../../Geo":220,"virtual-dom":173}],248:[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/operator/catch"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/debounceTime"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/pairwise"); -require("rxjs/add/operator/publish"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/skipWhile"); -require("rxjs/add/operator/startWith"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/takeUntil"); -require("rxjs/add/operator/withLatestFrom"); -var Component_1 = require("../../Component"); -var Render_1 = require("../../Render"); -var Tiles_1 = require("../../Tiles"); -var Utils_1 = require("../../Utils"); -var ImagePlaneComponent = (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 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; - }); - _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; - }; - }) - .subscribe(_this._rendererOperation$); - return _this; - } - ImagePlaneComponent.prototype._activate = function () { - var _this = this; - this._rendererSubscription = this._renderer$ - .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$ - .map(function (frame) { - return function (renderer) { - renderer.updateFrame(frame); - return renderer; - }; - }) - .subscribe(this._rendererOperation$); - var textureProvider$ = this._navigator.stateService.currentState$ - .distinctUntilChanged(undefined, function (frame) { - return frame.state.currentNode.key; - }) - .combineLatest(this._configuration$) - .filter(function (args) { - return args[1].imageTiling === true; - }) - .map(function (args) { - return args[0]; - }) - .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$) - .map(function (args) { - var state = args[0].state; - var renderer = args[1]; - var viewportSize = args[2]; - var currentNode = state.currentNode; - var currentTransform = state.currentTransform; - var tileSize = Math.max(viewportSize.width, viewportSize.height) > 1024 ? 1024 : 512; - return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer); - }) - .publishReplay(1) - .refCount(); - this._textureProviderSubscription = textureProvider$.subscribe(function () { }); - this._setTextureProviderSubscription = textureProvider$ - .map(function (provider) { - return function (renderer) { - renderer.setTextureProvider(provider.key, provider); - return renderer; - }; - }) - .subscribe(this._rendererOperation$); - this._abortTextureProviderSubscription = textureProvider$ - .pairwise() - .subscribe(function (pair) { - var previous = pair[0]; - previous.abort(); - }); - var roiTrigger$ = this._container.renderService.renderCameraFrame$ - .map(function (renderCamera) { - return [ - renderCamera.camera.position.clone(), - renderCamera.camera.lookat.clone(), - renderCamera.zoom.valueOf() - ]; - }) - .pairwise() - .skipWhile(function (pls) { - return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0; - }) - .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]; - return samePosition && sameLookat && sameZoom; - }) - .distinctUntilChanged() - .filter(function (stalled) { - return stalled; - }) - .switchMap(function (stalled) { - return _this._container.renderService.renderCameraFrame$ - .first(); - }) - .withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$); - this._setRegionOfInterestSubscription = textureProvider$ - .switchMap(function (provider) { - return roiTrigger$ - .map(function (args) { - return [ - _this._roiCalculator.computeRegionOfInterest(args[0], args[1], args[2]), - provider, - ]; - }); - }) - .filter(function (args) { - return !args[1].disposed; - }) - .subscribe(function (args) { - var roi = args[0]; - var provider = args[1]; - provider.setRegionOfInterest(roi); - }); - var hasTexture$ = textureProvider$ - .switchMap(function (provider) { - return provider.hasTexture$; - }) - .startWith(false) - .publishReplay(1) - .refCount(); - this._hasTextureSubscription = hasTexture$.subscribe(function () { }); - var nodeImage$ = this._navigator.stateService.currentNode$ - .debounceTime(1000) - .withLatestFrom(hasTexture$) - .filter(function (args) { - return !args[1]; - }) - .map(function (args) { - return args[0]; - }) - .filter(function (node) { - return node.pano ? - Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize : - Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize; - }) - .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 Observable_1.Observable.empty(); - } - var image$ = node - .cacheImage$(Utils_1.Settings.maxImageSize) - .map(function (n) { - return [n.image, n]; - }); - return image$ - .takeUntil(hasTexture$ - .filter(function (hasTexture) { - return hasTexture; - })) - .catch(function (error, caught) { - console.error("Failed to fetch high res image (" + node.key + ")", error); - return Observable_1.Observable.empty(); - }); - }) - .publish() - .refCount(); - this._updateBackgroundSubscription = nodeImage$ - .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$ - .map(function (imn) { - return function (renderer) { - renderer.updateTextureImage(imn[0], imn[1]); - return renderer; - }; - }) - .subscribe(this._rendererOperation$); - }; - ImagePlaneComponent.prototype._deactivate = function () { - this._rendererDisposer$.next(null); - this._abortTextureProviderSubscription.unsubscribe(); - this._hasTextureSubscription.unsubscribe(); - this._rendererSubscription.unsubscribe(); - this._setRegionOfInterestSubscription.unsubscribe(); - this._setTextureProviderSubscription.unsubscribe(); - this._stateSubscription.unsubscribe(); - this._textureProviderSubscription.unsubscribe(); - this._updateBackgroundSubscription.unsubscribe(); - this._updateTextureImageSubscription.unsubscribe(); - }; - ImagePlaneComponent.prototype._getDefaultConfiguration = function () { - return { imageTiling: false }; - }; - return ImagePlaneComponent; -}(Component_1.Component)); -ImagePlaneComponent.componentName = "imagePlane"; -exports.ImagePlaneComponent = ImagePlaneComponent; -Component_1.ComponentService.register(ImagePlaneComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ImagePlaneComponent; + /** + * 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); + }); + }; -},{"../../Component":217,"../../Render":223,"../../Tiles":225,"../../Utils":226,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/catch":49,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/debounceTime":52,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/pairwise":66,"rxjs/add/operator/publish":68,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/skipWhile":74,"rxjs/add/operator/startWith":75,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/takeUntil":78,"rxjs/add/operator/withLatestFrom":80}],249:[function(require,module,exports){ -/// -"use strict"; -var THREE = require("three"); -var Component_1 = require("../../Component"); -var ImagePlaneFactory = (function () { - function ImagePlaneFactory(imagePlaneDepth, imageSphereRadius) { - this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200; - this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200; - } - 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; - } - 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._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; - }; - 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; - }; - return ImagePlaneFactory; -}()); -exports.ImagePlaneFactory = ImagePlaneFactory; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ImagePlaneFactory; + return Promise; -},{"../../Component":217,"three":167}],250:[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._providerDisposers = {}; - this._frameId = 0; - this._needsRender = false; - } - Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", { - get: function () { - return this._frameId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", { - get: function () { - return this._needsRender; - }, - enumerable: true, - configurable: true - }); - ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () { - 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._updateTexture = function (texture) { - this._needsRender = true; - for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) { - var plane = _a[_i]; - var material = plane.material; - var oldTexture = material.uniforms.projectorTex.value; - material.uniforms.projectorTex.value = null; - oldTexture.dispose(); - material.uniforms.projectorTex.value = texture; - } - }; - ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) { - if (this._currentKey !== node.key) { - return; - } - 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; - } - renderer.render(this._imagePlaneScene.scene, perspectiveCamera); - }; - ImagePlaneGLRenderer.prototype.clearNeedsRender = function () { - this._needsRender = false; - }; - ImagePlaneGLRenderer.prototype.dispose = function () { - this._imagePlaneScene.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._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform); - this._imagePlaneScene.updateImagePlanes([previousMesh]); - } - this._previousKey = previousKey; - } - this._currentKey = currentKey; - var currentMesh = this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform); - this._imagePlaneScene.updateImagePlanes([currentMesh]); - this._alphaOld = 1; - return true; - }; - return ImagePlaneGLRenderer; -}()); -exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ImagePlaneGLRenderer; + /** + * 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; -},{"../../Component":217,"../../Geo":220}],251:[function(require,module,exports){ -/// -"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); - }; - ImagePlaneScene.prototype.setImagePlanesOld = function (planes) { - this._clearOld(); - this.addImagePlanesOld(planes); - }; - ImagePlaneScene.prototype.clear = function () { - this._clear(); - this._clearOld(); - }; - ImagePlaneScene.prototype._clear = function () { - this._dispose(this.imagePlanes, this.scene); - this.imagePlanes.length = 0; - }; - ImagePlaneScene.prototype._clearOld = function () { - this._dispose(this.imagePlanesOld, this.sceneOld); - this.imagePlanesOld.length = 0; - }; - 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(); - } - } - }; - return ImagePlaneScene; -}()); -exports.ImagePlaneScene = ImagePlaneScene; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ImagePlaneScene; + var pending = l; + var errors = []; -},{"three":167}],252:[function(require,module,exports){ -/// -"use strict"; + for (var h, x, i = 0; i < l; ++i) { + x = promises[i]; + if(x === void 0 && !(i in promises)) { + --pending; + continue; + } -var path = require("path"); -var ImagePlaneShaders = (function () { - function ImagePlaneShaders() { - } - return 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}", -}; -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}", -}; -exports.ImagePlaneShaders = ImagePlaneShaders; + h = Promise._handler(x); + if(h.state() > 0) { + resolver.become(h); + Promise._visitRemaining(promises, i, h); + break; + } else { + h.visit(resolver, handleFulfill, handleReject); + } + } -},{"path":21}],253:[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 State_1 = require("../../State"); -var Render_1 = require("../../Render"); -var Utils_1 = require("../../Utils"); -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._curtain = 1; - } - 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", { - get: function () { - return this._sliderVisible; - }, - set: function (value) { - this._sliderVisible = value; - this._domNeedsRender = true; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SliderState.prototype, "disabled", { - get: function () { - return this._currentKey == null || - this._previousKey == null || - this._currentPano; - }, - enumerable: true, - configurable: true - }); - SliderState.prototype.update = function (frame) { - this._updateFrameId(frame.id); - var needsRender = this._updateImagePlanes(frame.state); - this._domNeedsRender = needsRender || this._domNeedsRender; - needsRender = this._updateCurtain(frame.state.alpha) || needsRender; - this._glNeedsRender = needsRender || this._glNeedsRender; - }; - 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) { - 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); - } - 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; - }; - SliderState.prototype._updateImagePlanes = function (state) { - if (state.currentNode == null) { - return; - } - var needsRender = false; - if (state.previousNode != null && this._previousKey !== state.previousNode.key) { - needsRender = true; - this._previousKey = state.previousNode.key; - 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._imagePlaneScene.setImagePlanes([ - this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform), - ]); - if (!this.disabled) { - this._updateBbox(); - } - } - return needsRender; - }; - SliderState.prototype._updateCurtain = function (alpha) { - if (this.disabled || - Math.abs(this._curtain - alpha) < 0.001) { - return false; - } - this._curtain = alpha; - this._updateBbox(); - return true; - }; - 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; - } - }; - return SliderState; -}()); -var SliderComponent = (function (_super) { - __extends(SliderComponent, _super); - /** - * Create a new slider component instance. - * @class SliderComponent - */ - function SliderComponent(name, container, navigator) { - var _this = _super.call(this, name, container, navigator) || this; - _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; - }); - _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$); - return _this; - } - /** - * 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 }); - }; - /** - * 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 }); - }; - 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; - } - _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$ - .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) { - var baseImageSize = node.pano ? - Utils_1.Settings.basePanoramaSize : - Utils_1.Settings.baseImageSize; - if (Math.max(node.image.width, node.image.height) > baseImageSize) { - return Observable_1.Observable.empty(); - } - return node.cacheImage$(Utils_1.Settings.maxImageSize) - .map(function (n) { - return [n.image, 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$); - }; - 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(); - } - }); - 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 }); - }; - SliderComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - SliderComponent.prototype._catchCacheNode$ = function (key) { - return this._navigator.graphService.cacheNode$(key) - .catch(function (error, caught) { - console.error("Failed to cache slider node (" + key + ")", error); - return Observable_1.Observable.empty(); - }); - }; - return SliderComponent; -}(Component_1.Component)); -SliderComponent.componentName = "slider"; -exports.SliderComponent = SliderComponent; -Component_1.ComponentService.register(SliderComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SliderComponent; + if(pending === 0) { + resolver.reject(new RangeError('any(): array must not be empty')); + } -},{"../../Component":217,"../../Render":223,"../../State":224,"../../Utils":226,"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":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/withLatestFrom":80,"rxjs/add/operator/zip":81,"virtual-dom":173}],254:[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(Marker.prototype, "id", { - get: function () { - return this._id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Marker.prototype, "type", { - get: function () { - return this._type; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Marker.prototype, "latLonAlt", { - get: function () { - return this._latLonAlt; - }, - enumerable: true, - configurable: true - }); - return Marker; -}()); -exports.Marker = Marker; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Marker; + return p; -},{}],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 _ = 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); - }; - Object.defineProperty(MarkerSet.prototype, "markers$", { - get: function () { - return this._markers$; - }, - enumerable: true, - configurable: true - }); - return MarkerSet; -}()); -exports.MarkerSet = MarkerSet; -var MarkerComponent = (function (_super) { - __extends(MarkerComponent, _super); - function MarkerComponent(name, container, navigator) { - return _super.call(this, name, container, navigator) || this; - } - 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(); - }; - MarkerComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - MarkerComponent.prototype.createMarker = function (latLonAlt, markerOptions) { - if (markerOptions.type === "marker") { - return new Component_1.SimpleMarker(latLonAlt, markerOptions); - } - return null; - }; - MarkerComponent.prototype.addMarker = function (marker) { - this._markerSet.addMarker(marker); - }; - Object.defineProperty(MarkerComponent.prototype, "markers$", { - get: function () { - return this._markerSet.markers$; - }, - enumerable: true, - configurable: true - }); - MarkerComponent.prototype.removeMarker = function (id) { - this._markerSet.removeMarker(id); - }; - 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, - }, - }; - }; - 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; - }; - MarkerComponent.prototype._render = function (perspectiveCamera, renderer) { - renderer.render(this._scene, perspectiveCamera); - }; - 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(); - } - }; - MarkerComponent.prototype._disposeScene = function () { - for (var i in this._markerObjects) { - if (this._markerObjects.hasOwnProperty(i)) { - this._disposeObject(this._markerObjects[i]); - } - } - this._markerObjects = {}; - }; - return MarkerComponent; -}(Component_1.Component)); -MarkerComponent.componentName = "marker"; -exports.MarkerComponent = MarkerComponent; -Component_1.ComponentService.register(MarkerComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MarkerComponent; + function handleFulfill(x) { + /*jshint validthis:true*/ + errors = null; + this.resolve(x); // this === resolver + } -},{"../../Component":217,"../../Geo":220,"../../Render":223,"rbush":24,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76,"three":167,"underscore":168}],256:[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) { - var _this = _super.call(this, latLonAlt, markerOptions) || this; - _this._circleToRayAngle = 2.0; - _this._simpleMarkerStyle = markerOptions.style; - return _this; - } - 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); - }; - 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; - }; - SimpleMarker.prototype._stringToRBG = function (str) { - var ret = 0; - for (var i = 0; i < str.length; i++) { - ret = str.charCodeAt(i) + ((ret << 5) - ret); - } - return ret; - }; - return SimpleMarker; -}(Component_1.Marker)); -exports.SimpleMarker = SimpleMarker; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SimpleMarker; + function handleReject(e) { + /*jshint validthis:true*/ + if(this.resolved) { // this === resolver + return; + } -},{"../../Component":217,"three":167}],257:[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/bufferCount"); -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) { - var _this = _super.call(this, name, container, navigator) || this; - _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(); - 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} - */ - get: function () { - return this._hoveredKey$; - }, - enumerable: true, - 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 }); - }; - /** @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); - }); - }; - 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(function () { }); - 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$); - }; - SequenceComponent.prototype._deactivate = function () { - this._stopSubscription.unsubscribe(); - this._renderSubscription.unsubscribe(); - this._configurationSubscription.unsubscribe(); - this._containerWidthSubscription.unsubscribe(); - this._hoveredKeySubscription.unsubscribe(); - this.stop(); - }; - SequenceComponent.prototype._getDefaultConfiguration = function () { - return { - direction: Edge_1.EdgeDirection.Next, - maxWidth: 117, - minWidth: 70, - playing: false, - visible: true, - }; - }; - SequenceComponent.prototype._play = function () { - 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(); - }); - this._clearSubscription = this._navigator.stateService.currentNode$ - .bufferCount(1, 7) - .subscribe(function (nodes) { - _this._navigator.stateService.clearPriorNodes(); - }); - this.fire(SequenceComponent.playingchanged, true); - }; - SequenceComponent.prototype._stop = function () { - this._playingSubscription.unsubscribe(); - this._playingSubscription = null; - this._clearSubscription.unsubscribe(); - this._clearSubscription = null; - this.fire(SequenceComponent.playingchanged, false); - }; - return SequenceComponent; -}(Component_1.Component)); -/** @inheritdoc */ -SequenceComponent.componentName = "sequence"; -/** - * Event fired when playing starts or stops. - * - * @event PlayerComponent#playingchanged - * @type {boolean} Indicates whether the player is playing. - */ -SequenceComponent.playingchanged = "playingchanged"; -exports.SequenceComponent = SequenceComponent; -Component_1.ComponentService.register(SequenceComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SequenceComponent; + errors.push(e); + if(--pending === 0) { + this.reject(errors); + } + } + } -},{"../../Component":217,"../../Edge":218,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/of":44,"rxjs/add/operator/bufferCount":48,"rxjs/add/operator/concat":51,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/finally":59,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/takeUntil":78,"rxjs/add/operator/withLatestFrom":80}],258:[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; + /** + * 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; -},{"rxjs/Subject":33}],259:[function(require,module,exports){ -/// -"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])); - }; - 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; - } - 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); - }; - 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]); - }; - 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]), - ]; - }; - 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; - }; - return SequenceDOMRenderer; -}()); -exports.SequenceDOMRenderer = SequenceDOMRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SequenceDOMRenderer; + var results = []; + var errors = []; -},{"../../Edge":218,"virtual-dom":173}],260:[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; + var l = promises.length>>>0; + var nFulfill = 0; + var nReject; + var x, i; // reused in both for() loops -},{"./TagComponent":261,"./error/GeometryTagError":267,"./geometry/PointGeometry":269,"./geometry/PolygonGeometry":270,"./geometry/RectGeometry":271,"./tag/Alignment":273,"./tag/OutlineTag":276,"./tag/SpotTag":279}],261:[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/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 Geo_1 = require("../../Geo"); -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 = _super.call(this, name, container, navigator) || this; - _this._tagDomRenderer = new Component_1.TagDOMRenderer(); - _this._tagSet = new Component_1.TagSet(); - _this._tagCreator = new Component_1.TagCreator(); - _this._viewportCoords = new Geo_1.ViewportCoords(); - _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); - }); - return _this; - } - Object.defineProperty(TagComponent.prototype, "tags$", { - /** - * Get tags observable. - * - * @description An observable emitting every time the items in the - * tag array changes. - * - * @returns {Observable} - */ - get: function () { - return this._tags$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(TagComponent.prototype, "geometryCreated$", { - /** - * Get geometry created observable. - * - * @description An observable emitting every time a geometry - * has been created. - * - * @returns {Observable} - */ - get: function () { - return this._geometryCreated$; - }, - enumerable: true, - configurable: true - }); - /** - * Set the tags to display. - * - * @param {Tag[]} tags - The tags. - */ - TagComponent.prototype.setTags = function (tags) { - this._tagSet.set$.next(tags); - }; - /** - * Configure the component to enter create mode for - * creating a geometry of a certain type. - * - * @description Supported geometry types are: rect - * - * @param {string} geometryType - String specifying the geometry type. - */ - TagComponent.prototype.startCreate = function (geometryType) { - this.configure({ createType: geometryType, creating: true }); - }; - /** - * Configure the component to leave create mode. - * - * @description A non completed geometry will be removed. - */ - 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; - }); - 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, - }; - }; - 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 canvasWidth = element.offsetWidth; - var canvasHeight = element.offsetHeight; - var basic = this._viewportCoords.canvasToBasic(canvasX, canvasY, canvasWidth, canvasHeight, transform, camera.perspective); - return basic; - }; - return TagComponent; -}(Component_1.Component)); -/** @inheritdoc */ -TagComponent.componentName = "tag"; -/** - * Event fired when creation starts and stops. - * - * @event TagComponent#creatingchanged - * @type {boolean} Indicates whether the component is creating a tag. - */ -TagComponent.creatingchanged = "creatingchanged"; -/** - * Event fired when a geometry has been created. - * - * @event TagComponent#geometrycreated - * @type {Geometry} Created geometry. - */ -TagComponent.geometrycreated = "geometrycreated"; -/** - * Event fired when the tags collection has changed. - * - * @event TagComponent#tagschanged - * @type {Array} Current array of tags. - */ -TagComponent.tagschanged = "tagschanged"; -exports.TagComponent = TagComponent; -Component_1.ComponentService.register(TagComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = TagComponent; - -},{"../../Component":217,"../../Geo":220,"../../Render":223,"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":50,"rxjs/add/operator/concat":51,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/skip":72,"rxjs/add/operator/skipUntil":73,"rxjs/add/operator/startWith":75,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/take":77,"rxjs/add/operator/takeUntil":78,"rxjs/add/operator/withLatestFrom":80}],262:[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; + // First pass: count actual array items + for(i=0; i -"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)); - } - var properties = { - style: { - "pointer-events": configuration.creating ? "all" : "none", - }, - }; - return vd.h("div.TagContainer", properties, vNodes); - }; - TagDOMRenderer.prototype.clear = function () { - return vd.h("div", {}, []); - }; - return TagDOMRenderer; -}()); -exports.TagDOMRenderer = TagDOMRenderer; + // Compute actual goals + n = Math.max(n, 0); + nReject = (nFulfill - n + 1); + nFulfill = Math.min(n, nFulfill); -},{"three":167,"virtual-dom":173}],264:[function(require,module,exports){ -/// -"use strict"; -var THREE = require("three"); -var TagGLRenderer = (function () { - function TagGLRenderer() { - this._scene = new THREE.Scene(); - this._tags = {}; - this._createTag = null; - this._needsRender = false; - } - 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); - } - this._needsRender = true; - }; - 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); - } - this._addTag(tag); - }; - TagGLRenderer.prototype.setNeedsRender = function () { - this._needsRender = true; - }; - TagGLRenderer.prototype.dispose = function () { - this._disposeTags(); - this._disposeCreateTag(); - this._needsRender = false; - }; - 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); - } - }; - TagGLRenderer.prototype._addCreateTag = function (tag, transform) { - var object = tag.getGLObject(transform); - this._createTag = object; - this._scene.add(object); - }; - 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]; - } - }; - TagGLRenderer.prototype._disposeCreateTag = function () { - if (this._createTag == null) { - return; - } - var mesh = this._createTag; - this._scene.remove(mesh); - mesh.geometry.dispose(); - mesh.material.dispose(); - this._createTag = null; - }; - return TagGLRenderer; -}()); -exports.TagGLRenderer = TagGLRenderer; + 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); + } -},{"three":167}],265:[function(require,module,exports){ -"use strict"; -var TagOperation; -(function (TagOperation) { - TagOperation[TagOperation["None"] = 0] = "None"; - TagOperation[TagOperation["Centroid"] = 1] = "Centroid"; - TagOperation[TagOperation["Vertex"] = 2] = "Vertex"; -})(TagOperation = exports.TagOperation || (exports.TagOperation = {})); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = TagOperation; + // Second pass: observe each array item, make progress toward goals + for(i=0; i} Observable emitting the geometry instance. - */ - get: function () { - return this._notifyChanged$; - }, - enumerable: true, - configurable: true - }); - return Geometry; -}()); -exports.Geometry = Geometry; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Geometry; + function fulfill(x) { + /*jshint validthis:true*/ + if(this.resolved) { // this === resolver + return; + } -},{"rxjs/Subject":33}],269:[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} 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} Array representing the basic coordinates of the point. - */ - get: function () { - return this._point; - }, - enumerable: true, - 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} 3D world coordinates representing the centroid. - */ - PointGeometry.prototype.getCentroid3d = function (transform) { - return transform.unprojectBasic(this._point, 200); - }; - /** - * Set the centroid of the point, i.e. the point coordinates. - * - * @param {Array} 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); - }; - return PointGeometry; -}(Component_1.Geometry)); -exports.PointGeometry = PointGeometry; + results.push(x); + if(--nFulfill === 0) { + errors = null; + this.resolve(results); + } + } -},{"../../../Component":217}],270:[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 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>} polygon - Array of polygon vertices. Must be closed. - * @param {Array>>} [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."); - } - 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 _this; - } - 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(PolygonGeometry.prototype, "polygon", { - /** - * Get polygon property. - * @returns {Array>} Closed 2d polygon. - */ - get: function () { - return this._polygon; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(PolygonGeometry.prototype, "holes", { - /** - * Get holes property. - * @returns {Array>>} Holes of 2d polygon. - */ - get: function () { - return this._holes; - }, - enumerable: true, - configurable: true - }); - /** - * Add a vertex to the polygon by appending it after the last vertex. - * - * @param {Array} 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."); - } - 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); - }; - /** @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); - }; - /** @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); - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getPoints3d = function (transform) { - return this.getVertices3d(transform); - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getVertex3d = function (index, transform) { - return transform.unprojectBasic(this._polygon[index], 200); - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getVertices3d = function (transform) { - return this._polygon - .map(function (point) { - return transform.unprojectBasic(point, 200); - }); - }; - /** - * 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 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; - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getCentroid3d = function (transform) { - var centroid2d = this._getCentroid2d(); - return transform.unprojectBasic(centroid2d, 200); - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getTriangles3d = function (transform) { - return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(transform)); - }; - 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]; - }; - return PolygonGeometry; -}(Component_1.VertexGeometry)); -exports.PolygonGeometry = PolygonGeometry; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = PolygonGeometry; + function reject(e) { + /*jshint validthis:true*/ + if(this.resolved) { // this === resolver + return; + } -},{"../../../Component":217}],271:[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} 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._rect = rect.slice(0, 4); - if (_this._rect[0] > _this._rect[2]) { - _this._inverted = true; - } - return _this; - } - Object.defineProperty(RectGeometry.prototype, "rect", { - /** - * Get rect property. - * @returns {Array} Array representing the top-left and bottom-right - * corners of the rectangle in basic coordinates. - */ - get: function () { - return this._rect; - }, - enumerable: true, - 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} 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>} 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); - }); - }; - /** - * 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>} 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); - }; - /** - * 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>} 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); - }); - }; - /** @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); - }; - /** @inheritdoc */ - RectGeometry.prototype.getTriangles3d = function (transform) { - return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(transform)); - }; - /** - * Check if a particular bottom-right value is valid according to the current - * rectangle coordinates. - * - * @param {Array} 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 true; - }; - /** - * 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>} 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); - } - } - return points2d; - }; - /** - * 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} rect - Top-left, bottom-right representation of a - * rectangle. - * @returns {Array>} 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]], - ]; - }; - return RectGeometry; -}(Component_1.VertexGeometry)); -exports.RectGeometry = RectGeometry; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = RectGeometry; + errors.push(e); + if(--nReject === 0) { + results = null; + this.reject(errors); + } + } + } -},{"../../../Component":217}],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 earcut = require("earcut"); -var Component_1 = require("../../../Component"); -/** - * @class VertexGeometry - * @abstract - * @classdesc Represents a vertex geometry. - */ -var VertexGeometry = (function (_super) { - __extends(VertexGeometry, _super); - /** - * Create a vertex geometry. - * - * @constructor - */ - function VertexGeometry() { - return _super.call(this) || this; - } - /** - * Triangulates a 2d polygon and returns the triangle - * representation as a flattened array of 3d points. - * - * @param {Array>} points2d - 2d points of outline to triangulate. - * @param {Array>} points3d - 3d points of outline corresponding to the 2d points. - * @param {Array>>} [holes2d] - 2d points of holes to triangulate. - * @param {Array>>} [holes3d] - 3d points of holes corresponding to the 2d points. - * @returns {Array} 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)); - } - 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.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 triangles; - }; - return VertexGeometry; -}(Component_1.Geometry)); -exports.VertexGeometry = VertexGeometry; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = VertexGeometry; + /** + * 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); + } -},{"../../../Component":217,"earcut":6}],273:[function(require,module,exports){ -"use strict"; -var Alignment; -(function (Alignment) { - Alignment[Alignment["Center"] = 0] = "Center"; - Alignment[Alignment["Outer"] = 1] = "Outer"; -})(Alignment = exports.Alignment || (exports.Alignment = {})); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Alignment; + /** + * 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); + }); + } -},{}],274:[function(require,module,exports){ -/// -"use strict"; -var THREE = require("three"); -var vd = require("virtual-dom"); -var Subject_1 = require("rxjs/Subject"); -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", { - get: function () { - return this._geometry; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(OutlineCreateTag.prototype, "created$", { - get: function () { - return this._created$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(OutlineCreateTag.prototype, "aborted$", { - get: function () { - return this._aborted$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", { - get: function () { - var _this = this; - return this._geometry.changed$ - .map(function (geometry) { - return _this; - }); - }, - enumerable: true, - 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); - }; - OutlineCreateTag.prototype.getDOMObjects = function (transform, matrixWorldInverse, projectionMatrix) { - var _this = this; - var vNodes = []; - 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 pointProperties = { - style: { - background: "#" + ("000000" + this._options.color.toString(16)).substr(-6), - left: centerCss[0], - position: "absolute", - top: centerCss[1], - }, - }; - var completerProperties = { - onclick: abort, - style: { left: centerCss[0], position: "absolute", top: centerCss[1] }, - }; - vNodes.push(vd.h("div.TagInteractor", completerProperties, [])); - vNodes.push(vd.h("div.TagVertex", pointProperties, [])); - } - } - 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 firstOnclick = polygonGeometry_1.polygon.length > 4 ? - function (e) { - e.stopPropagation(); - polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 2); - _this._created$.next(_this); - } : - abort; - var completerProperties = { - onclick: firstOnclick, - style: { left: centerCss[0], position: "absolute", top: centerCss[1] }, - }; - var firstClass = polygonGeometry_1.polygon.length > 4 ? - "TagCompleter" : - "TagInteractor"; - 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 remove = function (e) { - e.stopPropagation(); - polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 3); - }; - var completerProperties = { - onclick: remove, - style: { left: centerCss[0], position: "absolute", top: centerCss[1] }, - }; - 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 pointProperties = { - style: { - background: "#" + ("000000" + this._options.color.toString(16)).substr(-6), - left: centerCss[0], - position: "absolute", - top: centerCss[1], - }, - }; - vNodes.push(vd.h("div.TagVertex", pointProperties, [])); - } - } - } - return vNodes; - }; - OutlineCreateTag.prototype.addPoint = function (point) { - if (this._geometry instanceof Component_1.RectGeometry) { - var rectGeometry = this._geometry; - if (!rectGeometry.validate(point)) { - return; - } - this._created$.next(this); - } - else if (this._geometry instanceof Component_1.PolygonGeometry) { - var polygonGeometry = this._geometry; - 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._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._convertToCameraSpace = function (point, matrixWorldInverse) { - return new THREE.Vector3(point[0], point[1], point[2]).applyMatrix4(matrixWorldInverse); - }; - return OutlineCreateTag; -}()); -exports.OutlineCreateTag = OutlineCreateTag; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = OutlineCreateTag; + 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 -"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 Component_1 = require("../../../Component"); -var Viewer_1 = require("../../../Viewer"); -/** - * @class OutlineRenderTag - * @classdesc Tag visualizing the properties of an OutlineTag. - */ -var OutlineRenderTag = (function (_super) { - __extends(OutlineRenderTag, _super); - function OutlineRenderTag(tag, transform) { - var _this = _super.call(this, tag, transform) || this; - _this._fill = _this._tag.fillOpacity > 0 && !transform.gpano ? - _this._createFill() : - null; - _this._holes = _this._tag.lineWidth >= 1 ? - _this._createHoles() : - []; - _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 () { - this._disposeFill(); - this._disposeHoles(); - this._disposeOutline(); - }; - OutlineRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) { - 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 labelCanvas = this._projectToCanvas(textCameraSpace, projectionMatrix); - var labelCss = labelCanvas.map(function (coord) { return (100 * coord) + "%"; }); - var properties = { - 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, - }; - vNodes.push(vd.h("span.TagSymbol", properties, [])); - } - } - } - if (!this._tag.editable) { - return vNodes; - } - var lineColor = "#" + ("000000" + this._tag.lineColor.toString(16)).substr(-6); - 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 properties = { - onmousedown: interact, - style: { background: lineColor, left: centerCss[0], position: "absolute", top: centerCss[1] }, - }; - 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 && - ((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) { - 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 properties = { - onmousedown: interact, - style: { - background: lineColor, - left: vertexCss[0], - position: "absolute", - top: vertexCss[1], - }, - }; - 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], - }, - }; - 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 () { - var glObjects = []; - if (this._fill != null) { - glObjects.push(this._fill); - } - for (var _i = 0, _a = this._holes; _i < _a.length; _i++) { - var hole = _a[_i]; - glObjects.push(hole); - } - if (this._outline != null) { - glObjects.push(this._outline); - } - return glObjects; - }; - 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); - for (var _i = 0, holes3d_1 = holes3d; _i < holes3d_1.length; _i++) { - var holePoints3d = holes3d_1[_i]; - var hole = this._createLine(holePoints3d); - holes.push(hole); - } - } - return holes; - }; - OutlineRenderTag.prototype._createLine = function (points3d) { - var positions = this._getLinePositions(points3d); - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute("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); - }; - OutlineRenderTag.prototype._createOutline = function () { - var points3d = this._tag.geometry.getPoints3d(this._transform); - return this._createLine(points3d); - }; - OutlineRenderTag.prototype._disposeFill = function () { - if (this._fill == null) { - return; - } - this._fill.geometry.dispose(); - 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 () { - if (this._outline == null) { - return; - } - this._outline.geometry.dispose(); - this._outline.material.dispose(); - this._outline = null; - }; - OutlineRenderTag.prototype._getLinePositions = function (points3d) { - var length = points3d.length; - var positions = new Float32Array(length * 3); - for (var i = 0; i < length; ++i) { - var index = 3 * i; - var position = points3d[i]; - positions[index + 0] = position[0]; - positions[index + 1] = position[1]; - positions[index + 2] = position[2]; - } - 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) { - 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, - }); - }; - }; - OutlineRenderTag.prototype._updateFillGeometry = function () { - var triangles = this._tag.geometry.getTriangles3d(this._transform); - var positions = new Float32Array(triangles); - var geometry = this._fill.geometry; - var attribute = geometry.getAttribute("position"); - if (attribute.array.length === positions.length) { - attribute.set(positions); - attribute.needsUpdate = true; - } - else { - geometry.removeAttribute("position"); - geometry.addAttribute("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) { - var positions = this._getLinePositions(points3d); - var geometry = line.geometry; - var attribute = geometry.getAttribute("position"); - attribute.set(positions); - 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; - }; - return OutlineRenderTag; -}(Component_1.RenderTag)); -exports.OutlineRenderTag = OutlineRenderTag; + } -},{"../../../Component":217,"../../../Viewer":227,"three":167,"virtual-dom":173}],276:[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 Component_1 = require("../../../Component"); -/** - * @class OutlineTag - * @classdesc Tag holding properties for visualizing a geometry outline. - */ -var OutlineTag = (function (_super) { - __extends(OutlineTag, _super); - /** - * Create an outline tag. - * - * @override - * @constructor - * @param {string} id - * @param {Geometry} geometry - * @param {IOutlineTagOptions} options - Options defining the visual appearance and - * behavior of the outline tag. - */ - function OutlineTag(id, geometry, options) { - var _this = _super.call(this, id, geometry) || this; - _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$ - .subscribe(function (t) { - _this.fire(OutlineTag.click, _this); - }); - return _this; - } - Object.defineProperty(OutlineTag.prototype, "click$", { - /** - * Click observable. - * - * @description An observable emitting the tag when the icon of the - * tag has been clicked. - * - * @returns {Observable} - */ - get: function () { - return this._click$; - }, - enumerable: true, - 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) { - this._editable = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - 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: true, - 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: true, - configurable: true - }); - Object.defineProperty(OutlineTag.prototype, "geometry", { - get: function () { - return this._geometry; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(OutlineTag.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(OutlineTag.prototype, "iconAlignment", { - /** - * Get icon alignment property. - * @returns {Alignment} - */ - get: function () { - return this._iconAlignment; - }, - /** - * Set icon alignment property. - * @param {Alignment} - * - * @fires Tag#changed - */ - set: function (value) { - this._iconAlignment = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(OutlineTag.prototype, "iconIndex", { - /** - * Get icon index property. - * @returns {number} - */ - get: function () { - return this._iconIndex; - }, - /** - * Set icon index property. - * @param {number} - * - * @fires Tag#changed - */ - set: function (value) { - this._iconIndex = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(OutlineTag.prototype, "indicateVertices", { - /** - * Get indicate vertices property. - * @returns {boolean} Value indicating if vertices should be indicated - * when tag is editable. - */ - get: function () { - return this._indicateVertices; - }, - /** - * Set indicate vertices property. - * @param {boolean} - * - * @fires Tag#changed - */ - set: function (value) { - this._indicateVertices = value; + /** + * 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":258,"../state":271}],260:[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(); })); + +},{}],261:[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(); })); + +},{}],262:[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":271}],263:[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(); })); + +},{}],264:[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(); })); + +},{}],265:[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":257,"../env":268}],266:[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":268,"../format":269}],267:[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(); })); + + +},{}],268:[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":6}],269:[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(); })); + +},{}],270:[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> + * @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 0 ? toFulfilledState(handler.value) + : toRejectedState(handler.value); + } + +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + +},{}],272:[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 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":275,"../Utils":285,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],290:[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 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":275,"virtual-dom":231}],291:[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 operators_1 = require("rxjs/operators"); +var vd = require("virtual-dom"); +var Component_1 = require("../Component"); +var Geo_1 = require("../Geo"); +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._svgNamespace = "http://www.w3.org/2000/svg"; + _this._distinctThreshold = Math.PI / 360; + 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; + })); + this._renderSubscription = cameraBearingFov$.pipe(operators_1.map(function (_a) { + var bearing = _a[0], fov = _a[1]; + var background = vd.h("div.BearingIndicatorBackground", {}, []); + var backgroundCircle = vd.h("div.BearingIndicatorBackgroundCircle", {}, []); + var north = _this._createNorth(bearing); + var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, fov), "#FFF")); + return { + name: _this._name, + vnode: vd.h("div.BearingIndicatorContainer", { oncontextmenu: function (event) { event.preventDefault(); } }, [ + background, + backgroundCircle, + north, + cameraSector, + ]), + }; + })) + .subscribe(this._container.domRenderer.render$); + }; + BearingComponent.prototype._deactivate = function () { + this._renderSubscription.unsubscribe(); + }; + BearingComponent.prototype._getDefaultConfiguration = function () { + return {}; + }; + 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: "30px", + left: "4px", + position: "absolute", + top: "4px", + width: "30px", + }, + }, [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(" + -bearing * 180 / Math.PI + "deg)" } }, [north]); + return container; + }; + BearingComponent.componentName = "bearing"; + return BearingComponent; +}(Component_1.Component)); +exports.BearingComponent = BearingComponent; +Component_1.ComponentService.register(BearingComponent); +exports.default = BearingComponent; + +},{"../Component":275,"../Geo":278,"rxjs/operators":225,"virtual-dom":231}],292:[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 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":275,"../Edge":276,"rxjs":27,"rxjs/operators":225}],293:[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 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: true, + configurable: true + }); + Object.defineProperty(Component.prototype, "activated$", { + /** @ignore */ + 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$", { + /** @ignore */ + get: function () { + return this._configuration$; + }, + enumerable: true, + 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: true, + 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":285,"rxjs":27,"rxjs/operators":225}],294:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + 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":277}],295:[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 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", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, [vd.h("div.CoverButtonIcon", [])]); + var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []); + return vd.h(cover, [this._getCoverBackgroundVNode(configuration), 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":275,"../Utils":285,"../Viewer":286,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],296:[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 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":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],297:[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 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":275,"../Utils":285,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],298:[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 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":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],299:[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 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":275,"../Edge":276,"../Error":277,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],300:[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 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._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.play = function () { + this.configure({ playing: true }); + }; + RouteComponent.prototype.stop = function () { + this.configure({ playing: false }); + }; + 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); +exports.default = RouteComponent; + +},{"../Component":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],301:[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 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":275,"rxjs":27,"rxjs/operators":225}],302:[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 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} + */ + get: function () { + return this._hoveredKey$; + }, + enumerable: true, + 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":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],303:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: 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", { + get: function () { + return this._turnCircleSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", { + get: function () { + return this._turnCircleSizeCss; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", { + get: function () { + return this._outerRadius; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", { + get: function () { + return this._innerRadius; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", { + get: function () { + return this._shadowOffset; + }, + enumerable: true, + 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} 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} 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":278}],304:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + 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":275,"../../Edge":276,"../../Error":277,"../../Geo":278,"virtual-dom":231}],305:[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 rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); +var Component_1 = require("../../Component"); +var Render_1 = require("../../Render"); +var Tiles_1 = require("../../Tiles"); +var Utils_1 = require("../../Utils"); +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]; + 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._rendererOperation$); + }; + 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(); + }; + 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":275,"../../Render":281,"../../Tiles":284,"../../Utils":285,"rxjs":27,"rxjs/operators":225}],306:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + configurable: true + }); + ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () { + 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._updateTexture = function (texture) { + this._needsRender = true; + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + var material = plane.material; + var oldTexture = material.uniforms.projectorTex.value; + material.uniforms.projectorTex.value = null; + oldTexture.dispose(); + material.uniforms.projectorTex.value = texture; + } + }; + ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) { + if (this._currentKey !== node.key) { + return; + } + this._needsRender = true; + for (var _i = 0, _a = this._scene.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._scene.imagePlanesOld.length ? 1 : this._alpha; + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + plane.material.uniforms.opacity.value = planeAlpha; + } + for (var _b = 0, _c = this._scene.imagePlanesOld; _b < _c.length; _b++) { + var plane = _c[_b]; + plane.material.uniforms.opacity.value = this._alphaOld; + } + renderer.render(this._scene.scene, perspectiveCamera); + renderer.render(this._scene.sceneOld, perspectiveCamera); + for (var _d = 0, _e = this._scene.imagePlanes; _d < _e.length; _d++) { + var plane = _e[_d]; + 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); + this._scene.updateImagePlanes([previousMesh]); + } + this._previousKey = previousKey; + } + this._currentKey = currentKey; + var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform); + this._scene.updateImagePlanes([currentMesh]); + this._alphaOld = 1; + return true; + }; + return ImagePlaneGLRenderer; +}()); +exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer; +exports.default = ImagePlaneGLRenderer; + +},{"../../Component":275}],307:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CoverState; +(function (CoverState) { + CoverState[CoverState["Hidden"] = 0] = "Hidden"; + CoverState[CoverState["Loading"] = 1] = "Loading"; + CoverState[CoverState["Visible"] = 2] = "Visible"; +})(CoverState = exports.CoverState || (exports.CoverState = {})); + +},{}],308:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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 = {})); + +},{}],309:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ICoverConfiguration_1 = require("./ICoverConfiguration"); +exports.CoverState = ICoverConfiguration_1.CoverState; +var ISliderConfiguration_1 = require("./ISliderConfiguration"); +exports.SliderMode = ISliderConfiguration_1.SliderMode; + +},{"./ICoverConfiguration":307,"./ISliderConfiguration":308}],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 }); +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":275,"../../Edge":276,"rxjs/operators":225}],311:[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 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":275,"../../Edge":276,"../../Error":277,"rxjs/operators":225}],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 }); +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":275,"../../Edge":276,"../../Error":277,"rxjs/operators":225}],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 }); +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":275,"rxjs/operators":225}],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 }); +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( + * "", + * "", + * ""); + * + * 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: true, + configurable: true + }); + Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", { + /** + * Get key sequence navigation. + * + * @returns {KeySequenceNavigationHandler} The key sequence navigation handler. + */ + get: function () { + return this._keySequenceNavigationHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", { + /** + * Get spatial. + * + * @returns {KeySpatialNavigationHandler} The spatial handler. + */ + get: function () { + return this._keySpatialNavigationHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(KeyboardComponent.prototype, "keyZoom", { + /** + * Get key zoom. + * + * @returns {KeyZoomHandler} The key zoom handler. + */ + get: function () { + return this._keyZoomHandler; + }, + enumerable: true, + 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":275,"../../Geo":278}],315:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var MarkerComponent_1 = require("./MarkerComponent"); +exports.MarkerComponent = MarkerComponent_1.MarkerComponent; +var SimpleMarker_1 = require("./marker/SimpleMarker"); +exports.SimpleMarker = SimpleMarker_1.SimpleMarker; +var CircleMarker_1 = require("./marker/CircleMarker"); +exports.CircleMarker = CircleMarker_1.CircleMarker; + +},{"./MarkerComponent":316,"./marker/CircleMarker":319,"./marker/SimpleMarker":321}],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 }); +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( + * "", + * "", + * "", + * { 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} 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} 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} 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":275,"../../Geo":278,"../../Graph":279,"../../Render":281,"rxjs":27,"rxjs/operators":225,"three":226,"when":272}],317:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(MarkerScene.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + 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":226}],318:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var rbush = require("rbush"); +var rxjs_1 = require("rxjs"); +var MarkerSet = /** @class */ (function () { + function MarkerSet() { + this._hash = {}; + this._index = rbush(16, [".lon", ".lat", ".lon", ".lat"]); + this._indexChanged$ = new rxjs_1.Subject(); + this._updated$ = new rxjs_1.Subject(); + } + Object.defineProperty(MarkerSet.prototype, "changed$", { + get: function () { + return this._indexChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkerSet.prototype, "updated$", { + get: function () { + return this._updated$; + }, + enumerable: true, + 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.lon, maxY: ne.lat, minX: sw.lon, minY: sw.lat }) + .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; + +},{"rbush":26,"rxjs":27}],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 }); +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":275,"three":226}],320:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * @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: true, + configurable: true + }); + Object.defineProperty(Marker.prototype, "geometry", { + /** + * Get geometry. + * + * @ignore + */ + get: function () { + return this._geometry; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Marker.prototype, "latLon", { + /** + * Get lat lon. + * @returns {ILatLon} The geographic coordinates of the marker. + */ + get: function () { + return this._latLon; + }, + enumerable: true, + 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; + +},{}],321:[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 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":275,"three":226}],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 }); +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; + })); + 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())); + })) + .subscribe(function (_a) { + var render = _a[0], transform = _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); + 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":275,"rxjs":27,"rxjs/operators":225}],323:[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 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":275,"rxjs":27,"rxjs/operators":225}],324:[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 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$), operators_1.map(function (_a) { + var events = _a[0], render = _a[1], transform = _a[2]; + 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); + 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":275,"rxjs":27,"rxjs/operators":225}],325:[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 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":275,"../../State":282,"rxjs":27,"rxjs/operators":225,"three":226}],326:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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":278}],327:[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 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( + * "", + * "", + * ""); + * + * 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: true, + configurable: true + }); + Object.defineProperty(MouseComponent.prototype, "dragPan", { + /** + * Get drag pan. + * + * @returns {DragPanHandler} The drag pan handler. + */ + get: function () { + return this._dragPanHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseComponent.prototype, "scrollZoom", { + /** + * Get scroll zoom. + * + * @returns {ScrollZoomHandler} The scroll zoom handler. + */ + get: function () { + return this._scrollZoomHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseComponent.prototype, "touchZoom", { + /** + * Get touch zoom. + * + * @returns {TouchZoomHandler} The touch zoom handler. + */ + get: function () { + return this._touchZoomHandler; + }, + enumerable: true, + 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":275,"../../Geo":278}],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 }); +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":275,"rxjs/operators":225}],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 }); +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":275,"rxjs":27,"rxjs/operators":225}],330:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Popup_1 = require("./popup/Popup"); +exports.Popup = Popup_1.Popup; +var PopupComponent_1 = require("./PopupComponent"); +exports.PopupComponent = PopupComponent_1.PopupComponent; + +},{"./PopupComponent":331,"./popup/Popup":332}],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 }); +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( + * "", + * "", + * "", + * { 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} 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} 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":275,"../../Utils":285,"rxjs":27,"rxjs/operators":225}],332:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + 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} 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} 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('
hello image
'); + * 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":278,"../../../Utils":285,"../../../Viewer":286,"rxjs":27}],333:[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 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} + */ + get: function () { + return this._hoveredKey$; + }, + enumerable: true, + 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":275,"../../Edge":276,"../../Graph":279,"rxjs":27,"rxjs/operators":225}],334:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "changingPositionChanged$", { + get: function () { + return this._notifyChangingPositionChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", { + get: function () { + return this._notifySpeedChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "index$", { + get: function () { + return this._notifyIndexChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "mouseEnterDirection$", { + get: function () { + return this._mouseEnterDirection$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "mouseLeaveDirection$", { + get: function () { + return this._mouseLeaveDirection$; + }, + enumerable: true, + 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; + 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; + } + if (edge.data.direction === Edge_1.EdgeDirection.Prev) { + prevKey = edge.to; + } + } + 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); + }; + 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]); + }; + 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; + }; + SequenceDOMRenderer.prototype._setChangingPosition = function (value) { + this._changingPosition = value; + this._notifyChangingPositionChanged$.next(value); + }; + return SequenceDOMRenderer; +}()); +exports.SequenceDOMRenderer = SequenceDOMRenderer; +exports.default = SequenceDOMRenderer; + +},{"../../Component":275,"../../Edge":276,"../../Error":277,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],335:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{}],336:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); + +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.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; + + +},{"path":23}],337:[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 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 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 marker component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * ""); + * + * viewer.deactivateComponent("imagePlane"); + * viewer.deactivateComponent("direction"); + * viewer.deactivateComponent("sequence"); + * + * viewer.activateComponent("slider"); + * + * var sliderComponent = viewer.getComponent("marker"); + * ``` + */ +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; + } + /** + * Set the initial position. + * + * @description 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 }); + }; + /** + * Set the image keys. + * + * @description Configures the component to show the image + * planes for the supplied image keys. + * + * @param {ISliderKeys} keys - 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 slider mode. + * + * @description Configures the mode for transitions between + * image pairs. + * + * @param {SliderMode} mode - Slider mode to be set. + */ + SliderComponent.prototype.setSliderMode = function (mode) { + this.configure({ mode: mode }); + }; + /** + * 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 }); + }; + SliderComponent.prototype._activate = function () { + var _this = this; + this._modeSubcription = this._domRenderer.mode$ + .subscribe(function (mode) { + _this.setSliderMode(mode); + }); + 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._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._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, + }; + } + } + 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$); + }; + 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 }); + }; + SliderComponent.prototype._getDefaultConfiguration = function () { + return { + initialPosition: 1, + mode: Component_1.SliderMode.Motion, + sliderVisible: true, + }; + }; + 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":275,"../../Geo":278,"../../Render":281,"../../State":282,"../../Tiles":284,"../../Utils":285,"rxjs":27,"rxjs/operators":225}],338:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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._notifyModeChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SliderDOMRenderer.prototype, "position$", { + get: function () { + return this._notifyPositionChanged$; + }, + enumerable: true, + configurable: true + }); + 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._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 () { + _this._notifyModeChanged$.next(mode === Component_1.SliderMode.Motion ? + Component_1.SliderMode.Stationary : + Component_1.SliderMode.Motion); + }, + }; + var className = mode === Component_1.SliderMode.Stationary ? + "SliderModeButtonPressed" : + "SliderModeButton"; + return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]); + }; + 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)) - 68 + (modeVisible ? 0 : 36); + 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":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],339:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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._disabled; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SliderGLRenderer.prototype, "frameId", { + get: function () { + return this._frameId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SliderGLRenderer.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + configurable: true + }); + 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 imagePlanes = node.key === this._currentKey ? + this._scene.imagePlanes : + node.key === this._previousKey ? + this._scene.imagePlanesOld : + []; + if (imagePlanes.length === 0) { + return; + } + this._needsRender = 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; + } + }; + SliderGLRenderer.prototype.updateTextureImage = function (image, node) { + if (this._currentKey !== node.key) { + return; + } + this._needsRender = true; + for (var _i = 0, _a = this._scene.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; + } + }; + 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 () { + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + 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); + } + } + this._scene.setImagePlanesOld([mesh]); + } + } + if (currentChanged || modeChanged) { + if (this._currentKey in this._currentProviderDisposers) { + this._currentProviderDisposers[this._currentKey](); + delete this._currentProviderDisposers[this._currentKey]; + } + this._currentKey = state.currentNode.key; + var imagePlanes = []; + if (state.currentNode.fullPano) { + imagePlanes.push(this._factory.createCurtainMesh(state.currentNode, state.currentTransform)); + } + else if (state.currentNode.pano && !state.currentNode.fullPano) { + imagePlanes.push(this._factory.createMesh(state.currentNode, state.currentTransform)); + } + else { + if (motionless) { + imagePlanes.push(this._factory.createDistortedCurtainMesh(state.currentNode, state.currentTransform)); + } + else { + imagePlanes.push(this._factory.createCurtainMesh(state.currentNode, state.currentTransform)); + } + } + this._scene.setImagePlanes(imagePlanes); + this._updateCurtain(); + } + }; + SliderGLRenderer.prototype._updateTexture = function (texture) { + this._needsRender = true; + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + 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; + for (var _i = 0, _a = this._scene.imagePlanesOld; _i < _a.length; _i++) { + var plane = _a[_i]; + 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":275,"../../Geo":278}],340:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var geohash = require("latlon-geohash"); +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._reconstructions = {}; + this._cachingReconstructions$ = {}; + this._cachingTiles$ = {}; + } + SpatialDataCache.prototype.cacheReconstructions$ = function (hash) { + var _this = this; + if (!this.hasTile(hash)) { + throw new Error("Cannot cache reconstructions of a non-existing tile."); + } + if (this.hasReconstructions(hash)) { + throw new Error("Cannot cache reconstructions that already exists."); + } + if (this.isCachingReconstructions(hash)) { + return this._cachingReconstructions$[hash]; + } + var tile = []; + if (hash in this._reconstructions) { + var reconstructionKeys = this.getReconstructions(hash) + .map(function (reconstruction) { + return reconstruction.data.key; + }); + for (var _i = 0, _a = this.getTile(hash); _i < _a.length; _i++) { + var node = _a[_i]; + if (reconstructionKeys.indexOf(node.key) === -1) { + tile.push(node); + } + } + } + else { + tile.push.apply(tile, this.getTile(hash)); + this._reconstructions[hash] = []; + } + this._cacheRequests[hash] = []; + this._cachingReconstructions$[hash] = rxjs_1.from(tile).pipe(operators_1.mergeMap(function (nodeData) { + return !_this._cacheRequests[hash] ? + rxjs_1.empty() : + rxjs_1.zip(rxjs_1.of(nodeData), _this._getAtomicReconstruction(nodeData.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.of([nodeData, null]); + })); + }, 6), operators_1.map(function (_a) { + var nodeData = _a[0], reconstruction = _a[1]; + return { data: nodeData, reconstruction: reconstruction }; + }), operators_1.filter(function () { + return hash in _this._reconstructions; + }), operators_1.tap(function (data) { + _this._reconstructions[hash].push(data); + }), operators_1.filter(function (data) { + return !!data.reconstruction; + }), operators_1.finalize(function () { + if (hash in _this._cachingReconstructions$) { + delete _this._cachingReconstructions$[hash]; + } + if (hash in _this._cacheRequests) { + delete _this._cacheRequests[hash]; + } + }), operators_1.publish(), operators_1.refCount()); + return this._cachingReconstructions$[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.hasTile(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._tiles[hash] = []; + this._cachingTiles$[hash] = this._graphService.cacheBoundingBox$(sw, ne).pipe(operators_1.catchError(function (error) { + console.error(error); + delete _this._tiles[hash]; + 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; + (_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.isCachingReconstructions = function (hash) { + return hash in this._cachingReconstructions$; + }; + SpatialDataCache.prototype.isCachingTile = function (hash) { + return hash in this._cachingTiles$; + }; + SpatialDataCache.prototype.hasReconstructions = function (hash) { + return !(hash in this._cachingReconstructions$) && + hash in this._reconstructions && + this._reconstructions[hash].length === this._tiles[hash].length; + }; + SpatialDataCache.prototype.hasTile = function (hash) { + return !(hash in this._cachingTiles$) && hash in this._tiles; + }; + SpatialDataCache.prototype.getReconstructions = function (hash) { + return hash in this._reconstructions ? + this._reconstructions[hash] + .filter(function (data) { + return !!data.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._reconstructions); _d < _e.length; _d++) { + var hash = _e[_d]; + if (!!keepHashes && keepHashes.indexOf(hash) !== -1) { + continue; + } + delete this._reconstructions[hash]; + } + for (var _f = 0, _g = Object.keys(this._tiles); _f < _g.length; _f++) { + var hash = _g[_f]; + if (!!keepHashes && keepHashes.indexOf(hash) !== -1) { + continue; + } + delete this._tiles[hash]; + } + }; + SpatialDataCache.prototype._createNodeData = function (node) { + return { + alt: node.alt, + 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, + width: node.width, + }; + }; + SpatialDataCache.prototype._getAtomicReconstruction = function (key, requests) { + return rxjs_1.Observable.create(function (subscriber) { + var xmlHTTP = new XMLHttpRequest(); + xmlHTTP.open("GET", Utils_1.Urls.atomicReconstruction(key), true); + xmlHTTP.responseType = "json"; + xmlHTTP.timeout = 15000; + xmlHTTP.onload = function () { + if (!xmlHTTP.response) { + subscriber.error(new Error("Atomic reconstruction does not exist (" + key + ")")); + } + else { + subscriber.next(xmlHTTP.response); + subscriber.complete(); + } + }; + xmlHTTP.onerror = function () { + subscriber.error(new Error("Failed to get atomic reconstruction (" + key + ")")); + }; + xmlHTTP.ontimeout = function () { + subscriber.error(new Error("Atomic reconstruction request timed out (" + key + ")")); + }; + xmlHTTP.onabort = function () { + subscriber.error(new Error_1.AbortMapillaryError("Atomic reconstruction request was aborted (" + key + ")")); + }; + requests.push(xmlHTTP); + xmlHTTP.send(null); + }); + }; + return SpatialDataCache; +}()); +exports.SpatialDataCache = SpatialDataCache; +exports.default = SpatialDataCache; + +},{"../../Error":277,"../../Utils":285,"latlon-geohash":21,"rxjs":27,"rxjs/operators":225}],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 }); +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 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()); + this._addSubscription = 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.switchMap(function (hashes) { + return rxjs_1.from(hashes).pipe(operators_1.mergeMap(function (h) { + var tile$; + if (_this._cache.hasTile(h)) { + tile$ = rxjs_1.of(_this._cache.getTile(h)); + } + else if (_this._cache.isCachingTile(h)) { + tile$ = _this._cache.cacheTile$(h).pipe(operators_1.last(null, {}), operators_1.switchMap(function () { + return rxjs_1.of(_this._cache.getTile(h)); + })); + } + else { + tile$ = _this._cache.cacheTile$(h); + } + return rxjs_1.combineLatest(rxjs_1.of(h), tile$); + }, 1), operators_1.map(function (_a) { + var hash = _a[0]; + return hash; + })); + }), operators_1.concatMap(function (hash) { + var reconstructions$; + if (_this._cache.hasReconstructions(hash)) { + reconstructions$ = rxjs_1.from(_this._cache.getReconstructions(hash)); + } + else if (_this._cache.isCachingReconstructions(hash)) { + reconstructions$ = _this._cache.cacheReconstructions$(hash).pipe(operators_1.last(null, {}), operators_1.switchMap(function () { + return rxjs_1.from(_this._cache.getReconstructions(hash)); + })); + } + else if (_this._cache.hasTile(hash)) { + reconstructions$ = _this._cache.cacheReconstructions$(hash); + } + else { + reconstructions$ = rxjs_1.empty(); + } + return rxjs_1.combineLatest(rxjs_1.of(hash), reconstructions$); + }), operators_1.withLatestFrom(this._navigator.stateService.reference$), operators_1.tap(function (_a) { + var hash = _a[0][0], reference = _a[1]; + if (_this._scene.hasTile(hash)) { + return; + } + _this._scene.addTile(_this._computeTileBBox(hash, reference), hash); + }), operators_1.filter(function (_a) { + var _b = _a[0], hash = _b[0], data = _b[1]; + return !_this._scene.hasReconstruction(data.reconstruction.main_shot, hash); + }), operators_1.map(function (_a) { + var _b = _a[0], hash = _b[0], data = _b[1], reference = _a[1]; + return [ + data, + _this._createTransform(data.data, reference), + _this._computeOriginalPosition(data.data, reference), + hash + ]; + })) + .subscribe(function (_a) { + var data = _a[0], transform = _a[1], position = _a[2], hash = _a[3]; + _this._scene.addReconstruction(data.reconstruction, transform, position, !!data.data.mergeCC ? data.data.mergeCC.toString() : "", 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._visualizeConnectedComponentSubscription = this._configuration$.pipe(operators_1.map(function (configuration) { + return configuration.connectedComponents; + }), operators_1.distinctUntilChanged()) + .subscribe(function (visualize) { + _this._scene.setConnectedComponentVisualization(visualize); + }); + 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$); + }; + SpatialDataComponent.prototype._deactivate = function () { + var _this = this; + this._cache.uncache(); + this._scene.uncache(); + this._addSubscription.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._visualizeConnectedComponentSubscription.unsubscribe(); + this._navigator.stateService.state$.pipe(operators_1.first()) + .subscribe(function (state) { + if (state === State_1.default.Earth) { + _this._navigator.stateService.traverse(); + } + }); + }; + SpatialDataComponent.prototype._getDefaultConfiguration = function () { + return { camerasVisible: false, pointsVisible: true, positionsVisible: false, tilesVisible: false }; + }; + SpatialDataComponent.prototype._adjacentComponent = function (hash, depth) { + var hashSet = new Set(); + hashSet.add(hash); + this._adjacentComponentRecursive(hashSet, [hash], 0, depth); + return this._setToArray(hashSet); + }; + 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); + }; + SpatialDataComponent.prototype._computeOriginalPosition = function (data, reference) { + return this._geoCoords.geodeticToEnu(data.originalLat, data.originalLon, data.alt, reference.lat, reference.lon, reference.alt); + }; + 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]; + }; + 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); + return transform; + }; + 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); + }; + 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); + } + }; + 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; + +},{"../../Component":275,"../../Geo":278,"../../Render":281,"../../state/State":412,"../../viewer/PlayService":441,"latlon-geohash":21,"rxjs":27,"rxjs/operators":225}],342:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +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._connectedComponentColors = {}; + this._needsRender = false; + this._interactiveObjects = []; + this._reconstructions = {}; + this._tiles = {}; + this._camerasVisible = configuration.camerasVisible; + this._pointsVisible = configuration.pointsVisible; + this._positionsVisible = configuration.positionsVisible; + this._tilesVisible = configuration.tilesVisible; + this._visualizeConnectedComponents = configuration.connectedComponents; + } + Object.defineProperty(SpatialDataScene.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + configurable: true + }); + SpatialDataScene.prototype.addReconstruction = function (reconstruction, transform, originalPosition, connectedComponent, hash) { + if (!(hash in this._reconstructions)) { + this._reconstructions[hash] = { + cameraKeys: {}, + cameras: new THREE.Object3D(), + connectedComponents: {}, + keys: [], + points: new THREE.Object3D(), + positions: new THREE.Object3D(), + }; + this._reconstructions[hash].cameras.visible = this._camerasVisible; + this._reconstructions[hash].points.visible = this._pointsVisible; + this._reconstructions[hash].positions.visible = this._positionsVisible; + this._scene.add(this._reconstructions[hash].cameras, this._reconstructions[hash].points, this._reconstructions[hash].positions); + } + if (!(connectedComponent in this._reconstructions[hash].connectedComponents)) { + this._reconstructions[hash].connectedComponents[connectedComponent] = []; + } + if (transform.hasValidScale) { + this._reconstructions[hash].points.add(this._createPoints(reconstruction, transform)); + } + var camera = this._createCamera(transform); + this._reconstructions[hash].cameras.add(camera); + for (var _i = 0, _a = camera.children; _i < _a.length; _i++) { + var child = _a[_i]; + this._reconstructions[hash].cameraKeys[child.uuid] = reconstruction.main_shot; + this._interactiveObjects.push(child); + } + this._reconstructions[hash].connectedComponents[connectedComponent].push(camera); + var color = this._getColor(connectedComponent, this._visualizeConnectedComponents); + this._setCameraColor(color, camera); + this._reconstructions[hash].positions.add(this._createPosition(transform, originalPosition)); + this._reconstructions[hash].keys.push(reconstruction.main_shot); + 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._reconstructions); _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._tiles); _b < _c.length; _b++) { + var hash = _c[_b]; + if (!!keepHashes && keepHashes.indexOf(hash) !== -1) { + continue; + } + this._disposeTile(hash); + } + this._needsRender = true; + }; + SpatialDataScene.prototype.hasReconstruction = function (key, hash) { + return hash in this._reconstructions && this._reconstructions[hash].keys.indexOf(key) !== -1; + }; + SpatialDataScene.prototype.hasTile = function (hash) { + return hash in this._tiles; + }; + 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._reconstructions) { + if (!this._reconstructions.hasOwnProperty(hash)) { + continue; + } + if (intersect.object.uuid in this._reconstructions[hash].cameraKeys) { + return this._reconstructions[hash].cameraKeys[intersect.object.uuid]; + } + } + } + return null; + }; + SpatialDataScene.prototype.setCameraVisibility = function (visible) { + if (visible === this._camerasVisible) { + return; + } + for (var hash in this._reconstructions) { + if (!this._reconstructions.hasOwnProperty(hash)) { + continue; + } + this._reconstructions[hash].cameras.visible = visible; + } + this._camerasVisible = visible; + this._needsRender = true; + }; + SpatialDataScene.prototype.setPointVisibility = function (visible) { + if (visible === this._pointsVisible) { + return; + } + for (var hash in this._reconstructions) { + if (!this._reconstructions.hasOwnProperty(hash)) { + continue; + } + this._reconstructions[hash].points.visible = visible; + } + this._pointsVisible = visible; + this._needsRender = true; + }; + SpatialDataScene.prototype.setPositionVisibility = function (visible) { + if (visible === this._positionsVisible) { + return; + } + for (var hash in this._reconstructions) { + if (!this._reconstructions.hasOwnProperty(hash)) { + continue; + } + this._reconstructions[hash].positions.visible = visible; + } + this._positionsVisible = visible; + this._needsRender = true; + }; + SpatialDataScene.prototype.setTileVisibility = function (visible) { + if (visible === this._tilesVisible) { + return; + } + for (var hash in this._tiles) { + if (!this._tiles.hasOwnProperty(hash)) { + continue; + } + this._tiles[hash].visible = visible; + } + this._tilesVisible = visible; + this._needsRender = true; + }; + SpatialDataScene.prototype.setConnectedComponentVisualization = function (visualize) { + if (visualize === this._visualizeConnectedComponents) { + return; + } + for (var hash in this._reconstructions) { + if (!this._reconstructions.hasOwnProperty(hash)) { + continue; + } + var connectedComponents = this._reconstructions[hash].connectedComponents; + for (var connectedComponent in connectedComponents) { + if (!connectedComponents.hasOwnProperty(connectedComponent)) { + continue; + } + var color = this._getColor(connectedComponent, visualize); + for (var _i = 0, _a = connectedComponents[connectedComponent]; _i < _a.length; _i++) { + var camera = _a[_i]; + this._setCameraColor(color, camera); + } + } + } + this._visualizeConnectedComponents = visualize; + 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.addAttribute("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.addAttribute("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.addAttribute("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.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + return new THREE.Line(latitude, new THREE.LineBasicMaterial()); + }; + 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.addAttribute("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; + }; + SpatialDataScene.prototype._createPoints = function (reconstruction, transform) { + var srtInverse = new THREE.Matrix4().getInverse(transform.srt); + 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]) + .applyMatrix4(srtInverse); + 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.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.addAttribute("color", new THREE.BufferAttribute(colors, 3)); + var material = new THREE.PointsMaterial({ + size: 0.1, + vertexColors: THREE.VertexColors, + }); + return new THREE.Points(geometry, material); + }; + SpatialDataScene.prototype._createPosition = function (transform, originalPosition) { + var computedPosition = transform.unprojectBasic([0, 0], 0); + var vertices = [originalPosition, computedPosition]; + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("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; + }; + SpatialDataScene.prototype._disposeCameras = function (hash) { + var tileCameras = this._reconstructions[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); + } + } + tileCameras.remove(camera); + } + this._scene.remove(tileCameras); + }; + SpatialDataScene.prototype._disposePoints = function (hash) { + var tilePoints = this._reconstructions[hash].points; + for (var _i = 0, _a = tilePoints.children.slice(); _i < _a.length; _i++) { + var points = _a[_i]; + points.geometry.dispose(); + points.material.dispose(); + tilePoints.remove(points); + } + this._scene.remove(tilePoints); + }; + SpatialDataScene.prototype._disposePositions = function (hash) { + var tilePositions = this._reconstructions[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._disposeReconstruction = function (hash) { + this._disposeCameras(hash); + this._disposePoints(hash); + this._disposePositions(hash); + delete this._reconstructions[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 (connectedComponent, visualizeConnectedComponents) { + return visualizeConnectedComponents ? + this._getConnectedComponentColor(connectedComponent) : + "#FFFFFF"; + }; + SpatialDataScene.prototype._getConnectedComponentColor = function (connectedComponent) { + if (!(connectedComponent in this._connectedComponentColors)) { + this._connectedComponentColors[connectedComponent] = this._randomColor(); + } + return this._connectedComponentColors[connectedComponent]; + }; + SpatialDataScene.prototype._interpolate = function (a, b, alpha) { + return a + alpha * (b - a); + }; + SpatialDataScene.prototype._randomColor = function () { + return "hsl(" + Math.floor(360 * Math.random()) + ", 100%, 65%)"; + }; + 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); + } + }; + SpatialDataScene.prototype._subsample = function (p1, p2, subsamples) { + if (subsamples < 1) { + return [p1, p2]; + } + 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; + }; + return SpatialDataScene; +}()); +exports.SpatialDataScene = SpatialDataScene; +exports.default = SpatialDataScene; + +},{"three":226}],343:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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 TagDomain_1 = require("./tag/TagDomain"); +exports.TagDomain = TagDomain_1.TagDomain; +var TagComponent_1 = require("./TagComponent"); +exports.TagComponent = TagComponent_1.TagComponent; +var TagMode_1 = require("./TagMode"); +exports.TagMode = TagMode_1.TagMode; + +},{"./TagComponent":344,"./TagMode":347,"./error/GeometryTagError":351,"./geometry/PointGeometry":353,"./geometry/PolygonGeometry":354,"./geometry/RectGeometry":355,"./tag/OutlineTag":367,"./tag/SpotTag":370,"./tag/TagDomain":372}],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 }); +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( + * "", + * "", + * "", + * { 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), + "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} 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); + }); + } + else { + this._tagSet.addDeactivated(tags); + } + }; + /** + * 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); + } + }; + /** + * 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(); + } + }; + /** + * 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 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} pixelPoint - Pixel coordinates on the viewer element. + * @returns {Array} 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); + }); + }); + }; + /** + * 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); + }; + /** + * Remove tags with the specified ids from the tag set. + * + * @param {Array} 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); + } + else { + this._tagSet.removeDeactivated(tagIds); + } + }; + /** + * Remove all tags from the tag set. + * + * @example ```tagComponent.removeAll();``` + */ + TagComponent.prototype.removeAll = function () { + if (this._activated) { + this._tagSet.removeAll(); + this._tagScene.removeAll(); + } + else { + this._tagSet.removeAllDeactivated(); + } + }; + 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._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 (tags) { + _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 (t) { 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 (tag) { + _this._tagScene.update(); + }); + this._domSubscription = rxjs_1.combineLatest(this._renderTags$.pipe(operators_1.startWith([]), operators_1.tap(function (tags) { + _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], tag = _a[4], ct = _a[5]; + return { + name: _this._name, + vnode: _this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size), + }; + })) + .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: frame.id, + needsRender: tagScene.needsRender, + render: tagScene.render.bind(tagScene), + stage: Render_1.GLRenderStage.Foreground, + }, + }; + })) + .subscribe(this._container.glRenderer.render$); + this._navigator.stateService.currentTransform$.pipe(operators_1.first()) + .subscribe(function (transform) { + _this._tagSet.activate(transform); + _this._tagScene.add(_this._tagSet.getAll()); + }); + }; + 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"); + }; + TagComponent.prototype._getDefaultConfiguration = function () { + return { + createColor: 0xFFFFFF, + mode: Component_1.TagMode.Default, + }; + }; + 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.TagComponent = TagComponent; +Component_1.ComponentService.register(TagComponent); +exports.default = TagComponent; + +},{"../../Component":275,"../../Geo":278,"../../Render":281,"rxjs":27,"rxjs/operators":225,"when":272}],345:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); +var rxjs_1 = require("rxjs"); +var Component_1 = require("../../Component"); +var TagCreator = /** @class */ (function () { + function TagCreator(component, navigator) { + this._component = component; + this._navigator = navigator; + this._tagOperation$ = 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._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 (tag) { + 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 (tag) { + 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 (tag) { + return null; + }; + })) + .subscribe(this._tagOperation$); + } + Object.defineProperty(TagCreator.prototype, "createRect$", { + get: function () { + return this._createRect$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TagCreator.prototype, "createPolygon$", { + get: function () { + return this._createPolygon$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TagCreator.prototype, "delete$", { + get: function () { + return this._delete$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TagCreator.prototype, "tag$", { + get: function () { + return this._tag$; + }, + enumerable: true, + configurable: true + }); + return TagCreator; +}()); +exports.TagCreator = TagCreator; +exports.default = TagCreator; + +},{"../../Component":275,"rxjs":27,"rxjs/operators":225}],346:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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)); + } + if (createTag != null) { + vNodes = vNodes.concat(createTag.getDOMObjects(camera, size)); + } + return vd.h("div.TagContainer", {}, vNodes); + }; + TagDOMRenderer.prototype.clear = function () { + return vd.h("div", {}, []); + }; + return TagDOMRenderer; +}()); +exports.TagDOMRenderer = TagDOMRenderer; + +},{"virtual-dom":231}],347:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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 polygon geometry through clicks. + */ + TagMode[TagMode["CreatePolygon"] = 2] = "CreatePolygon"; + /** + * Create a rect geometry through clicks. + */ + TagMode[TagMode["CreateRect"] = 3] = "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"] = 4] = "CreateRectDrag"; +})(TagMode = exports.TagMode || (exports.TagMode = {})); +exports.default = TagMode; + +},{}],348:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{}],349:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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(TagScene.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + configurable: true + }); + 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; + }; + TagScene.prototype.addCreateTag = function (tag) { + for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) { + var object = _a[_i]; + this._scene.add(object); + } + this._createTag = { tag: tag, objects: tag.glObjects }; + this._needsRender = true; + }; + 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; + }; + TagScene.prototype.get = function (id) { + return this.has(id) ? this._tags[id].tag : undefined; + }; + TagScene.prototype.has = function (id) { + return id in this._tags; + }; + TagScene.prototype.hasCreateTag = function () { + return this._createTag != null; + }; + 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]); + } + } + return intersectedIds; + }; + 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._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._needsRender = true; + }; + 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; + }; + TagScene.prototype.render = function (perspectiveCamera, renderer) { + renderer.render(this._scene, perspectiveCamera); + this._needsRender = false; + }; + TagScene.prototype.update = function () { + this._needsRender = true; + }; + 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; + }; + 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; + }; + 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; + } + }; + TagScene.prototype._remove = function (id) { + var tagObjects = this._tags[id]; + this._removeObjects(tagObjects); + tagObjects.tag.dispose(); + delete this._tags[id]; + }; + 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 TagScene; +}()); +exports.TagScene = TagScene; +exports.default = TagScene; + +},{"three":226}],350:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var Component_1 = require("../../Component"); +var TagSet = /** @class */ (function () { + function TagSet() { + this._active = false; + this._hash = {}; + this._hashDeactivated = {}; + this._notifyChanged$ = new rxjs_1.Subject(); + } + Object.defineProperty(TagSet.prototype, "active", { + get: function () { + return this._active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TagSet.prototype, "changed$", { + get: function () { + return this._notifyChanged$; + }, + enumerable: true, + configurable: true + }); + TagSet.prototype.activate = function (transform) { + if (this._active) { + return; + } + for (var id in this._hashDeactivated) { + if (!this._hashDeactivated.hasOwnProperty(id)) { + continue; + } + var tag = this._hashDeactivated[id]; + this._add(tag, transform); + } + this._hashDeactivated = {}; + this._active = true; + this._notifyChanged$.next(this); + }; + TagSet.prototype.deactivate = function () { + if (!this._active) { + return; + } + for (var id in this._hash) { + if (!this._hash.hasOwnProperty(id)) { + continue; + } + this._hashDeactivated[id] = this._hash[id].tag; + } + this._hash = {}; + this._active = 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._notifyChanged$.next(this); + }; + 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)) { + throw new Error("Tag type not supported"); + } + this._hashDeactivated[tag.id] = tag; + } + }; + 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]; + }); + }; + TagSet.prototype.getAllDeactivated = function () { + var hashDeactivated = this._hashDeactivated; + return Object.keys(hashDeactivated) + .map(function (id) { + return hashDeactivated[id]; + }); + }; + TagSet.prototype.getDeactivated = function (id) { + return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined; + }; + 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; + } + delete hash[id]; + } + this._notifyChanged$.next(this); + }; + 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; + } + delete hashDeactivated[id]; + } + }; + 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 { + throw new Error("Tag type not supported"); + } + }; + TagSet.prototype._assertActivationState = function (should) { + if (should !== this._active) { + throw new Error("Tag set not in correct state for operation."); + } + }; + return TagSet; +}()); +exports.TagSet = TagSet; +exports.default = TagSet; + +},{"../../Component":275,"rxjs":27}],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 }); +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; + _this.name = "GeometryTagError"; + return _this; + } + return GeometryTagError; +}(Error_1.MapillaryError)); +exports.GeometryTagError = GeometryTagError; +exports.default = Error_1.MapillaryError; + +},{"../../../Error":277}],352:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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(Geometry.prototype, "changed$", { + /** + * Get changed observable. + * + * @description Emits the geometry itself every time the geometry + * has changed. + * + * @returns {Observable} Observable emitting the geometry instance. + * @ignore + */ + get: function () { + return this._notifyChanged$; + }, + enumerable: true, + configurable: true + }); + return Geometry; +}()); +exports.Geometry = Geometry; +exports.default = Geometry; + +},{"rxjs":27}],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 }); +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} 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} Array representing the basic coordinates of the point. + */ + get: function () { + return this._point; + }, + enumerable: true, + configurable: true + }); + /** + * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D + * basic coordinates of the point itself. + * + * @returns {Array} 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} 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} 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; + +},{"../../../Component":275}],354:[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 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>} polygon - Array of polygon vertices. Must be closed. + * @param {Array>>} [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."); + } + 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 _this; + } + 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(PolygonGeometry.prototype, "polygon", { + /** + * Get polygon property. + * @returns {Array>} Closed 2d polygon. + */ + get: function () { + return this._polygon; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PolygonGeometry.prototype, "holes", { + /** + * Get holes property. + * @returns {Array>>} Holes of 2d polygon. + */ + get: function () { + return this._holes; + }, + enumerable: true, + configurable: true + }); + /** + * Add a vertex to the polygon by appending it after the last vertex. + * + * @param {Array} vertex - Vertex to add. + * @ignore + */ + 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); + }; + /** + * 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. + * + * @param {number} index - Vertex index. + * @returns {Array} Array representing the 2D basic coordinates of the vertex. + * @ignore + */ + PolygonGeometry.prototype.getVertex2d = function (index) { + return this._polygon[index].slice(); + }; + /** + * Remove a vertex from the polygon. + * + * @param {number} index - The index of the vertex to remove. + * @ignore + */ + 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); + }; + /** @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); + }; + /** @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); + }; + /** @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); + }; + /** @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 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; + return this._holes + .map(function (hole2d) { + return _this._getPoints3d(_this._subsample(hole2d), 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 of hole polygons in 3D world coordinates + * representing the vertices of each hole of the geometry. + * @ignore + */ + PolygonGeometry.prototype.getHoleVertices3d = function (transform) { + var _this = this; + return this._holes + .map(function (hole2d) { + return _this._getPoints3d(hole2d, transform); + }); + }; + /** @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; + } + area /= 2; + centroidX /= 6 * area; + centroidY /= 6 * area; + return [centroidX, centroidY]; + }; + /** @ignore */ + PolygonGeometry.prototype.getCentroid3d = function (transform) { + var centroid2d = this.getCentroid2d(); + return transform.unprojectBasic(centroid2d, 200); + }; + /** @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)); + }; + /** @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); + }; + /** @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; + +},{"../../../Component":275}],355:[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 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} 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(RectGeometry.prototype, "anchorIndex", { + /** + * Get anchor index property. + * + * @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._anchorIndex; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RectGeometry.prototype, "inverted", { + /** + * Get inverted property. + * + * @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: true, + configurable: true + }); + Object.defineProperty(RectGeometry.prototype, "rect", { + /** + * Get rect property. + * + * @returns {Array} Array representing the top-left and bottom-right + * corners of the rectangle in basic coordinates. + */ + get: function () { + return this._rect; + }, + enumerable: true, + configurable: true + }); + /** + * 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} 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} 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>} 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} 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} 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. + * + * @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>} Polygon array of 3D world coordinates representing + * the vertices of the geometry. + * @ignore + */ + RectGeometry.prototype.getVertex3d = function (index, transform) { + return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200); + }; + /** + * Get a polygon representation of the 2D basic 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. + * + * @returns {Array>} Polygon array of 2D basic coordinates representing + * the rectangle vertices. + * @ignore + */ + RectGeometry.prototype.getVertices2d = function () { + return this._rectToVertices2d(this._rect); + }; + /** + * 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>} Polygon array of 3D world coordinates representing + * the rectangle vertices. + * @ignore + */ + RectGeometry.prototype.getVertices3d = function (transform) { + return this._rectToVertices2d(this._rect) + .map(function (vertex) { + return transform.unprojectBasic(vertex, 200); + }); + }; + /** @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]; + }; + /** @ignore */ + RectGeometry.prototype.getCentroid3d = function (transform) { + var centroid2d = this.getCentroid2d(); + return transform.unprojectBasic(centroid2d, 200); + }; + /** + * @ignore + */ + 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)); + }; + /** + * Check if a particular bottom-right value is valid according to the current + * rectangle coordinates. + * + * @param {Array} bottomRight - The bottom-right coordinates to validate + * @returns {boolean} Value indicating whether the provided bottom-right coordinates + * are valid. + * @ignore + */ + 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; + }; + /** + * Get the 2D coordinates for the vertices of the rectangle with + * interpolated points along the lines. + * + * @returns {Array>} Polygon array of 2D basic coordinates + * representing the rectangle. + */ + 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); + } + } + 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} rect - Top-left, bottom-right representation of a + * rectangle. + * @returns {Array>} 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]], + ]; + }; + /** + * 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} rect - Top-left, bottom-right representation of a + * rectangle. + * @returns {Array>} 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 RectGeometry; +}(Component_1.VertexGeometry)); +exports.RectGeometry = RectGeometry; +exports.default = RectGeometry; + +},{"../../../Component":275}],356:[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 earcut_1 = require("earcut"); +var martinez = require("martinez-polygon-clipping"); +var polylabel = require("@mapbox/polylabel"); +var THREE = require("three"); +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; + } + /** + * Finds the polygon pole of inaccessibility, the most distant internal + * point from the polygon outline. + * + * @param {Array>} points2d - 2d points of outline to triangulate. + * @returns {Array} 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); + } + } + return subsampled; + }; + /** + * Triangulates a 2d polygon and returns the triangle + * representation as a flattened array of 3d points. + * + * @param {Array>} points2d - 2d points of outline to triangulate. + * @param {Array>} points3d - 3d points of outline corresponding to the 2d points. + * @param {Array>>} [holes2d] - 2d points of holes to triangulate. + * @param {Array>>} [holes3d] - 3d points of holes corresponding to the 2d points. + * @returns {Array} 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]); + } + return triangles; + }; + 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; + }; + VertexGeometry.prototype._unproject = function (points2d, transform, distance) { + if (distance === void 0) { distance = 200; } + return points2d + .map(function (point) { + return transform.unprojectBasic(point, distance); + }); + }; + 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; + }; + 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]; + }); + }; + VertexGeometry.prototype._triangulateSubarea = function (points2d, holes2d, bbox2d, lookat2d, transform) { + var intersections = martinez.intersection([points2d].concat(holes2d), [bbox2d]); + if (!intersections) { + 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)); + } + return triangles; + }; + return VertexGeometry; +}(Component_1.Geometry)); +exports.VertexGeometry = VertexGeometry; +exports.default = VertexGeometry; + +},{"../../../Component":275,"@mapbox/polylabel":1,"earcut":8,"martinez-polygon-clipping":22,"three":226}],357:[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 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._geometryCreated$; + }, + enumerable: true, + configurable: true + }); + 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; + +},{"../../../Component":275,"rxjs":27,"rxjs/operators":225}],358:[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 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; + +},{"../../../Component":275,"rxjs/operators":225}],359:[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 Component_1 = require("../../../Component"); +var CreatePolygonHandler = /** @class */ (function (_super) { + __extends(CreatePolygonHandler, _super); + function CreatePolygonHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + CreatePolygonHandler.prototype._addPoint = function (tag, basicPoint) { + tag.addPoint(basicPoint); + }; + Object.defineProperty(CreatePolygonHandler.prototype, "_create$", { + get: function () { + return this._tagCreator.createPolygon$; + }, + enumerable: true, + configurable: true + }); + 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":275}],360:[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 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":275,"rxjs":27,"rxjs/operators":225}],361:[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 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._tagCreator.createRect$; + }, + enumerable: true, + configurable: true + }); + CreateRectHandler.prototype._addPoint = function (tag, basicPoint) { + var rectGeometry = tag.geometry; + if (!rectGeometry.validate(basicPoint)) { + basicPoint = rectGeometry.getNonAdjustedVertex2d(3); + } + tag.addPoint(basicPoint); + }; + 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(); + }); + }; + CreateRectHandler.prototype._disable = function () { + _super.prototype._disable.call(this); + this._initializeAnchorIndexingSubscription.unsubscribe(); + }; + CreateRectHandler.prototype._getNameExtension = function () { + return "create-rect"; + }; + CreateRectHandler.prototype._setVertex2d = function (tag, basicPoint, transform) { + tag.geometry.setOppositeVertex2d(basicPoint, transform); + }; + return CreateRectHandler; +}(Component_1.CreateVertexHandler)); +exports.CreateRectHandler = CreateRectHandler; +exports.default = CreateRectHandler; + +},{"../../../Component":275,"rxjs/operators":225}],362:[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 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 (transform) { }), 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":275,"rxjs":27,"rxjs/operators":225}],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 __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +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); + } + }); + }; + EditVertexHandler.prototype._disable = function () { + this._claimMouseSubscription.unsubscribe(); + this._cursorSubscription.unsubscribe(); + this._preventDefaultSubscription.unsubscribe(); + this._unclaimMouseSubscription.unsubscribe(); + this._updateGeometrySubscription.unsubscribe(); + }; + EditVertexHandler.prototype._getNameExtension = function () { + return "edit-vertex"; + }; + return EditVertexHandler; +}(Component_1.TagHandlerBase)); +exports.EditVertexHandler = EditVertexHandler; +exports.default = EditVertexHandler; + + +},{"../../../Component":275,"rxjs":27,"rxjs/operators":225}],364:[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 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 {}; + }; + 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":275}],365:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); +var THREE = require("three"); +var vd = require("virtual-dom"); +var rxjs_1 = require("rxjs"); +var Component_1 = require("../../../Component"); +var Geo_1 = require("../../../Geo"); +var OutlineCreateTag = /** @class */ (function () { + function OutlineCreateTag(geometry, options, transform, viewportCoords) { + var _this = this; + this._geometry = geometry; + this._options = { color: options.color == null ? 0xFFFFFF : options.color }; + this._transform = transform; + this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); + this._outline = this._createOutine(); + this._glObjects = [this._outline]; + 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 (vertexGeometry) { + _this._disposeOutline(); + _this._outline = _this._createOutine(); + _this._glObjects = [_this._outline]; + _this._glObjectsChanged$.next(_this); + }); + } + Object.defineProperty(OutlineCreateTag.prototype, "geometry", { + get: function () { + return this._geometry; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineCreateTag.prototype, "glObjects", { + get: function () { + return this._glObjects; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineCreateTag.prototype, "aborted$", { + get: function () { + return this._aborted$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineCreateTag.prototype, "created$", { + get: function () { + return this._created$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineCreateTag.prototype, "glObjectsChanged$", { + get: function () { + return this._glObjectsChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", { + get: function () { + var _this = this; + return this._geometry.changed$.pipe(operators_1.map(function (geometry) { + return _this; + })); + }, + enumerable: true, + configurable: true + }); + OutlineCreateTag.prototype.dispose = function () { + this._disposeOutline(); + this._geometryChangedSubscription.unsubscribe(); + }; + 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 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: background, transform: transform }, + }; + var completerProperties = { + onclick: abort, + style: { transform: transform }, + }; + vNodes.push(vd.h("div.TagInteractor", completerProperties, [])); + vNodes.push(vd.h("div.TagVertex", pointProperties, [])); + } + } + else if (this._geometry instanceof Component_1.PolygonGeometry) { + var polygonGeometry_1 = this._geometry; + 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(); + polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 2); + _this._created$.next(_this); + } : + abort; + var transform = this._canvasToTransform(firstVertexCanvas); + var completerProperties = { + onclick: firstOnclick, + style: { transform: transform }, + }; + var firstClass = polygonGeometry_1.polygon.length > 4 ? + "TagCompleter" : + "TagInteractor"; + vNodes.push(vd.h("div." + firstClass, completerProperties, [])); + } + if (polygonGeometry_1.polygon.length > 3) { + 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: { transform: transform }, + }; + vNodes.push(vd.h("div.TagInteractor", completerProperties, [])); + } + } + 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: background, + transform: transform, + }, + }; + vNodes.push(vd.h("div.TagVertex", pointProperties, [])); + } + } + } + return vNodes; + }; + OutlineCreateTag.prototype.addPoint = function (point) { + if (this._geometry instanceof Component_1.RectGeometry) { + var rectGeometry = this._geometry; + if (!rectGeometry.validate(point)) { + return; + } + this._created$.next(this); + } + else if (this._geometry instanceof Component_1.PolygonGeometry) { + var polygonGeometry = this._geometry; + polygonGeometry.addVertex2d(point); + } + }; + OutlineCreateTag.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; + }; + OutlineCreateTag.prototype._colorToBackground = function (color) { + return "#" + ("000000" + color.toString(16)).substr(-6); + }; + OutlineCreateTag.prototype._createOutine = function () { + var polygon3d = this._geometry instanceof Component_1.RectGeometry ? + this._geometry.getPoints3d(this._transform) : + this._geometry.getVertices3d(this._transform); + var positions = this._getLinePositions(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); + }; + OutlineCreateTag.prototype._disposeOutline = function () { + if (this._outline == null) { + return; + } + var line = this._outline; + line.geometry.dispose(); + line.material.dispose(); + this._outline = null; + this._glObjects = []; + }; + OutlineCreateTag.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; + }; + return OutlineCreateTag; +}()); +exports.OutlineCreateTag = OutlineCreateTag; +exports.default = OutlineCreateTag; + + +},{"../../../Component":275,"../../../Geo":278,"rxjs":27,"rxjs/operators":225,"three":226,"virtual-dom":231}],366:[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 THREE = require("three"); +var vd = require("virtual-dom"); +var Component_1 = require("../../../Component"); +/** + * @class OutlineRenderTag + * @classdesc Tag visualizing the properties of an OutlineTag. + */ +var OutlineRenderTag = /** @class */ (function (_super) { + __extends(OutlineRenderTag, _super); + function OutlineRenderTag(tag, transform) { + 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() : + null; + _this._geometryChangedSubscription = _this._tag.geometry.changed$ + .subscribe(function () { + if (_this._fill != null) { + _this._updateFillGeometry(); + } + if (_this._holes.length > 0) { + _this._updateHoleGeometries(); + } + if (_this._outline != null) { + _this._updateOulineGeometry(); + } + }); + _this._changedSubscription = _this._tag.changed$ + .subscribe(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(); + } + if (glObjectsChanged) { + _this._glObjectsChanged$.next(_this); + } + }); + return _this; + } + OutlineRenderTag.prototype.dispose = function () { + this._disposeFill(); + this._disposeHoles(); + this._disposeOutline(); + this._changedSubscription.unsubscribe(); + this._geometryChangedSubscription.unsubscribe(); + }; + OutlineRenderTag.prototype.getDOMObjects = function (atlas, camera, size) { + var _this = this; + var vNodes = []; + 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 (e) { + _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 properties = { + onclick: click, + onmousedown: interact, + style: { transform: transform }, + }; + 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 (e) { + _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 = this._colorToCss(this._tag.lineColor); + if (this._tag.geometry instanceof Component_1.RectGeometry) { + 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, transform: transform }, + }; + vNodes.push(vd.h("div.TagMover", properties, [])); + } + } + 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 _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 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, 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, [])); + } + return vNodes; + }; + OutlineRenderTag.prototype.getGLObjects = function () { + var glObjects = []; + if (this._fill != null) { + glObjects.push(this._fill); + } + for (var _i = 0, _a = this._holes; _i < _a.length; _i++) { + var hole = _a[_i]; + glObjects.push(hole); + } + if (this._outline != null) { + glObjects.push(this._outline); + } + return glObjects; + }; + OutlineRenderTag.prototype.getRetrievableObjects = function () { + return this._fill != null ? [this._fill] : []; + }; + OutlineRenderTag.prototype._colorToCss = function (color) { + return "#" + ("000000" + color.toString(16)).substr(-6); + }; + OutlineRenderTag.prototype._createFill = function () { + var triangles = this._getTriangles(); + 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({ side: THREE.DoubleSide, transparent: true }); + this._updateFillMaterial(material); + return new THREE.Mesh(geometry, material); + }; + OutlineRenderTag.prototype._createHoles = function () { + var holes = []; + if (this._tag.geometry instanceof Component_1.PolygonGeometry) { + 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); + holes.push(hole); + } + } + return holes; + }; + OutlineRenderTag.prototype._createLine = function (points3d) { + var positions = this._getLinePositions(points3d); + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.computeBoundingSphere(); + var material = new THREE.LineBasicMaterial(); + this._updateLineBasicMaterial(material); + var line = new THREE.Line(geometry, material); + line.renderOrder = 1; + return line; + }; + OutlineRenderTag.prototype._createOutline = function () { + return this._createLine(this._getPoints3d()); + }; + OutlineRenderTag.prototype._disposeFill = function () { + if (this._fill == null) { + return; + } + this._fill.geometry.dispose(); + 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 () { + if (this._outline == null) { + return; + } + this._outline.geometry.dispose(); + this._outline.material.dispose(); + this._outline = null; + }; + OutlineRenderTag.prototype._getLinePositions = function (points3d) { + var length = points3d.length; + var positions = new Float32Array(length * 3); + for (var i = 0; i < length; ++i) { + var index = 3 * i; + var position = points3d[i]; + positions[index + 0] = position[0]; + positions[index + 1] = position[1]; + positions[index + 2] = position[2]; + } + return positions; + }; + OutlineRenderTag.prototype._getHoles3d = function () { + var polygonGeometry = this._tag.geometry; + return this._in3dDomain() ? + polygonGeometry.getHoleVertices3d(this._transform) : + polygonGeometry.getHolePoints3d(this._transform); + }; + 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._in3dDomain = function () { + return this._tag.geometry instanceof Component_1.PolygonGeometry && this._tag.domain === Component_1.TagDomain.ThreeDimensional; + }; + OutlineRenderTag.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, + tag: _this._tag, + vertexIndex: vertexIndex, + }); + }; + }; + OutlineRenderTag.prototype._updateFillGeometry = function () { + var triangles = this._getTriangles(); + var positions = new Float32Array(triangles); + var geometry = this._fill.geometry; + var attribute = geometry.getAttribute("position"); + if (attribute.array.length === positions.length) { + attribute.set(positions); + attribute.needsUpdate = true; + } + else { + geometry.removeAttribute("position"); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + } + geometry.computeBoundingSphere(); + }; + OutlineRenderTag.prototype._updateFillMaterial = function (material) { + material.color = new THREE.Color(this._tag.fillColor); + material.opacity = this._tag.fillOpacity; + material.needsUpdate = true; + }; + 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]; + var material = hole.material; + this._updateLineBasicMaterial(material); + } + }; + OutlineRenderTag.prototype._updateLine = function (line, points3d) { + var positions = this._getLinePositions(points3d); + var geometry = line.geometry; + var attribute = geometry.getAttribute("position"); + attribute.set(positions); + attribute.needsUpdate = true; + geometry.computeBoundingSphere(); + }; + OutlineRenderTag.prototype._updateOulineGeometry = function () { + this._updateLine(this._outline, this._getPoints3d()); + }; + 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.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0; + material.opacity = this._tag.lineOpacity; + material.transparent = this._tag.lineOpacity < 1; + material.needsUpdate = true; + }; + return OutlineRenderTag; +}(Component_1.RenderTag)); +exports.OutlineRenderTag = OutlineRenderTag; + + +},{"../../../Component":275,"three":226,"virtual-dom":231}],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 }); +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 = /** @class */ (function (_super) { + __extends(OutlineTag, _super); + /** + * Create an outline tag. + * + * @override + * @constructor + * @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 = _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. + * + * @description An observable emitting the tag when the icon of the + * tag has been clicked. + * + * @returns {Observable} + */ + get: function () { + return this._click$; + }, + enumerable: true, + 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: true, + 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: true, + 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: true, + 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: true, + configurable: true + }); + Object.defineProperty(OutlineTag.prototype, "geometry", { + /** @inheritdoc */ + get: function () { + return this._geometry; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineTag.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(OutlineTag.prototype, "iconFloat", { + /** + * Get icon float property. + * @returns {Alignment} + */ + get: function () { + return this._iconFloat; + }, + /** + * Set icon float property. + * @param {Alignment} + * + * @fires Tag#changed + */ + set: function (value) { + this._iconFloat = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineTag.prototype, "iconIndex", { + /** + * Get icon index property. + * @returns {number} + */ + get: function () { + return this._iconIndex; + }, + /** + * Set icon index property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._iconIndex = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineTag.prototype, "indicateVertices", { + /** + * Get indicate vertices property. + * @returns {boolean} Value indicating if vertices should be indicated + * when tag is editable. + */ + get: function () { + return this._indicateVertices; + }, + /** + * Set indicate vertices 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._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineTag.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: true, + configurable: true + }); + Object.defineProperty(OutlineTag.prototype, "lineWidth", { + /** + * Get line width property. + * @returns {number} + */ + get: function () { + return this._lineWidth; + }, + /** + * Set line width property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._lineWidth = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineTag.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(OutlineTag.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 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":275,"../../../Viewer":286,"rxjs":27}],368:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(RenderTag.prototype, "interact$", { + get: function () { + return this._interact$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RenderTag.prototype, "tag", { + get: function () { + return this._tag; + }, + enumerable: true, + configurable: true + }); + return RenderTag; +}()); +exports.RenderTag = RenderTag; +exports.default = RenderTag; + +},{"../../../Geo":278,"rxjs":27}],369:[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 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":275,"../../../Viewer":286,"virtual-dom":231}],370:[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 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 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(OutlineTag.prototype, "lineColor", { + Object.defineProperty(SpotTag.prototype, "editable", { /** - * Get line color property. - * @returns {number} + * Get editable property. + * @returns {boolean} Value indicating if tag is editable. */ get: function () { - return this._lineColor; + return this._editable; }, /** - * Set line color property. - * @param {number} + * Set editable property. + * @param {boolean} * * @fires Tag#changed */ set: function (value) { - this._lineColor = value; + this._editable = value; this._notifyChanged$.next(this); }, enumerable: true, 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, configurable: true }); - Object.defineProperty(OutlineTag.prototype, "text", { + Object.defineProperty(SpotTag.prototype, "text", { /** * Get text property. * @returns {string} @@ -26335,7 +35748,7 @@ var OutlineTag = (function (_super) { enumerable: true, configurable: true }); - Object.defineProperty(OutlineTag.prototype, "textColor", { + Object.defineProperty(SpotTag.prototype, "textColor", { /** * Get text color property. * @returns {number} @@ -26362,548 +35775,1008 @@ 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); }; - return OutlineTag; -}(Component_1.Tag)); -/** - * 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"; -exports.OutlineTag = OutlineTag; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = OutlineTag; + return SpotTag; +}(Component_1.Tag)); +exports.SpotTag = SpotTag; +exports.default = SpotTag; + +},{"../../../Component":275}],371:[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 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(Tag.prototype, "id", { + /** + * Get id property. + * @returns {string} + */ + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tag.prototype, "geometry", { + /** + * Get geometry property. + * @returns {Geometry} The geometry of the tag. + */ + get: function () { + return this._geometry; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tag.prototype, "changed$", { + /** + * Get changed observable. + * @returns {Observable} + * @ignore + */ + get: function () { + return this._notifyChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tag.prototype, "geometryChanged$", { + /** + * Get geometry changed observable. + * @returns {Observable} + * @ignore + */ + get: function () { + var _this = this; + return this._geometry.changed$.pipe(operators_1.map(function (geometry) { + return _this; + }), operators_1.share()); + }, + enumerable: true, + 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; +exports.default = Tag; + +},{"../../../Utils":285,"rxjs":27,"rxjs/operators":225}],372:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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; + +},{}],373:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + /** + * Enables the interaction. + * + * @example ```..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 ```..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; + +},{}],374:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + } + MeshFactory.prototype.createMesh = function (node, transform) { + var mesh = node.pano ? + this._createImageSphere(node, transform) : + this._createImagePlane(node, transform); + return mesh; + }; + 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."); + } + return node.pano ? + this._createSphereCurtainMesh(node, transform) : + 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._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._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: { + 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.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: { + type: "f", + value: 1, + }, + 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.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: { + type: "f", + value: transform.focal, + }, + k1: { + type: "f", + value: transform.ck1, + }, + k2: { + type: "f", + value: transform.ck2, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.basicRt, + }, + projectorTex: { + type: "t", + value: texture, + }, + radial_peak: { + type: "f", + value: !!transform.radialPeak ? transform.radialPeak : 0, + }, + scale_x: { + type: "f", + value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth, + }, + scale_y: { + type: "f", + value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight, + }, + }, + vertexShader: Component_1.Shaders.perspective.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: { + type: "f", + value: 1, + }, + focal: { + type: "f", + value: transform.focal, + }, + k1: { + type: "f", + value: transform.ck1, + }, + k2: { + type: "f", + value: transform.ck2, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.basicRt, + }, + projectorTex: { + type: "t", + value: texture, + }, + radial_peak: { + type: "f", + value: !!transform.radialPeak ? transform.radialPeak : 0, + }, + scale_x: { + type: "f", + value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth, + }, + scale_y: { + type: "f", + 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: { + type: "f", + value: 1, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.projectorMatrix(), + }, + projectorTex: { + type: "t", + 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: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.projectorMatrix(), + }, + projectorTex: { + type: "t", + 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.addAttribute("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 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]; + } + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.setIndex(new THREE.BufferAttribute(indices, 1)); + return geometry; + }; + 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.applyMatrix(new THREE.Matrix4().getInverse(transform.rt)); + return geometry; + }; + 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._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.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.setIndex(new THREE.BufferAttribute(indices, 1)); + return geometry; + }; + return MeshFactory; +}()); +exports.MeshFactory = MeshFactory; +exports.default = MeshFactory; -},{"../../../Component":217,"rxjs/Subject":33}],277:[function(require,module,exports){ -/// +},{"../../Component":275,"three":226}],375:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); 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 MeshScene = /** @class */ (function () { + function MeshScene() { + this.scene = new THREE.Scene(); + this.sceneOld = new THREE.Scene(); + this.imagePlanes = []; + this.imagePlanesOld = []; } - Object.defineProperty(RenderTag.prototype, "glObjects", { - /** - * Get the GL objects for rendering of the tag. - * @return {Array} - */ - get: function () { - return this._glObjects; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", { - get: function () { - return this._glObjectsChanged$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RenderTag.prototype, "interact$", { - get: function () { - return this._interact$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RenderTag.prototype, "tag", { - get: function () { - return this._tag; - }, - enumerable: true, - 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]; + MeshScene.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; }; - RenderTag.prototype._convertToCameraSpace = function (point3d, matrixWorldInverse) { - return new THREE.Vector3(point3d[0], point3d[1], point3d[2]).applyMatrix4(matrixWorldInverse); + MeshScene.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); + } }; - return RenderTag; + MeshScene.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); + } + }; + MeshScene.prototype.setImagePlanes = function (planes) { + this._clear(); + this.addImagePlanes(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.imagePlanes, this.scene); + this.imagePlanes.length = 0; + }; + MeshScene.prototype._clearOld = function () { + this._dispose(this.imagePlanesOld, this.sceneOld); + this.imagePlanesOld.length = 0; + }; + MeshScene.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(); + } + } + }; + return MeshScene; }()); -exports.RenderTag = RenderTag; +exports.MeshScene = MeshScene; +exports.default = MeshScene; + +},{"three":226}],376:[function(require,module,exports){ +"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = RenderTag; +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; -},{"rxjs/Subject":33,"three":167}],278:[function(require,module,exports){ -/// +},{"rxjs":27,"rxjs/operators":225}],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 __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 rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); 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() { - return _super !== null && _super.apply(this, arguments) || this; +var Component_1 = require("../../Component"); +var Geo_1 = require("../../Geo"); +var State_1 = require("../../State"); +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; } - SpotRenderTag.prototype.dispose = function () { return; }; - SpotRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) { + ZoomComponent.prototype._activate = function () { 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, [])); - } - var pointProperties = { - style: { - background: background, - left: centroidCss[0], - position: "absolute", - top: centroidCss[1], - }, + this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$).pipe(operators_1.map(function (_a) { + var frame = _a[0], state = _a[1]; + return [frame.state.zoom, state]; + }), operators_1.map(function (_a) { + var zoom = _a[0], state = _a[1]; + 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]); + return { + name: _this._name, + vnode: vd.h("div.ZoomContainer", { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]), }; - vNodes.push(vd.h("div.TagVertex", pointProperties, [])); - } - return vNodes; + })) + .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(); }; - 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, - }); - }; + ZoomComponent.prototype._getDefaultConfiguration = function () { + return {}; }; - return SpotRenderTag; -}(Component_1.RenderTag)); -exports.SpotRenderTag = SpotRenderTag; + ZoomComponent.componentName = "zoom"; + return ZoomComponent; +}(Component_1.Component)); +exports.ZoomComponent = ZoomComponent; +Component_1.ComponentService.register(ZoomComponent); +exports.default = ZoomComponent; -},{"../../../Component":217,"../../../Viewer":227,"virtual-dom":173}],279:[function(require,module,exports){ +},{"../../Component":275,"../../Geo":278,"../../State":282,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],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 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) { - var _this = _super.call(this, id, geometry) || this; - _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; +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); } - 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); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - return SpotTag; -}(Component_1.Tag)); -exports.SpotTag = SpotTag; +})(); Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SpotTag; - -},{"../../../Component":217}],280:[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 = _super.call(this) || 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); - }); - return _this; - } - Object.defineProperty(Tag.prototype, "id", { - /** - * Get id property. - * @returns {string} - */ - get: function () { - return this._id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tag.prototype, "geometry", { - /** - * Get geometry property. - * @returns {Geometry} - */ - get: function () { - return this._geometry; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tag.prototype, "changed$", { - /** - * Get changed observable. - * @returns {Observable} - */ - get: function () { - return this._notifyChanged$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tag.prototype, "geometryChanged$", { - /** - * Get geometry changed observable. - * @returns {Observable} - */ - get: function () { - var _this = this; - return this._geometry.changed$ - .map(function (geometry) { - return _this; - }) - .share(); - }, - enumerable: true, - configurable: true - }); - return Tag; -}(Utils_1.EventEmitter)); -/** - * 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"; +var MapillaryError_1 = require("./MapillaryError"); /** - * Event fired when the geometry of the tag has changed. + * @class AbortMapillaryError * - * @event Tag#geometrychanged - * @type {Tag} The tag instance whose geometry has changed. - */ -Tag.geometrychanged = "geometrychanged"; -exports.Tag = Tag; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Tag; + * @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; -},{"../../../Utils":226,"rxjs/Subject":33,"rxjs/add/operator/map":62,"rxjs/add/operator/share":71}],281:[function(require,module,exports){ +},{"./MapillaryError":381}],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 __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 MapillaryError_1 = require("./MapillaryError"); -var ArgumentMapillaryError = (function (_super) { +var ArgumentMapillaryError = /** @class */ (function (_super) { __extends(ArgumentMapillaryError, _super); function ArgumentMapillaryError(message) { 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":283}],282:[function(require,module,exports){ +},{"./MapillaryError":381}],380:[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 }); var MapillaryError_1 = require("./MapillaryError"); -var GraphMapillaryError = (function (_super) { +var GraphMapillaryError = /** @class */ (function (_super) { __extends(GraphMapillaryError, _super); function GraphMapillaryError(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":283}],283:[function(require,module,exports){ +},{"./MapillaryError":381}],381:[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) { +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 MapillaryError = /** @class */ (function (_super) { __extends(MapillaryError, _super); 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; -},{}],284:[function(require,module,exports){ -/// +},{}],382:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); 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. @@ -27043,8 +36916,23 @@ var Camera = (function () { }()); exports.Camera = Camera; -},{"three":167}],285:[function(require,module,exports){ +},{"three":226}],383:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{"../Geo":278}],384:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * @class GeoCoords * @@ -27114,7 +37002,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; @@ -27264,29 +37152,109 @@ var GeoCoords = (function () { return GeoCoords; }()); exports.GeoCoords = GeoCoords; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GeoCoords; -},{}],286:[function(require,module,exports){ -/// +},{}],385:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{}],386:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); 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; @@ -27294,7 +37262,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; @@ -27302,19 +37271,23 @@ var Spatial = (function () { /** * Creates a rotation matrix from an angle-axis vector. * - * @param {Array} angleAxis Angle-axis representation of a rotation. + * @param {Array} 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} vector Vector to rotate. - * @param {Array} angleAxis Angle-axis representation of a rotation. + * @param {Array} vector - Vector to rotate. + * @param {Array} 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]); @@ -27327,8 +37300,9 @@ var Spatial = (function () { * on the angle-axis representation and a translation vector * according to C = -R^T t. * - * @param {Array} rotation Angle-axis representation of a rotation. - * @param {Array} translation Translation vector. + * @param {Array} rotation - Angle-axis representation of a rotation. + * @param {Array} translation - Translation vector. + * @returns {THREE.Vector3} Optical center. */ Spatial.prototype.opticalCenter = function (rotation, translation) { var angleAxis = [-rotation[0], -rotation[1], -rotation[2]]; @@ -27339,7 +37313,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]]; @@ -27348,11 +37323,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) { @@ -27372,9 +37346,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); @@ -27383,11 +37356,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) { @@ -27402,10 +37374,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); @@ -27415,8 +37388,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; @@ -27426,23 +37400,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} vector The vector. - * @param {Array} planeNormal Normal of the plane. + * @param {Array} vector - The vector. + * @param {Array} 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); @@ -27458,17 +37435,18 @@ var Spatial = (function () { * (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; @@ -27476,12 +37454,11 @@ var Spatial = (function () { return Spatial; }()); exports.Spatial = Spatial; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Spatial; -},{"three":167}],287:[function(require,module,exports){ -/// +},{"three":226}],387:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** * @class Transform @@ -27489,31 +37466,56 @@ 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} translation - Node translation vector in three dimensions. - */ - function Transform(node, image, translation) { - this._orientation = this._getValue(node.orientation, 1); + * @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} rotation - Rotation vector in three dimensions. + * @param {Array} translation - Translation vector in three dimensions. + * @param {HTMLImageElement} image - Image for fallback size calculations. + */ + function Transform(orientation, width, height, focal, scale, gpano, rotation, translation, image, textureScale, ck1, ck2) { + 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._basicWidth = keepOrientation ? node.width : node.height; - this._basicHeight = keepOrientation ? node.height : node.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._radialPeak = this._getRadialPeak(this._ck1, this._ck2); } + Object.defineProperty(Transform.prototype, "ck1", { + get: function () { + return this._ck1; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Transform.prototype, "ck2", { + get: function () { + return this._ck2; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "basicAspect", { /** * Get basic aspect. @@ -27541,6 +37543,13 @@ var Transform = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Transform.prototype, "basicRt", { + get: function () { + return this._basicRt; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "basicWidth", { /** * Get basic width. @@ -27655,6 +37664,29 @@ var Transform = (function () { enumerable: true, 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: true, + 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: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "width", { /** * Get width. @@ -27719,12 +37751,15 @@ var Transform = (function () { * Unproject basic coordinates to 3D world coordinates. * * @param {Array} basic - 2D basic coordinates. - * @param {Array} distance - Depth to unproject from camera center. + * @param {Array} 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} 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. @@ -27741,12 +37776,17 @@ var Transform = (function () { * Unproject SfM coordinates to a 3D world coordinates. * * @param {Array} sfm - 2D SfM coordinates. - * @param {Array} distance - Depth to unproject from camera center. + * @param {Array} 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} 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]; }; @@ -27781,7 +37821,20 @@ var Transform = (function () { return [x, y, z]; } else { - var v = new THREE.Vector3(sfm[0], sfm[1], this._focal); + var _a = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _a[0], dyn = _a[1]; + var rp = this._radialPeak; + var dr = Math.sqrt(dxn * dxn + dyn * dyn); + var d = 1.0; + for (var i = 0; i < 10; i++) { + var r = dr / d; + if (r > rp) { + r = rp; + } + d = 1 + this._ck1 * Math.pow(r, 2) + this._ck2 * Math.pow(r, 4); + } + 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]; } @@ -27821,9 +37874,16 @@ var Transform = (function () { } else { 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 [ - bearing[0] * this._focal / bearing[2], - bearing[1] * this._focal / bearing[2], + this._focal * d * xn, + this._focal * d * yn, ]; } else { @@ -27944,7 +38004,9 @@ var Transform = (function () { Transform.prototype._getRt = function (rotation, translation) { var axis = new THREE.Vector3(rotation[0], rotation[1], rotation[2]); var angle = axis.length(); - axis.normalize(); + 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])); @@ -27966,6 +38028,44 @@ var Transform = (function () { 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. @@ -27975,8 +38075,10 @@ var Transform = (function () { */ Transform.prototype._normalizedToTextureMatrix = function () { var size = Math.max(this._width, this._height); - var w = size / this._width; - var h = size / 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); @@ -27994,9 +38096,9 @@ var Transform = (function () { }()); exports.Transform = Transform; -},{"three":167}],288:[function(require,module,exports){ -/// +},{"three":226}],388:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** * @class ViewportCoords @@ -28007,7 +38109,7 @@ var THREE = require("three"); * 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 - * photo. + * 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 @@ -28020,64 +38122,130 @@ var THREE = require("three"); * * 3D coordinates are in the topocentric world reference frame. */ -var ViewportCoords = (function () { +var ViewportCoords = /** @class */ (function () { function ViewportCoords() { this._unprojectDepth = 200; } /** * Convert basic coordinates to canvas coordinates. * - * @description Transform origin and perspective camera position needs to be the + * @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 {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. + * @param {HTMLElement} container - The viewer container. * @param {Transform} transform - Transform of the node to unproject from. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} 2D canvas coordinates. */ - ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, canvasWidth, canvasHeight, transform, perspectiveCamera) { + ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, container, transform, camera) { var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth); - var canvas = this.projectToCanvas(point3d, canvasWidth, canvasHeight, perspectiveCamera); + 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} 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 perspective camera position needs to be the + * @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 {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. * @param {Transform} transform - Transform of the node to unproject from. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. - * @returns {Array} 2D canvas coordinates. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 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} 2D viewport coordinates. */ - ViewportCoords.prototype.basicToViewport = function (basicX, basicY, transform, perspectiveCamera) { + ViewportCoords.prototype.basicToViewportSafe = function (basicX, basicY, transform, camera) { var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth); - var viewport = this.projectToViewport(point3d, perspectiveCamera); + 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} 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} 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 perspective camera position needs to be the + * @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 {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. + * @param {HTMLElement} container - The viewer container. * @param {Transform} transform - Transform of the node to unproject from. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} 2D basic coordinates. */ - ViewportCoords.prototype.canvasToBasic = function (canvasX, canvasY, canvasWidth, canvasHeight, transform, perspectiveCamera) { - var point3d = this.unprojectFromCanvas(canvasX, canvasY, canvasWidth, canvasHeight, perspectiveCamera) + 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; @@ -28087,32 +38255,41 @@ var ViewportCoords = (function () { * * @param {number} canvasX - Canvas X coordinate. * @param {number} canvasY - Canvas Y coordinate. - * @param {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. + * @param {HTMLElement} container - The viewer container. * @returns {Array} 2D viewport coordinates. */ - ViewportCoords.prototype.canvasToViewport = function (canvasX, canvasY, canvasWidth, canvasHeight) { + 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} 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 perspective camera position needs to be the + * @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.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} Array of basic distances as [top, right, bottom, left]. */ - ViewportCoords.prototype.getBasicDistances = function (transform, perspectiveCamera) { - var topLeftBasic = this.viewportToBasic(-1, 1, transform, perspectiveCamera); - var topRightBasic = this.viewportToBasic(1, 1, transform, perspectiveCamera); - var bottomRightBasic = this.viewportToBasic(1, -1, transform, perspectiveCamera); - var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, perspectiveCamera); + 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; @@ -28142,101 +38319,111 @@ var ViewportCoords = (function () { /** * Determine pixel distances from image to canvas corners. * - * @description Transform origin and perspective camera position needs to be the + * @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 {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. + * @param {HTMLElement} container - The viewer container. * @param {Transform} transform - Transform of the node to unproject from. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} Array of pixel distances as [top, right, bottom, left]. */ - ViewportCoords.prototype.getPixelDistances = function (canvasWidth, canvasHeight, transform, perspectiveCamera) { - var topLeftBasic = this.viewportToBasic(-1, 1, transform, perspectiveCamera); - var topRightBasic = this.viewportToBasic(1, 1, transform, perspectiveCamera); - var bottomRightBasic = this.viewportToBasic(1, -1, transform, perspectiveCamera); - var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, perspectiveCamera); + 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, canvasWidth, canvasHeight, transform, perspectiveCamera); + 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, canvasWidth, canvasHeight, transform, perspectiveCamera); + 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, canvasWidth, canvasHeight, transform, perspectiveCamera); + 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, canvasWidth, canvasHeight, transform, perspectiveCamera); + 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} point3D - 3D world coordinates. - * @param {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. - * @returns {Array} 3D world coordinates. + * @param {HTMLElement} container - The viewer container. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D canvas coordinates. */ - ViewportCoords.prototype.projectToCanvas = function (point3d, canvasWidth, canvasHeight, perspectiveCamera) { - var viewport = this.projectToViewport(point3d, perspectiveCamera); - var canvas = this.viewportToCanvas(viewport[0], viewport[1], canvasWidth, canvasHeight); + 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 viewport coordinates. * * @param {Array} point3D - 3D world coordinates. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. - * @returns {Array} 3D world coordinates. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D viewport coordinates. */ - ViewportCoords.prototype.projectToViewport = function (point3d, perspectiveCamera) { - var projected = new THREE.Vector3(point3d[0], point3d[1], point3d[2]) - .project(perspectiveCamera); - var z = Math.abs(projected.z) < 1e-9 ? - projected.z < 0 ? - -1e-9 : 1e-9 : - projected.z; - var viewportX = projected.x / z; - var viewportY = projected.y / z; - return [viewportX, viewportY]; + ViewportCoords.prototype.projectToViewport = function (point3d, camera) { + var viewport = new THREE.Vector3(point3d[0], point3d[1], point3d[2]) + .project(camera); + return [viewport.x, viewport.y]; }; /** * Uproject canvas coordinates to 3D world coordinates. * * @param {number} canvasX - Canvas X coordinate. * @param {number} canvasY - Canvas Y coordinate. - * @param {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {HTMLElement} container - The viewer container. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} 3D world coordinates. */ - ViewportCoords.prototype.unprojectFromCanvas = function (canvasX, canvasY, canvasWidth, canvasHeight, perspectiveCamera) { - var viewport = this.canvasToViewport(canvasX, canvasY, canvasWidth, canvasHeight); - var point3d = this.unprojectFromViewport(viewport[0], viewport[1], perspectiveCamera); + 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; }; /** @@ -28244,29 +38431,29 @@ var ViewportCoords = (function () { * * @param {number} viewportX - Viewport X coordinate. * @param {number} viewportY - Viewport Y coordinate. - * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} 3D world coordinates. */ - ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, perspectiveCamera) { + ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, camera) { var point3d = new THREE.Vector3(viewportX, viewportY, 1) - .unproject(perspectiveCamera); + .unproject(camera); return point3d; }; /** * Convert viewport coordinates to basic coordinates. * - * @description Transform origin and perspective camera position needs to be the + * @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.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering. + * @param {THREE.Camera} camera - Camera used in rendering. * @returns {Array} 2D basic coordinates. */ - ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, perspectiveCamera) { + ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, camera) { var point3d = new THREE.Vector3(viewportX, viewportY, 1) - .unproject(perspectiveCamera) + .unproject(camera) .toArray(); var basic = transform.projectBasic(point3d); return basic; @@ -28276,30 +38463,43 @@ var ViewportCoords = (function () { * * @param {number} viewportX - Viewport X coordinate. * @param {number} viewportY - Viewport Y coordinate. - * @param {number} canvasWidth - Width of canvas. - * @param {number} canvasHeight - Height of canvas. + * @param {HTMLElement} container - The viewer container. * @returns {Array} 2D canvas coordinates. */ - ViewportCoords.prototype.viewportToCanvas = function (viewportX, viewportY, canvasWidth, canvasHeight) { + 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]; }; + /** + * 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} 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.ViewportCoords = ViewportCoords; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ViewportCoords; -},{"three":167}],289:[function(require,module,exports){ + +},{"three":226}],389:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * @class Filter * * @classdesc Represents a class for creating node filters. Implementation and * definitions based on https://github.com/mapbox/feature-filter. */ -var FilterCreator = (function () { +var FilterCreator = /** @class */ (function () { function FilterCreator() { } /** @@ -28376,20 +38576,14 @@ var FilterCreator = (function () { return FilterCreator; }()); exports.FilterCreator = FilterCreator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = FilterCreator; -},{}],290:[function(require,module,exports){ -/// +},{}],390:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var rbush = require("rbush"); -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 Edge_1 = require("../Edge"); var Error_1 = require("../Error"); var Graph_1 = require("../Graph"); @@ -28398,7 +38592,7 @@ var Graph_1 = require("../Graph"); * * @classdesc Represents a graph of nodes with edges. */ -var Graph = (function () { +var Graph = /** @class */ (function () { /** * Create a new graph instance. * @@ -28413,14 +38607,16 @@ var Graph = (function () { 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(); @@ -28431,6 +38627,7 @@ var Graph = (function () { { maxSequences: 50, maxUnusedNodes: 100, + maxUnusedPreStoredNodes: 30, maxUnusedTiles: 20, }; this._nodes = {}; @@ -28457,6 +38654,83 @@ var Graph = (function () { enumerable: true, 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} 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. * @@ -28481,24 +38755,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]; }; /** @@ -28518,8 +38787,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); @@ -28528,8 +38796,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); @@ -28538,18 +38806,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]; }; /** @@ -28602,6 +38866,77 @@ var Graph = (function () { 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} 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. * @@ -28636,8 +38971,7 @@ 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 spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch).pipe(operators_1.tap(function (imageByKeyFill) { for (var fillKey in imageByKeyFill) { if (!imageByKeyFill.hasOwnProperty(fillKey)) { continue; @@ -28654,11 +38988,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) { @@ -28672,14 +39004,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; @@ -28739,8 +39068,8 @@ var Graph = (function () { * Retrieve and cache geohash tiles for a node. * * @param {string} key - Key of node for which to retrieve tiles. - * @returns {Observable} Observable emitting the graph - * when the tiles required for the node has been cached. + * @returns {Array>} 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. */ @@ -28762,81 +39091,16 @@ var Graph = (function () { } if (!this.hasNode(key)) { throw new Error_1.GraphMapillaryError("Cannot cache tiles of node that does not exist in graph (" + key + ")."); - } - var hs = nodeTiles.cache.slice(); - 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._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 == 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); - var nodeIndexItem_1 = { - lat: node_1.latLon.lat, - lon: node_1.latLon.lon, - node: node_1, - }; - _this._nodeIndex.insert(nodeIndexItem_1); - _this._nodeIndexTiles[h].push(nodeIndexItem_1); - _this._nodeToTile[node_1.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]; - }) - .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 hs = nodeTiles.cache.slice(); + nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs); + nodeTiles.cache = []; + var cacheTiles$ = []; + 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); @@ -28846,8 +39110,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); @@ -28858,12 +39121,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++) { @@ -28928,6 +39188,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. @@ -28994,6 +39264,16 @@ var Graph = (function () { } 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 * all nodes in the spatial area of a node. @@ -29145,8 +39425,8 @@ var Graph = (function () { this._nodes = {}; this._nodeToTile = {}; this._preStored = {}; - for (var _c = 0, nodes_1 = nodes; _c < nodes_1.length; _c++) { - var node = nodes_1[_c]; + 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); @@ -29178,12 +39458,15 @@ var Graph = (function () { * @param {Array} 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.uncache = function (keepKeys) { + Graph.prototype.uncache = function (keepKeys, keepSequenceKey) { var keysInUse = {}; this._addNewKeys(keysInUse, this._cachingFull$); this._addNewKeys(keysInUse, this._cachingFill$); - this._addNewKeys(keysInUse, this._cachingTiles$); this._addNewKeys(keysInUse, this._cachingSpatialArea$); this._addNewKeys(keysInUse, this._requiredNodeTiles); this._addNewKeys(keysInUse, this._requiredSpatialArea); @@ -29225,8 +39508,43 @@ var Graph = (function () { }); for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) { var uncacheH = uncacheHs_1[_b]; - this._uncacheTile(uncacheH); + 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) { @@ -29254,7 +39572,8 @@ var Graph = (function () { var potentialSequences = []; for (var sequenceKey in this._sequences) { if (!this._sequences.hasOwnProperty(sequenceKey) || - sequenceKey in this._cachingSequences$) { + sequenceKey in this._cachingSequences$ || + sequenceKey === keepSequenceKey) { continue; } potentialSequences.push(this._sequences[sequenceKey]); @@ -29268,6 +39587,9 @@ var Graph = (function () { 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(); } }; @@ -29286,8 +39608,7 @@ 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] = { accessed: new Date().getTime(), @@ -29295,20 +39616,74 @@ var Graph = (function () { }; } 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; @@ -29339,11 +39714,10 @@ var Graph = (function () { } this._nodes[key] = node; }; - Graph.prototype._uncacheTile = function (h) { + 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._nodes[key]; delete this._nodeToTile[key]; if (key in this._cachedNodes) { delete this._cachedNodes[key]; @@ -29354,7 +39728,17 @@ var Graph = (function () { if (key in this._cachedSpatialEdges) { delete this._cachedSpatialEdges[key]; } - node.dispose(); + 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]; @@ -29363,6 +39747,33 @@ var Graph = (function () { 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; @@ -29376,34 +39787,21 @@ var Graph = (function () { return Graph; }()); exports.Graph = Graph; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Graph; -},{"../Edge":218,"../Error":219,"../Graph":221,"rbush":24,"rxjs/Subject":33,"rxjs/add/observable/from":40,"rxjs/add/operator/catch":49,"rxjs/add/operator/do":56,"rxjs/add/operator/finally":59,"rxjs/add/operator/map":62,"rxjs/add/operator/publish":68}],291:[function(require,module,exports){ -/// +},{"../Edge":276,"../Error":277,"../Graph":279,"rbush":26,"rxjs":27,"rxjs/operators":225}],391:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var geohash = require("latlon-geohash"); var THREE = require("three"); +var Error_1 = require("../Error"); var Geo_1 = require("../Geo"); -var GeoHashDirections = (function () { - function GeoHashDirections() { - } - return 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"; /** * @class GraphCalculator * * @classdesc Represents a calculator for graph entities. */ -var GraphCalculator = (function () { +var GraphCalculator = /** @class */ (function () { /** * Create a new graph calculator instance. * @@ -29455,31 +39853,57 @@ 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. @@ -29538,47 +39962,105 @@ var GraphCalculator = (function () { return GraphCalculator; }()); exports.GraphCalculator = GraphCalculator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GraphCalculator; -},{"../Geo":220,"latlon-geohash":20,"three":167}],292:[function(require,module,exports){ -"use strict"; -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); -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":277,"../Geo":278,"latlon-geohash":21,"three":226}],392:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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; + +},{}],393:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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$ = 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} Observable + * emitting the current graph mode when it changes. + */ + get: function () { + return this._graphMode$; + }, + enumerable: true, + 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>} 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. * @@ -29599,50 +40081,40 @@ var GraphService = (function () { */ GraphService.prototype.cacheNode$ = function (key) { var _this = this; - var firstGraphSubject$ = new Subject_1.Subject(); + var firstGraphSubject$ = new rxjs_1.Subject(); this._firstGraphSubjects$.push(firstGraphSubject$); - var firstGraph$ = firstGraphSubject$ - .publishReplay(1) - .refCount(); - var node$ = firstGraph$ - .map(function (graph) { + var firstGraph$ = firstGraphSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount()); + var node$ = firstGraph$.pipe(operators_1.map(function (graph) { return graph.getNode(key); - }) - .mergeMap(function (node) { + }), operators_1.mergeMap(function (node) { return node.assetsCached ? - Observable_1.Observable.of(node) : + rxjs_1.of(node) : node.cacheAssets$(); - }) - .publishReplay(1) - .refCount(); + }), 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$ - .first() - .mergeMap(function (graph) { + 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); } - }) - .finally(function () { + }), 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(); @@ -29652,93 +40124,78 @@ var GraphService = (function () { if (!initializeCacheSubscription.closed) { this._initializeCacheSubscriptions.push(initializeCacheSubscription); } - var sequenceSubscription = firstGraph$ - .mergeMap(function (graph) { + 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); } - }) - .finally(function () { + }), 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); }); if (!sequenceSubscription.closed) { this._sequenceSubscriptions.push(sequenceSubscription); } - 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 (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._removeFromArray(spatialSubscription, _this._spatialSubscriptions); - }) - .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. @@ -29749,17 +40206,44 @@ var GraphService = (function () { * @throws {Error} Propagates any IO node caching errors to the caller. */ GraphService.prototype.cacheSequence$ = function (sequenceKey) { - return this._graph$ - .first() - .mergeMap(function (graph) { + return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) { if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) { return graph.cacheSequence$(sequenceKey); } - return Observable_1.Observable.of(graph); - }) - .map(function (graph) { + 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} 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. @@ -29772,12 +40256,35 @@ var GraphService = (function () { */ GraphService.prototype.setFilter$ = function (filter) { this._resetSubscriptions(this._spatialSubscriptions); - return this._graph$ - .first() - .do(function (graph) { + 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. @@ -29794,11 +40301,11 @@ var GraphService = (function () { this._resetSubscriptions(this._initializeCacheSubscriptions); this._resetSubscriptions(this._sequenceSubscriptions); this._resetSubscriptions(this._spatialSubscriptions); - return this._graph$ - .first() - .do(function (graph) { + return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) { graph.reset(keepKeys); - }); + }), operators_1.map(function (graph) { + return undefined; + })); }; /** * Uncache the graph. @@ -29808,15 +40315,19 @@ var GraphService = (function () { * related to those nodes. * * @param {Array} 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} Observable emitting a single item, * the graph, when the graph has been uncached. */ - GraphService.prototype.uncache$ = function (keepKeys) { - return this._graph$ - .first() - .do(function (graph) { - graph.uncache(keepKeys); - }); + 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++) { @@ -29843,23 +40354,37 @@ var GraphService = (function () { return GraphService; }()); exports.GraphService = GraphService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GraphService; -},{"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/catch":49,"rxjs/add/operator/concat":51,"rxjs/add/operator/do":56,"rxjs/add/operator/expand":57,"rxjs/add/operator/finally":59,"rxjs/add/operator/first":60,"rxjs/add/operator/last":61,"rxjs/add/operator/map":62,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/publishReplay":69}],293:[function(require,module,exports){ -/// +},{"../Graph":279,"rxjs":27,"rxjs/operators":225}],394:[function(require,module,exports){ "use strict"; -var Subject_1 = require("rxjs/Subject"); -var ImageLoadingService = (function () { +Object.defineProperty(exports, "__esModule", { value: true }); +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(); + }), operators_1.publishReplay(1), operators_1.refCount()); this._loadstatus$.subscribe(function () { }); } Object.defineProperty(ImageLoadingService.prototype, "loadnode$", { @@ -29880,11 +40405,11 @@ var ImageLoadingService = (function () { }()); exports.ImageLoadingService = ImageLoadingService; -},{"rxjs/Subject":33}],294:[function(require,module,exports){ -/// +},{"rxjs":27,"rxjs/operators":225}],395:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Pbf = require("pbf"); -var MeshReader = (function () { +var MeshReader = /** @class */ (function () { function MeshReader() { } MeshReader.read = function (buffer) { @@ -29903,20 +40428,48 @@ var MeshReader = (function () { }()); exports.MeshReader = MeshReader; -},{"pbf":22}],295:[function(require,module,exports){ +},{"pbf":24}],396:[function(require,module,exports){ "use strict"; -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/map"); +Object.defineProperty(exports, "__esModule", { value: true }); +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; @@ -29934,6 +40487,8 @@ var Node = (function () { * * @returns {boolean} Value indicating whether all assets have been * cached. + * + * @ignore */ get: function () { return this._core != null && @@ -29967,7 +40522,8 @@ 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; @@ -29987,13 +40543,60 @@ var Node = (function () { enumerable: true, 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: true, + 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: true, + 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: true, + configurable: true + }); Object.defineProperty(Node.prototype, "computedCA", { /** * Get computedCA. * * @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; @@ -30039,6 +40642,8 @@ var Node = (function () { * * @returns {boolean} Value indicating whether the node has all * properties filled. + * + * @ignore */ get: function () { return this._fill != null; @@ -30104,6 +40709,21 @@ var Node = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Node.prototype, "image$", { + /** + * Get image$. + * + * @returns {Observable} Observable emitting + * the cached image when it is updated. + * + * @ignore + */ + get: function () { + return this._cache.image$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Node.prototype, "key", { /** * Get key. @@ -30205,6 +40825,20 @@ var Node = (function () { enumerable: true, 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: true, + configurable: true + }); Object.defineProperty(Node.prototype, "orientation", { /** * Get orientation. @@ -30257,12 +40891,29 @@ var Node = (function () { enumerable: true, 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: true, + configurable: true + }); Object.defineProperty(Node.prototype, "projectKey", { /** * Get projectKey. * * @returns {string} Unique key of the project to which - * the node belongs. + * 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 ? @@ -30308,7 +40959,7 @@ var Node = (function () { * the node belongs. */ get: function () { - return this._core.sequence.key; + return this._core.sequence_key; }, enumerable: true, configurable: true @@ -30330,8 +40981,12 @@ var Node = (function () { /** * Get sequenceEdges$. * + * @description Internal observable, should not be used as an API. + * * @returns {Observable} Observable emitting * values describing the status of the sequence edges. + * + * @ignore */ get: function () { return this._cache.sequenceEdges$; @@ -30356,8 +41011,12 @@ var Node = (function () { /** * Get spatialEdges$. * + * @description Internal observable, should not be used as an API. + * * @returns {Observable} Observable emitting * values describing the status of the spatial edges. + * + * @ignore */ get: function () { return this._cache.spatialEdges$; @@ -30412,20 +41071,31 @@ var Node = (function () { * * @returns {Observable} 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} 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) - .map(function (cache) { + return this._cache.cacheImage$(this.key, imageSize).pipe(operators_1.map(function () { return _this; - }); + })); }; /** * Cache the sequence edges. @@ -30434,6 +41104,7 @@ var Node = (function () { * internally by the library. * * @param {Array} edges - Sequence edges to cache. + * @ignore */ Node.prototype.cacheSequenceEdges = function (edges) { this._cache.cacheSequenceEdges(edges); @@ -30445,6 +41116,7 @@ var Node = (function () { * internally by the library. * * @param {Array} edges - Spatial edges to cache. + * @ignore */ Node.prototype.cacheSpatialEdges = function (edges) { this._cache.cacheSpatialEdges(edges); @@ -30453,6 +41125,7 @@ var Node = (function () { * Dispose the node. * * @description Disposes all cached assets. + * @ignore */ Node.prototype.dispose = function () { if (this._cache != null) { @@ -30469,6 +41142,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) { @@ -30483,6 +41157,7 @@ var Node = (function () { * the library. * * @param {IFillNode} fill - The fill node struct. + * @ignore */ Node.prototype.makeFull = function (fill) { if (fill == null) { @@ -30492,12 +41167,16 @@ var Node = (function () { }; /** * Reset the sequence edges. + * + * @ignore */ Node.prototype.resetSequenceEdges = function () { this._cache.resetSequenceEdges(); }; /** * Reset the spatial edges. + * + * @ignore */ Node.prototype.resetSpatialEdges = function () { this._cache.resetSpatialEdges(); @@ -30505,6 +41184,8 @@ var Node = (function () { /** * Clears the image and mesh assets, aborts * any outstanding requests and resets edges. + * + * @ignore */ Node.prototype.uncache = function () { if (this._cache == null) { @@ -30516,16 +41197,14 @@ var Node = (function () { return Node; }()); exports.Node = Node; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Node; -},{"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/map":62}],296:[function(require,module,exports){ +},{"rxjs/operators":225}],397:[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 }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Graph_1 = require("../Graph"); var Utils_1 = require("../Utils"); /** @@ -30533,7 +41212,7 @@ 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. */ @@ -30544,17 +41223,14 @@ var NodeCache = (function () { 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._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 Subject_1.Subject(); - this._spatialEdges$ = this._spatialEdgesChanged$ - .startWith(this._spatialEdges) - .publishReplay(1) - .refCount(); + 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; } @@ -30573,6 +41249,19 @@ var NodeCache = (function () { enumerable: true, configurable: true }); + Object.defineProperty(NodeCache.prototype, "image$", { + /** + * Get image$. + * + * @returns {Observable} Observable emitting + * the cached image when it is updated. + */ + get: function () { + return this._image$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(NodeCache.prototype, "loadStatus", { /** * Get loadStatus. @@ -30672,8 +41361,8 @@ var NodeCache = (function () { var imageSize = pano ? Utils_1.Settings.basePanoramaSize : Utils_1.Settings.baseImageSize; - this._cachingAssets$ = Observable_1.Observable - .combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged), function (imageStatus, meshStatus) { + 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) { @@ -30687,12 +41376,15 @@ 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$; }; /** @@ -30708,19 +41400,21 @@ var NodeCache = (function () { NodeCache.prototype.cacheImage$ = function (key, imageSize) { var _this = this; if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) { - return Observable_1.Observable.of(this); + return rxjs_1.of(this); } - return this._cacheImage$(key, imageSize) - .first(function (status) { + var cacheImage$ = this._cacheImage$(key, imageSize).pipe(operators_1.first(function (status) { return status.object != null; - }) - .do(function (status) { + }), operators_1.tap(function (status) { _this._disposeImage(); _this._image = status.object; - }) - .map(function (imageStatus) { + }), 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. @@ -30747,6 +41441,7 @@ var NodeCache = (function () { * all streams. */ NodeCache.prototype.dispose = function () { + this._iamgeSubscription.unsubscribe(); this._sequenceEdgesSubscription.unsubscribe(); this._spatialEdgesSubscription.unsubscribe(); this._disposeImage(); @@ -30755,6 +41450,7 @@ var NodeCache = (function () { 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; @@ -30790,9 +41486,9 @@ var NodeCache = (function () { */ NodeCache.prototype._cacheImage$ = function (key, imageSize) { var _this = this; - return Observable_1.Observable.create(function (subscriber) { + return rxjs_1.Observable.create(function (subscriber) { var xmlHTTP = new XMLHttpRequest(); - xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize), true); + xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize, Utils_1.Urls.origin), true); xmlHTTP.responseType = "arraybuffer"; xmlHTTP.timeout = 15000; xmlHTTP.onload = function (pe) { @@ -30853,7 +41549,7 @@ var NodeCache = (function () { */ 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(); @@ -30921,21 +41617,19 @@ var NodeCache = (function () { return NodeCache; }()); exports.NodeCache = NodeCache; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = NodeCache; }).call(this,require("buffer").Buffer) -},{"../Graph":221,"../Utils":226,"buffer":5,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/publishReplay":69}],297:[function(require,module,exports){ -/// +},{"../Graph":279,"../Utils":285,"buffer":7,"rxjs":27,"rxjs/operators":225}],398:[function(require,module,exports){ "use strict"; -var _ = require("underscore"); +Object.defineProperty(exports, "__esModule", { value: true }); /** * @class Sequence * * @classdesc Represents a sequence of ordered nodes. */ -var Sequence = (function () { +var Sequence = /** @class */ (function () { /** * Create a new sequene instance. * @@ -30986,7 +41680,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; } @@ -31002,7 +41696,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; } @@ -31013,12 +41707,11 @@ var Sequence = (function () { return Sequence; }()); exports.Sequence = Sequence; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Sequence; -},{"underscore":168}],298:[function(require,module,exports){ -/// +},{}],399:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Edge_1 = require("../../Edge"); var Error_1 = require("../../Error"); @@ -31028,7 +41721,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. * @@ -31092,6 +41785,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, @@ -31171,8 +41865,7 @@ var EdgeCalculator = (function () { if (potentialEdge.sequenceKey == null) { continue; } - if (potentialEdge.sameSequence || - !potentialEdge.sameMergeCC) { + if (potentialEdge.sameSequence) { continue; } if (nodeFullPano) { @@ -31242,6 +41935,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} potentialEdges - Potential edges. * @param {string} prevKey - Key of previous node in sequence. @@ -31253,7 +41949,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) { @@ -31266,7 +41962,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) { @@ -31316,6 +42012,9 @@ var EdgeCalculator = (function () { /** * 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} potentialEdges - Potential edges. * @throws {ArgumentMapillaryError} If node is not full. @@ -31325,7 +42024,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.turns) { @@ -31337,7 +42036,7 @@ var EdgeCalculator = (function () { var edge = null; for (var _i = 0, potentialEdges_3 = potentialEdges; _i < potentialEdges_3.length; _i++) { var potential = potentialEdges_3[_i]; - if (potential.fullPano) { + if (potential.croppedPano || potential.fullPano) { continue; } if (potential.distance > this._settings.turnMaxDistance) { @@ -31389,6 +42088,9 @@ var EdgeCalculator = (function () { /** * 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} potentialEdges - Potential edges. * @throws {ArgumentMapillaryError} If node is not full. @@ -31397,7 +42099,7 @@ var EdgeCalculator = (function () { if (!node.full) { throw new Error_1.ArgumentMapillaryError("Node has to be full."); } - if (node.fullPano) { + if (node.pano) { return []; } var lowestScore = Number.MAX_VALUE; @@ -31432,7 +42134,12 @@ var EdgeCalculator = (function () { ]; }; /** - * Computes the pano and step edges for a pano node. + * 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} potentialEdges - Potential edges. @@ -31460,6 +42167,9 @@ var EdgeCalculator = (function () { potentialPanos.push(potential); } else { + if (potential.croppedPano) { + continue; + } for (var k in this._directions.panos) { if (!this._directions.panos.hasOwnProperty(k)) { continue; @@ -31598,12 +42308,12 @@ var EdgeCalculator = (function () { return EdgeCalculator; }()); exports.EdgeCalculator = EdgeCalculator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EdgeCalculator; -},{"../../Edge":218,"../../Error":219,"../../Geo":220,"three":167}],299:[function(require,module,exports){ +},{"../../Edge":276,"../../Error":277,"../../Geo":278,"three":226}],400:[function(require,module,exports){ "use strict"; -var EdgeCalculatorCoefficients = (function () { +Object.defineProperty(exports, "__esModule", { value: true }); +var EdgeCalculatorCoefficients = /** @class */ (function () { function EdgeCalculatorCoefficients() { this.panoPreferredDistance = 2; this.panoMotion = 2; @@ -31624,13 +42334,13 @@ var EdgeCalculatorCoefficients = (function () { return EdgeCalculatorCoefficients; }()); exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EdgeCalculatorCoefficients; -},{}],300:[function(require,module,exports){ +},{}],401:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Edge_1 = require("../../Edge"); -var EdgeCalculatorDirections = (function () { +var EdgeCalculatorDirections = /** @class */ (function () { function EdgeCalculatorDirections() { this.steps = {}; this.turns = {}; @@ -31699,9 +42409,10 @@ var EdgeCalculatorDirections = (function () { }()); exports.EdgeCalculatorDirections = EdgeCalculatorDirections; -},{"../../Edge":218}],301:[function(require,module,exports){ +},{"../../Edge":276}],402:[function(require,module,exports){ "use strict"; -var EdgeCalculatorSettings = (function () { +Object.defineProperty(exports, "__esModule", { value: true }); +var EdgeCalculatorSettings = /** @class */ (function () { function EdgeCalculatorSettings() { this.panoMinDistance = 0.1; this.panoMaxDistance = 20; @@ -31733,11 +42444,11 @@ var EdgeCalculatorSettings = (function () { return EdgeCalculatorSettings; }()); exports.EdgeCalculatorSettings = EdgeCalculatorSettings; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EdgeCalculatorSettings; -},{}],302:[function(require,module,exports){ +},{}],403:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * Enumeration for edge directions * @enum {number} @@ -31792,43 +42503,34 @@ var EdgeDirection; */ EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar"; })(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {})); -; -},{}],303:[function(require,module,exports){ -/// +},{}],404:[function(require,module,exports){ "use strict"; -var _ = require("underscore"); +Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); 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"); +var rxjs_2 = require("rxjs"); var Render_1 = require("../Render"); -var DOMRenderer = (function () { +var DOMRenderer = /** @class */ (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._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$ - .scan(function (adaptive, operation) { + 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, - }) - .filter(function (adaptive) { + }), operators_1.filter(function (adaptive) { return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0; - }) - .map(function (adaptive) { + }), operators_1.map(function (adaptive) { var elementAspect = adaptive.elementWidth / adaptive.elementHeight; var ratio = adaptive.imageAspect / elementAspect; var verticalOffset = 0; @@ -31855,28 +42557,23 @@ var DOMRenderer = (function () { right: horizontalOffset, top: verticalOffset, }; - }); - this._currentFrame$ - .filter(function (frame) { + })); + this._currentFrame$.pipe(operators_1.filter(function (frame) { return frame.state.currentNode != null; - }) - .distinctUntilChanged(function (k1, k2) { + }), operators_1.distinctUntilChanged(function (k1, k2) { return k1 === k2; }, function (frame) { return frame.state.currentNode.key; - }) - .map(function (frame) { + }), operators_1.map(function (frame) { return frame.state.currentTransform.basicAspect; - }) - .map(function (aspect) { + }), operators_1.map(function (aspect) { return function (adaptive) { adaptive.imageAspect = aspect; return adaptive; }; - }) + })) .subscribe(this._adaptiveOperation$); - this._renderAdaptive$ - .scan(function (vNodeHashes, vNodeHash) { + rxjs_1.combineLatest(this._renderAdaptive$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) { if (vNodeHash.vnode == null) { delete vNodeHashes[vNodeHash.name]; } @@ -31884,29 +42581,33 @@ var DOMRenderer = (function () { vNodeHashes[vNodeHash.name] = vNodeHash.vnode; } return vNodeHashes; - }, {}) - .combineLatest(this._offset$) - .map(function (vo) { - var vNodes = _.values(vo[0]); + }, {})), 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; + } + 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", - zIndex: -1, }, }; return { name: "adaptiveDomRenderer", vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes), }; - }) + })) .subscribe(this._render$); - this._vNode$ = this._render$ - .scan(function (vNodeHashes, vNodeHash) { + this._vNode$ = this._render$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) { if (vNodeHash.vnode == null) { delete vNodeHashes[vNodeHash.name]; } @@ -31914,41 +42615,39 @@ var DOMRenderer = (function () { vNodeHashes[vNodeHash.name] = vNodeHash.vnode; } return vNodeHashes; - }, {}) - .map(function (vNodeHashes) { - var vNodes = _.values(vNodeHashes); + }, {}), operators_1.map(function (hashes) { + var vNodes = []; + for (var name_2 in hashes) { + if (!hashes.hasOwnProperty(name_2)) { + continue; + } + vNodes.push(hashes[name_2]); + } return vd.h("div.domRenderer", vNodes); - }); - this._vPatch$ = this._vNode$ - .scan(function (nodePatch, vNode) { + })); + 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 }) - .pluck("vpatch"); - this._element$ = this._vPatch$ - .scan(function (oldElement, vPatch) { + }, { 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) - .publishReplay(1) - .refCount(); + }, rootNode), operators_1.publishReplay(1), operators_1.refCount()); this._element$.subscribe(function () { }); - this._renderService.size$ - .map(function (size) { + 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$ - .map(function (renderMode) { + 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$", { @@ -31979,76 +42678,63 @@ var DOMRenderer = (function () { return DOMRenderer; }()); exports.DOMRenderer = DOMRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DOMRenderer; -},{"../Render":223,"rxjs/Subject":33,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/pluck":67,"rxjs/add/operator/scan":70,"underscore":168,"virtual-dom":173}],304:[function(require,module,exports){ + +},{"../Render":281,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],405:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var GLRenderStage; (function (GLRenderStage) { GLRenderStage[GLRenderStage["Background"] = 0] = "Background"; GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground"; })(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {})); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GLRenderStage; -},{}],305:[function(require,module,exports){ -/// +},{}],406:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); 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 Utils_1 = require("../Utils"); +var GLRenderer = /** @class */ (function () { + function GLRenderer(canvasContainer, renderService, dom) { 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._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._renderer$ = this._rendererOperation$ - .scan(function (renderer, operation) { + 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 }); - this._renderCollection$ = this._renderOperation$ - .scan(function (hashes, operation) { + }, { 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); - }, {}) - .share(); - this._renderCamera$ = this._renderCameraOperation$ - .scan(function (rc, operation) { + }, {}), 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$ - .startWith(function (eraser) { + }, { frameId: -1, needsRender: false, perspective: null })); + this._eraser$ = this._eraserOperation$.pipe(operators_1.startWith(function (eraser) { return eraser; - }) - .scan(function (eraser, operation) { + }), operators_1.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) { + }, { 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 }; - }) - .filter(function (co) { + }), operators_1.filter(function (co) { var needsRender = co.renderer.needsRender || co.camera.needsRender || co.eraser.needsRender; @@ -32061,12 +42747,11 @@ var GLRenderer = (function () { needsRender = needsRender || render.needsRender; } return needsRender; - }) - .distinctUntilChanged(function (n1, n2) { + }), 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; @@ -32095,8 +42780,7 @@ var GLRenderer = (function () { render(perspectiveCamera, renderer); } }); - this._renderFrame$ - .map(function (rc) { + this._renderFrame$.pipe(operators_1.map(function (rc) { return function (irc) { irc.frameId = rc.frameId; irc.perspective = rc.perspective; @@ -32105,53 +42789,45 @@ var GLRenderer = (function () { } return irc; }; - }) + })) .subscribe(this._renderCameraOperation$); this._renderFrameSubscribe(); - var renderHash$ = this._render$ - .map(function (hash) { + var renderHash$ = this._render$.pipe(operators_1.map(function (hash) { return function (hashes) { hashes[hash.name] = hash.render; return hashes; }; - }); - var clearHash$ = this._clear$ - .map(function (name) { + })); + var clearHash$ = this._clear$.pipe(operators_1.map(function (name) { return function (hashes) { delete hashes[name]; return hashes; }; - }); - Observable_1.Observable - .merge(renderHash$, clearHash$) + })); + rxjs_1.merge(renderHash$, clearHash$) .subscribe(this._renderOperation$); - this._webGLRenderer$ = this._render$ - .first() - .map(function (hash) { + 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(); + 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; - webGLRenderer.sortObjects = false; - element.appendChild(webGLRenderer.domElement); return webGLRenderer; - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); this._webGLRenderer$.subscribe(function () { }); - var createRenderer$ = this._webGLRenderer$ - .first() - .map(function (webGLRenderer) { + 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$ - .map(function (size) { + })); + var resizeRenderer$ = this._renderService.size$.pipe(operators_1.map(function (size) { return function (renderer) { if (renderer.renderer == null) { return renderer; @@ -32160,9 +42836,8 @@ var GLRenderer = (function () { renderer.needsRender = true; return renderer; }; - }); - var clearRenderer$ = this._clear$ - .map(function (name) { + })); + var clearRenderer$ = this._clear$.pipe(operators_1.map(function (name) { return function (renderer) { if (renderer.renderer == null) { return renderer; @@ -32170,15 +42845,12 @@ var GLRenderer = (function () { renderer.needsRender = true; return renderer; }; - }); - Observable_1.Observable - .merge(createRenderer$, resizeRenderer$, clearRenderer$) + })); + rxjs_1.merge(createRenderer$, resizeRenderer$, clearRenderer$) .subscribe(this._rendererOperation$); - var renderCollectionEmpty$ = this._renderCollection$ - .filter(function (hashes) { + var renderCollectionEmpty$ = this._renderCollection$.pipe(operators_1.filter(function (hashes) { return Object.keys(hashes).length === 0; - }) - .share(); + }), operators_1.share()); renderCollectionEmpty$ .subscribe(function (hashes) { if (_this._renderFrameSubscription == null) { @@ -32188,13 +42860,12 @@ var GLRenderer = (function () { _this._renderFrameSubscription = null; _this._renderFrameSubscribe(); }); - renderCollectionEmpty$ - .map(function (hashes) { + renderCollectionEmpty$.pipe(operators_1.map(function (hashes) { return function (eraser) { eraser.needsRender = true; return eraser; }; - }) + })) .subscribe(this._eraserOperation$); } Object.defineProperty(GLRenderer.prototype, "render$", { @@ -32216,54 +42887,65 @@ var GLRenderer = (function () { }; GLRenderer.prototype._renderFrameSubscribe = function () { var _this = this; - this._render$ - .first() - .map(function (renderHash) { + 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$ - .first() - .mergeMap(function (hash) { + this._renderFrameSubscription = this._render$.pipe(operators_1.first(), operators_1.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":223,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/startWith":75,"three":167}],306:[function(require,module,exports){ -/// + +},{"../Render":281,"../Utils":285,"rxjs":27,"rxjs/operators":225,"three":226}],407:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); 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; +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.currentAspect = 1; - this.currentPano = false; - this.previousAspect = 1; - this.previousPano = false; - this.renderMode = renderMode; - this._spatial = new Geo_1.Spatial(); + 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(50, perspectiveCameraAspect, 0.4, 10000); + 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(RenderCamera.prototype, "alpha", { + get: function () { + return this._alpha; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(RenderCamera.prototype, "camera", { get: function () { return this._camera; @@ -32273,7 +42955,7 @@ var RenderCamera = (function () { }); Object.defineProperty(RenderCamera.prototype, "changed", { get: function () { - return this.frameId === this._changedForFrame; + return this._frameId === this._changedForFrame; }, enumerable: true, configurable: true @@ -32282,13 +42964,6 @@ var RenderCamera = (function () { get: function () { return this._frameId; }, - set: function (value) { - this._frameId = value; - if (this._changed) { - this._changed = false; - this._changedForFrame = value; - } - }, enumerable: true, configurable: true }); @@ -32299,6 +42974,13 @@ var RenderCamera = (function () { enumerable: true, configurable: true }); + Object.defineProperty(RenderCamera.prototype, "renderMode", { + get: function () { + return this._renderMode; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(RenderCamera.prototype, "rotation", { get: function () { return this._rotation; @@ -32306,43 +42988,140 @@ var RenderCamera = (function () { enumerable: true, 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; + Object.defineProperty(RenderCamera.prototype, "zoom", { + get: function () { + return this._zoom; + }, + enumerable: true, + configurable: true + }); + 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._previousFov = this._computePreviousFov(); + } + 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); + this._perspective.lookAt(camera.lookat); + 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.updatePerspective = function (camera) { - this._perspective.up.copy(camera.up); - this._perspective.position.copy(camera.position); - this._perspective.lookAt(camera.lookat); - this._perspective.updateMatrix(); - this._perspective.updateMatrixWorld(false); + 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.updateRotation = function (camera) { - this._rotation = this._getRotation(camera); + RenderCamera.prototype._computeAspect = function (elementWidth, elementHeight) { + return elementWidth === 0 ? 0 : elementWidth / elementHeight; + }; + RenderCamera.prototype._computeCurrentFov = function () { + if (!this._currentNodeId) { + return this._initialFov; + } + return this._currentPano ? + this._yToFov(1, this._zoom) : + this._computeVerticalFov(this._currentProjectedPoints, this._renderMode, this._zoom, this.perspective.aspect); }; - RenderCamera.prototype._getVerticalFov = function (aspect, focal, zoom) { - return 2 * Math.atan(0.5 / (Math.pow(2, zoom) * aspect * focal)) * 180 / Math.PI; + RenderCamera.prototype._computeFov = function () { + this._currentFov = this._computeCurrentFov(); + this._previousFov = this._computePreviousFov(); + return this._interpolateFov(this._currentFov, this._previousFov, this._alpha); }; - RenderCamera.prototype._getAspect = function (nodeAspect, pano, perspectiveCameraAspect) { - if (pano) { - return 1; + RenderCamera.prototype._computePreviousFov = function () { + if (!this._currentNodeId) { + return this._initialFov; } - 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 !this._previousNodeId ? + this._currentFov : + this._previousPano ? + this._yToFov(1, this._zoom) : + this._computeVerticalFov(this._previousProjectedPoints, this._renderMode, this._zoom, this.perspective.aspect); }; - RenderCamera.prototype._getRotation = function (camera) { + RenderCamera.prototype._computeProjectedPoints = function (transform) { + var _this = this; + var os = [[0.5, 0], [1, 0]]; + var ds = [[0.5, 0], [0, 0.5]]; + var pointsPerSide = 100; + var basicPoints = []; + for (var side = 0; side < os.length; ++side) { + var o = os[side]; + var d = ds[side]; + for (var i = 0; i <= pointsPerSide; ++i) { + basicPoints.push([o[0] + d[0] * i / pointsPerSide, + o[1] + d[1] * i / pointsPerSide]); + } + } + 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 = _this._viewportCoords.worldToCamera(worldPoint, camera); + return [ + Math.abs(cameraPoint[0] / cameraPoint[2]), + Math.abs(cameraPoint[1] / cameraPoint[2]), + ]; + }); + return projectedPoints; + }; + 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 upProjection = direction.clone().dot(up); @@ -32351,14 +43130,37 @@ var RenderCamera = (function () { 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.RenderCamera = RenderCamera; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RenderCamera; -},{"../Geo":220,"../Render":223,"three":167}],307:[function(require,module,exports){ +},{"../Geo":278,"../Render":281,"../State":282,"three":226}],408:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * Enumeration for render mode * @enum {number} @@ -32390,122 +43192,65 @@ var RenderMode; */ RenderMode[RenderMode["Fill"] = 1] = "Fill"; })(RenderMode = exports.RenderMode || (exports.RenderMode = {})); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RenderMode; -},{}],308:[function(require,module,exports){ -/// -"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"); +},{}],409:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); +var rxjs_1 = require("rxjs"); var Geo_1 = require("../Geo"); var Render_1 = require("../Render"); -var RenderService = (function () { - function RenderService(element, currentFrame$, renderMode) { +var RenderService = /** @class */ (function () { + function RenderService(element, currentFrame$, renderMode, renderCamera) { var _this = this; this._element = element; this._currentFrame$ = currentFrame$; this._spatial = new Geo_1.Spatial(); renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill; - this._resize$ = new Subject_1.Subject(); - this._renderCameraOperation$ = new Subject_1.Subject(); + this._resize$ = new rxjs_1.Subject(); + this._renderCameraOperation$ = new rxjs_1.Subject(); this._size$ = - new BehaviorSubject_1.BehaviorSubject({ + new rxjs_1.BehaviorSubject({ height: this._element.offsetHeight, width: this._element.offsetWidth, }); - this._resize$ - .map(function () { + this._resize$.pipe(operators_1.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) { + this._renderMode$ = new rxjs_1.BehaviorSubject(renderMode); + this._renderCameraHolder$ = this._renderCameraOperation$.pipe(operators_1.startWith(function (rc) { return rc; - }) - .scan(function (rc, operation) { + }), operators_1.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-9) { - 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.updateRotation(camera); - rc.updateProjection(); - } - rc.frameId = frame.id; - }) - .map(function (args) { + }, !!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]; - }) - .publishReplay(1) - .refCount(); - this._renderCamera$ = this._renderCameraFrame$ - .filter(function (rc) { + }), operators_1.publishReplay(1), operators_1.refCount()); + this._renderCamera$ = this._renderCameraFrame$.pipe(operators_1.filter(function (rc) { return rc.changed; - }) - .publishReplay(1) - .refCount(); - this._bearing$ = this._renderCamera$ - .map(function (renderCamera) { - var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(renderCamera.rotation.phi)); + }), 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); - }) - .publishReplay(1) - .refCount(); - this._size$ - .skip(1) - .map(function (size) { + }), operators_1.publishReplay(1), operators_1.refCount()); + this._size$.pipe(operators_1.skip(1), operators_1.map(function (size) { return function (rc) { - rc.perspective.aspect = size.width / size.height; - rc.updateProjection(); + rc.setSize(size); return rc; }; - }) + })) .subscribe(this._renderCameraOperation$); - this._renderMode$ - .skip(1) - .map(function (rm) { + this._renderMode$.pipe(operators_1.skip(1), operators_1.map(function (rm) { return function (rc) { - rc.renderMode = rm; - rc.updateProjection(); + rc.setRenderMode(rm); return rc; }; - }) + })) .subscribe(this._renderCameraOperation$); this._bearing$.subscribe(function () { }); this._renderCameraHolder$.subscribe(function () { }); @@ -32565,49 +43310,177 @@ var RenderService = (function () { }); return RenderService; }()); -exports.RenderService = RenderService; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = RenderService; +exports.RenderService = RenderService; +exports.default = RenderService; + + +},{"../Geo":278,"../Render":281,"rxjs":27,"rxjs/operators":225}],410:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(FrameGenerator.prototype, "requestAnimationFrame", { + get: function () { + return this._requestAnimationFrame; + }, + enumerable: true, + configurable: true + }); + return FrameGenerator; +}()); +exports.FrameGenerator = FrameGenerator; +exports.default = FrameGenerator; + +},{}],411:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: 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; + }; + return RotationDelta; +}()); +exports.RotationDelta = RotationDelta; +exports.default = RotationDelta; -},{"../Geo":220,"../Render":223,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/skip":72,"rxjs/add/operator/startWith":75,"rxjs/add/operator/withLatestFrom":80}],309:[function(require,module,exports){ +},{}],412:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var State; (function (State) { - State[State["Traversing"] = 0] = "Traversing"; - State[State["Waiting"] = 1] = "Waiting"; + 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 = {})); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = State; -},{}],310:[function(require,module,exports){ +},{}],413:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var State_1 = require("../State"); var Geo_1 = require("../Geo"); -var StateContext = (function () { - function StateContext() { +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, }); } + 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(); + }; Object.defineProperty(StateContext.prototype, "state", { get: function () { - if (this._state instanceof State_1.TraversingState) { + if (this._state instanceof State_1.EarthState) { + return State_1.State.Earth; + } + else 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; } + else if (this._state instanceof State_1.InteractiveWaitingState) { + return State_1.State.WaitingInteractively; + } throw new Error("Invalid state"); }, enumerable: true, @@ -32714,470 +43587,1085 @@ var StateContext = (function () { StateContext.prototype.getCenter = function () { return this._state.getCenter(); }; - StateContext.prototype.setCenter = function (center) { - this._state.setCenter(center); + 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":278,"../State":282}],414:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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._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(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, "currentKey$", { + get: function () { + return this._currentKey$; + }, + 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, "inMotion$", { + get: function () { + return this._inMotion$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StateService.prototype, "inTranslation$", { + get: function () { + return this._inTranslation$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StateService.prototype, "appendNode$", { + get: function () { + return this._appendNode$; + }, + enumerable: true, + configurable: true + }); + StateService.prototype.earth = function () { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.earth(); }); + }; + StateService.prototype.traverse = function () { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.traverse(); }); + }; + StateService.prototype.wait = function () { + this._invokeContextOperation(function (context) { context.wait(); }); + }; + StateService.prototype.waitInteractively = function () { + this._invokeContextOperation(function (context) { context.waitInteractively(); }); + }; + 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(); }); }; - StateContext.prototype.setZoom = function (zoom) { - this._state.setZoom(zoom); + StateService.prototype.cutNodes = function () { + this._invokeContextOperation(function (context) { context.cut(); }); }; - StateContext.prototype.update = function (fps) { - this._state.update(fps); + StateService.prototype.setNodes = function (nodes) { + this._invokeContextOperation(function (context) { context.set(nodes); }); }; - StateContext.prototype.append = function (nodes) { - this._state.append(nodes); + StateService.prototype.rotate = function (delta) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotate(delta); }); }; - StateContext.prototype.prepend = function (nodes) { - this._state.prepend(nodes); + StateService.prototype.rotateUnbounded = function (delta) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateUnbounded(delta); }); }; - StateContext.prototype.remove = function (n) { - this._state.remove(n); + StateService.prototype.rotateWithoutInertia = function (delta) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateWithoutInertia(delta); }); }; - StateContext.prototype.clear = function () { - this._state.clear(); + StateService.prototype.rotateBasic = function (basicRotation) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); }); }; - StateContext.prototype.clearPrior = function () { - this._state.clearPrior(); + StateService.prototype.rotateBasicUnbounded = function (basicRotation) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); }); }; - StateContext.prototype.cut = function () { - this._state.cut(); + StateService.prototype.rotateBasicWithoutInertia = function (basicRotation) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateBasicWithoutInertia(basicRotation); }); }; - StateContext.prototype.set = function (nodes) { - this._state.set(nodes); + StateService.prototype.rotateToBasic = function (basic) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateToBasic(basic); }); }; - StateContext.prototype.rotate = function (delta) { - this._state.rotate(delta); + StateService.prototype.move = function (delta) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.move(delta); }); }; - StateContext.prototype.rotateBasic = function (basicRotation) { - this._state.rotateBasic(basicRotation); + StateService.prototype.moveTo = function (position) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.moveTo(position); }); }; - StateContext.prototype.rotateBasicUnbounded = function (basicRotation) { - this._state.rotateBasicUnbounded(basicRotation); + StateService.prototype.dolly = function (delta) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.dolly(delta); }); }; - StateContext.prototype.rotateToBasic = function (basic) { - this._state.rotateToBasic(basic); + 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} 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); + } + }; + 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.StateService = StateService; + +},{"../State":282,"rxjs":27,"rxjs/operators":225}],415:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enumeration for transition mode + * @enum {number} + * @readonly + * @description Modes for specifying how transitions + * between nodes are performed. + */ +var TransitionMode; +(function (TransitionMode) { + /** + * Default transitions. + * + * @description The viewer dynamically determines + * whether transitions should be performed with or + * without motion and blending for each transition + * based on the underlying data. + */ + TransitionMode[TransitionMode["Default"] = 0] = "Default"; + /** + * Instantaneous transitions. + * + * @description All transitions are performed + * without motion or blending. + */ + TransitionMode[TransitionMode["Instantaneous"] = 1] = "Instantaneous"; +})(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {})); +exports.default = TransitionMode; + +},{}],416:[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 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)); + }; + EarthState.prototype.truck = function (direction) { + this._camera.position.add(new THREE.Vector3().fromArray(direction)); + this._camera.lookat.add(new THREE.Vector3().fromArray(direction)); + }; + EarthState.prototype.update = function () { }; + return EarthState; +}(State_1.StateBase)); +exports.EarthState = EarthState; +exports.default = EarthState; + + +},{"../../State":282,"three":226}],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 }); +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; + } + 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); + } + }; + 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)); + }; + 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); + }; + 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(); + } + }; + 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.move = function (delta) { - this._state.move(delta); + 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.moveTo = function (delta) { - this._state.moveTo(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.zoomIn = function (delta, reference) { - this._state.zoomIn(delta, reference); + 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)); }; - return StateContext; -}()); -exports.StateContext = StateContext; - -},{"../Geo":220,"../State":224}],311:[function(require,module,exports){ -"use strict"; -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -var Subject_1 = require("rxjs/Subject"); -var AnimationFrame_1 = require("rxjs/util/AnimationFrame"); -require("rxjs/add/operator/bufferCount"); -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$ - .bufferCount(1, _this._fpsSampleRate) - .map(function (frameIds) { - 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._currentKey$ = new BehaviorSubject_1.BehaviorSubject(null); - nodeChangedSubject$ - .map(function (f) { - return f.state.currentNode.key; - }) - .subscribe(this._currentKey$); - 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._inMotionOperation$ = new Subject_1.Subject(); - nodeChanged$ - .map(function (frame) { - return true; - }) - .subscribe(this._inMotionOperation$); - this._inMotionOperation$ - .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._inMotionOperation$); - this._inMotion$ = this._inMotionOperation$ - .distinctUntilChanged() - .publishReplay(1) - .refCount(); - this._inTranslationOperation$ = new Subject_1.Subject(); - nodeChanged$ - .map(function (frame) { - return true; - }) - .subscribe(this._inTranslationOperation$); - this._inTranslationOperation$ - .distinctUntilChanged() - .filter(function (inTranslation) { - return inTranslation; - }) - .switchMap(function (inTranslation) { - return _this._currentState$ - .filter(function (frame) { - return frame.state.nodesAhead === 0; - }) - .map(function (frame) { - return frame.state.camera.position.clone(); - }) - .pairwise() - .map(function (pair) { - return pair[0].distanceToSquared(pair[1]) !== 0; - }) - .first(function (changed) { - return !changed; - }); - }) - .subscribe(this._inTranslationOperation$); - this._inTranslation$ = this._inTranslationOperation$ - .distinctUntilChanged() - .publishReplay(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 AnimationFrame_1.RequestAnimationFrameDefinition(window); - } - 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, "currentKey$", { - get: function () { - return this._currentKey$; - }, - 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, "inMotion$", { - get: function () { - return this._inMotion$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StateService.prototype, "inTranslation$", { - get: function () { - return this._inTranslation$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StateService.prototype, "appendNode$", { - get: function () { - return this._appendNode$; - }, - enumerable: true, - configurable: true - }); - StateService.prototype.traverse = function () { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.traverse(); }); + 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); }; - StateService.prototype.wait = function () { - this._invokeContextOperation(function (context) { context.wait(); }); + 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; }; - StateService.prototype.appendNodes = function (nodes) { - this._invokeContextOperation(function (context) { context.append(nodes); }); + 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)); }; - StateService.prototype.prependNodes = function (nodes) { - this._invokeContextOperation(function (context) { context.prepend(nodes); }); + 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); }; - StateService.prototype.removeNodes = function (n) { - this._invokeContextOperation(function (context) { context.remove(n); }); + 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.clearNodes = function () { - this._invokeContextOperation(function (context) { context.clear(); }); + 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.clearPriorNodes = function () { - this._invokeContextOperation(function (context) { context.clearPrior(); }); + 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; + } + this._rotationDelta.multiply(this._rotationAcceleration); + this._rotationDelta.threshold(this._rotationThreshold); }; - StateService.prototype.cutNodes = function () { - this._invokeContextOperation(function (context) { context.cut(); }); + 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.setNodes = function (nodes) { - this._invokeContextOperation(function (context) { context.set(nodes); }); + 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.rotate = function (delta) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.rotate(delta); }); + 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.rotateBasic = function (basicRotation) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); }); + InteractiveStateBase.prototype._setDesiredZoom = function () { + this._desiredZoom = + this._currentNode.fullPano || this._previousNode == null ? + this._zoom : 0; }; - StateService.prototype.rotateBasicUnbounded = function (basicRotation) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); }); + return InteractiveStateBase; +}(State_1.StateBase)); +exports.InteractiveStateBase = InteractiveStateBase; +exports.default = InteractiveStateBase; + + +},{"../../State":282,"three":226}],418:[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.rotateToBasic = function (basic) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.rotateToBasic(basic); }); +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +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.move = function (delta) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.move(delta); }); + InteractiveWaitingState.prototype.wait = function () { + return new State_1.WaitingState(this); }; - StateService.prototype.moveTo = function (position) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.moveTo(position); }); + InteractiveWaitingState.prototype.prepend = function (nodes) { + _super.prototype.prepend.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} reference - Reference point in basic coordinates. - */ - StateService.prototype.zoomIn = function (delta, reference) { - this._inMotionOperation$.next(true); - this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); }); + InteractiveWaitingState.prototype.set = function (nodes) { + _super.prototype.set.call(this, nodes); + this._motionless = this._motionlessTransition(); }; - StateService.prototype.getCenter = function () { - return this._lastState$ - .first() - .map(function (frame) { - return frame.state.getCenter(); - }); + InteractiveWaitingState.prototype.move = function (delta) { + this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); }; - StateService.prototype.getZoom = function () { - return this._lastState$ - .first() - .map(function (frame) { - return frame.state.zoom; - }); + InteractiveWaitingState.prototype.moveTo = function (position) { + this._alpha = Math.max(0, Math.min(1, position)); + }; + 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._inMotionOperation$.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._inMotionOperation$.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":224,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/bufferCount":48,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/pairwise":66,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/withLatestFrom":80,"rxjs/util/AnimationFrame":150}],312:[function(require,module,exports){ -/// +},{"../../State":282}],419:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); 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(); @@ -33188,8 +44676,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); this._trajectoryTransforms.push(transform); this._trajectoryCameras.push(new Geo_1.Camera(transform)); } @@ -33292,6 +44780,34 @@ var StateBase = (function () { enumerable: true, configurable: true }); + Object.defineProperty(StateBase.prototype, "transitionMode", { + get: function () { + return this._transitionMode; + }, + enumerable: true, + 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"); @@ -33365,6 +44881,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); @@ -33381,10 +44901,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 @@ -33433,8 +44953,8 @@ var StateBase = (function () { if (!node.assetsCached) { 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); this._trajectoryTransforms.push(transform); this._trajectoryCameras.push(new Geo_1.Camera(transform)); } @@ -33445,27 +44965,20 @@ var StateBase = (function () { if (!node.assetsCached) { 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); 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; @@ -33481,108 +44994,45 @@ var StateBase = (function () { }()); exports.StateBase = StateBase; -},{"../../Error":219,"../../Geo":220}],313:[function(require,module,exports){ -/// +},{"../../Error":277,"../../Geo":278,"../../State":282}],420:[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; +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); } - 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; + 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 }); +var UnitBezier = require("@mapbox/unitbezier"); +var State_1 = require("../../State"); +var TraversingState = /** @class */ (function (_super) { __extends(TraversingState, _super); function TraversingState(state) { var _this = _super.call(this, state) || this; _this._adjustCameras(); _this._motionless = _this._motionlessTransition(); _this._baseAlpha = _this._alpha; - _this._animationSpeed = 0.025; + _this._speedCoefficient = 1; _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._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; } - TraversingState.prototype.traverse = function () { - throw new Error("Not implemented"); + 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) { @@ -33601,155 +45051,23 @@ var TraversingState = (function (_super) { } _super.prototype.prepend.call(this, nodes); if (emptyTrajectory) { - this._setDesiredCenter(); - this._setDesiredZoom(); - } - }; - TraversingState.prototype.set = function (nodes) { - _super.prototype.set.call(this, nodes); - this._desiredLookat = null; - this._resetTransition(); - this._clearRotation(); - this._setDesiredCenter(); - this._setDesiredZoom(); - if (this._trajectory.length < 3) { - 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]; - 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(); - } - }; - TraversingState.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(); - } - }; - 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); + this._setDesiredCenter(); + this._setDesiredZoom(); + } }; - TraversingState.prototype.setZoom = function (zoom) { + TraversingState.prototype.set = function (nodes) { + _super.prototype.set.call(this, nodes); this._desiredLookat = null; - this._requestedRotationDelta = null; - this._requestedBasicRotation = null; - this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom); - this._desiredZoom = this._zoom; + this._resetTransition(); + this._clearRotation(); + this._setDesiredCenter(); + this._setDesiredZoom(); + if (this._trajectory.length < 3) { + this._useBezier = true; + } + }; + 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) { @@ -33763,7 +45081,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); } @@ -33772,12 +45090,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); @@ -33805,219 +45123,33 @@ var TraversingState = (function (_super) { this._baseAlpha = 0; this._motionless = this._motionlessTransition(); }; - TraversingState.prototype._applyRotation = function (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 += 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)); - }; - 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); - } - 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); - } - 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); - } - 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); - } - 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); - } - 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); - } - 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; - 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); - } - }; - TraversingState.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); - } - }; - 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); - } - else { - this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha); - } - this._requestedRotationDelta = null; - return; - } - if (this._rotationDelta.isZero) { - return; - } - 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 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]; - } - }; - 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]; - } - }; - TraversingState.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; - }; - TraversingState.prototype._setDesiredZoom = function () { - this._desiredZoom = - this._currentNode.fullPano || this._previousNode == null ? - this._zoom : 0; - }; return TraversingState; -}(State_1.StateBase)); +}(State_1.InteractiveStateBase)); exports.TraversingState = TraversingState; +exports.default = TraversingState; -},{"../../State":224,"three":167,"unitbezier":169}],314:[function(require,module,exports){ +},{"../../State":282,"@mapbox/unitbezier":2}],421:[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 }); var State_1 = require("../../State"); -var WaitingState = (function (_super) { +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; @@ -34025,8 +45157,8 @@ var WaitingState = (function (_super) { WaitingState.prototype.traverse = function () { return new State_1.TraversingState(this); }; - WaitingState.prototype.wait = function () { - throw new Error("Not implemented"); + WaitingState.prototype.waitInteractively = function () { + return new State_1.InteractiveWaitingState(this); }; WaitingState.prototype.prepend = function (nodes) { _super.prototype.prepend.call(this, nodes); @@ -34036,11 +45168,6 @@ var WaitingState = (function (_super) { _super.prototype.set.call(this, nodes); this._motionless = this._motionlessTransition(); }; - WaitingState.prototype.rotate = function (delta) { return; }; - WaitingState.prototype.rotateBasic = function (basicRotation) { return; }; - WaitingState.prototype.rotateBasicUnbounded = 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)); }; @@ -34050,12 +45177,9 @@ var WaitingState = (function (_super) { 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.round(this._alpha) : this._alpha; }; - ; WaitingState.prototype._setCurrentCamera = function () { _super.prototype._setCurrentCamera.call(this); this._adjustCameras(); @@ -34076,16 +45200,18 @@ var WaitingState = (function (_super) { return WaitingState; }(State_1.StateBase)); exports.WaitingState = WaitingState; +exports.default = WaitingState; -},{"../../State":224}],315:[function(require,module,exports){ +},{"../../State":282}],422:[function(require,module,exports){ "use strict"; -var Observable_1 = require("rxjs/Observable"); +Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); /** * @class ImageTileLoader * * @classdesc Represents a loader of image tiles. */ -var ImageTileLoader = (function () { +var ImageTileLoader = /** @class */ (function () { /** * Create a new node image tile loader instance. * @@ -34122,7 +45248,7 @@ var ImageTileLoader = (function () { characteristics + this._origin; var xmlHTTP = null; - return [Observable_1.Observable.create(function (subscriber) { + return [rxjs_1.Observable.create(function (subscriber) { xmlHTTP = new XMLHttpRequest(); xmlHTTP.open("GET", url, true); xmlHTTP.responseType = "arraybuffer"; @@ -34166,17 +45292,17 @@ var ImageTileLoader = (function () { return ImageTileLoader; }()); exports.ImageTileLoader = ImageTileLoader; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImageTileLoader; -},{"rxjs/Observable":28}],316:[function(require,module,exports){ +},{"rxjs":27}],423:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * @class ImageTileStore * * @classdesc Represents a store for image tiles. */ -var ImageTileStore = (function () { +var ImageTileStore = /** @class */ (function () { /** * Create a new node image tile store instance. */ @@ -34234,19 +45360,18 @@ var ImageTileStore = (function () { return ImageTileStore; }()); exports.ImageTileStore = ImageTileStore; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImageTileStore; -},{}],317:[function(require,module,exports){ -/// +},{}],424:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Geo_1 = require("../Geo"); /** * @class RegionOfInterestCalculator * * @classdesc Represents a calculator for regions of interest. */ -var RegionOfInterestCalculator = (function () { +var RegionOfInterestCalculator = /** @class */ (function () { function RegionOfInterestCalculator() { this._viewportCoords = new Geo_1.ViewportCoords(); } @@ -34261,26 +45386,28 @@ var RegionOfInterestCalculator = (function () { * @returns {IRegionOfInterest} A region of interest. */ RegionOfInterestCalculator.prototype.computeRegionOfInterest = function (renderCamera, size, transform) { - var canvasPoints = this._canvasBoundaryPoints(4); - var bbox = this._canvasPointsBoundingBox(canvasPoints, renderCamera, transform); + var viewportBoundaryPoints = this._viewportBoundaryPoints(4); + var bbox = this._viewportPointsBoundingBox(viewportBoundaryPoints, renderCamera, transform); this._clipBoundingBox(bbox); - var centralPixel = [ - [0.5 - 0.5 / size.width, 0.5 - 0.5 / size.height], - [0.5 + 0.5 / size.width, 0.5 - 0.5 / size.height], - [0.5 + 0.5 / size.width, 0.5 + 0.5 / size.height], - [0.5 - 0.5 / size.width, 0.5 + 0.5 / size.height], + 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._canvasPointsBoundingBox(centralPixel, renderCamera, transform); + 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), }; }; - RegionOfInterestCalculator.prototype._canvasBoundaryPoints = function (pointsPerSide) { + RegionOfInterestCalculator.prototype._viewportBoundaryPoints = function (pointsPerSide) { var points = []; - var os = [[0, 0], [1, 0], [1, 1], [0, 1]]; - var ds = [[1, 0], [0, 1], [-1, 0], [0, -1]]; + 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]; @@ -34291,11 +45418,12 @@ var RegionOfInterestCalculator = (function () { } return points; }; - RegionOfInterestCalculator.prototype._canvasPointsBoundingBox = function (canvasPoints, renderCamera, transform) { + RegionOfInterestCalculator.prototype._viewportPointsBoundingBox = function (viewportPoints, renderCamera, transform) { var _this = this; - var basicPoints = canvasPoints.map(function (point) { + var basicPoints = viewportPoints + .map(function (point) { return _this._viewportCoords - .canvasToBasic(point[0], point[1], 1, 1, transform, renderCamera.perspective); + .viewportToBasic(point[0], point[1], transform, renderCamera.perspective); }); if (transform.gpano != null) { return this._boundingBoxPano(basicPoints); @@ -34372,20 +45500,20 @@ var RegionOfInterestCalculator = (function () { return RegionOfInterestCalculator; }()); exports.RegionOfInterestCalculator = RegionOfInterestCalculator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RegionOfInterestCalculator; -},{"../Geo":220}],318:[function(require,module,exports){ -/// +},{"../Geo":278}],425:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var THREE = require("three"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); /** * @class TextureProvider * * @classdesc Represents a provider of textures. */ -var TextureProvider = (function () { +var TextureProvider = /** @class */ (function () { /** * Create a new node texture provider instance. * @@ -34409,17 +45537,12 @@ var TextureProvider = (function () { this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2)); this._currentLevel = -1; this._tileSize = tileSize; - this._updated$ = new Subject_1.Subject(); - this._createdSubject$ = new Subject_1.Subject(); - this._created$ = this._createdSubject$ - .publishReplay(1) - .refCount(); + 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 Subject_1.Subject(); - this._has$ = this._hasSubject$ - .startWith(false) - .publishReplay(1) - .refCount(); + 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 = {}; @@ -34523,6 +45646,10 @@ var TextureProvider = (function () { * 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(); @@ -34557,7 +45684,7 @@ var TextureProvider = (function () { 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.round(Math.log(size) / Math.log(2)))); + 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; @@ -34567,7 +45694,7 @@ var TextureProvider = (function () { this._renderedCurrentLevelTiles = {}; for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) { var tile = _a[_i]; - this._renderedCurrentLevelTiles[this._tileKey(tile)] = true; + this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true; } } var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]); @@ -34595,6 +45722,9 @@ var TextureProvider = (function () { } this._fetchTiles(tiles); }; + TextureProvider.prototype.setTileSize = function (tileSize) { + this._tileSize = tileSize; + }; /** * Update the image used as background for the texture. * @@ -34625,7 +45755,7 @@ var TextureProvider = (function () { var tile$ = getTile[0]; var abort = getTile[1]; this._abortFunctions.push(abort); - var tileKey = this._tileKey(tile); + var tileKey = this._tileKey(this._tileSize, tile); var subscription = tile$ .subscribe(function (image) { _this._renderToTarget(x, y, w, h, image); @@ -34657,7 +45787,7 @@ var TextureProvider = (function () { 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(tile); + var tileKey = this._tileKey(this._tileSize, tile); if (tileKey in this._renderedCurrentLevelTiles || tileKey in this._tileSubscriptions) { continue; @@ -34829,7 +45959,7 @@ var TextureProvider = (function () { } } this._renderedTiles[level].push(tile); - this._renderedCurrentLevelTiles[this._tileKey(tile)] = true; + this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true; }; /** * Create a tile key from a tile coordinates. @@ -34837,20 +45967,50 @@ var TextureProvider = (function () { * @description Tile keys are used as a hash for * storing the tile in a dictionary. * + * @param {number} tileSize - The tile size. * @param {Arrary} tile - The tile coordinates. */ - TextureProvider.prototype._tileKey = function (tile) { - return tile[0] + "-" + tile[1]; + TextureProvider.prototype._tileKey = function (tileSize, tile) { + return tileSize + "-" + tile[0] + "-" + tile[1]; }; return TextureProvider; }()); exports.TextureProvider = TextureProvider; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = TextureProvider; -},{"rxjs/Subject":33,"three":167}],319:[function(require,module,exports){ +},{"rxjs":27,"rxjs/operators":225,"three":226}],426:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DOM = /** @class */ (function () { + function DOM(doc) { + this._document = !!doc ? doc : document; + } + Object.defineProperty(DOM.prototype, "document", { + get: function () { + return this._document; + }, + enumerable: true, + 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; + +},{}],427:[function(require,module,exports){ "use strict"; -var EventEmitter = (function () { +Object.defineProperty(exports, "__esModule", { value: true }); +var EventEmitter = /** @class */ (function () { function EventEmitter() { this._events = {}; } @@ -34904,13 +46064,13 @@ var EventEmitter = (function () { return EventEmitter; }()); exports.EventEmitter = EventEmitter; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EventEmitter; -},{}],320:[function(require,module,exports){ +},{}],428:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Viewer_1 = require("../Viewer"); -var Settings = (function () { +var Settings = /** @class */ (function () { function Settings() { } Settings.setOptions = function (options) { @@ -34948,58 +46108,226 @@ var Settings = (function () { return Settings; }()); exports.Settings = Settings; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Settings; -},{"../Viewer":227}],321:[function(require,module,exports){ +},{"../Viewer":286}],429:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{}],430:[function(require,module,exports){ "use strict"; -var Urls = (function () { +Object.defineProperty(exports, "__esModule", { value: true }); +var Urls = /** @class */ (function () { function Urls() { } - Object.defineProperty(Urls, "tileScheme", { + Object.defineProperty(Urls, "explore", { get: function () { - return "https"; + return Urls._scheme + "://" + Urls._exploreHost; }, enumerable: true, configurable: true }); - Object.defineProperty(Urls, "tileDomain", { + Object.defineProperty(Urls, "origin", { get: function () { - return "d2qb1440i7l50o.cloudfront.net"; + return Urls._origin; }, enumerable: true, configurable: true }); - Object.defineProperty(Urls, "origin", { + Object.defineProperty(Urls, "tileScheme", { + get: function () { + return Urls._scheme; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Urls, "tileDomain", { get: function () { - return "mapillary.webgl"; + return Urls._imageTileHost; }, enumerable: true, configurable: true }); - Urls.thumbnail = function (key, size) { - return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=" + this.origin; + Urls.atomicReconstruction = function (key) { + return Urls._scheme + "://" + Urls._atomicReconstructionHost + "/" + key + "/sfm/v1.0/atomic_reconstruction.json"; + }; + 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.atomicReconstructionHost) { + Urls._atomicReconstructionHost = options.atomicReconstructionHost; + } + 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._atomicReconstructionHost = "d3necqxnn15whe.cloudfront.net"; + Urls._exploreHost = "www.mapillary.com"; + Urls._imageHost = "d1cuyjsrcm0gby.cloudfront.net"; + Urls._imageTileHost = "d2qb1440i7l50o.cloudfront.net"; + Urls._meshHost = "d1brzeo354iq2l.cloudfront.net"; + Urls._origin = "mapillary.webgl"; + Urls._scheme = "https"; return Urls; }()); exports.Urls = Urls; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Urls; -},{}],322:[function(require,module,exports){ +},{}],431:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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; + +},{}],432:[function(require,module,exports){ "use strict"; -require("rxjs/add/operator/bufferCount"); -require("rxjs/add/operator/delay"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/switchMap"); -var CacheService = (function () { +Object.defineProperty(exports, "__esModule", { value: true }); +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; @@ -35017,21 +46345,40 @@ var CacheService = (function () { if (this._started) { return; } - this._uncacheSubscription = this._stateService.currentState$ - .distinctUntilChanged(undefined, function (frame) { + this._uncacheSubscription = this._stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) { return frame.state.currentNode.key; - }) - .map(function (frame) { - return frame.state.trajectory + }), operators_1.map(function (frame) { + var trajectory = frame.state.trajectory; + var trajectoryKeys = trajectory .map(function (n) { return n.key; }); - }) - .bufferCount(1, 5) - .switchMap(function (keepKeysBuffer) { - var keepKeys = keepKeysBuffer[0]; - return _this._graphService.uncache$(keepKeys); - }) + 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; }; @@ -35041,25 +46388,40 @@ var CacheService = (function () { } 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; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = CacheService; -},{"rxjs/add/operator/bufferCount":48,"rxjs/add/operator/delay":53,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/map":62,"rxjs/add/operator/switchMap":76}],323:[function(require,module,exports){ +},{"../Graph":279,"rxjs":27,"rxjs/operators":225}],433:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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) { @@ -35067,19 +46429,27 @@ var ComponentController = (function () { this._subscribeCoverComponent(); } else { - this._navigator.movedToKey$ - .first(function (k) { + 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._observer.startEmit(); }); } } + Object.defineProperty(ComponentController.prototype, "navigable", { + get: function () { + return this._navigable; + }, + enumerable: true, + configurable: true + }); ComponentController.prototype.get = function (name) { return this._componentService.get(name); }; @@ -35087,16 +46457,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; @@ -35105,9 +46472,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"); @@ -35118,6 +46486,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; @@ -35129,30 +46499,48 @@ 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.stateService.currentKey$ - .first() - .switchMap(function (key) { - return key == null || key !== conf.key ? + 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$ - .first(); - }) - .subscribe(function (node) { + _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._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._componentService.activateCover(); + _this._setNavigable(conf.key == null); } }); }; @@ -35194,103 +46582,60 @@ var ComponentController = (function () { }()); exports.ComponentController = ComponentController; -},{"../Component":217}],324:[function(require,module,exports){ +},{"../Component":275,"rxjs/operators":225}],434:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Render_1 = require("../Render"); +var Utils_1 = require("../Utils"); var Viewer_1 = require("../Viewer"); -var Container = (function () { - function Container(id, stateService, options) { +var Container = /** @class */ (function () { + function Container(id, stateService, options, dom) { 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); + this._dom = !!dom ? dom : new Utils_1.DOM(); + this._container = this._dom.document.getElementById(id); + if (!this._container) { + throw new Error("Container '" + id + "' not found."); + } + 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: true, + configurable: true + }); + Object.defineProperty(Container.prototype, "canvasContainer", { + get: function () { + return this._canvasContainer; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Container.prototype, "domContainer", { + get: function () { + return this._domContainer; + }, + enumerable: true, + configurable: true + }); return Container; }()); exports.Container = Container; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Container; -},{"../Render":223,"../Viewer":227}],325:[function(require,module,exports){ +},{"../Render":281,"../Utils":285,"../Viewer":286}],435:[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"); -require("rxjs/add/operator/throttleTime"); -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); - }); - this._moveSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$) - .map(function (values) { - return values[0] || values[1] || values[2]; - }) - .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$ - .throttleTime(100) - .distinctUntilChanged(function (b1, b2) { - return Math.abs(b2 - b1) < 1; - }) - .subscribe(function (bearing) { - _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing); - }); - } - EventLauncher.prototype.dispose = function () { - this._bearingSubscription.unsubscribe(); - this._loadingSubscription.unsubscribe(); - this._currentNodeSubscription.unsubscribe(); - this._moveSubscription.unsubscribe(); - this._sequenceEdgesSubscription.unsubscribe(); - this._spatialEdgesSubscription.unsubscribe(); - }; - return EventLauncher; -}()); -exports.EventLauncher = EventLauncher; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = EventLauncher; - -},{"../Viewer":227,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/map":62,"rxjs/add/operator/throttleTime":79}],326:[function(require,module,exports){ -"use strict"; /** * Enumeration for image sizes * @enum {number} @@ -35317,52 +46662,70 @@ var ImageSize; ImageSize[ImageSize["Size2048"] = 2048] = "Size2048"; })(ImageSize = exports.ImageSize || (exports.ImageSize = {})); -},{}],327:[function(require,module,exports){ -/// -"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 () { +},{}],436:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(KeyboardService.prototype, "keyUp$", { + get: function () { + return this._keyUp$; + }, + enumerable: true, + configurable: true + }); + return KeyboardService; +}()); +exports.KeyboardService = KeyboardService; +exports.default = KeyboardService; + +},{"rxjs":27}],437:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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, 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 }); @@ -35373,149 +46736,108 @@ var LoadingService = (function () { return LoadingService; }()); exports.LoadingService = LoadingService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = LoadingService; -},{"rxjs/Subject":33,"rxjs/add/operator/debounceTime":52,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75,"underscore":168}],328:[function(require,module,exports){ -"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":27,"rxjs/operators":225}],438:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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(function () { }); - 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) { - Object.defineProperty(e, "movementX", { - configurable: false, - enumerable: false, - value: e.clientX - previous.clientX, - writable: false, - }); - } - if (e.movementY == null) { - Object.defineProperty(e, "movementY", { - configurable: false, - enumerable: false, - value: e.clientY - previous.clientY, - writable: false, - }); - } - 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 () { @@ -35531,6 +46853,55 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "documentMouseMove$", { + get: function () { + return this._documentMouseMove$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "documentMouseUp$", { + get: function () { + return this._documentMouseUp$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDragStart$", { + get: function () { + return this._domMouseDragStart$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDrag$", { + get: function () { + return this._domMouseDrag$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDragEnd$", { + get: function () { + return this._domMouseDragEnd$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDown$", { + get: function () { + return this._domMouseDown$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseMove$", { + get: function () { + return this._domMouseMove$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "mouseOwner$", { get: function () { return this._mouseOwner$; @@ -35559,6 +46930,20 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "mouseOut$", { + get: function () { + return this._mouseOut$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "mouseOver$", { + get: function () { + return this._mouseOver$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "mouseUp$", { get: function () { return this._mouseUp$; @@ -35573,6 +46958,20 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "dblClick$", { + get: function () { + return this._dblClick$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "contextMenu$", { + get: function () { + return this._consistentContextMenu$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "mouseWheel$", { get: function () { return this._mouseWheel$; @@ -35601,16 +47000,16 @@ var MouseService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(MouseService.prototype, "staticClick$", { + Object.defineProperty(MouseService.prototype, "proximateClick$", { get: function () { - return this._staticClick$; + return this._proximateClick$; }, enumerable: true, configurable: true }); - Object.defineProperty(MouseService.prototype, "preventDefaultMouseDown$", { + Object.defineProperty(MouseService.prototype, "staticClick$", { get: function () { - return this._preventMouseDown$; + return this._staticClick$; }, enumerable: true, configurable: true @@ -35621,42 +47020,118 @@ var MouseService = (function () { 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 observable$ - .withLatestFrom(this.mouseOwner$, function (event, owner) { - return [event, owner]; - }) - .filter(function (eo) { - return eo[1] === name; - }) - .map(function (eo) { - return eo[0]; - }); + 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; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = MouseService; -},{"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/withLatestFrom":80}],329:[function(require,module,exports){ -/// -"use strict"; -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -var Observable_1 = require("rxjs/Observable"); -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"); +},{"rxjs":27,"rxjs/operators":225}],439:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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 Navigator = (function () { - function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService) { +var Navigator = /** @class */ (function () { + function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService) { this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token); this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService(); this._graphService = graphService != null ? @@ -35664,15 +47139,18 @@ var Navigator = (function () { 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._stateService = stateService != null ? stateService : new State_1.StateService(options.transitionMode); this._cacheService = cacheService != null ? cacheService : new Viewer_1.CacheService(this._graphService, this._stateService); - this._cacheService.start(); - this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null); - this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null); - this._dirRequested$ = new BehaviorSubject_1.BehaviorSubject(null); - this._latLonRequested$ = new BehaviorSubject_1.BehaviorSubject(null); + this._playService = playService != null ? + playService : + new Viewer_1.PlayService(this._graphService, this._stateService); + 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 () { @@ -35681,23 +47159,23 @@ var Navigator = (function () { enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "graphService", { + Object.defineProperty(Navigator.prototype, "cacheService", { get: function () { - return this._graphService; + return this._cacheService; }, enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "imageLoadingService", { + Object.defineProperty(Navigator.prototype, "graphService", { get: function () { - return this._imageLoadingService; + return this._graphService; }, enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "keyRequested$", { + Object.defineProperty(Navigator.prototype, "imageLoadingService", { get: function () { - return this._keyRequested$; + return this._imageLoadingService; }, enumerable: true, configurable: true @@ -35716,6 +47194,13 @@ var Navigator = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Navigator.prototype, "playService", { + get: function () { + return this._playService; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Navigator.prototype, "stateService", { get: function () { return this._stateService; @@ -35724,30 +47209,19 @@ var Navigator = (function () { configurable: true }); Navigator.prototype.moveToKey$ = function (key) { - 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); - }); + 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.loadingService.startLoading(this._loadingName); - this._dirRequested$.next(direction); - return this.stateService.currentNode$ - .first() - .mergeMap(function (node) { + 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$) - .first() - .map(function (status) { + 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) { @@ -35755,140 +47229,674 @@ var Navigator = (function () { } } return null; - }); - }) - .mergeMap(function (directionKey) { + })); + }), operators_1.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.")); + _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._moveToKey$(directionKey); + })); + return this._makeRequest$(node$); }; Navigator.prototype.moveCloseTo$ = function (lat, lon) { var _this = this; - this.loadingService.startLoading(this._loadingName); - this._latLonRequested$.next({ lat: lat, lon: lon }); - return this.apiV3.imageCloseTo$(lat, lon) - .mergeMap(function (fullNode) { + 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 Observable_1.Observable - .throw(new Error("No image found close to lat " + lat + ", lon " + lon + ".")); + _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._moveToKey$(fullNode.key); + })); + return this._makeRequest$(node$); }; Navigator.prototype.setFilter$ = function (filter) { var _this = this; this._stateService.clearNodes(); - return this._movedToKey$ - .first() - .mergeMap(function (key) { + return this._movedToKey$.pipe(operators_1.first(), operators_1.mergeMap(function (key) { if (key != null) { - return _this._trajectoryKeys$() - .mergeMap(function (keys) { - return _this._graphService.setFilter$(filter) - .mergeMap(function (graph) { + return _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) { + return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () { return _this._cacheKeys$(keys); - }); - }) - .last(); + })); + }), operators_1.last()); } - return _this._keyRequested$ - .mergeMap(function (requestedKey) { + return _this._keyRequested$.pipe(operators_1.first(), operators_1.mergeMap(function (requestedKey) { if (requestedKey != null) { - return _this._graphService.setFilter$(filter) - .mergeMap(function (graph) { + return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () { return _this._graphService.cacheNode$(requestedKey); - }); + })); } - return _this._graphService.setFilter$(filter) - .map(function (graph) { + return _this._graphService.setFilter$(filter).pipe(operators_1.map(function () { return undefined; - }); - }); - }) - .map(function (node) { + })); + })); + }), 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$ - .first() - .do(function (key) { + return this._movedToKey$.pipe(operators_1.first(), operators_1.tap(function (key) { _this._apiV3.setToken(token); - }) - .mergeMap(function (key) { + }), operators_1.mergeMap(function (key) { return key == null ? - _this._graphService.reset$([]) - .map(function (graph) { - return undefined; - }) : - _this._trajectoryKeys$() - .mergeMap(function (keys) { - return _this._graphService.reset$(keys) - .mergeMap(function (graph) { + _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); - }); - }) - .last() - .map(function (node) { + })); + }), 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":274,"../Edge":276,"../Error":277,"../Graph":279,"../State":282,"../Viewer":286,"rxjs":27,"rxjs/operators":225}],440:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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, + configurable: true + }); + Object.defineProperty(Observer.prototype, "navigable$", { + get: function () { + return this._navigable$; + }, + enumerable: true, + configurable: true + }); + 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 [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])]; + })); + }; + 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); + }); + }; + Observer.prototype.stopEmit = function () { + if (!this.started) { + return; + } + this._started = false; + this._bearingSubscription.unsubscribe(); + this._currentNodeSubscription.unsubscribe(); + this._moveSubscription.unsubscribe(); + this._sequenceEdgesSubscription.unsubscribe(); + this._spatialEdgesSubscription.unsubscribe(); + this._viewerMouseEventSubscription.unsubscribe(); + this._bearingSubscription = null; + this._currentNodeSubscription = null; + this._moveSubscription = 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._mapMouseEvent$ = function (type, mouseEvent$) { + return mouseEvent$.pipe(operators_1.map(function (event) { + return [type, event]; + })); + }; + return Observer; +}()); +exports.Observer = Observer; +exports.default = Observer; + +},{"../Viewer":286,"rxjs":27,"rxjs/operators":225}],441:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); +var Edge_1 = require("../Edge"); +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._playing; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PlayService.prototype, "direction$", { + get: function () { + return this._direction$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PlayService.prototype, "playing$", { + get: function () { + return this._playing$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PlayService.prototype, "speed$", { + get: function () { + return this._speed$; + }, + enumerable: true, + configurable: true + }); + PlayService.prototype.play = function () { + var _this = this; + 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); + }); + 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$).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; + }), 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._cacheKeys$ = function (keys) { - var _this = this; - var cacheNodes$ = keys - .map(function (key) { - return _this._graphService.cacheNode$(key); - }); - return Observable_1.Observable - .from(cacheNodes$) - .mergeAll(); + PlayService.prototype.setDirection = function (direction) { + this._directionSubject$.next(direction); }; - Navigator.prototype._trajectoryKeys$ = function () { - return this._stateService.currentState$ - .first() - .map(function (frame) { - return frame.state.trajectory - .map(function (node) { - return node.key; - }); - }); + 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); }; - return Navigator; + 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; + 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 !!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":216,"../Edge":218,"../Graph":221,"../State":224,"../Viewer":227,"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/add/observable/throw":45,"rxjs/add/operator/do":56,"rxjs/add/operator/finally":59,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/mergeMap":65}],330:[function(require,module,exports){ +},{"../Edge":276,"../Graph":279,"rxjs":27,"rxjs/operators":225}],442:[function(require,module,exports){ "use strict"; -var SpriteAlignment; -(function (SpriteAlignment) { - SpriteAlignment[SpriteAlignment["Center"] = 0] = "Center"; - SpriteAlignment[SpriteAlignment["Start"] = 1] = "Start"; - SpriteAlignment[SpriteAlignment["End"] = 2] = "End"; -})(SpriteAlignment = exports.SpriteAlignment || (exports.SpriteAlignment = {})); Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SpriteAlignment; +var THREE = require("three"); +var Geo_1 = require("../Geo"); +var Projection = /** @class */ (function () { + function Projection(geoCoords, viewportCoords) { + this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords(); + this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); + } + Projection.prototype.basicToCanvas = function (basicPoint, container, render, transform) { + return this._viewportCoords + .basicToCanvas(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; + }; + return Projection; +}()); +exports.Projection = Projection; +exports.default = Projection; -},{}],331:[function(require,module,exports){ -/// +},{"../Geo":278,"three":226}],443:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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", { @@ -35934,15 +47942,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) { @@ -35957,27 +47962,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; } @@ -36005,20 +48020,16 @@ 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(); + }, new SpriteAtlas()), operators_1.publishReplay(1), operators_1.refCount()); this._spriteAtlas$.subscribe(function () { }); if (sprite == null) { return; @@ -36067,163 +48078,94 @@ var SpriteService = (function () { return SpriteService; }()); exports.SpriteService = SpriteService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SpriteService; -},{"../Viewer":227,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75,"three":167,"virtual-dom":173}],332:[function(require,module,exports){ -"use strict"; -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -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":286,"rxjs":27,"rxjs/operators":225,"three":226,"virtual-dom":231}],444:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false); - this._active$ = this._activeSubject$ - .distinctUntilChanged() - .publishReplay(1) - .refCount(); - 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(function () { }); - 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._singleTouchMoveStart$ = singleTouchStart$ - .mergeMap(function (e) { - return _this._singleTouchMove$ - .takeUntil(Observable_1.Observable.merge(touchStop$, multipleTouchStart$)) - .take(1); - }); - this._singleTouchMoveEnd$ = singleTouchStart$ - .mergeMap(function (e) { - return Observable_1.Observable - .merge(touchStop$, multipleTouchStart$) - .first(); - }); - 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]; @@ -36244,31 +48186,29 @@ 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 () { @@ -36284,6 +48224,13 @@ var TouchService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(TouchService.prototype, "doubleTap$", { + get: function () { + return this._doubleTap$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(TouchService.prototype, "touchStart$", { get: function () { return this._touchStart$; @@ -36312,23 +48259,23 @@ var TouchService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(TouchService.prototype, "singleTouchMoveStart$", { + Object.defineProperty(TouchService.prototype, "singleTouchDragStart$", { get: function () { - return this._singleTouchMoveStart$; + return this._singleTouchDragStart$; }, enumerable: true, configurable: true }); - Object.defineProperty(TouchService.prototype, "singleTouchMove$", { + Object.defineProperty(TouchService.prototype, "singleTouchDrag$", { get: function () { - return this._singleTouch$; + return this._singleTouchDrag$; }, enumerable: true, configurable: true }); - Object.defineProperty(TouchService.prototype, "singleTouchMoveEnd$", { + Object.defineProperty(TouchService.prototype, "singleTouchDragEnd$", { get: function () { - return this._singleTouchMoveEnd$; + return this._singleTouchDragEnd$; }, enumerable: true, configurable: true @@ -36340,9 +48287,16 @@ var TouchService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(TouchService.prototype, "preventDefaultTouchMove$", { + Object.defineProperty(TouchService.prototype, "pinchStart$", { + get: function () { + return this._pinchStart$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TouchService.prototype, "pinchEnd$", { get: function () { - return this._preventTouchMove$; + return this._pinchEnd$; }, enumerable: true, configurable: true @@ -36351,55 +48305,174 @@ var TouchService = (function () { }()); exports.TouchService = TouchService; -},{"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76}],333:[function(require,module,exports){ -/// +},{"rxjs":27,"rxjs/operators":225}],445:[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 }); +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. * + * @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("")`. + * 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} id - Required `id` of a 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. - * @param {string} [token] - Optional bearer token for API requests of + * @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("")`. + * @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("", "", ""); + * ``` */ function Viewer(id, clientId, key, options, token) { var _this = _super.call(this) || this; options = options != null ? options : {}; Utils_1.Settings.setOptions(options); - _this._navigator = new Viewer_1.Navigator(clientId, token); + Utils_1.Urls.setOptions(options.url); + _this._navigator = new Viewer_1.Navigator(clientId, options, token); _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); + _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: true, + configurable: true + }); /** * 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); @@ -36414,6 +48487,11 @@ var Viewer = (function (_super) { * 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); @@ -36437,12 +48515,16 @@ var Viewer = (function (_super) { * * @returns {Promise} 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$ - .first() + _this._container.renderService.bearing$.pipe(operators_1.first()) .subscribe(function (bearing) { resolve(bearing); }, function (error) { @@ -36451,16 +48533,21 @@ var Viewer = (function (_super) { }); }; /** - * Get the basic coordinates of the current photo that is + * 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 - * photo. + * image. * * @returns {Promise} Promise to the basic coordinates - * of the current photo at the center for the viewport. + * 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; @@ -36478,15 +48565,33 @@ var Viewer = (function (_super) { * * @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); }; /** - * Get the photo's current zoom level. + * Returns the viewer's containing HTML element. + * + * @returns {HTMLElement} The viewer's container. + */ + Viewer.prototype.getContainer = function () { + return this._container.element; + }; + /** + * Get the image's current zoom level. * * @returns {Promise} Promise to the viewers's current * zoom level. + * + * @example + * ``` + * viewer.getZoom().then((z) => { console.log(z); }); + * ``` */ Viewer.prototype.getZoom = function () { var _this = this; @@ -36502,17 +48607,32 @@ var Viewer = (function (_super) { /** * 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 {Number} lat - Latitude, in degrees. * @param {Number} lon - Longitude, in degrees. * @returns {Promise} 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 {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.moveCloseTo = function (lat, lon) { - var _this = this; + 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.moveCloseTo$(lat, lon).subscribe(function (node) { + moveCloseTo$.subscribe(function (node) { resolve(node); }, function (error) { reject(error); @@ -36529,13 +48649,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 {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); @@ -36543,31 +48673,75 @@ var Viewer = (function (_super) { }); }; /** - * Navigate to a given photo key. + * Navigate to a given image key. * - * @param {string} key - A valid Mapillary photo key. + * @param {string} key - A valid Mapillary image key. * @returns {Promise} Promise to the node that was navigated to. * @throws {Error} Propagates any IO errors to the caller. + * @throws {Error} When viewer is not navigable. + * @throws {AbortMapillaryError} When a subsequent move request is made + * before the move to key call has completed. + * + * @example + * ``` + * viewer.moveToKey("").then( + * (n) => { console.log(n); }, + * (e) => { console.error(e); }); + * ``` */ Viewer.prototype.moveToKey = function (key) { - var _this = this; + 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.moveToKey$(key).subscribe(function (node) { + moveToKey$.subscribe(function (node) { resolve(node); }, 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. + * + * @param {Array} basicPoint - Basic images coordinates to project. + * @returns {Promise>} 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 a bearer token for authenticated API requests of @@ -36578,17 +48752,30 @@ var Viewer = (function (_super) { * viewer will make unauthenticated requests. * * Calling setAuthToken aborts all outstanding move requests. - * The promises of those move requests will be rejected and - * the rejections need to be caught. + * 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} Promise that resolves after token * is set. + * + * @throws {Error} When viewer is not navigable. + * + * @example + * ``` + * viewer.setAuthToken("") + * .then(() => { console.log("token set"); }); + * ``` */ Viewer.prototype.setAuthToken = function (token) { - var _this = this; + 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) { - _this._navigator.setToken$(token) + setToken$ .subscribe(function () { resolve(undefined); }, function (error) { @@ -36597,16 +48784,21 @@ var Viewer = (function (_super) { }); }; /** - * Set the basic coordinates of the current photo to be in the + * Set the basic coordinates of the current image to be in the * center of the viewport. * * @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 - * photo. + * image. * * @param {number[]} The basic coordinates of the current - * photo to be at the center for the viewport. + * image to be at the center for the viewport. + * + * @example + * ``` + * viewer.setCenter([0.5, 0.5]); + * ``` */ Viewer.prototype.setCenter = function (center) { this._navigator.stateService.setCenter(center); @@ -36641,8 +48833,9 @@ var Viewer = (function (_super) { * * `["all", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn` * - * A key must be a string that identifies a node property name. A value must be - * a string, number, or boolean. Strictly-typed comparisons are used. The values + * 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. @@ -36650,7 +48843,10 @@ var Viewer = (function (_super) { * @param {FilterExpression} filter - The filter expression. * @returns {Promise} Promise that resolves after filter is applied. * - * @example `viewer.setFilter(["==", "sequenceKey", ""]);` + * @example + * ``` + * viewer.setFilter(["==", "sequenceKey", ""]); + * ``` */ Viewer.prototype.setFilter = function (filter) { var _this = this; @@ -36668,70 +48864,219 @@ var Viewer = (function (_super) { * * @param {RenderMode} renderMode - Render mode. * - * @example `viewer.setRenderMode(Mapillary.RenderMode.Letterbox);` + * @example + * ``` + * viewer.setRenderMode(Mapillary.RenderMode.Letterbox); + * ``` */ Viewer.prototype.setRenderMode = function (renderMode) { this._container.renderService.renderMode$.next(renderMode); }; /** - * Set the photo's current zoom level. + * Set the viewer's transition mode. + * + * @param {TransitionMode} transitionMode - Transition mode. + * + * @example + * ``` + * viewer.setTransitionMode(Mapillary.TransitionMode.Instantaneous); + * ``` + */ + Viewer.prototype.setTransitionMode = function (transitionMode) { + this._navigator.stateService.setTransitionMode(transitionMode); + }; + /** + * 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 photo to the view whereas three + * Zero means zooming out to fit the image to the view whereas three * shows the highest level of detail. * - * @param {number} The photo's current zoom level. + * @param {number} The image's current zoom level. + * + * @example + * ``` + * viewer.setZoom(2); + * ``` */ 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`. + * + * @param {Array} pixelPoint - Pixel coordinates to unproject. + * @returns {Promise} 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._observer.unproject$(pixelPoint) + .subscribe(function (latLon) { + resolve(latLon); + }, function (error) { + reject(error); + }); + }); + }; + /** + * Unproject canvas pixel coordinates to basic image coordinates for the + * current node. + * + * @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} pixelPoint - Pixel coordinates to unproject. + * @returns {Promise} Promise to the basic coordinates corresponding + * to the pixel point. + * + * @example + * ``` + * viewer.unprojectToBasic([100, 100]) + * .then((basicPoint) => { console.log(basicPoint); }); + * ``` + */ + Viewer.prototype.unprojectToBasic = function (pixelPoint) { + var _this = this; + return when.promise(function (resolve, reject) { + _this._observer.unprojectBasic$(pixelPoint) + .subscribe(function (basicPoint) { + resolve(basicPoint); + }, function (error) { + reject(error); + }); + }); + }; + /** + * Fired when the viewing direction of the camera changes. + * + * @description Related to the computed compass angle + * ({@link Node.computedCa}) from SfM, not the original EXIF compass + * angle. + * + * @event + * @type {number} bearing - Value indicating the current bearing + * measured in degrees clockwise with respect to north. + */ + Viewer.bearingchanged = "bearingchanged"; + /** + * Fired when a pointing device (usually a mouse) is pressed and released at + * the same point in the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.click = "click"; + /** + * Fired when the right button of the mouse is clicked within the viewer. + * @event + * @type {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 {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.dblclick = "dblclick"; + /** + * Fired when the viewer is loading more data. + * @event + * @type {boolean} loading - Boolean indicating whether the viewer is loading. + */ + Viewer.loadingchanged = "loadingchanged"; + /** + * Fired when a pointing device (usually a mouse) is pressed within the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + 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 {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mousemove = "mousemove"; + /** + * Fired when a pointing device (usually a mouse) leaves the viewer's canvas. + * @event + * @type {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 {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mouseover = "mouseover"; + /** + * Fired when a pointing device (usually a mouse) is released within the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mouseup = "mouseup"; + /** + * 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. + */ + Viewer.nodechanged = "nodechanged"; + /** + * Fired every time the sequence edges of the current node changes. + * @event + * @type {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. + */ + Viewer.spatialedgeschanged = "spatialedgeschanged"; return Viewer; }(Utils_1.EventEmitter)); -/** - * Fired when the viewing direction of the camera changes. - * @event - * @type {boolean} bearing - Value indicating the current bearing - * measured in degrees clockwise with respect to north. - */ -Viewer.bearingchanged = "bearingchanged"; -/** - * Fired when the viewer is loading more data. - * @event - * @type {boolean} loading - Value indicating whether the viewer is loading. - */ -Viewer.loadingchanged = "loadingchanged"; -/** - * Fired when the viewer finishes transitioning and is in a fixed - * position with a fixed point of view. - * @event - */ -Viewer.moveend = "moveend"; -/** - * Fired when the viewer starts transitioning from one view to another, - * either by changing the node or by interaction such as pan and zoom. - * @event - */ -Viewer.movestart = "movestart"; -/** - * Fired every time the viewer navigates to a new node. - * @event - * @type {Node} node - Current node. - */ -Viewer.nodechanged = "nodechanged"; -/** - * Fired every time the sequence edges of the current node changes. - * @event - * @type {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. - */ -Viewer.spatialedgeschanged = "spatialedgeschanged"; exports.Viewer = Viewer; -},{"../Utils":226,"../Viewer":227,"when":214}]},{},[222])(222) +},{"../Utils":285,"../Viewer":286,"rxjs":27,"rxjs/operators":225,"when":272}]},{},[280])(280) }); //# sourceMappingURL=mapillary.js.map