UNPKG

react-animation-engine

Version:

Extract famo.us transitionable capabilities in 14kb for react. Mixin to transition between state values.

982 lines (911 loc) 79.2 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define(factory); else if(typeof exports === 'object') exports["FamousAnimations"] = factory(); else root["FamousAnimations"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; Object.defineProperty(exports, '__esModule', { value: true }); // import {PropertyAnimator} from './animator'; var _TransitionableMixin = __webpack_require__(1); var _TransitionableMixin2 = _interopRequireWildcard(_TransitionableMixin); var _Transitionable = __webpack_require__(2); var _Transitionable2 = _interopRequireWildcard(_Transitionable); var _Easing = __webpack_require__(3); var _Easing2 = _interopRequireWildcard(_Easing); exports.TransitionableMixin = _TransitionableMixin2['default']; exports.Transitionable = _Transitionable2['default']; exports.Easing = _Easing2['default']; // PropertyAnimator /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; var _defineProperty = function (obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: key == null || typeof Symbol == 'undefined' || key.constructor !== Symbol, configurable: true, writable: true }); }; Object.defineProperty(exports, '__esModule', { value: true }); var _Transitionable = __webpack_require__(2); var _Transitionable2 = _interopRequireWildcard(_Transitionable); var _Easing = __webpack_require__(3); var _Easing2 = _interopRequireWildcard(_Easing); function TransitionableMixin(props) { props = [].concat(props); var _transitionables = {}; var mixin = { componentWillUnmount: function componentWillUnmount() { props.forEach(function (p) { delete _transitionables[p]; }); }, componentWillMount: function componentWillMount() { var _this = this; props.forEach(function (p) { // Create a transitionable _transitionables[p] = new _Transitionable2['default'](_this.state[p]); // Define a property var property = p; Object.defineProperty(_this, property, { get: function get() { return _transitionables[property].get(); }, set: function set(v) { /* {value, duration , animation} */ if (typeof v != 'object') { v = { value: v }; } // Store the value var value = v.value; delete v.value; // Use 'inSine' as default curve if (!v.curve) { v.curve = _Easing2['default'].inSine; } this.tween(property, value, v); } }); var trans = _transitionables[property]; trans.update(_this._syncProp.bind(_this, property)); _this._syncProp(property); }); }, _syncProp: function _syncProp(prop) { var trans = _transitionables[prop]; var state = _defineProperty({}, prop, trans.get()); this.setState(state); }, tween: function tween(prop, value, animation, callback) { var trans = _transitionables[prop]; trans.val(value, animation, callback); }, halt: function halt(prop) { if (prop) { var trans = _transitionables[p]; trans.halt(); return; } else { props.forEach(function (p) { var trans = _transitionables[p]; trans.halt(); }); } } }; return mixin; } exports['default'] = TransitionableMixin; module.exports = exports['default']; /***/ }, /* 2 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var FamousTransitionable = __webpack_require__(4); var allowAnimations = false; var animationID = null; var transitionables = []; var listeners = []; function haveAllFinishedAnimating() { return transitionables.map(function (t) { return t._isAnimating; }).reduce(function (final, tIsAnimating) { return final && !tIsAnimating; }, true); } function executeListeners() { for (var ls in listeners) { listeners[ls](); } } function requestCancelation() { if (haveAllFinishedAnimating()) { cancelAnimationFrame(animationID); allowAnimations = false; animationID = null; } } // Setup animation function animate() { if (!allowAnimations) { return; }executeListeners(); animationID = requestAnimationFrame(animate); } var Transitionable = (function (_FamousTransitionable) { function Transitionable(value) { var _this = this; _classCallCheck(this, Transitionable); _get(Object.getPrototypeOf(Transitionable.prototype), 'constructor', this).call(this, value); // Configure for globals transitionables.push(this); this._listenerFn = function () { return _this._executeListeners(); }; listeners.push(this._listenerFn); this._isAnimating = false; } _inherits(Transitionable, _FamousTransitionable); _createClass(Transitionable, [{ key: 'update', value: function update(fn) { this._listeners = this._listeners || []; this._listeners.push(fn); } }, { key: 'val', value: function val(value, animation, complete) { var self = this; // Call the original set self.set(value, animation, function () { // Last time execution if (animationID) { self._isAnimating = false; } requestCancelation(); if (complete) { complete(); }; }); // Prepare for animation self._isAnimating = true; allowAnimations = true; // Request animation start animate(); } }, { key: '_executeListeners', value: function _executeListeners() { var _this2 = this; // Execute listeners if (this._listeners) { this._listeners.forEach(function (fn) { return fn(_this2.get()); }); } } }]); return Transitionable; })(FamousTransitionable); module.exports = Transitionable; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * @license MPL 2.0 * @copyright Famous Industries, Inc. 2015 */ var Easing = { inQuad: function (t) { return t * t; }, outQuad: function (t) { return -(t -= 1) * t + 1; }, inOutQuad: function (t) { if ((t /= 0.5) < 1) return 0.5 * t * t; return -0.5 * (--t * (t - 2) - 1); }, inCubic: function (t) { return t * t * t; }, outCubic: function (t) { return --t * t * t + 1; }, inOutCubic: function (t) { if ((t /= 0.5) < 1) return 0.5 * t * t * t; return 0.5 * ((t -= 2) * t * t + 2); }, inQuart: function (t) { return t * t * t * t; }, outQuart: function (t) { return -(--t * t * t * t - 1); }, inOutQuart: function (t) { if ((t /= 0.5) < 1) return 0.5 * t * t * t * t; return -0.5 * ((t -= 2) * t * t * t - 2); }, inQuint: function (t) { return t * t * t * t * t; }, outQuint: function (t) { return --t * t * t * t * t + 1; }, inOutQuint: function (t) { if ((t /= 0.5) < 1) return 0.5 * t * t * t * t * t; return 0.5 * ((t -= 2) * t * t * t * t + 2); }, inSine: function (t) { return -1 * Math.cos(t * (Math.PI / 2)) + 1; }, outSine: function (t) { return Math.sin(t * (Math.PI / 2)); }, inOutSine: function (t) { return -0.5 * (Math.cos(Math.PI * t) - 1); }, inExpo: function (t) { return t === 0 ? 0 : Math.pow(2, 10 * (t - 1)); }, outExpo: function (t) { return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1; }, inOutExpo: function (t) { if (t === 0) return 0; if (t === 1) return 1; if ((t /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (t - 1)); return 0.5 * (-Math.pow(2, -10 * --t) + 2); }, inCirc: function (t) { return -(Math.sqrt(1 - t * t) - 1); }, outCirc: function (t) { return Math.sqrt(1 - --t * t); }, inOutCirc: function (t) { if ((t /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - t * t) - 1); return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); }, inElastic: function (t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) return 0; if (t === 1) return 1; if (!p) p = 0.3; s = p / (2 * Math.PI) * Math.asin(1 / a); return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); }, outElastic: function (t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) return 0; if (t === 1) return 1; if (!p) p = 0.3; s = p / (2 * Math.PI) * Math.asin(1 / a); return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; }, inOutElastic: function (t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) return 0; if ((t /= 0.5) === 2) return 1; if (!p) p = 0.3 * 1.5; s = p / (2 * Math.PI) * Math.asin(1 / a); if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; }, inBack: function (t, s) { if (s === undefined) s = 1.70158; return t * t * ((s + 1) * t - s); }, outBack: function (t, s) { if (s === undefined) s = 1.70158; return --t * t * ((s + 1) * t + s) + 1; }, inOutBack: function (t, s) { if (s === undefined) s = 1.70158; if ((t /= 0.5) < 1) return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s)); return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2); }, inBounce: function (t) { return 1 - Easing.outBounce(1 - t); }, outBounce: function (t) { if (t < 1 / 2.75) { return 7.5625 * t * t; } else if (t < 2 / 2.75) { return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75; } else if (t < 2.5 / 2.75) { return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375; } else { return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375; } }, inOutBounce: function (t) { if (t < 0.5) return Easing.inBounce(t * 2) * 0.5; return Easing.outBounce(t * 2 - 1) * 0.5 + 0.5; } }; module.exports = Easing; /***/ }, /* 4 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * @license MPL 2.0 * @copyright Famous Industries, Inc. 2015 */ var MultipleTransition = __webpack_require__(5); var TweenTransition = __webpack_require__(6); function Transitionable(start) { this.currentAction = null; this.actionQueue = []; this.callbackQueue = []; this.state = 0; this.velocity = undefined; this._callback = undefined; this._engineInstance = null; this._currentMethod = null; this.set(start); } var transitionMethods = {}; Transitionable.register = function register(methods) { var success = true; for (var method in methods) { if (!Transitionable.registerMethod(method, methods[method])) success = false; } return success; }; Transitionable.registerMethod = function registerMethod(name, engineClass) { if (!(name in transitionMethods)) { transitionMethods[name] = engineClass; return true; } else return false; }; Transitionable.unregisterMethod = function unregisterMethod(name) { if (name in transitionMethods) { delete transitionMethods[name]; return true; } else return false; }; function _loadNext() { if (this._callback) { var callback = this._callback; this._callback = undefined; callback(); } if (this.actionQueue.length <= 0) { this.set(this.get()); return; } this.currentAction = this.actionQueue.shift(); this._callback = this.callbackQueue.shift(); var method = null; var endValue = this.currentAction[0]; var transition = this.currentAction[1]; if (transition instanceof Object && transition.method) { method = transition.method; if (typeof method === 'string') method = transitionMethods[method]; } else { method = TweenTransition; } if (this._currentMethod !== method) { if (!(endValue instanceof Object) || method.SUPPORTS_MULTIPLE === true || endValue.length <= method.SUPPORTS_MULTIPLE) { this._engineInstance = new method(); } else { this._engineInstance = new MultipleTransition(method); } this._currentMethod = method; } this._engineInstance.reset(this.state, this.velocity); if (this.velocity !== undefined) transition.velocity = this.velocity; this._engineInstance.set(endValue, transition, _loadNext.bind(this)); } Transitionable.prototype.set = function set(endState, transition, callback) { if (!transition) { this.reset(endState); if (callback) callback(); return this; } var action = [ endState, transition ]; this.actionQueue.push(action); this.callbackQueue.push(callback); if (!this.currentAction) _loadNext.call(this); return this; }; Transitionable.prototype.reset = function reset(startState, startVelocity) { this._currentMethod = null; this._engineInstance = null; this._callback = undefined; this.state = startState; this.velocity = startVelocity; this.currentAction = null; this.actionQueue = []; this.callbackQueue = []; }; Transitionable.prototype.delay = function delay(duration, callback) { var endValue; if (this.actionQueue.length) endValue = this.actionQueue[this.actionQueue.length - 1][0]; else if (this.currentAction) endValue = this.currentAction[0]; else endValue = this.get(); return this.set(endValue, { duration: duration, curve: function () { return 0; } }, callback); }; Transitionable.prototype.get = function get(timestamp) { if (this._engineInstance) { if (this._engineInstance.getVelocity) this.velocity = this._engineInstance.getVelocity(); this.state = this._engineInstance.get(timestamp); } return this.state; }; Transitionable.prototype.isActive = function isActive() { return !!this.currentAction; }; Transitionable.prototype.halt = function halt() { return this.set(this.get()); }; module.exports = Transitionable; /***/ }, /* 5 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * @license MPL 2.0 * @copyright Famous Industries, Inc. 2015 */ var Utility = __webpack_require__(7); function MultipleTransition(method) { this.method = method; this._instances = []; this.state = []; } MultipleTransition.SUPPORTS_MULTIPLE = true; MultipleTransition.prototype.get = function get() { for (var i = 0; i < this._instances.length; i++) { this.state[i] = this._instances[i].get(); } return this.state; }; MultipleTransition.prototype.set = function set(endState, transition, callback) { var _allCallback = Utility.after(endState.length, callback); for (var i = 0; i < endState.length; i++) { if (!this._instances[i]) this._instances[i] = new this.method(); this._instances[i].set(endState[i], transition, _allCallback); } }; MultipleTransition.prototype.reset = function reset(startState) { for (var i = 0; i < startState.length; i++) { if (!this._instances[i]) this._instances[i] = new this.method(); this._instances[i].reset(startState[i]); } }; module.exports = MultipleTransition; /***/ }, /* 6 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * @license MPL 2.0 * @copyright Famous Industries, Inc. 2015 */ function TweenTransition(options) { this.options = Object.create(TweenTransition.DEFAULT_OPTIONS); if (options) this.setOptions(options); this._startTime = 0; this._startValue = 0; this._updateTime = 0; this._endValue = 0; this._curve = undefined; this._duration = 0; this._active = false; this._callback = undefined; this.state = 0; this.velocity = undefined; } TweenTransition.Curves = { linear: function (t) { return t; }, easeIn: function (t) { return t * t; }, easeOut: function (t) { return t * (2 - t); }, easeInOut: function (t) { if (t <= 0.5) return 2 * t * t; else return -2 * t * t + 4 * t - 1; }, easeOutBounce: function (t) { return t * (3 - 2 * t); }, spring: function (t) { return (1 - t) * Math.sin(6 * Math.PI * t) + t; } }; TweenTransition.SUPPORTS_MULTIPLE = true; TweenTransition.DEFAULT_OPTIONS = { curve: TweenTransition.Curves.linear, duration: 500, speed: 0 }; var registeredCurves = {}; TweenTransition.registerCurve = function registerCurve(curveName, curve) { if (!registeredCurves[curveName]) { registeredCurves[curveName] = curve; return true; } else { return false; } }; TweenTransition.unregisterCurve = function unregisterCurve(curveName) { if (registeredCurves[curveName]) { delete registeredCurves[curveName]; return true; } else { return false; } }; TweenTransition.getCurve = function getCurve(curveName) { var curve = registeredCurves[curveName]; if (curve !== undefined) return curve; else throw new Error('curve not registered'); }; TweenTransition.getCurves = function getCurves() { return registeredCurves; }; function _interpolate(a, b, t) { return (1 - t) * a + t * b; } function _clone(obj) { if (obj instanceof Object) { if (obj instanceof Array) return obj.slice(0); else return Object.create(obj); } else return obj; } function _normalize(transition, defaultTransition) { var result = { curve: defaultTransition.curve }; if (defaultTransition.duration) result.duration = defaultTransition.duration; if (defaultTransition.speed) result.speed = defaultTransition.speed; if (transition instanceof Object) { if (transition.duration !== undefined) result.duration = transition.duration; if (transition.curve) result.curve = transition.curve; if (transition.speed) result.speed = transition.speed; } if (typeof result.curve === 'string') result.curve = TweenTransition.getCurve(result.curve); return result; } TweenTransition.prototype.setOptions = function setOptions(options) { if (options.curve !== undefined) this.options.curve = options.curve; if (options.duration !== undefined) this.options.duration = options.duration; if (options.speed !== undefined) this.options.speed = options.speed; }; TweenTransition.prototype.set = function set(endValue, transition, callback) { if (!transition) { this.reset(endValue); if (callback) callback(); return; } this._startValue = _clone(this.get()); transition = _normalize(transition, this.options); if (transition.speed) { var startValue = this._startValue; if (startValue instanceof Object) { var variance = 0; for (var i in startValue) variance += (endValue[i] - startValue[i]) * (endValue[i] - startValue[i]); transition.duration = Math.sqrt(variance) / transition.speed; } else { transition.duration = Math.abs(endValue - startValue) / transition.speed; } } this._startTime = Date.now(); this._endValue = _clone(endValue); this._startVelocity = _clone(transition.velocity); this._duration = transition.duration; this._curve = transition.curve; this._active = true; this._callback = callback; }; TweenTransition.prototype.reset = function reset(startValue, startVelocity) { if (this._callback) { var callback = this._callback; this._callback = undefined; callback(); } this.state = _clone(startValue); this.velocity = _clone(startVelocity); this._startTime = 0; this._duration = 0; this._updateTime = 0; this._startValue = this.state; this._startVelocity = this.velocity; this._endValue = this.state; this._active = false; }; TweenTransition.prototype.getVelocity = function getVelocity() { return this.velocity; }; TweenTransition.prototype.get = function get(timestamp) { this.update(timestamp); return this.state; }; function _calculateVelocity(current, start, curve, duration, t) { var velocity; var eps = 1e-7; var speed = (curve(t) - curve(t - eps)) / eps; if (current instanceof Array) { velocity = []; for (var i = 0; i < current.length; i++) { if (typeof current[i] === 'number') velocity[i] = speed * (current[i] - start[i]) / duration; else velocity[i] = 0; } } else velocity = speed * (current - start) / duration; return velocity; } function _calculateState(start, end, t) { var state; if (start instanceof Array) { state = []; for (var i = 0; i < start.length; i++) { if (typeof start[i] === 'number') state[i] = _interpolate(start[i], end[i], t); else state[i] = start[i]; } } else state = _interpolate(start, end, t); return state; } TweenTransition.prototype.update = function update(timestamp) { if (!this._active) { if (this._callback) { var callback = this._callback; this._callback = undefined; callback(); } return; } if (!timestamp) timestamp = Date.now(); if (this._updateTime >= timestamp) return; this._updateTime = timestamp; var timeSinceStart = timestamp - this._startTime; if (timeSinceStart >= this._duration) { this.state = this._endValue; this.velocity = _calculateVelocity(this.state, this._startValue, this._curve, this._duration, 1); this._active = false; } else if (timeSinceStart < 0) { this.state = this._startValue; this.velocity = this._startVelocity; } else { var t = timeSinceStart / this._duration; this.state = _calculateState(this._startValue, this._endValue, this._curve(t)); this.velocity = _calculateVelocity(this.state, this._startValue, this._curve, this._duration, t); } }; TweenTransition.prototype.isActive = function isActive() { return this._active; }; TweenTransition.prototype.halt = function halt() { this.reset(this.get()); }; TweenTransition.registerCurve('linear', TweenTransition.Curves.linear); TweenTransition.registerCurve('easeIn', TweenTransition.Curves.easeIn); TweenTransition.registerCurve('easeOut', TweenTransition.Curves.easeOut); TweenTransition.registerCurve('easeInOut', TweenTransition.Curves.easeInOut); TweenTransition.registerCurve('easeOutBounce', TweenTransition.Curves.easeOutBounce); TweenTransition.registerCurve('spring', TweenTransition.Curves.spring); TweenTransition.customCurve = function customCurve(v1, v2) { v1 = v1 || 0; v2 = v2 || 0; return function (t) { return v1 * t + (-2 * v1 - v2 + 3) * t * t + (v1 + v2 - 2) * t * t * t; }; }; module.exports = TweenTransition; /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * @license MPL 2.0 * @copyright Famous Industries, Inc. 2015 */ var Utility = {}; Utility.Direction = { X: 0, Y: 1, Z: 2 }; Utility.after = function after(count, callback) { var counter = count; return function () { counter--; if (counter === 0) callback.apply(this, arguments); }; }; Utility.loadURL = function loadURL(url, callback) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function onreadystatechange() { if (this.readyState === 4) { if (callback) callback(this.responseText); } }; xhr.open('GET', url); xhr.send(); }; Utility.createDocumentFragmentFromHTML = function createDocumentFragmentFromHTML(html) { var element = document.createElement('div'); element.innerHTML = html; var result = document.createDocumentFragment(); while (element.hasChildNodes()) result.appendChild(element.firstChild); return result; }; Utility.clone = function clone(b) { var a; if (typeof b === 'object') { a = b instanceof Array ? [] : {}; for (var key in b) { if (typeof b[key] === 'object' && b[key] !== null) { if (b[key] instanceof Array) { a[key] = new Array(b[key].length); for (var i = 0; i < b[key].length; i++) { a[key][i] = Utility.clone(b[key][i]); } } else { a[key] = Utility.clone(b[key]); } } else { a[key] = b[key]; } } } else { a = b; } return a; }; module.exports = Utility; /***/ } /******/ ]) }); ; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA5MzFiMWZkZmY4OWJjMzVmNWE4MyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21peGluLmpzIiwid2VicGFjazovLy8uL3NyYy90cmFuc2l0aW9uYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZhbW91cy90cmFuc2l0aW9ucy9FYXNpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYW1vdXMvdHJhbnNpdGlvbnMvVHJhbnNpdGlvbmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYW1vdXMvdHJhbnNpdGlvbnMvTXVsdGlwbGVUcmFuc2l0aW9uLmpzIiwid2VicGFjazovLy8uL34vZmFtb3VzL3RyYW5zaXRpb25zL1R3ZWVuVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZhbW91cy91dGlsaXRpZXMvVXRpbGl0eS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Z0RDckNnQyxDQUFTOzs7OzJDQUNkLENBQWtCOzs7O21DQUMxQixDQUEyQjs7OztTQUkxQyxtQkFBbUI7U0FDbkIsY0FBYztTQUNkLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0NUaUIsQ0FBa0I7Ozs7bUNBQzFCLENBQTJCOzs7O0FBRTlDLFVBQVMsbUJBQW1CLENBQUMsS0FBSyxFQUFFOztBQUVs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QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0EsVUFBUztBQUNUO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUI7Ozs7OztBQ3JLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDOzs7Ozs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDRCQUE0QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsbUJBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7OztBQ3BQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBbUMsbUJBQW1CO0FBQ3REO0FBQ0E7QUFDQSxrQkFBaUI7QUFDakI7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQiIsImZpbGUiOiJGYW1vdXNBbmltYXRpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJGYW1vdXNBbmltYXRpb25zXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkZhbW91c0FuaW1hdGlvbnNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb25cbiAqKi8iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIDkzMWIxZmRmZjg5YmMzNWY1YTgzXG4gKiovIiwiLy8gaW1wb3J0IHtQcm9wZXJ0eUFuaW1hdG9yfSBmcm9tICcuL2FuaW1hdG9yJztcbmltcG9ydCBUcmFuc2l0aW9uYWJsZU1peGluIGZyb20gJy4vbWl4aW4nO1xuaW1wb3J0IFRyYW5zaXRpb25hYmxlIGZyb20gJy4vdHJhbnNpdGlvbmFibGUnO1xuaW1wb3J0IEVhc2luZyBmcm9tICdmYW1vdXMvdHJhbnNpdGlvbnMvRWFzaW5nJztcblxuZXhwb3J0IHtcbiAgICAvLyBQcm9wZXJ0eUFuaW1hdG9yXG4gICAgVHJhbnNpdGlvbmFibGVNaXhpbixcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBFYXNpbmdcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2luZGV4LmpzXG4gKiovIiwiaW1wb3J0IFRyYW5zaXRpb25hYmxlIGZyb20gJy4vdHJhbnNpdGlvbmFibGUnO1xuaW1wb3J0IEVhc2luZyBmcm9tICdmYW1vdXMvdHJhbnNpdGlvbnMvRWFzaW5nJztcblxuZnVuY3Rpb24gVHJhbnNpdGlvbmFibGVNaXhpbihwcm9wcykge1xuXG4gIHByb3BzID0gW10uY29uY2F0KHByb3BzKTtcblxuICB2YXIgX3RyYW5zaXRpb25hYmxlcyA9IHt9O1xuXG4gIHZhciBtaXhpbiA9IHtcblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgcHJvcHMuZm9yRWFjaCggcCA9PiB7XG4gICAgICAgIGRlbGV0ZSBfdHJhbnNpdGlvbmFibGVzW3BdO1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgcHJvcHMuZm9yRWFjaCggcCA9PiB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHRyYW5zaXRpb25hYmxlXG4gICAgICAgIF90cmFuc2l0aW9uYWJsZXNbcF0gPSBuZXcgVHJhbnNpdGlvbmFibGUodGhpcy5zdGF0ZVtwXSk7XG4gICAgICAgIC8vIERlZmluZSBhIHByb3BlcnR5XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IHA7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwge1xuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdHJhbnNpdGlvbmFibGVzW3Byb3BlcnR5XS5nZXQoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0KHYpIHtcbiAgICAgICAgICAgIC8qIHt2YWx1ZSwgZHVyYXRpb24gLCBhbmltYXRpb259ICovXG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICB2ID0ge3ZhbHVlOiB2fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdi52YWx1ZTtcbiAgICAgICAgICAgIGRlbGV0ZSB2LnZhbHVlO1xuICAgICAgICAgICAgLy8gVXNlICdpblNpbmUnIGFzIGRlZmF1bHQgY3VydmVcbiAgICAgICAgICAgIGlmICghdi5jdXJ2ZSkge3YuY3VydmUgPSBFYXNpbmcuaW5TaW5lfVxuICAgICAgICAgICAgdGhpcy50d2Vlbihwcm9wZXJ0eSwgdmFsdWUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB0cmFucyA9IF90cmFuc2l0aW9uYWJsZXNbcHJvcGVydHldO1xuICAgICAgICB0cmFucy51cGRhdGUodGhpcy5fc3luY1Byb3AuYmluZCh0aGlzLCBwcm9wZXJ0eSkpXG4gICAgICAgIHRoaXMuX3N5bmNQcm9wKHByb3BlcnR5KTtcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIF9zeW5jUHJvcChwcm9wKSB7XG4gICAgICB2YXIgdHJhbnMgPSBfdHJhbnNpdGlvbmFibGVzW3Byb3BdO1xuICAgICAgdmFyIHN0YXRlID0ge1twcm9wXTogdHJhbnMuZ2V0KCl9O1xuICAgICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSxcblxuICAgIHR3ZWVuKHByb3AsIHZhbHVlLCBhbmltYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgdHJhbnMgPSBfdHJhbnNpdGlvbmFibGVzW3Byb3BdO1xuICAgICAgdHJhbnMudmFsKHZhbHVlLCBhbmltYXRpb24sIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgaGFsdChwcm9wKSB7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICB2YXIgdHJhbnMgPSBfdHJhbnNpdGlvbmFibGVzW3BdO1xuICAgICAgICB0cmFucy5oYWx0KCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMuZm9yRWFjaCggcCA9PiB7XG4gICAgICAgICAgdmFyIHRyYW5zID0gX3RyYW5zaXRpb25hYmxlc1twXTtcbiAgICAgICAgICB0cmFucy5oYWx0KClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4aW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbmFibGVNaXhpbjtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL21peGluLmpzXG4gKiovIiwidmFyIEZhbW91c1RyYW5zaXRpb25hYmxlID0gcmVxdWlyZSgnZmFtb3VzL3RyYW5zaXRpb25zL1RyYW5zaXRpb25hYmxlJyk7XG5cbnZhciBhbGxvd0FuaW1hdGlvbnMgPSBmYWxzZTtcbnZhciBhbmltYXRpb25JRCA9IG51bGw7XG5cbnZhciB0cmFuc2l0aW9uYWJsZXMgPSBbXTtcbnZhciBsaXN0ZW5lcnMgPSBbXTtcblxuZnVuY3Rpb24gaGF2ZUFsbEZpbmlzaGVkQW5pbWF0aW5nKCkge1xuICAgIHJldHVybiB0cmFuc2l0aW9uYWJsZXNcbiAgICAgICAgICAgIC5tYXAodCA9PiB0Ll9pc0FuaW1hdGluZylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZpbmFsLCB0SXNBbmltYXRpbmcpID0+IGZpbmFsICYmICF0SXNBbmltYXRpbmcsIHRydWUpXG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yICh2YXIgbHMgaW4gbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyc1tsc10oKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdENhbmNlbGF0aW9uKCkge1xuICAgIGlmIChoYXZlQWxsRmluaXNoZWRBbmltYXRpbmcoKSkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25JRCk7XG4gICAgICAgIGFsbG93QW5pbWF0aW9ucyA9IGZhbHNlO1xuICAgICAgICBhbmltYXRpb25JRCA9IG51bGw7XG4gICAgfVxufVxuXG4vLyBTZXR1cCBhbmltYXRpb25cbmZ1bmN0aW9uIGFuaW1hdGUoKSB7XG4gICAgaWYgKCFhbGxvd0FuaW1hdGlvbnMpIHJldHVyblxuICAgIGV4ZWN1dGVMaXN0ZW5lcnMoKTtcbiAgICBhbmltYXRpb25JRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbn1cblxuXG5jbGFzcyBUcmFuc2l0aW9uYWJsZSBleHRlbmRzIEZhbW91c1RyYW5zaXRpb25hYmxlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcih2YWx1ZSlcblxuICAgICAgICAvLyBDb25maWd1cmUgZm9yIGdsb2JhbHNcbiAgICAgICAgdHJhbnNpdGlvbmFibGVzLnB1c2godGhpcyk7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyRm4gPSAoKSA9PiB0aGlzLl9leGVjdXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHRoaXMuX2xpc3RlbmVyRm4pO1xuXG4gICAgICAgIHRoaXMuX2lzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZShmbikge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGZuKTtcbiAgICB9XG4gICAgdmFsKHZhbHVlLCBhbmltYXRpb24sIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXRcbiAgICAgICAgc2VsZi5zZXQodmFsdWUsIGFuaW1hdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gTGFzdCB0aW1lIGV4ZWN1dGlvblxuICAgICAgICAgIGlmIChhbmltYXRpb25JRCkge1xuICAgICAgICAgICAgICBzZWxmLl9pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcXVlc3RDYW5jZWxhdGlvbigpO1xuXG4gICAgICAgICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIHNlbGYuX2lzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dBbmltYXRpb25zID0gdHJ1ZTtcblxuICAgICAgICAvLyBSZXF1ZXN0IGFuaW1hdGlvbiBzdGFydFxuICAgICAgICBhbmltYXRlKCk7XG4gICAgfVxuXG4gICAgX2V4ZWN1dGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIC8vIEV4ZWN1dGUgbGlzdGVuZXJzXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCggZm4gPT4gZm4odGhpcy5n