From 44bbe1747701ba04a67218d7f06a4dac77e8f850 Mon Sep 17 00:00:00 2001 From: Jonny Schmid Date: Wed, 15 Nov 2017 10:37:31 +0000 Subject: [PATCH] Upgrade dependencies (#11) --- dist/fl-form-builder-tests.js | 1315 ++++---- dist/fl-form-builder-tests.js.map | 2 +- package-lock.json | 552 ++-- package.json | 106 +- yarn.lock | 4622 ----------------------------- 5 files changed, 1134 insertions(+), 5463 deletions(-) delete mode 100644 yarn.lock diff --git a/dist/fl-form-builder-tests.js b/dist/fl-form-builder-tests.js index 8a617a1..38bcc13 100644 --- a/dist/fl-form-builder-tests.js +++ b/dist/fl-form-builder-tests.js @@ -1156,72 +1156,37 @@ assert.warn = function warn(condition, errorMessage) { * _isArray({}); //=> false */ var _isArray = Array.isArray || function _isArray(val) { - return (val != null && - val.length >= 0 && - Object.prototype.toString.call(val) === '[object Array]'); + return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]'; }; /** - * An optimized, private array `slice` implementation. - * - * @private - * @param {Arguments|Array} args The array or arguments object to consider. - * @param {Number} [from=0] The array index to slice from, inclusive. - * @param {Number} [to=args.length] The array index to slice to, exclusive. - * @return {Array} A new, sliced array. - * @example - * - * _slice([1, 2, 3, 4, 5], 1, 3); //=> [2, 3] - * - * var firstThreeArgs = function(a, b, c, d) { - * return _slice(arguments, 0, 3); - * }; - * firstThreeArgs(1, 2, 3, 4); //=> [1, 2, 3] - */ -var _slice = function _slice(args, from, to) { - switch (arguments.length) { - case 1: return _slice(args, 0, args.length); - case 2: return _slice(args, from, args.length); - default: - var list = []; - var idx = 0; - var len = Math.max(0, Math.min(args.length, to) - from); - while (idx < len) { - list[idx] = args[from + idx]; - idx += 1; - } - return list; - } -}; - -/** - * Similar to hasMethod, this checks whether a function has a [methodname] - * function. If it isn't an array it will execute that function otherwise it - * will default to the ramda implementation. + * This checks whether a function has a [methodname] function. If it isn't an + * array it will execute that function otherwise it will default to the ramda + * implementation. * * @private * @param {Function} fn ramda implemtation * @param {String} methodname property to check for a custom implementation * @return {Object} Whatever the return value of the method is. */ -var _checkForMethod = function _checkForMethod(methodname, fn) { - return function() { + + +function _checkForMethod(methodname, fn) { + return function () { var length = arguments.length; if (length === 0) { return fn(); } var obj = arguments[length - 1]; - return (_isArray(obj) || typeof obj[methodname] !== 'function') ? - fn.apply(this, arguments) : - obj[methodname].apply(obj, _slice(arguments, 0, length - 1)); + return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1)); }; -}; +} +var _checkForMethod_1 = _checkForMethod; -var _isPlaceholder = function _isPlaceholder(a) { - return a != null && - typeof a === 'object' && - a['@@functional/placeholder'] === true; -}; +function _isPlaceholder(a) { + return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true; +} +var _isPlaceholder_1 = _isPlaceholder; /** * Optimized internal one-arity curry function. @@ -1231,15 +1196,18 @@ var _isPlaceholder = function _isPlaceholder(a) { * @param {Function} fn The function to curry. * @return {Function} The curried function. */ -var _curry1 = function _curry1(fn) { + + +function _curry1(fn) { return function f1(a) { - if (arguments.length === 0 || _isPlaceholder(a)) { + if (arguments.length === 0 || _isPlaceholder_1(a)) { return f1; } else { return fn.apply(this, arguments); } }; -}; +} +var _curry1_1 = _curry1; /** * Optimized internal two-arity curry function. @@ -1249,22 +1217,27 @@ var _curry1 = function _curry1(fn) { * @param {Function} fn The function to curry. * @return {Function} The curried function. */ -var _curry2 = function _curry2(fn) { + + +function _curry2(fn) { return function f2(a, b) { switch (arguments.length) { case 0: return f2; case 1: - return _isPlaceholder(a) ? f2 - : _curry1(function(_b) { return fn(a, _b); }); + return _isPlaceholder_1(a) ? f2 : _curry1_1(function (_b) { + return fn(a, _b); + }); default: - return _isPlaceholder(a) && _isPlaceholder(b) ? f2 - : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b); }) - : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b); }) - : fn(a, b); + return _isPlaceholder_1(a) && _isPlaceholder_1(b) ? f2 : _isPlaceholder_1(a) ? _curry1_1(function (_a) { + return fn(_a, b); + }) : _isPlaceholder_1(b) ? _curry1_1(function (_b) { + return fn(a, _b); + }) : fn(a, b); } }; -}; +} +var _curry2_1 = _curry2; /** * Optimized internal three-arity curry function. @@ -1274,31 +1247,43 @@ var _curry2 = function _curry2(fn) { * @param {Function} fn The function to curry. * @return {Function} The curried function. */ -var _curry3 = function _curry3(fn) { + + +function _curry3(fn) { return function f3(a, b, c) { switch (arguments.length) { case 0: return f3; case 1: - return _isPlaceholder(a) ? f3 - : _curry2(function(_b, _c) { return fn(a, _b, _c); }); + return _isPlaceholder_1(a) ? f3 : _curry2_1(function (_b, _c) { + return fn(a, _b, _c); + }); case 2: - return _isPlaceholder(a) && _isPlaceholder(b) ? f3 - : _isPlaceholder(a) ? _curry2(function(_a, _c) { return fn(_a, b, _c); }) - : _isPlaceholder(b) ? _curry2(function(_b, _c) { return fn(a, _b, _c); }) - : _curry1(function(_c) { return fn(a, b, _c); }); + return _isPlaceholder_1(a) && _isPlaceholder_1(b) ? f3 : _isPlaceholder_1(a) ? _curry2_1(function (_a, _c) { + return fn(_a, b, _c); + }) : _isPlaceholder_1(b) ? _curry2_1(function (_b, _c) { + return fn(a, _b, _c); + }) : _curry1_1(function (_c) { + return fn(a, b, _c); + }); default: - return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 - : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function(_a, _b) { return fn(_a, _b, c); }) - : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function(_a, _c) { return fn(_a, b, _c); }) - : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function(_b, _c) { return fn(a, _b, _c); }) - : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b, c); }) - : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b, c); }) - : _isPlaceholder(c) ? _curry1(function(_c) { return fn(a, b, _c); }) - : fn(a, b, c); + return _isPlaceholder_1(a) && _isPlaceholder_1(b) && _isPlaceholder_1(c) ? f3 : _isPlaceholder_1(a) && _isPlaceholder_1(b) ? _curry2_1(function (_a, _b) { + return fn(_a, _b, c); + }) : _isPlaceholder_1(a) && _isPlaceholder_1(c) ? _curry2_1(function (_a, _c) { + return fn(_a, b, _c); + }) : _isPlaceholder_1(b) && _isPlaceholder_1(c) ? _curry2_1(function (_b, _c) { + return fn(a, _b, _c); + }) : _isPlaceholder_1(a) ? _curry1_1(function (_a) { + return fn(_a, b, c); + }) : _isPlaceholder_1(b) ? _curry1_1(function (_b) { + return fn(a, _b, c); + }) : _isPlaceholder_1(c) ? _curry1_1(function (_c) { + return fn(a, b, _c); + }) : fn(a, b, c); } }; -}; +} +var _curry3_1 = _curry3; /** * Returns the elements of the given list or string (or object with a `slice` @@ -1324,9 +1309,22 @@ var _curry3 = function _curry3(fn) { * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] * R.slice(0, 3, 'ramda'); //=> 'ram' */ -var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) { + + +var slice = /*#__PURE__*/_curry3_1( /*#__PURE__*/_checkForMethod_1('slice', function slice(fromIndex, toIndex, list) { return Array.prototype.slice.call(list, fromIndex, toIndex); })); +var slice_1 = slice; + +// `Identity` is a functor that holds a single value, where `map` simply +// transforms the held value with the provided function. + + +var Identity = function (x) { + return { value: x, map: function (f) { + return Identity(f(x)); + } }; +}; /** * Returns the result of "setting" the portion of the given data structure @@ -1350,20 +1348,15 @@ var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, * * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz'] */ -var over = (function() { - // `Identity` is a functor that holds a single value, where `map` simply - // transforms the held value with the provided function. - var Identity = function(x) { - return {value: x, map: function(f) { return Identity(f(x)); }}; - }; - - return _curry3(function over(lens, f, x) { - // The value returned by the getter function is first transformed with `f`, - // then set as the value of an `Identity`. This is then mapped over with the - // setter function of the lens. - return lens(function(y) { return Identity(f(y)); })(x).value; - }); -}()); +var over = /*#__PURE__*/_curry3_1(function over(lens, f, x) { + // The value returned by the getter function is first transformed with `f`, + // then set as the value of an `Identity`. This is then mapped over with the + // setter function of the lens. + return lens(function (y) { + return Identity(f(y)); + })(x).value; +}); +var over_1 = over; /** * Returns a function that always returns the given value. Note that for @@ -1384,11 +1377,14 @@ var over = (function() { * var t = R.always('Tee'); * t(); //=> 'Tee' */ -var always = _curry1(function always(val) { - return function() { + + +var always = /*#__PURE__*/_curry1_1(function always(val) { + return function () { return val; }; }); +var always_1 = always; /** * Returns the result of "setting" the portion of the given data structure @@ -1412,48 +1408,144 @@ var always = _curry1(function always(val) { * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2} */ -var set$1 = _curry3(function set(lens, v, x) { - return over(lens, always(v), x); + + +var set$1 = /*#__PURE__*/_curry3_1(function set(lens, v, x) { + return over_1(lens, always_1(v), x); }); +var set_1 = set$1; -var _arity = function _arity(n, fn) { +function _arity(n, fn) { /* eslint-disable no-unused-vars */ switch (n) { - case 0: return function() { return fn.apply(this, arguments); }; - case 1: return function(a0) { return fn.apply(this, arguments); }; - case 2: return function(a0, a1) { return fn.apply(this, arguments); }; - case 3: return function(a0, a1, a2) { return fn.apply(this, arguments); }; - case 4: return function(a0, a1, a2, a3) { return fn.apply(this, arguments); }; - case 5: return function(a0, a1, a2, a3, a4) { return fn.apply(this, arguments); }; - case 6: return function(a0, a1, a2, a3, a4, a5) { return fn.apply(this, arguments); }; - case 7: return function(a0, a1, a2, a3, a4, a5, a6) { return fn.apply(this, arguments); }; - case 8: return function(a0, a1, a2, a3, a4, a5, a6, a7) { return fn.apply(this, arguments); }; - case 9: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8) { return fn.apply(this, arguments); }; - case 10: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { return fn.apply(this, arguments); }; - default: throw new Error('First argument to _arity must be a non-negative integer no greater than ten'); + case 0: + return function () { + return fn.apply(this, arguments); + }; + case 1: + return function (a0) { + return fn.apply(this, arguments); + }; + case 2: + return function (a0, a1) { + return fn.apply(this, arguments); + }; + case 3: + return function (a0, a1, a2) { + return fn.apply(this, arguments); + }; + case 4: + return function (a0, a1, a2, a3) { + return fn.apply(this, arguments); + }; + case 5: + return function (a0, a1, a2, a3, a4) { + return fn.apply(this, arguments); + }; + case 6: + return function (a0, a1, a2, a3, a4, a5) { + return fn.apply(this, arguments); + }; + case 7: + return function (a0, a1, a2, a3, a4, a5, a6) { + return fn.apply(this, arguments); + }; + case 8: + return function (a0, a1, a2, a3, a4, a5, a6, a7) { + return fn.apply(this, arguments); + }; + case 9: + return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { + return fn.apply(this, arguments); + }; + case 10: + return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + return fn.apply(this, arguments); + }; + default: + throw new Error('First argument to _arity must be a non-negative integer no greater than ten'); } -}; +} +var _arity_1 = _arity; -var _pipe = function _pipe(f, g) { - return function() { +function _pipe(f, g) { + return function () { return g.call(this, f.apply(this, arguments)); }; -}; +} +var _pipe_1 = _pipe; + +function _isString(x) { + return Object.prototype.toString.call(x) === '[object String]'; +} +var _isString_1 = _isString; + +/** + * Tests whether or not an object is similar to an array. + * + * @private + * @category Type + * @category List + * @sig * -> Boolean + * @param {*} x The object to test. + * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. + * @example + * + * _isArrayLike([]); //=> true + * _isArrayLike(true); //=> false + * _isArrayLike({}); //=> false + * _isArrayLike({length: 10}); //=> false + * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true + */ + + +var _isArrayLike = /*#__PURE__*/_curry1_1(function isArrayLike(x) { + if (_isArray(x)) { + return true; + } + if (!x) { + return false; + } + if (typeof x !== 'object') { + return false; + } + if (_isString_1(x)) { + return false; + } + if (x.nodeType === 1) { + return !!x.length; + } + if (x.length === 0) { + return true; + } + if (x.length > 0) { + return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1); + } + return false; +}); +var _isArrayLike_1 = _isArrayLike; -var _xwrap = (function() { +var XWrap = /*#__PURE__*/function () { function XWrap(fn) { this.f = fn; } - XWrap.prototype['@@transducer/init'] = function() { + XWrap.prototype['@@transducer/init'] = function () { throw new Error('init not implemented on XWrap'); }; - XWrap.prototype['@@transducer/result'] = function(acc) { return acc; }; - XWrap.prototype['@@transducer/step'] = function(acc, x) { + XWrap.prototype['@@transducer/result'] = function (acc) { + return acc; + }; + XWrap.prototype['@@transducer/step'] = function (acc, x) { return this.f(acc, x); }; - return function _xwrap(fn) { return new XWrap(fn); }; -}()); + return XWrap; +}(); + +function _xwrap(fn) { + return new XWrap(fn); +} +var _xwrap_1 = _xwrap; /** * Creates a function that is bound to a context. @@ -1475,101 +1567,73 @@ var _xwrap = (function() { * var log = R.bind(console.log, console); * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3} * // logs {a: 2} + * @symb R.bind(f, o)(a, b) = f.call(o, a, b) */ -var bind = _curry2(function bind(fn, thisObj) { - return _arity(fn.length, function() { - return fn.apply(thisObj, arguments); - }); -}); -var _isString = function _isString(x) { - return Object.prototype.toString.call(x) === '[object String]'; -}; -/** - * Tests whether or not an object is similar to an array. - * - * @func - * @memberOf R - * @since v0.5.0 - * @category Type - * @category List - * @sig * -> Boolean - * @param {*} x The object to test. - * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. - * @example - * - * R.isArrayLike([]); //=> true - * R.isArrayLike(true); //=> false - * R.isArrayLike({}); //=> false - * R.isArrayLike({length: 10}); //=> false - * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true - */ -var isArrayLike = _curry1(function isArrayLike(x) { - if (_isArray(x)) { return true; } - if (!x) { return false; } - if (typeof x !== 'object') { return false; } - if (_isString(x)) { return false; } - if (x.nodeType === 1) { return !!x.length; } - if (x.length === 0) { return true; } - if (x.length > 0) { - return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1); - } - return false; +var bind = /*#__PURE__*/_curry2_1(function bind(fn, thisObj) { + return _arity_1(fn.length, function () { + return fn.apply(thisObj, arguments); + }); }); +var bind_1 = bind; -var _reduce = (function() { - function _arrayReduce(xf, acc, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - acc = xf['@@transducer/step'](acc, list[idx]); - if (acc && acc['@@transducer/reduced']) { - acc = acc['@@transducer/value']; - break; - } - idx += 1; +function _arrayReduce(xf, acc, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + acc = xf['@@transducer/step'](acc, list[idx]); + if (acc && acc['@@transducer/reduced']) { + acc = acc['@@transducer/value']; + break; } - return xf['@@transducer/result'](acc); + idx += 1; } + return xf['@@transducer/result'](acc); +} - function _iterableReduce(xf, acc, iter) { - var step = iter.next(); - while (!step.done) { - acc = xf['@@transducer/step'](acc, step.value); - if (acc && acc['@@transducer/reduced']) { - acc = acc['@@transducer/value']; - break; - } - step = iter.next(); +function _iterableReduce(xf, acc, iter) { + var step = iter.next(); + while (!step.done) { + acc = xf['@@transducer/step'](acc, step.value); + if (acc && acc['@@transducer/reduced']) { + acc = acc['@@transducer/value']; + break; } - return xf['@@transducer/result'](acc); + step = iter.next(); } + return xf['@@transducer/result'](acc); +} - function _methodReduce(xf, acc, obj) { - return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc)); +function _methodReduce(xf, acc, obj, methodName) { + return xf['@@transducer/result'](obj[methodName](bind_1(xf['@@transducer/step'], xf), acc)); +} + +var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator'; + +function _reduce(fn, acc, list) { + if (typeof fn === 'function') { + fn = _xwrap_1(fn); + } + if (_isArrayLike_1(list)) { + return _arrayReduce(fn, acc, list); + } + if (typeof list['fantasy-land/reduce'] === 'function') { + return _methodReduce(fn, acc, list, 'fantasy-land/reduce'); + } + if (list[symIterator] != null) { + return _iterableReduce(fn, acc, list[symIterator]()); + } + if (typeof list.next === 'function') { + return _iterableReduce(fn, acc, list); + } + if (typeof list.reduce === 'function') { + return _methodReduce(fn, acc, list, 'reduce'); } - var symIterator = (typeof Symbol !== 'undefined') ? Symbol.iterator : '@@iterator'; - return function _reduce(fn, acc, list) { - if (typeof fn === 'function') { - fn = _xwrap(fn); - } - if (isArrayLike(list)) { - return _arrayReduce(fn, acc, list); - } - if (typeof list.reduce === 'function') { - return _methodReduce(fn, acc, list); - } - if (list[symIterator] != null) { - return _iterableReduce(fn, acc, list[symIterator]()); - } - if (typeof list.next === 'function') { - return _iterableReduce(fn, acc, list); - } - throw new TypeError('reduce: list must be array or iterable'); - }; -}()); + throw new TypeError('reduce: list must be array or iterable'); +} +var _reduce_1 = _reduce; /** * Returns a single item by iterating through the list, successively calling @@ -1577,14 +1641,19 @@ var _reduce = (function() { * value from the array, and then passing the result to the next call. * * The iterator function receives two values: *(acc, value)*. It may use - * `R.reduced` to shortcut the iteration. + * [`R.reduced`](#reduced) to shortcut the iteration. + * + * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function + * is *(value, acc)*. * * Note: `R.reduce` does not skip deleted or unassigned indices (sparse * arrays), unlike the native `Array.prototype.reduce` method. For more details * on this behavior, see: * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description * - * Dispatches to the `reduce` method of the third argument, if present. + * Dispatches to the `reduce` method of the third argument, if present. When + * doing so, it is up to the user to handle the [`R.reduced`](#reduced) + * shortcuting, as this is not implemented by `reduce`. * * @func * @memberOf R @@ -1596,15 +1665,26 @@ var _reduce = (function() { * @param {*} acc The accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. - * @see R.reduced, R.addIndex + * @see R.reduced, R.addIndex, R.reduceRight * @example * - * var numbers = [1, 2, 3]; - * var plus = (a, b) => a + b; - * - * R.reduce(plus, 10, numbers); //=> 16 + * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10 + * // - -10 + * // / \ / \ + * // - 4 -6 4 + * // / \ / \ + * // - 3 ==> -3 3 + * // / \ / \ + * // - 2 -1 2 + * // / \ / \ + * // 0 1 0 1 + * + * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d) */ -var reduce = _curry3(_reduce); + + +var reduce = /*#__PURE__*/_curry3_1(_reduce_1); +var reduce_1 = reduce; /** * Returns all but the first element of the given list or string (or object @@ -1633,7 +1713,10 @@ var reduce = _curry3(_reduce); * R.tail('a'); //=> '' * R.tail(''); //=> '' */ -var tail = _checkForMethod('tail', slice(1, Infinity)); + + +var tail = /*#__PURE__*/_curry1_1( /*#__PURE__*/_checkForMethod_1('tail', /*#__PURE__*/slice_1(1, Infinity))); +var tail_1 = tail; /** * Performs left-to-right function composition. The leftmost function may have @@ -1656,14 +1739,17 @@ var tail = _checkForMethod('tail', slice(1, Infinity)); * var f = R.pipe(Math.pow, R.negate, R.inc); * * f(3, 4); // -(3^4) + 1 + * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b))) */ -var pipe = function pipe() { + + +function pipe() { if (arguments.length === 0) { throw new Error('pipe requires at least one argument'); } - return _arity(arguments[0].length, - reduce(_pipe, arguments[0], tail(arguments))); -}; + return _arity_1(arguments[0].length, reduce_1(_pipe_1, arguments[0], tail_1(arguments))); +} +var pipe_1 = pipe; /** * Private `concat` function to merge two array-like objects. @@ -1676,7 +1762,7 @@ var pipe = function pipe() { * * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] */ -var _concat = function _concat(set1, set2) { +function _concat(set1, set2) { set1 = set1 || []; set2 = set2 || []; var idx; @@ -1695,7 +1781,8 @@ var _concat = function _concat(set1, set2) { idx += 1; } return result; -}; +} +var _concat_1 = _concat; /** * Returns a new list with the given element at the front, followed by the @@ -1714,9 +1801,46 @@ var _concat = function _concat(set1, set2) { * * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum'] */ -var prepend = _curry2(function prepend(el, list) { - return _concat([el], list); + + +var prepend = /*#__PURE__*/_curry2_1(function prepend(el, list) { + return _concat_1([el], list); }); +var prepend_1 = prepend; + +/** + * Retrieve the value at a given path. + * + * @func + * @memberOf R + * @since v0.2.0 + * @category Object + * @typedefn Idx = String | Int + * @sig [Idx] -> {a} -> a | Undefined + * @param {Array} path The path to use. + * @param {Object} obj The object to retrieve the nested property from. + * @return {*} The data at `path`. + * @see R.prop + * @example + * + * R.path(['a', 'b'], {a: {b: 2}}); //=> 2 + * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined + */ + + +var path = /*#__PURE__*/_curry2_1(function path(paths, obj) { + var val = obj; + var idx = 0; + while (idx < paths.length) { + if (val == null) { + return; + } + val = val[paths[idx]]; + idx += 1; + } + return val; +}); +var path_1 = path; /** * Returns a function that when supplied an object returns the indicated @@ -1736,48 +1860,59 @@ var prepend = _curry2(function prepend(el, list) { * R.prop('x', {x: 100}); //=> 100 * R.prop('x', {}); //=> undefined */ -var prop$1 = _curry2(function prop(p, obj) { return obj[p]; }); -var _isTransformer = function _isTransformer(obj) { +var prop = /*#__PURE__*/_curry2_1(function prop(p, obj) { + return path_1([p], obj); +}); +var prop_1$1 = prop; + +function _isTransformer(obj) { return typeof obj['@@transducer/step'] === 'function'; -}; +} +var _isTransformer_1 = _isTransformer; /** * Returns a function that dispatches with different strategies based on the * object in list position (last argument). If it is an array, executes [fn]. - * Otherwise, if it has a function with [methodname], it will execute that - * function (functor case). Otherwise, if it is a transformer, uses transducer - * [xf] to return a new transformer (transducer case). Otherwise, it will - * default to executing [fn]. + * Otherwise, if it has a function with one of the given method names, it will + * execute that function (functor case). Otherwise, if it is a transformer, + * uses transducer [xf] to return a new transformer (transducer case). + * Otherwise, it will default to executing [fn]. * * @private - * @param {String} methodname property to check for a custom implementation + * @param {Array} methodNames properties to check for a custom implementation * @param {Function} xf transducer to initialize if object is transformer * @param {Function} fn default ramda implementation * @return {Function} A function that dispatches on object in list position */ -var _dispatchable = function _dispatchable(methodname, xf, fn) { - return function() { - var length = arguments.length; - if (length === 0) { + + +function _dispatchable(methodNames, xf, fn) { + return function () { + if (arguments.length === 0) { return fn(); } - var obj = arguments[length - 1]; + var args = Array.prototype.slice.call(arguments, 0); + var obj = args.pop(); if (!_isArray(obj)) { - var args = _slice(arguments, 0, length - 1); - if (typeof obj[methodname] === 'function') { - return obj[methodname].apply(obj, args); + var idx = 0; + while (idx < methodNames.length) { + if (typeof obj[methodNames[idx]] === 'function') { + return obj[methodNames[idx]].apply(obj, args); + } + idx += 1; } - if (_isTransformer(obj)) { + if (_isTransformer_1(obj)) { var transducer = xf.apply(null, args); return transducer(obj); } } return fn.apply(this, arguments); }; -}; +} +var _dispatchable_1 = _dispatchable; -var _map = function _map(fn, functor) { +function _map(fn, functor) { var idx = 0; var len = functor.length; var result = Array(len); @@ -1786,30 +1921,37 @@ var _map = function _map(fn, functor) { idx += 1; } return result; -}; +} +var _map_1 = _map; var _xfBase = { - init: function() { + init: function () { return this.xf['@@transducer/init'](); }, - result: function(result) { + result: function (result) { return this.xf['@@transducer/result'](result); } }; -var _xmap = (function() { +var XMap = /*#__PURE__*/function () { + function XMap(f, xf) { this.xf = xf; this.f = f; } XMap.prototype['@@transducer/init'] = _xfBase.init; XMap.prototype['@@transducer/result'] = _xfBase.result; - XMap.prototype['@@transducer/step'] = function(result, input) { + XMap.prototype['@@transducer/step'] = function (result, input) { return this.xf['@@transducer/step'](result, this.f(input)); }; - return _curry2(function _xmap(f, xf) { return new XMap(f, xf); }); -}()); + return XMap; +}(); + +var _xmap = /*#__PURE__*/_curry2_1(function _xmap(f, xf) { + return new XMap(f, xf); +}); +var _xmap_1 = _xmap; /** * Internal curryN function. @@ -1821,32 +1963,32 @@ var _xmap = (function() { * @param {Function} fn The function to curry. * @return {Function} The curried function. */ -var _curryN = function _curryN(length, received, fn) { - return function() { + + +function _curryN(length, received, fn) { + return function () { var combined = []; var argsIdx = 0; var left = length; var combinedIdx = 0; while (combinedIdx < received.length || argsIdx < arguments.length) { var result; - if (combinedIdx < received.length && - (!_isPlaceholder(received[combinedIdx]) || - argsIdx >= arguments.length)) { + if (combinedIdx < received.length && (!_isPlaceholder_1(received[combinedIdx]) || argsIdx >= arguments.length)) { result = received[combinedIdx]; } else { result = arguments[argsIdx]; argsIdx += 1; } combined[combinedIdx] = result; - if (!_isPlaceholder(result)) { + if (!_isPlaceholder_1(result)) { left -= 1; } combinedIdx += 1; } - return left <= 0 ? fn.apply(this, combined) - : _arity(left, _curryN(length, combined, fn)); + return left <= 0 ? fn.apply(this, combined) : _arity_1(left, _curryN(length, combined, fn)); }; -}; +} +var _curryN_1 = _curryN; /** * Returns a curried equivalent of the provided function, with the specified @@ -1859,10 +2001,10 @@ var _curryN = function _curryN(length, received, fn) { * - `g(1, 2)(3)` * - `g(1, 2, 3)` * - * Secondly, the special placeholder value `R.__` may be used to specify + * Secondly, the special placeholder value [`R.__`](#__) may be used to specify * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is `R.__`, the - * following are equivalent: + * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), + * the following are equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` @@ -1890,23 +2032,54 @@ var _curryN = function _curryN(length, received, fn) { * var g = f(3); * g(4); //=> 10 */ -var curryN = _curry2(function curryN(length, fn) { + + +var curryN = /*#__PURE__*/_curry2_1(function curryN(length, fn) { if (length === 1) { - return _curry1(fn); + return _curry1_1(fn); } - return _arity(length, _curryN(length, [], fn)); + return _arity_1(length, _curryN_1(length, [], fn)); }); +var curryN_1 = curryN; -var _has = function _has(prop, obj) { +function _has(prop, obj) { return Object.prototype.hasOwnProperty.call(obj, prop); +} +var _has_1 = _has; + +var toString = Object.prototype.toString; +var _isArguments = function () { + return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) { + return toString.call(x) === '[object Arguments]'; + } : function _isArguments(x) { + return _has_1('callee', x); + }; }; -var _isArguments = (function() { - var toString = Object.prototype.toString; - return toString.call(arguments) === '[object Arguments]' ? - function _isArguments(x) { return toString.call(x) === '[object Arguments]'; } : - function _isArguments(x) { return _has('callee', x); }; -}()); +var _isArguments_1 = _isArguments; + +// cover IE < 9 keys issues + + +var hasEnumBug = ! /*#__PURE__*/{ toString: null }.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; +// Safari bug +var hasArgsEnumBug = /*#__PURE__*/function () { + 'use strict'; + + return arguments.propertyIsEnumerable('length'); +}(); + +var contains = function contains(list, item) { + var idx = 0; + while (idx < list.length) { + if (list[idx] === item) { + return true; + } + idx += 1; + } + return false; +}; /** * Returns a list containing the names of all the enumerable own properties of @@ -1921,61 +2094,39 @@ var _isArguments = (function() { * @sig {k: v} -> [k] * @param {Object} obj The object to extract properties from * @return {Array} An array of the object's own properties. + * @see R.keysIn, R.values * @example * * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c'] */ -var keys = (function() { - // cover IE < 9 keys issues - var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString'); - var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', - 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; - // Safari bug - var hasArgsEnumBug = (function() { - 'use strict'; - return arguments.propertyIsEnumerable('length'); - }()); - - var contains = function contains(list, item) { - var idx = 0; - while (idx < list.length) { - if (list[idx] === item) { - return true; - } - idx += 1; +var _keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? function keys(obj) { + return Object(obj) !== obj ? [] : Object.keys(obj); +} : function keys(obj) { + if (Object(obj) !== obj) { + return []; + } + var prop, nIdx; + var ks = []; + var checkArgsLength = hasArgsEnumBug && _isArguments_1(obj); + for (prop in obj) { + if (_has_1(prop, obj) && (!checkArgsLength || prop !== 'length')) { + ks[ks.length] = prop; } - return false; - }; - - return typeof Object.keys === 'function' && !hasArgsEnumBug ? - _curry1(function keys(obj) { - return Object(obj) !== obj ? [] : Object.keys(obj); - }) : - _curry1(function keys(obj) { - if (Object(obj) !== obj) { - return []; - } - var prop, nIdx; - var ks = []; - var checkArgsLength = hasArgsEnumBug && _isArguments(obj); - for (prop in obj) { - if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) { - ks[ks.length] = prop; - } - } - if (hasEnumBug) { - nIdx = nonEnumerableProps.length - 1; - while (nIdx >= 0) { - prop = nonEnumerableProps[nIdx]; - if (_has(prop, obj) && !contains(ks, prop)) { - ks[ks.length] = prop; - } - nIdx -= 1; - } + } + if (hasEnumBug) { + nIdx = nonEnumerableProps.length - 1; + while (nIdx >= 0) { + prop = nonEnumerableProps[nIdx]; + if (_has_1(prop, obj) && !contains(ks, prop)) { + ks[ks.length] = prop; } - return ks; - }); -}()); + nIdx -= 1; + } + } + return ks; +}; +var keys = /*#__PURE__*/_curry1_1(_keys); +var keys_1 = keys; /** * Takes a function and @@ -2008,22 +2159,28 @@ var keys = (function() { * R.map(double, [1, 2, 3]); //=> [2, 4, 6] * * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6} + * @symb R.map(f, [a, b]) = [f(a), f(b)] + * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) } + * @symb R.map(f, functor_o) = functor_o.map(f) */ -var map = _curry2(_dispatchable('map', _xmap, function map(fn, functor) { + + +var map = /*#__PURE__*/_curry2_1( /*#__PURE__*/_dispatchable_1(['fantasy-land/map', 'map'], _xmap_1, function map(fn, functor) { switch (Object.prototype.toString.call(functor)) { case '[object Function]': - return curryN(functor.length, function() { + return curryN_1(functor.length, function () { return fn.call(this, functor.apply(this, arguments)); }); case '[object Object]': - return _reduce(function(acc, key) { + return _reduce_1(function (acc, key) { acc[key] = fn(functor[key]); return acc; - }, {}, keys(functor)); + }, {}, keys_1(functor)); default: - return _map(fn, functor); + return _map_1(fn, functor); } })); +var map_1 = map; /** * Returns a lens for the given getter and setter functions. The getter "gets" @@ -2048,18 +2205,18 @@ var map = _curry2(_dispatchable('map', _xmap, function map(fn, functor) { * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} */ -var lens$1 = _curry2(function lens(getter, setter) { - return function(toFunctorFn) { - return function(target) { - return map( - function(focus) { - return setter(focus, target); - }, - toFunctorFn(getter(target)) - ); + + +var lens = /*#__PURE__*/_curry2_1(function lens(getter, setter) { + return function (toFunctorFn) { + return function (target) { + return map_1(function (focus) { + return setter(focus, target); + }, toFunctorFn(getter(target))); }; }; }); +var lens_1$1 = lens; /** * Returns a curried equivalent of the provided function. The curried function @@ -2072,10 +2229,10 @@ var lens$1 = _curry2(function lens(getter, setter) { * - `g(1, 2)(3)` * - `g(1, 2, 3)` * - * Secondly, the special placeholder value `R.__` may be used to specify + * Secondly, the special placeholder value [`R.__`](#__) may be used to specify * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is `R.__`, the - * following are equivalent: + * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), + * the following are equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` @@ -2102,9 +2259,12 @@ var lens$1 = _curry2(function lens(getter, setter) { * var g = f(3); * g(4); //=> 10 */ -var curry$1 = _curry1(function curry(fn) { - return curryN(fn.length, fn); + + +var curry = /*#__PURE__*/_curry1_1(function curry(fn) { + return curryN_1(fn.length, fn); }); +var curry_1$1 = curry; // Copyright (c) 2013-2014 Quildreen Motta // @@ -2580,7 +2740,7 @@ var lib = either; /* eslint-disable new-cap */ -var updateAt = curry$1(function (keyArray, newVal, obj) { +var updateAt = curry_1$1(function (keyArray, newVal, obj) { var deepNewVal = keyArray.reduceRight(function (result, key) { return defineProperty({}, key, result); }, newVal); @@ -2590,9 +2750,9 @@ var updateAt = curry$1(function (keyArray, newVal, obj) { // State lenses var StateLenses = { - fieldTypes: lens$1(prop$1("fieldTypes"), updateAt(["fieldTypes"])), - fieldsState: lens$1(prop$1("fieldsState"), updateAt(["fieldsState"])), - fieldsStateHistory: lens$1(prop$1("fieldsStateHistory"), updateAt(["fieldsStateHistory"])) + fieldTypes: lens_1$1(prop_1$1("fieldTypes"), updateAt(["fieldTypes"])), + fieldsState: lens_1$1(prop_1$1("fieldsState"), updateAt(["fieldsState"])), + fieldsStateHistory: lens_1$1(prop_1$1("fieldsStateHistory"), updateAt(["fieldsStateHistory"])) }; // _ => String @@ -2601,23 +2761,23 @@ var createId = function createId(_) { }; // State -> [fieldsState] -> State -var pushHistoryState = curry$1(function (state, newHistoryState) { - return pipe( +var pushHistoryState = curry_1$1(function (state, newHistoryState) { + return pipe_1( // Add current state to history - over(StateLenses.fieldsStateHistory, prepend(state.fieldsState)), + over_1(StateLenses.fieldsStateHistory, prepend_1(state.fieldsState)), // Make new State the current - set$1(StateLenses.fieldsState, newHistoryState))(state); + set_1(StateLenses.fieldsState, newHistoryState))(state); }); // State -> State var hideConfigs = function hideConfigs(state) { - return set$1(StateLenses.fieldsState, state.fieldsState.map(function (s) { + return set_1(StateLenses.fieldsState, state.fieldsState.map(function (s) { return Object.assign({}, s, { configShowing: false }); }), state); }; // String -> String -> Object -> Either String Object -var propertyTypeCheck = curry$1(function (propertyName, type, obj) { +var propertyTypeCheck = curry_1$1(function (propertyName, type, obj) { return _typeof(obj[propertyName]) === type ? lib.Right(obj) : lib.Left("Property '" + propertyName + "' cannot be of type " + _typeof(obj[propertyName])); }); @@ -2634,14 +2794,17 @@ var lastHistoryState = function lastHistoryState(state) { }; var undo$1 = function undo(state, _) { - return pipe( + return pipe_1( // Make last history last state the current one - set$1(StateLenses.fieldsState, lastHistoryState(state)), + set_1(StateLenses.fieldsState, lastHistoryState(state)), // Remove last history state from the history array - over(StateLenses.fieldsStateHistory, slice(1, Infinity)))(state); + over_1(StateLenses.fieldsStateHistory, slice_1(1, Infinity)))(state); }; -var _identity = function _identity(x) { return x; }; +function _identity(x) { + return x; +} +var _identity_1 = _identity; /** * A function that does nothing but return the parameter supplied to it. Good @@ -2660,38 +2823,12 @@ var _identity = function _identity(x) { return x; }; * * var obj = {}; * R.identity(obj) === obj; //=> true + * @symb R.identity(a) = a */ -var identity = _curry1(_identity); -/** - * Retrieve the value at a given path. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @sig [String] -> {k: v} -> v | Undefined - * @param {Array} path The path to use. - * @param {Object} obj The object to retrieve the nested property from. - * @return {*} The data at `path`. - * @see R.prop - * @example - * - * R.path(['a', 'b'], {a: {b: 2}}); //=> 2 - * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined - */ -var path = _curry2(function path(paths, obj) { - var val = obj; - var idx = 0; - while (idx < paths.length) { - if (val == null) { - return; - } - val = val[paths[idx]]; - idx += 1; - } - return val; -}); + +var identity = /*#__PURE__*/_curry1_1(_identity_1); +var identity_1 = identity; /** * ap applies a list of functions to a list of values. @@ -2705,36 +2842,46 @@ var path = _curry2(function path(paths, obj) { * @category Function * @sig [a -> b] -> [a] -> [b] * @sig Apply f => f (a -> b) -> f a -> f b - * @param {Array} fns An array of functions - * @param {Array} vs An array of values - * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn. + * @sig (a -> b -> c) -> (a -> b) -> (a -> c) + * @param {*} applyF + * @param {*} applyX + * @return {*} * @example * * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6] + * R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"] + * + * // R.ap can also be used as S combinator + * // when only two functions are passed + * R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA' + * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)] */ -var ap = _curry2(function ap(applicative, fn) { - return ( - typeof applicative.ap === 'function' ? - applicative.ap(fn) : - typeof applicative === 'function' ? - function(x) { return applicative(x)(fn(x)); } : - // else - _reduce(function(acc, f) { return _concat(acc, map(f, fn)); }, [], applicative) - ); + + +var ap = /*#__PURE__*/_curry2_1(function ap(applyF, applyX) { + return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) { + return applyF(x)(applyX(x)); + } : + // else + _reduce_1(function (acc, f) { + return _concat_1(acc, map_1(f, applyX)); + }, [], applyF); }); +var ap_1 = ap; /** * Returns a single item by iterating through the list, successively calling * the iterator function and passing it an accumulator value and the current * value from the array, and then passing the result to the next call. * - * Similar to `reduce`, except moves through the input list from the right to - * the left. + * Similar to [`reduce`](#reduce), except moves through the input list from the + * right to the left. * - * The iterator function receives two values: *(acc, value)* + * The iterator function receives two values: *(value, acc)*, while the arguments' + * order of `reduce`'s iterator function is *(acc, value)*. * * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.reduce` method. For more details + * arrays), unlike the native `Array.prototype.reduceRight` method. For more details * on this behavior, see: * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description * @@ -2742,28 +2889,39 @@ var ap = _curry2(function ap(applicative, fn) { * @memberOf R * @since v0.1.0 * @category List - * @sig (a,b -> a) -> a -> [b] -> a - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array. + * @sig ((a, b) -> b) -> b -> [a] -> b + * @param {Function} fn The iterator function. Receives two values, the current element from the array + * and the accumulator. * @param {*} acc The accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. - * @see R.addIndex + * @see R.reduce, R.addIndex * @example * - * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ]; - * var flattenPairs = (acc, pair) => acc.concat(pair); - * - * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ] + * R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2 + * // - -2 + * // / \ / \ + * // 1 - 1 3 + * // / \ / \ + * // 2 - ==> 2 -1 + * // / \ / \ + * // 3 - 3 4 + * // / \ / \ + * // 4 0 4 0 + * + * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a))) */ -var reduceRight = _curry3(function reduceRight(fn, acc, list) { + + +var reduceRight = /*#__PURE__*/_curry3_1(function reduceRight(fn, acc, list) { var idx = list.length - 1; while (idx >= 0) { - acc = fn(acc, list[idx]); + acc = fn(list[idx], acc); idx -= 1; } return acc; }); +var reduceRight_1 = reduceRight; /** * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable) @@ -2789,13 +2947,14 @@ var reduceRight = _curry3(function reduceRight(fn, acc, list) { * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)] * R.sequence(R.of, Nothing()); //=> [Nothing()] */ -var sequence = _curry2(function sequence(of, traversable) { - return typeof traversable.sequence === 'function' ? - traversable.sequence(of) : - reduceRight(function(acc, x) { return ap(map(prepend, x), acc); }, - of([]), - traversable); + + +var sequence = /*#__PURE__*/_curry2_1(function sequence(of, traversable) { + return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight_1(function (x, acc) { + return ap_1(map_1(prepend_1, x), acc); + }, of([]), traversable); }); +var sequence_1 = sequence; /** * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning @@ -2803,7 +2962,7 @@ var sequence = _curry2(function sequence(of, traversable) { * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative * into an Applicative of Traversable. * - * Dispatches to the `sequence` method of the third argument, if present. + * Dispatches to the `traverse` method of the third argument, if present. * * @func * @memberOf R @@ -2823,24 +2982,43 @@ var sequence = _curry2(function sequence(of, traversable) { * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Just([5, 2.5, 2]) * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Nothing */ -var traverse = _curry3(function traverse(of, f, traversable) { - return sequence(of, map(f, traversable)); + + +var traverse = /*#__PURE__*/_curry3_1(function traverse(of, f, traversable) { + return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](f, of) : sequence_1(of, map_1(f, traversable)); }); +var traverse_1 = traverse; -var _arrayFromIterator = function _arrayFromIterator(iter) { +function _arrayFromIterator(iter) { var list = []; var next; while (!(next = iter.next()).done) { list.push(next.value); } return list; -}; +} +var _arrayFromIterator_1 = _arrayFromIterator; -var _functionName = function _functionName(f) { +function _containsWith(pred, x, list) { + var idx = 0; + var len = list.length; + + while (idx < len) { + if (pred(x, list[idx])) { + return true; + } + idx += 1; + } + return false; +} +var _containsWith_1 = _containsWith; + +function _functionName(f) { // String(x => x) evaluates to "x => x", so the pattern may not match. var match = String(f).match(/^function (\w*)/); return match == null ? '' : match[1]; -}; +} +var _functionName_1 = _functionName; /** * Returns true if its arguments are identical, false otherwise. Values are @@ -2865,9 +3043,12 @@ var _functionName = function _functionName(f) { * R.identical(0, -0); //=> false * R.identical(NaN, NaN); //=> true */ -var identical = _curry2(function identical(a, b) { + + +var identical = /*#__PURE__*/_curry2_1(function identical(a, b) { // SameValue algorithm - if (a === b) { // Steps 1-5, 7-10 + if (a === b) { + // Steps 1-5, 7-10 // Steps 6.b-6.e: +0 != -0 return a !== 0 || 1 / a === 1 / b; } else { @@ -2875,6 +3056,7 @@ var identical = _curry2(function identical(a, b) { return a !== a && b !== b; } }); +var identical_1 = identical; /** * Gives a single-word string description of the (native) type of a value, @@ -2898,19 +3080,49 @@ var identical = _curry2(function identical(a, b) { * R.type(null); //=> "Null" * R.type([]); //=> "Array" * R.type(/[A-z]/); //=> "RegExp" + * R.type(() => {}); //=> "Function" + * R.type(undefined); //=> "Undefined" */ -var type = _curry1(function type(val) { - return val === null ? 'Null' : - val === undefined ? 'Undefined' : - Object.prototype.toString.call(val).slice(8, -1); + + +var type = /*#__PURE__*/_curry1_1(function type(val) { + return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1); }); +var type_1 = type; + +/** + * private _uniqContentEquals function. + * That function is checking equality of 2 iterator contents with 2 assumptions + * - iterators lengths are the same + * - iterators values are unique + * + * false-positive result will be returned for comparision of, e.g. + * - [1,2,3] and [1,2,3,4] + * - [1,1,1] and [1,2,3] + * */ + +function _uniqContentEquals(aIterator, bIterator, stackA, stackB) { + var a = _arrayFromIterator_1(aIterator); + var b = _arrayFromIterator_1(bIterator); + + function eq(_a, _b) { + return _equals(_a, _b, stackA.slice(), stackB.slice()); + } -var _equals = function _equals(a, b, stackA, stackB) { - if (identical(a, b)) { + // if *a* array contains any element that is not included in *b* + return !_containsWith_1(function (b, aItem) { + return !_containsWith_1(eq, aItem, b); + }, b, a); +} + +function _equals(a, b, stackA, stackB) { + if (identical_1(a, b)) { return true; } - if (type(a) !== type(b)) { + var typeA = type_1(a); + + if (typeA !== type_1(b)) { return false; } @@ -2918,50 +3130,73 @@ var _equals = function _equals(a, b, stackA, stackB) { return false; } + if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') { + return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a); + } + if (typeof a.equals === 'function' || typeof b.equals === 'function') { - return typeof a.equals === 'function' && a.equals(b) && - typeof b.equals === 'function' && b.equals(a); + return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a); } - switch (type(a)) { + switch (typeA) { case 'Arguments': case 'Array': case 'Object': - if (typeof a.constructor === 'function' && - _functionName(a.constructor) === 'Promise') { + if (typeof a.constructor === 'function' && _functionName_1(a.constructor) === 'Promise') { return a === b; } break; case 'Boolean': case 'Number': case 'String': - if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) { + if (!(typeof a === typeof b && identical_1(a.valueOf(), b.valueOf()))) { return false; } break; case 'Date': - if (!identical(a.valueOf(), b.valueOf())) { + if (!identical_1(a.valueOf(), b.valueOf())) { return false; } break; case 'Error': return a.name === b.name && a.message === b.message; case 'RegExp': - if (!(a.source === b.source && - a.global === b.global && - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline && - a.sticky === b.sticky && - a.unicode === b.unicode)) { + if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) { return false; } break; + } + + var idx = stackA.length - 1; + while (idx >= 0) { + if (stackA[idx] === a) { + return stackB[idx] === b; + } + idx -= 1; + } + + switch (typeA) { case 'Map': + if (a.size !== b.size) { + return false; + } + + return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b])); case 'Set': - if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) { + if (a.size !== b.size) { return false; } - break; + + return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b])); + case 'Arguments': + case 'Array': + case 'Object': + case 'Boolean': + case 'Number': + case 'String': + case 'Date': + case 'Error': + case 'RegExp': case 'Int8Array': case 'Uint8Array': case 'Uint8ClampedArray': @@ -2971,7 +3206,6 @@ var _equals = function _equals(a, b, stackA, stackB) { case 'Uint32Array': case 'Float32Array': case 'Float64Array': - break; case 'ArrayBuffer': break; default: @@ -2979,33 +3213,25 @@ var _equals = function _equals(a, b, stackA, stackB) { return false; } - var keysA = keys(a); - if (keysA.length !== keys(b).length) { + var keysA = keys_1(a); + if (keysA.length !== keys_1(b).length) { return false; } - var idx = stackA.length - 1; - while (idx >= 0) { - if (stackA[idx] === a) { - return stackB[idx] === b; - } - idx -= 1; - } + var extendedStackA = stackA.concat([a]); + var extendedStackB = stackB.concat([b]); - stackA.push(a); - stackB.push(b); idx = keysA.length - 1; while (idx >= 0) { var key = keysA[idx]; - if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) { + if (!(_has_1(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) { return false; } idx -= 1; } - stackA.pop(); - stackB.pop(); return true; -}; +} +var _equals_1 = _equals; /** * Returns `true` if its arguments are equivalent, `false` otherwise. Handles @@ -3032,9 +3258,12 @@ var _equals = function _equals(a, b, stackA, stackB) { * var b = {}; b.v = b; * R.equals(a, b); //=> true */ -var equals = _curry2(function equals(a, b) { - return _equals(a, b, [], []); + + +var equals = /*#__PURE__*/_curry2_1(function equals(a, b) { + return _equals_1(a, b, [], []); }); +var equals_1 = equals; /* weak */ /* eslint-disable new-cap */ @@ -3043,17 +3272,17 @@ var isArray = function isArray(arr) { return Array.isArray(arr) ? lib.Right(arr) : lib.Left("Invalid states sent with importState. Expected Array but received " + (typeof arr === "undefined" ? "undefined" : _typeof(arr))); }; // eslint-disable-line max-len -var fieldTypeIsValid = curry$1(function (validTypes, field) { - return validTypes.find(equals(field.type)) ? lib.Right(field) : lib.Left("Invalid field type " + field.type); +var fieldTypeIsValid = curry_1$1(function (validTypes, field) { + return validTypes.find(equals_1(field.type)) ? lib.Right(field) : lib.Left("Invalid field type " + field.type); }); -var validFieldTypes = curry$1(function (validTypes, fieldsState) { - return traverse(lib.of, fieldTypeIsValid(validTypes), fieldsState); +var validFieldTypes = curry_1$1(function (validTypes, fieldsState) { + return traverse_1(lib.of, fieldTypeIsValid(validTypes), fieldsState); }); // [a] -> [a] -> Either String [a] -var validateFieldsState = curry$1(function (fieldsState, state) { - return lib.of(fieldsState).chain(isArray).chain(validFieldTypes(state.fieldTypes.map(path(["info", "type"])))); +var validateFieldsState = curry_1$1(function (fieldsState, state) { + return lib.of(fieldsState).chain(isArray).chain(validFieldTypes(state.fieldTypes.map(path_1(["info", "type"])))); }); // Add required properties that are not managed by the field @@ -3073,40 +3302,46 @@ var addRequiredProperties = function addRequiredProperties(fieldStates) { // will be returned var importState$1 = (function (state, _ref) { var newFieldsState = _ref.newFieldsState; - return validateFieldsState(newFieldsState, state).map(addRequiredProperties).map(pushHistoryState(state)).bimap(console.error, identity).getOrElse(state); + return validateFieldsState(newFieldsState, state).map(addRequiredProperties).map(pushHistoryState(state)).bimap(console.error, identity_1).getOrElse(state); }); -var _reduced = function _reduced(x) { - return x && x['@@transducer/reduced'] ? x : - { - '@@transducer/value': x, - '@@transducer/reduced': true - }; -}; +function _reduced(x) { + return x && x['@@transducer/reduced'] ? x : { + '@@transducer/value': x, + '@@transducer/reduced': true + }; +} +var _reduced_1 = _reduced; + +var XFind = /*#__PURE__*/function () { -var _xfind = (function() { function XFind(f, xf) { this.xf = xf; this.f = f; this.found = false; } XFind.prototype['@@transducer/init'] = _xfBase.init; - XFind.prototype['@@transducer/result'] = function(result) { + XFind.prototype['@@transducer/result'] = function (result) { if (!this.found) { result = this.xf['@@transducer/step'](result, void 0); } return this.xf['@@transducer/result'](result); }; - XFind.prototype['@@transducer/step'] = function(result, input) { + XFind.prototype['@@transducer/step'] = function (result, input) { if (this.f(input)) { this.found = true; - result = _reduced(this.xf['@@transducer/step'](result, input)); + result = _reduced_1(this.xf['@@transducer/step'](result, input)); } return result; }; - return _curry2(function _xfind(f, xf) { return new XFind(f, xf); }); -}()); + return XFind; +}(); + +var _xfind = /*#__PURE__*/_curry2_1(function _xfind(f, xf) { + return new XFind(f, xf); +}); +var _xfind_1 = _xfind; /** * Returns the first element of the list which matches the predicate, or @@ -3132,7 +3367,9 @@ var _xfind = (function() { * R.find(R.propEq('a', 2))(xs); //=> {a: 2} * R.find(R.propEq('a', 4))(xs); //=> undefined */ -var find = _curry2(_dispatchable('find', _xfind, function find(fn, list) { + + +var find = /*#__PURE__*/_curry2_1( /*#__PURE__*/_dispatchable_1(['find'], _xfind_1, function find(fn, list) { var idx = 0; var len = list.length; while (idx < len) { @@ -3142,6 +3379,7 @@ var find = _curry2(_dispatchable('find', _xfind, function find(fn, list) { idx += 1; } })); +var find_1 = find; /** * A helper for delaying the execution of a function. @@ -3498,11 +3736,11 @@ var lib$1 = task; // State -> String -> Either String Function var typeConstructor = function typeConstructor(state, fieldType) { - return lib.of(state).map(prop$1("fieldTypes")).map(find(function (v) { + return lib.of(state).map(prop_1$1("fieldTypes")).map(find_1(function (v) { return v.info.type === fieldType; })).chain(lib.fromNullable).bimap(function (_) { return "Field \"" + fieldType + "\" does not exist."; - }, identity); + }, identity_1); }; // { initialState: Function } -> Task String Object @@ -3548,7 +3786,7 @@ var createFieldAsynchronously = function createFieldAsynchronously(state, fieldT .map(insertRequiredProps).fork( // execute task function (err) { return console.error("Task rejected", err); - }, pipe(fieldCreated, asyncDispatch)); + }, pipe_1(fieldCreated, asyncDispatch)); }; // This is an async action. When it is finished it will trigger the @@ -3571,9 +3809,9 @@ var createField$2 = (function (state, _ref) { * @category List * @sig a -> [a] -> [a] * @param {*} el The element to add to the end of the new list. - * @param {Array} list The list whose contents will be added to the beginning of the output + * @param {Array} list The list of elements to add a new item to. * list. - * @return {Array} A new list containing the contents of the old list followed by `el`. + * @return {Array} A new list containing the elements of the old list followed by `el`. * @see R.prepend * @example * @@ -3581,9 +3819,12 @@ var createField$2 = (function (state, _ref) { * R.append('tests', []); //=> ['tests'] * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']] */ -var append = _curry2(function append(el, list) { - return _concat(list, [el]); + + +var append = /*#__PURE__*/_curry2_1(function append(el, list) { + return _concat_1(list, [el]); }); +var append_1 = append; // Copyright (c) 2013-2014 Quildreen Motta // @@ -3986,20 +4227,20 @@ Just.prototype.toJSON = function() { var lib$2 = maybe; // State -> Object -> State -var historyStateWithNewField = curry$1(function (state, newField) { - return pipe(hideConfigs, over(StateLenses.fieldsState, append(newField)))(state); +var historyStateWithNewField = curry_1$1(function (state, newField) { + return pipe_1(hideConfigs, over_1(StateLenses.fieldsState, append_1(newField)))(state); }); var fieldCreated$1 = (function (state, _ref) { var createdFieldState = _ref.createdFieldState; - return lib$2.fromNullable(createdFieldState).map(historyStateWithNewField(state)).map(prop$1("fieldsState")).map(pushHistoryState(state)).getOrElse(state); + return lib$2.fromNullable(createdFieldState).map(historyStateWithNewField(state)).map(prop_1$1("fieldsState")).map(pushHistoryState(state)).getOrElse(state); }); var toggleConfig$1 = function toggleConfig(fieldState) { return seamlessImmutable(fieldState).set("configShowing", !fieldState.configShowing); }; -var replaceFieldState = curry$1(function (state, fieldState) { +var replaceFieldState = curry_1$1(function (state, fieldState) { return state.fieldsState.map(function (aField) { return aField.id === fieldState.id ? fieldState : aField; }); @@ -4014,7 +4255,7 @@ var toggleRequired$1 = function toggleRequired(fieldState) { return seamlessImmutable(fieldState).set("required", !fieldState.required); }; -var replaceFieldState$1 = curry$1(function (state, fieldState) { +var replaceFieldState$1 = curry_1$1(function (state, fieldState) { return state.fieldsState.map(function (aField) { return aField.id === fieldState.id ? fieldState : aField; }); @@ -4025,7 +4266,7 @@ var toggleRequired$2 = (function (state, _ref) { return lib$2.fromNullable(fieldState).map(toggleRequired$1).map(replaceFieldState$1(state)).map(pushHistoryState(state)).getOrElse(state); }); -var _filter = function _filter(fn, list) { +function _filter(fn, list) { var idx = 0; var len = list.length; var result = []; @@ -4037,30 +4278,39 @@ var _filter = function _filter(fn, list) { idx += 1; } return result; -}; +} +var _filter_1 = _filter; -var _isObject = function _isObject(x) { +function _isObject(x) { return Object.prototype.toString.call(x) === '[object Object]'; -}; +} +var _isObject_1 = _isObject; + +var XFilter = /*#__PURE__*/function () { -var _xfilter = (function() { function XFilter(f, xf) { this.xf = xf; this.f = f; } XFilter.prototype['@@transducer/init'] = _xfBase.init; XFilter.prototype['@@transducer/result'] = _xfBase.result; - XFilter.prototype['@@transducer/step'] = function(result, input) { + XFilter.prototype['@@transducer/step'] = function (result, input) { return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; }; - return _curry2(function _xfilter(f, xf) { return new XFilter(f, xf); }); -}()); + return XFilter; +}(); + +var _xfilter = /*#__PURE__*/_curry2_1(function _xfilter(f, xf) { + return new XFilter(f, xf); +}); +var _xfilter_1 = _xfilter; /** - * Takes a predicate and a "filterable", and returns a new filterable of the + * Takes a predicate and a `Filterable`, and returns a new filterable of the * same type containing the members of the given filterable which satisfy the - * given predicate. + * given predicate. Filterable objects include plain objects or any object + * that has a filter method such as `Array`. * * Dispatches to the `filter` method of the second argument, if present. * @@ -4073,7 +4323,7 @@ var _xfilter = (function() { * @sig Filterable f => (a -> Boolean) -> f a -> f a * @param {Function} pred * @param {Array} filterable - * @return {Array} + * @return {Array} Filterable * @see R.reject, R.transduce, R.addIndex * @example * @@ -4083,35 +4333,35 @@ var _xfilter = (function() { * * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} */ -var filter = _curry2(_dispatchable('filter', _xfilter, function(pred, filterable) { - return ( - _isObject(filterable) ? - _reduce(function(acc, key) { - if (pred(filterable[key])) { - acc[key] = filterable[key]; - } - return acc; - }, {}, keys(filterable)) : - // else - _filter(pred, filterable) - ); + + +var filter = /*#__PURE__*/_curry2_1( /*#__PURE__*/_dispatchable_1(['filter'], _xfilter_1, function (pred, filterable) { + return _isObject_1(filterable) ? _reduce_1(function (acc, key) { + if (pred(filterable[key])) { + acc[key] = filterable[key]; + } + return acc; + }, {}, keys_1(filterable)) : + // else + _filter_1(pred, filterable); })); +var filter_1 = filter; // State -> Object -> State -var historyStateWithoutField = curry$1(function (state, fieldState) { - return over(StateLenses.fieldsState, filter(function (fs) { +var historyStateWithoutField = curry_1$1(function (state, fieldState) { + return over_1(StateLenses.fieldsState, filter_1(function (fs) { return fs.id !== fieldState.id; }), state); }); var deleteField$1 = (function (state, _ref) { var fieldState = _ref.fieldState; - return lib$2.fromNullable(fieldState).map(historyStateWithoutField(state)).map(prop$1("fieldsState")).map(pushHistoryState(state)).getOrElse(state); + return lib$2.fromNullable(fieldState).map(historyStateWithoutField(state)).map(prop_1$1("fieldsState")).map(pushHistoryState(state)).getOrElse(state); }); // State -> Object -> State -var updateFieldState = curry$1(function (state, newFieldState) { - return over(StateLenses.fieldsState, map(function (fs) { +var updateFieldState = curry_1$1(function (state, newFieldState) { + return over_1(StateLenses.fieldsState, map_1(function (fs) { return fs.id === newFieldState.id ? newFieldState : fs; }), state); }); @@ -4119,7 +4369,7 @@ var updateFieldState = curry$1(function (state, newFieldState) { var updateField$1 = (function (state, _ref) { var newFieldState = _ref.newFieldState; return validateField(newFieldState) // Either - .map(updateFieldState(state)).map(prop$1("fieldsState")).map(pushHistoryState(state)).leftMap(console.error).getOrElse(state); + .map(updateFieldState(state)).map(prop_1$1("fieldsState")).map(pushHistoryState(state)).leftMap(console.error).getOrElse(state); }); /** @@ -4133,7 +4383,7 @@ var updateField$1 = (function (state, _ref) { * @memberOf R * @since v0.1.0 * @category List - * @sig (a,a -> Number) -> [a] -> [a] + * @sig ((a, a) -> Number) -> [a] -> [a] * @param {Function} comparator A sorting function :: a -> b -> Int * @param {Array} list The list to sort * @return {Array} a new array with its elements sorted by the comparator function. @@ -4142,13 +4392,16 @@ var updateField$1 = (function (state, _ref) { * var diff = function(a, b) { return a - b; }; * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7] */ -var sort = _curry2(function sort(comparator, list) { - return _slice(list).sort(comparator); + + +var sort = /*#__PURE__*/_curry2_1(function sort(comparator, list) { + return Array.prototype.slice.call(list, 0).sort(comparator); }); +var sort_1 = sort; // State -> Object -> State -var historyStateWithNewOrder = curry$1(function (state, newOrder) { - return pipe(hideConfigs, over(StateLenses.fieldsState, sort(function (f1, f2) { +var historyStateWithNewOrder = curry_1$1(function (state, newOrder) { + return pipe_1(hideConfigs, over_1(StateLenses.fieldsState, sort_1(function (f1, f2) { return newOrder.indexOf(f1.id) - newOrder.indexOf(f2.id); })))(state); }); @@ -4159,12 +4412,12 @@ var reorderFields$1 = (function (state, _ref) { return o.length === state.fieldsState.length ? lib.Right(o) : lib.Left("newFieldsOrder has " + o.length + " elements, but the current state has " + state.fieldsState.length + " elements"); } // eslint-disable-line max-len ).chain(function (o) { - var stateIds = state.fieldsState.map(prop$1("id")); + var stateIds = state.fieldsState.map(prop_1$1("id")); var noMissingId = stateIds.reduce(function (acc, fId) { return acc && o.includes(fId); }, true); return noMissingId ? lib.Right(o) : lib.Left("Not all ids in the new order are matched in the existing state ids."); - }).map(historyStateWithNewOrder(state)).map(prop$1("fieldsState")).map(pushHistoryState(state)).leftMap(function (err) { + }).map(historyStateWithNewOrder(state)).map(prop_1$1("fieldsState")).map(pushHistoryState(state)).leftMap(function (err) { return console.error("Unable to reorder: " + err); }).getOrElse(state); }); @@ -4186,7 +4439,7 @@ var hasRequiredInfo = function hasRequiredInfo(component) { }; var isComponentValid = function isComponentValid(customComponents) { - return traverse(lib.of, hasRequiredInfo, customComponents); + return traverse_1(lib.of, hasRequiredInfo, customComponents); }; // [a] -> [a] -> Either String [a] @@ -4194,8 +4447,8 @@ var validateComponents = function validateComponents(customComponents) { return lib.Right(customComponents).chain(isArray$1).chain(isComponentValid); }; -var addToFieldTypes = curry$1(function (state, customComponents) { - return over(StateLenses.fieldTypes, function (s) { +var addToFieldTypes = curry_1$1(function (state, customComponents) { + return over_1(StateLenses.fieldTypes, function (s) { return s.concat(customComponents); }, state); }); diff --git a/dist/fl-form-builder-tests.js.map b/dist/fl-form-builder-tests.js.map index 0c8a1a2..c59356c 100644 --- a/dist/fl-form-builder-tests.js.map +++ b/dist/fl-form-builder-tests.js.map @@ -1 +1 @@ -{"version":3,"file":"fl-form-builder-tests.js","sources":["src/js/Actions.js","src/tests/actions.js","node_modules/seamless-immutable/src/seamless-immutable.js","src/js/utils/asyncDispatchMiddleware.js","src/tests/utils.asyncDispatchMiddleware.js","node_modules/fl-assert/dist/assert.js","node_modules/ramda/src/internal/_isArray.js","node_modules/ramda/src/internal/_slice.js","node_modules/ramda/src/internal/_checkForMethod.js","node_modules/ramda/src/internal/_isPlaceholder.js","node_modules/ramda/src/internal/_curry1.js","node_modules/ramda/src/internal/_curry2.js","node_modules/ramda/src/internal/_curry3.js","node_modules/ramda/src/slice.js","node_modules/ramda/src/over.js","node_modules/ramda/src/always.js","node_modules/ramda/src/set.js","node_modules/ramda/src/internal/_arity.js","node_modules/ramda/src/internal/_pipe.js","node_modules/ramda/src/internal/_xwrap.js","node_modules/ramda/src/bind.js","node_modules/ramda/src/internal/_isString.js","node_modules/ramda/src/isArrayLike.js","node_modules/ramda/src/internal/_reduce.js","node_modules/ramda/src/reduce.js","node_modules/ramda/src/tail.js","node_modules/ramda/src/pipe.js","node_modules/ramda/src/internal/_concat.js","node_modules/ramda/src/prepend.js","node_modules/ramda/src/prop.js","node_modules/ramda/src/internal/_isTransformer.js","node_modules/ramda/src/internal/_dispatchable.js","node_modules/ramda/src/internal/_map.js","node_modules/ramda/src/internal/_xfBase.js","node_modules/ramda/src/internal/_xmap.js","node_modules/ramda/src/internal/_curryN.js","node_modules/ramda/src/curryN.js","node_modules/ramda/src/internal/_has.js","node_modules/ramda/src/internal/_isArguments.js","node_modules/ramda/src/keys.js","node_modules/ramda/src/map.js","node_modules/ramda/src/lens.js","node_modules/ramda/src/curry.js","node_modules/data.either/lib/either.js","node_modules/data.either/lib/index.js","src/js/Update/utils.js","src/js/Update/undo.js","node_modules/ramda/src/internal/_identity.js","node_modules/ramda/src/identity.js","node_modules/ramda/src/path.js","node_modules/ramda/src/ap.js","node_modules/ramda/src/reduceRight.js","node_modules/ramda/src/sequence.js","node_modules/ramda/src/traverse.js","node_modules/ramda/src/internal/_arrayFromIterator.js","node_modules/ramda/src/internal/_functionName.js","node_modules/ramda/src/identical.js","node_modules/ramda/src/type.js","node_modules/ramda/src/internal/_equals.js","node_modules/ramda/src/equals.js","src/js/Update/importState.js","node_modules/ramda/src/internal/_reduced.js","node_modules/ramda/src/internal/_xfind.js","node_modules/ramda/src/find.js","node_modules/data.task/lib/task.js","node_modules/data.task/lib/index.js","src/js/Update/createField.js","node_modules/ramda/src/append.js","node_modules/data.maybe/lib/maybe.js","node_modules/data.maybe/lib/index.js","src/js/Update/fieldCreated.js","src/js/Update/field.toggleConfig.js","src/js/Update/field.toggleRequired.js","node_modules/ramda/src/internal/_filter.js","node_modules/ramda/src/internal/_isObject.js","node_modules/ramda/src/internal/_xfilter.js","node_modules/ramda/src/filter.js","src/js/Update/field.deleteField.js","src/js/Update/field.updateField.js","node_modules/ramda/src/sort.js","src/js/Update/reorderFields.js","src/js/Update/importCustomComponents.js","src/js/Update/index.js","src/tests/update/undo.js","src/tests/update/importState.js","src/tests/update/createField.js","src/tests/update/fieldCreated.js","src/tests/update/field.toggleConfig.js","src/tests/update/field.toggleRequired.js","src/tests/update/field.deleteField.js","src/tests/update/field.updateField.js","src/tests/update/reorderFields.js","src/tests/update/importCustomComponents.js"],"sourcesContent":["//\n// ACTION CREATORS\n//\n\nexport const undo = _ =>\n({\n type: \"undo\",\n});\n\nexport const importCustomComponents = customComponents =>\n({\n type: \"importCustomComponents\",\n customComponents,\n});\n\n\nexport const importState = newFieldsState =>\n({\n type: \"importState\",\n newFieldsState,\n});\n\nexport const createField = fieldType =>\n({\n type: \"createField\",\n fieldType,\n});\n\nexport const fieldCreated = createdFieldState =>\n({\n type: \"fieldCreated\",\n createdFieldState,\n});\n\nexport const toggleConfig = fieldState =>\n({\n type: \"toggleConfig\",\n fieldState,\n});\n\nexport const toggleRequired = fieldState =>\n({\n type: \"toggleRequired\",\n fieldState,\n});\n\nexport const deleteField = fieldState =>\n({\n type: \"deleteField\",\n fieldState,\n});\n\nexport const updateField = newFieldState =>\n({\n type: \"updateField\",\n newFieldState,\n});\n\nexport const reorderFields = newFieldsOrder =>\n({\n type: \"reorderFields\",\n newFieldsOrder,\n});\n","/* eslint-env jasmine */\n\nimport {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n} from \"../js/Actions\";\n\ndescribe(\"Action\", () => {\n describe(\"undo\", () => {\n it(\"returns the correct action type\", () => {\n const action = undo();\n expect(action.type).toEqual(\"undo\");\n });\n });\n\n describe(\"importState\", () => {\n const mockStateToImport = [\"a\", \"b\"];\n\n it(\"returns the correct action type\", () => {\n const action = importState(mockStateToImport);\n expect(action.type).toEqual(\"importState\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importState(mockStateToImport);\n expect(action.newFieldsState).toEqual(mockStateToImport);\n });\n });\n\n describe(\"createField\", () => {\n const fieldType = \"testField\";\n\n it(\"returns the correct action type\", () => {\n const action = createField(fieldType);\n expect(action.type).toEqual(\"createField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = createField(fieldType);\n expect(action.fieldType).toEqual(fieldType);\n });\n });\n\n describe(\"fieldCreated\", () => {\n const createdFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.type).toEqual(\"fieldCreated\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.createdFieldState).toEqual(createdFieldState);\n });\n });\n\n describe(\"toggleConfig\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleConfig(fieldState);\n expect(action.type).toEqual(\"toggleConfig\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleConfig(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"toggleRequired\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleRequired(fieldState);\n expect(action.type).toEqual(\"toggleRequired\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleRequired(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"deleteField\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = deleteField(fieldState);\n expect(action.type).toEqual(\"deleteField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = deleteField(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"updateField\", () => {\n const newFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = updateField(newFieldState);\n expect(action.type).toEqual(\"updateField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = updateField(newFieldState);\n expect(action.newFieldState).toEqual(newFieldState);\n });\n });\n\n describe(\"reorderFields\", () => {\n const newFieldsOrder = {};\n\n it(\"returns the correct action type\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.type).toEqual(\"reorderFields\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.newFieldsOrder).toEqual(newFieldsOrder);\n });\n });\n\n describe(\"importCustomComponents\", () => {\n const customComponents = [];\n\n it(\"returns the correct action type\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.type).toEqual(\"importCustomComponents\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.customComponents).toEqual(customComponents);\n });\n });\n});\n","(function() {\n \"use strict\";\n\nfunction immutableInit(config) {\n\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L21\n var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element');\n var REACT_ELEMENT_TYPE_FALLBACK = 0xeac7;\n\n var globalConfig = {\n use_static: false\n };\n if (isObject(config)) {\n if (config.use_static !== undefined) {\n globalConfig.use_static = Boolean(config.use_static);\n }\n }\n\n function isObject(data) {\n return (\n typeof data === 'object' &&\n !Array.isArray(data) &&\n data !== null\n );\n }\n\n function instantiateEmptyObject(obj) {\n var prototype = Object.getPrototypeOf(obj);\n if (!prototype) {\n return {};\n } else {\n return Object.create(prototype);\n }\n }\n\n function addPropertyTo(target, methodName, value) {\n Object.defineProperty(target, methodName, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: value\n });\n }\n\n function banProperty(target, methodName) {\n addPropertyTo(target, methodName, function() {\n throw new ImmutableError(\"The \" + methodName +\n \" method cannot be invoked on an Immutable data structure.\");\n });\n }\n\n var immutabilityTag = \"__immutable_invariants_hold\";\n\n function addImmutabilityTag(target) {\n addPropertyTo(target, immutabilityTag, true);\n }\n\n function isImmutable(target) {\n if (typeof target === \"object\") {\n return target === null || Boolean(\n Object.getOwnPropertyDescriptor(target, immutabilityTag)\n );\n } else {\n // In JavaScript, only objects are even potentially mutable.\n // strings, numbers, null, and undefined are all naturally immutable.\n return true;\n }\n }\n\n function isEqual(a, b) {\n // Avoid false positives due to (NaN !== NaN) evaluating to true\n return (a === b || (a !== a && b !== b));\n }\n\n function isMergableObject(target) {\n return target !== null && typeof target === \"object\" && !(Array.isArray(target)) && !(target instanceof Date);\n }\n\n var mutatingObjectMethods = [\n \"setPrototypeOf\"\n ];\n\n var nonMutatingObjectMethods = [\n \"keys\"\n ];\n\n var mutatingArrayMethods = mutatingObjectMethods.concat([\n \"push\", \"pop\", \"sort\", \"splice\", \"shift\", \"unshift\", \"reverse\"\n ]);\n\n var nonMutatingArrayMethods = nonMutatingObjectMethods.concat([\n \"map\", \"filter\", \"slice\", \"concat\", \"reduce\", \"reduceRight\"\n ]);\n\n var mutatingDateMethods = mutatingObjectMethods.concat([\n \"setDate\", \"setFullYear\", \"setHours\", \"setMilliseconds\", \"setMinutes\", \"setMonth\", \"setSeconds\",\n \"setTime\", \"setUTCDate\", \"setUTCFullYear\", \"setUTCHours\", \"setUTCMilliseconds\", \"setUTCMinutes\",\n \"setUTCMonth\", \"setUTCSeconds\", \"setYear\"\n ]);\n\n function ImmutableError(message) {\n this.name = 'MyError';\n this.message = message;\n this.stack = (new Error()).stack;\n }\n ImmutableError.prototype = new Error();\n ImmutableError.prototype.constructor = Error;\n\n function makeImmutable(obj, bannedMethods) {\n // Tag it so we can quickly tell it's immutable later.\n addImmutabilityTag(obj);\n\n if (process.env.NODE_ENV !== \"production\") {\n // Make all mutating methods throw exceptions.\n for (var index in bannedMethods) {\n if (bannedMethods.hasOwnProperty(index)) {\n banProperty(obj, bannedMethods[index]);\n }\n }\n\n // Freeze it and return it.\n Object.freeze(obj);\n }\n\n return obj;\n }\n\n function makeMethodReturnImmutable(obj, methodName) {\n var currentMethod = obj[methodName];\n\n addPropertyTo(obj, methodName, function() {\n return Immutable(currentMethod.apply(obj, arguments));\n });\n }\n\n function arraySet(idx, value, config) {\n var deep = config && config.deep;\n\n if (idx in this) {\n if (deep && this[idx] !== value && isMergableObject(value) && isMergableObject(this[idx])) {\n value = Immutable.merge(this[idx], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[idx], value)) {\n return this;\n }\n }\n\n var mutable = asMutableArray.call(this);\n mutable[idx] = Immutable(value);\n return makeImmutableArray(mutable);\n }\n\n var immutableEmptyArray = Immutable([]);\n\n function arraySetIn(pth, value, config) {\n var head = pth[0];\n\n if (pth.length === 1) {\n return arraySet.call(this, head, value, config);\n } else {\n var tail = pth.slice(1);\n var thisHead = this[head];\n var newValue;\n\n if (typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n var nextHead = tail[0];\n // If the next path part is a number, then we are setting into an array, else an object.\n if (nextHead !== '' && isFinite(nextHead)) {\n newValue = arraySetIn.call(immutableEmptyArray, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n }\n\n if (head in this && thisHead === newValue) {\n return this;\n }\n\n var mutable = asMutableArray.call(this);\n mutable[head] = newValue;\n return makeImmutableArray(mutable);\n }\n }\n\n function makeImmutableArray(array) {\n // Don't change their implementations, but wrap these functions to make sure\n // they always return an immutable value.\n for (var index in nonMutatingArrayMethods) {\n if (nonMutatingArrayMethods.hasOwnProperty(index)) {\n var methodName = nonMutatingArrayMethods[index];\n makeMethodReturnImmutable(array, methodName);\n }\n }\n\n if (!globalConfig.use_static) {\n addPropertyTo(array, \"flatMap\", flatMap);\n addPropertyTo(array, \"asObject\", asObject);\n addPropertyTo(array, \"asMutable\", asMutableArray);\n addPropertyTo(array, \"set\", arraySet);\n addPropertyTo(array, \"setIn\", arraySetIn);\n addPropertyTo(array, \"update\", update);\n addPropertyTo(array, \"updateIn\", updateIn);\n addPropertyTo(array, \"getIn\", getIn);\n }\n\n for(var i = 0, length = array.length; i < length; i++) {\n array[i] = Immutable(array[i]);\n }\n\n return makeImmutable(array, mutatingArrayMethods);\n }\n\n function makeImmutableDate(date) {\n if (!globalConfig.use_static) {\n addPropertyTo(date, \"asMutable\", asMutableDate);\n }\n\n return makeImmutable(date, mutatingDateMethods);\n }\n\n function asMutableDate() {\n return new Date(this.getTime());\n }\n\n /**\n * Effectively performs a map() over the elements in the array, using the\n * provided iterator, except that whenever the iterator returns an array, that\n * array's elements are added to the final result instead of the array itself.\n *\n * @param {function} iterator - The iterator function that will be invoked on each element in the array. It will receive three arguments: the current value, the current index, and the current object.\n */\n function flatMap(iterator) {\n // Calling .flatMap() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n var result = [],\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var iteratorResult = iterator(this[index], index, this);\n\n if (Array.isArray(iteratorResult)) {\n // Concatenate Array results into the return value we're building up.\n result.push.apply(result, iteratorResult);\n } else {\n // Handle non-Array results the same way map() does.\n result.push(iteratorResult);\n }\n }\n\n return makeImmutableArray(result);\n }\n\n /**\n * Returns an Immutable copy of the object without the given keys included.\n *\n * @param {array} keysToRemove - A list of strings representing the keys to exclude in the return value. Instead of providing a single array, this method can also be called by passing multiple strings as separate arguments.\n */\n function without(remove) {\n // Calling .without() with no arguments is a no-op. Don't bother cloning.\n if (typeof remove === \"undefined\" && arguments.length === 0) {\n return this;\n }\n\n if (typeof remove !== \"function\") {\n // If we weren't given an array, use the arguments list.\n var keysToRemoveArray = (Array.isArray(remove)) ?\n remove.slice() : Array.prototype.slice.call(arguments);\n\n // Convert numeric keys to strings since that's how they'll\n // come from the enumeration of the object.\n keysToRemoveArray.forEach(function(el, idx, arr) {\n if(typeof(el) === \"number\") {\n arr[idx] = el.toString();\n }\n });\n\n remove = function(val, key) {\n return keysToRemoveArray.indexOf(key) !== -1;\n };\n }\n\n var result = instantiateEmptyObject(this);\n\n for (var key in this) {\n if (this.hasOwnProperty(key) && remove(this[key], key) === false) {\n result[key] = this[key];\n }\n }\n\n return makeImmutableObject(result);\n }\n\n function asMutableArray(opts) {\n var result = [], i, length;\n\n if(opts && opts.deep) {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(asDeepMutable(this[i]));\n }\n } else {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(this[i]);\n }\n }\n\n return result;\n }\n\n /**\n * Effectively performs a [map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) over the elements in the array, expecting that the iterator function\n * will return an array of two elements - the first representing a key, the other\n * a value. Then returns an Immutable Object constructed of those keys and values.\n *\n * @param {function} iterator - A function which should return an array of two elements - the first representing the desired key, the other the desired value.\n */\n function asObject(iterator) {\n // If no iterator was provided, assume the identity function\n // (suggesting this array is already a list of key/value pairs.)\n if (typeof iterator !== \"function\") {\n iterator = function(value) { return value; };\n }\n\n var result = {},\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var pair = iterator(this[index], index, this),\n key = pair[0],\n value = pair[1];\n\n result[key] = value;\n }\n\n return makeImmutableObject(result);\n }\n\n function asDeepMutable(obj) {\n if (\n (!obj) ||\n (typeof obj !== 'object') ||\n (!Object.getOwnPropertyDescriptor(obj, immutabilityTag)) ||\n (obj instanceof Date)\n ) { return obj; }\n return Immutable.asMutable(obj, {deep: true});\n }\n\n function quickCopy(src, dest) {\n for (var key in src) {\n if (Object.getOwnPropertyDescriptor(src, key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n }\n\n /**\n * Returns an Immutable Object containing the properties and values of both\n * this object and the provided object, prioritizing the provided object's\n * values whenever the same key is present in both objects.\n *\n * @param {object} other - The other object to merge. Multiple objects can be passed as an array. In such a case, the later an object appears in that list, the higher its priority.\n * @param {object} config - Optional config object that contains settings. Supported settings are: {deep: true} for deep merge and {merger: mergerFunc} where mergerFunc is a function\n * that takes a property from both objects. If anything is returned it overrides the normal merge behaviour.\n */\n function merge(other, config) {\n // Calling .merge() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (other === null || (typeof other !== \"object\")) {\n throw new TypeError(\"Immutable#merge can only be invoked with objects or arrays, not \" + JSON.stringify(other));\n }\n\n var receivedArray = (Array.isArray(other)),\n deep = config && config.deep,\n mode = config && config.mode || 'merge',\n merger = config && config.merger,\n result;\n\n // Use the given key to extract a value from the given object, then place\n // that value in the result object under the same key. If that resulted\n // in a change from this object's value at that key, set anyChanges = true.\n function addToResult(currentObj, otherObj, key) {\n var immutableValue = Immutable(otherObj[key]);\n var mergerResult = merger && merger(currentObj[key], immutableValue, config);\n var currentValue = currentObj[key];\n\n if ((result !== undefined) ||\n (mergerResult !== undefined) ||\n (!currentObj.hasOwnProperty(key)) ||\n !isEqual(immutableValue, currentValue)) {\n\n var newValue;\n\n if (mergerResult) {\n newValue = mergerResult;\n } else if (deep && isMergableObject(currentValue) && isMergableObject(immutableValue)) {\n newValue = Immutable.merge(currentValue, immutableValue, config);\n } else {\n newValue = immutableValue;\n }\n\n if (!isEqual(currentValue, newValue) || !currentObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n\n result[key] = newValue;\n }\n }\n }\n\n function clearDroppedKeys(currentObj, otherObj) {\n for (var key in currentObj) {\n if (!otherObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n delete result[key];\n }\n }\n }\n\n var key;\n\n // Achieve prioritization by overriding previous values that get in the way.\n if (!receivedArray) {\n // The most common use case: just merge one object into the existing one.\n for (key in other) {\n if (Object.getOwnPropertyDescriptor(other, key)) {\n addToResult(this, other, key);\n }\n }\n if (mode === 'replace') {\n clearDroppedKeys(this, other);\n }\n } else {\n // We also accept an Array\n for (var index = 0, length = other.length; index < length; index++) {\n var otherFromArray = other[index];\n\n for (key in otherFromArray) {\n if (otherFromArray.hasOwnProperty(key)) {\n addToResult(result !== undefined ? result : this, otherFromArray, key);\n }\n }\n }\n }\n\n if (result === undefined) {\n return this;\n } else {\n return makeImmutableObject(result);\n }\n }\n\n function objectReplace(value, config) {\n var deep = config && config.deep;\n\n // Calling .replace() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (value === null || typeof value !== \"object\") {\n throw new TypeError(\"Immutable#replace can only be invoked with objects or arrays, not \" + JSON.stringify(value));\n }\n\n return Immutable.merge(this, value, {deep: deep, mode: 'replace'});\n }\n\n var immutableEmptyObject = Immutable({});\n\n function objectSetIn(path, value, config) {\n if (!(path instanceof Array) || path.length === 0) {\n throw new TypeError(\"The first argument to Immutable#setIn must be an array containing at least one \\\"key\\\" string.\");\n }\n\n var head = path[0];\n if (path.length === 1) {\n return objectSet.call(this, head, value, config);\n }\n\n var tail = path.slice(1);\n var newValue;\n var thisHead = this[head];\n\n if (this.hasOwnProperty(head) && typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n\n if (this.hasOwnProperty(head) && thisHead === newValue) {\n return this;\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[head] = newValue;\n return makeImmutableObject(mutable);\n }\n\n function objectSet(property, value, config) {\n var deep = config && config.deep;\n\n if (this.hasOwnProperty(property)) {\n if (deep && this[property] !== value && isMergableObject(value) && isMergableObject(this[property])) {\n value = Immutable.merge(this[property], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[property], value)) {\n return this;\n }\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[property] = Immutable(value);\n return makeImmutableObject(mutable);\n }\n\n function update(property, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = this[property];\n return Immutable.set(this, property, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getInPath(obj, path) {\n /*jshint eqnull:true */\n for (var i = 0, l = path.length; obj != null && i < l; i++) {\n obj = obj[path[i]];\n }\n\n return (i && i == l) ? obj : undefined;\n }\n\n function updateIn(path, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = getInPath(this, path);\n\n return Immutable.setIn(this, path, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getIn(path, defaultValue) {\n var value = getInPath(this, path);\n return value === undefined ? defaultValue : value;\n }\n\n function asMutableObject(opts) {\n var result = instantiateEmptyObject(this), key;\n\n if(opts && opts.deep) {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = asDeepMutable(this[key]);\n }\n }\n } else {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = this[key];\n }\n }\n }\n\n return result;\n }\n\n // Creates plain object to be used for cloning\n function instantiatePlainObject() {\n return {};\n }\n\n // Finalizes an object with immutable methods, freezes it, and returns it.\n function makeImmutableObject(obj) {\n if (!globalConfig.use_static) {\n addPropertyTo(obj, \"merge\", merge);\n addPropertyTo(obj, \"replace\", objectReplace);\n addPropertyTo(obj, \"without\", without);\n addPropertyTo(obj, \"asMutable\", asMutableObject);\n addPropertyTo(obj, \"set\", objectSet);\n addPropertyTo(obj, \"setIn\", objectSetIn);\n addPropertyTo(obj, \"update\", update);\n addPropertyTo(obj, \"updateIn\", updateIn);\n addPropertyTo(obj, \"getIn\", getIn);\n }\n\n return makeImmutable(obj, mutatingObjectMethods);\n }\n\n // Returns true if object is a valid react element\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L326\n function isReactElement(obj) {\n return typeof obj === 'object' &&\n obj !== null &&\n (obj.$$typeof === REACT_ELEMENT_TYPE_FALLBACK || obj.$$typeof === REACT_ELEMENT_TYPE);\n }\n\n function isFileObject(obj) {\n return typeof File !== 'undefined' &&\n obj instanceof File;\n }\n\n function isPromise(obj) {\n return typeof obj === 'object' &&\n typeof obj.then === 'function';\n }\n\n function isError(obj) {\n return obj instanceof Error;\n }\n\n function Immutable(obj, options, stackRemaining) {\n if (isImmutable(obj) || isReactElement(obj) || isFileObject(obj) || isError(obj)) {\n return obj;\n } else if (isPromise(obj)) {\n return obj.then(Immutable);\n } else if (Array.isArray(obj)) {\n return makeImmutableArray(obj.slice());\n } else if (obj instanceof Date) {\n return makeImmutableDate(new Date(obj.getTime()));\n } else {\n // Don't freeze the object we were given; make a clone and use that.\n var prototype = options && options.prototype;\n var instantiateEmptyObject =\n (!prototype || prototype === Object.prototype) ?\n instantiatePlainObject : (function() { return Object.create(prototype); });\n var clone = instantiateEmptyObject();\n\n if (process.env.NODE_ENV !== \"production\") {\n /*jshint eqnull:true */\n if (stackRemaining == null) {\n stackRemaining = 64;\n }\n if (stackRemaining <= 0) {\n throw new ImmutableError(\"Attempt to construct Immutable from a deeply nested object was detected.\" +\n \" Have you tried to wrap an object with circular references (e.g. React element)?\" +\n \" See https://github.com/rtfeldman/seamless-immutable/wiki/Deeply-nested-object-was-detected for details.\");\n }\n stackRemaining -= 1;\n }\n\n for (var key in obj) {\n if (Object.getOwnPropertyDescriptor(obj, key)) {\n clone[key] = Immutable(obj[key], undefined, stackRemaining);\n }\n }\n\n return makeImmutableObject(clone);\n }\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n function toStatic(fn) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n return fn.apply(self, args);\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object.\n function toStaticObjectOrArray(fnObject, fnArray) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object or a date.\n function toStaticObjectOrDateOrArray(fnObject, fnArray, fnDate) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else if (self instanceof Date) {\n return fnDate.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Export the library\n Immutable.from = Immutable;\n Immutable.isImmutable = isImmutable;\n Immutable.ImmutableError = ImmutableError;\n Immutable.merge = toStatic(merge);\n Immutable.replace = toStatic(objectReplace);\n Immutable.without = toStatic(without);\n Immutable.asMutable = toStaticObjectOrDateOrArray(asMutableObject, asMutableArray, asMutableDate);\n Immutable.set = toStaticObjectOrArray(objectSet, arraySet);\n Immutable.setIn = toStaticObjectOrArray(objectSetIn, arraySetIn);\n Immutable.update = toStatic(update);\n Immutable.updateIn = toStatic(updateIn);\n Immutable.getIn = toStatic(getIn);\n Immutable.flatMap = toStatic(flatMap);\n Immutable.asObject = toStatic(asObject);\n if (!globalConfig.use_static) {\n Immutable.static = immutableInit({\n use_static: true\n });\n }\n\n Object.freeze(Immutable);\n\n return Immutable;\n}\n\n var Immutable = immutableInit();\n /* istanbul ignore if */\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Immutable;\n });\n } else if (typeof module === \"object\") {\n module.exports = Immutable;\n } else if (typeof exports === \"object\") {\n exports.Immutable = Immutable;\n } else if (typeof window === \"object\") {\n window.Immutable = Immutable;\n } else if (typeof global === \"object\") {\n global.Immutable = Immutable;\n }\n})();\n","/* eslint-disable new-cap */\nimport Immutable from \"seamless-immutable\";\n\n// This middleware will just add the property \"async dispatch\"\n// to actions with the \"async\" propperty set to true\nconst asyncDispatchMiddleware = store => next => action => {\n let syncActivityFinished = false;\n let actionQueue = [];\n\n function flushQueue() {\n actionQueue.forEach(a => store.dispatch(a)); // flush queue\n actionQueue = [];\n }\n\n function asyncDispatch(asyncAction) {\n actionQueue = actionQueue.concat([asyncAction]);\n\n if (syncActivityFinished) {\n flushQueue();\n }\n }\n\n const actionWithAsyncDispatch =\n Immutable(action).merge({ asyncDispatch });\n\n next(actionWithAsyncDispatch);\n syncActivityFinished = true;\n flushQueue();\n};\n\nexport default asyncDispatchMiddleware;\n","/* eslint-env jasmine */\nimport asyncDispatchMiddleware from \"../js/utils/asyncDispatchMiddleware\";\n\nconst fakeAction = { type: \"fake action\" };\n\ndescribe(\"The asyncDispatchMiddleware\", () => {\n it(\"calls next with asyncDispatch property\", (done) => {\n const next = returnedAction => {\n expect(returnedAction.asyncDispatch).not.toEqual(undefined);\n expect(typeof returnedAction.asyncDispatch).toEqual(\"function\");\n done();\n };\n\n asyncDispatchMiddleware(\"fakeStore\")(next)(fakeAction);\n });\n\n\n it(\"asyncDispatch triggers a store dispatch\", (done) => {\n const fakeAsyncAction = { type: \"fakeAsyncAction\" };\n\n const fakeStore = {\n dispatch: action => {\n expect(action.type).toEqual(fakeAsyncAction.type);\n done();\n },\n };\n\n const next = returnedAction =>\n returnedAction.asyncDispatch(fakeAsyncAction);\n\n asyncDispatchMiddleware(fakeStore)(next)(fakeAction);\n });\n});\n","// Bug checking function that will throw an error whenever\n// the condition sent to it is evaluated to false\n/**\n * Processes the message and outputs the correct message if the condition\n * is false. Otherwise it outputs null.\n * @api private\n * @method processCondition\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return {String | null} - Error message if there is an error, nul otherwise.\n */\nfunction processCondition(condition, errorMessage) {\n if (!condition) {\n var completeErrorMessage = '';\n var re = /at ([^\\s]+)\\s\\(/g;\n var stackTrace = new Error().stack;\n var stackFunctions = [];\n\n var funcName = re.exec(stackTrace);\n while (funcName && funcName[1]) {\n stackFunctions.push(funcName[1]);\n funcName = re.exec(stackTrace);\n }\n\n // Number 0 is processCondition itself,\n // Number 1 is assert,\n // Number 2 is the caller function.\n if (stackFunctions[2]) {\n completeErrorMessage = stackFunctions[2] + ': ' + completeErrorMessage;\n }\n\n completeErrorMessage += errorMessage;\n return completeErrorMessage;\n }\n\n return null;\n}\n\n/**\n * Throws an error if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert(myDate !== undefined, \"Date cannot be undefined.\");\n * @api public\n * @method assert\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nfunction assert(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n throw new Error(error);\n }\n}\n\n/**\n * Logs a warning if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert.warn(myDate !== undefined, \"No date provided.\");\n * @api public\n * @method warn\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nassert.warn = function warn(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n console.warn(error);\n }\n};\n\nexport default assert;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJhc3NlcnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgbGV0IGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3QgcmUgPSAvYXQgKFteXFxzXSspXFxzXFwoL2c7XG4gICAgY29uc3Qgc3RhY2tUcmFjZSA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICAgIGNvbnN0IHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICBsZXQgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IGAke3N0YWNrRnVuY3Rpb25zWzJdfTogJHtjb21wbGV0ZUVycm9yTWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGNvbnN0IGVycm9yID0gcHJvY2Vzc0NvbmRpdGlvbihjb25kaXRpb24sIGVycm9yTWVzc2FnZSk7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgYSB3YXJuaW5nIGlmIHRoZSBib29sZWFuIHBhc3NlZCB0byBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuXG4gKiBUbyBiZSB1c2VkIGxpa2UgdGhpczpcbiAqIFx0XHRhc3NlcnQud2FybihteURhdGUgIT09IHVuZGVmaW5lZCwgXCJObyBkYXRlIHByb3ZpZGVkLlwiKTtcbiAqIEBhcGkgcHVibGljXG4gKiBAbWV0aG9kIHdhcm5cbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4gdm9pZFxuICovXG5hc3NlcnQud2FybiA9IGZ1bmN0aW9uIHdhcm4oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgY29uc3QgZXJyb3IgPSBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKTtcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3NlcnQ7XG4iXSwiZmlsZSI6ImFzc2VydC5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9\n","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nmodule.exports = Array.isArray || function _isArray(val) {\n return (val != null &&\n val.length >= 0 &&\n Object.prototype.toString.call(val) === '[object Array]');\n};\n","/**\n * An optimized, private array `slice` implementation.\n *\n * @private\n * @param {Arguments|Array} args The array or arguments object to consider.\n * @param {Number} [from=0] The array index to slice from, inclusive.\n * @param {Number} [to=args.length] The array index to slice to, exclusive.\n * @return {Array} A new, sliced array.\n * @example\n *\n * _slice([1, 2, 3, 4, 5], 1, 3); //=> [2, 3]\n *\n * var firstThreeArgs = function(a, b, c, d) {\n * return _slice(arguments, 0, 3);\n * };\n * firstThreeArgs(1, 2, 3, 4); //=> [1, 2, 3]\n */\nmodule.exports = function _slice(args, from, to) {\n switch (arguments.length) {\n case 1: return _slice(args, 0, args.length);\n case 2: return _slice(args, from, args.length);\n default:\n var list = [];\n var idx = 0;\n var len = Math.max(0, Math.min(args.length, to) - from);\n while (idx < len) {\n list[idx] = args[from + idx];\n idx += 1;\n }\n return list;\n }\n};\n","var _isArray = require('./_isArray');\nvar _slice = require('./_slice');\n\n\n/**\n * Similar to hasMethod, this checks whether a function has a [methodname]\n * function. If it isn't an array it will execute that function otherwise it\n * will default to the ramda implementation.\n *\n * @private\n * @param {Function} fn ramda implemtation\n * @param {String} methodname property to check for a custom implementation\n * @return {Object} Whatever the return value of the method is.\n */\nmodule.exports = function _checkForMethod(methodname, fn) {\n return function() {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n return (_isArray(obj) || typeof obj[methodname] !== 'function') ?\n fn.apply(this, arguments) :\n obj[methodname].apply(obj, _slice(arguments, 0, length - 1));\n };\n};\n","module.exports = function _isPlaceholder(a) {\n return a != null &&\n typeof a === 'object' &&\n a['@@functional/placeholder'] === true;\n};\n","var _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n};\n","var _curry1 = require('./_curry1');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2\n : _curry1(function(_b) { return fn(a, _b); });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2\n : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b); })\n : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b); })\n : fn(a, b);\n }\n };\n};\n","var _curry1 = require('./_curry1');\nvar _curry2 = require('./_curry2');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3\n : _curry2(function(_b, _c) { return fn(a, _b, _c); });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3\n : _isPlaceholder(a) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })\n : _isPlaceholder(b) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })\n : _curry1(function(_c) { return fn(a, b, _c); });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3\n : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function(_a, _b) { return fn(_a, _b, c); })\n : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })\n : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })\n : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b, c); })\n : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b, c); })\n : _isPlaceholder(c) ? _curry1(function(_c) { return fn(a, b, _c); })\n : fn(a, b, c);\n }\n };\n};\n","var _checkForMethod = require('./internal/_checkForMethod');\nvar _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns the elements of the given list or string (or object with a `slice`\n * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).\n *\n * Dispatches to the `slice` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.4\n * @category List\n * @sig Number -> Number -> [a] -> [a]\n * @sig Number -> Number -> String -> String\n * @param {Number} fromIndex The start index (inclusive).\n * @param {Number} toIndex The end index (exclusive).\n * @param {*} list\n * @return {*}\n * @example\n *\n * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']\n * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c']\n * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(0, 3, 'ramda'); //=> 'ram'\n */\nmodule.exports = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) {\n return Array.prototype.slice.call(list, fromIndex, toIndex);\n}));\n","var _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the result of applying the given function to\n * the focused value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> (a -> a) -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var headLens = R.lensIndex(0);\n *\n * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']\n */\nmodule.exports = (function() {\n // `Identity` is a functor that holds a single value, where `map` simply\n // transforms the held value with the provided function.\n var Identity = function(x) {\n return {value: x, map: function(f) { return Identity(f(x)); }};\n };\n\n return _curry3(function over(lens, f, x) {\n // The value returned by the getter function is first transformed with `f`,\n // then set as the value of an `Identity`. This is then mapped over with the\n // setter function of the lens.\n return lens(function(y) { return Identity(f(y)); })(x).value;\n });\n}());\n","var _curry1 = require('./internal/_curry1');\n\n\n/**\n * Returns a function that always returns the given value. Note that for\n * non-primitives the value returned is a reference to the original value.\n *\n * This function is known as `const`, `constant`, or `K` (for K combinator) in\n * other languages and libraries.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> (* -> a)\n * @param {*} val The value to wrap in a function\n * @return {Function} A Function :: * -> val.\n * @example\n *\n * var t = R.always('Tee');\n * t(); //=> 'Tee'\n */\nmodule.exports = _curry1(function always(val) {\n return function() {\n return val;\n };\n});\n","var _curry3 = require('./internal/_curry3');\nvar always = require('./always');\nvar over = require('./over');\n\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the given value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> a -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lensProp('x');\n *\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2}\n */\nmodule.exports = _curry3(function set(lens, v, x) {\n return over(lens, always(v), x);\n});\n","module.exports = function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0: return function() { return fn.apply(this, arguments); };\n case 1: return function(a0) { return fn.apply(this, arguments); };\n case 2: return function(a0, a1) { return fn.apply(this, arguments); };\n case 3: return function(a0, a1, a2) { return fn.apply(this, arguments); };\n case 4: return function(a0, a1, a2, a3) { return fn.apply(this, arguments); };\n case 5: return function(a0, a1, a2, a3, a4) { return fn.apply(this, arguments); };\n case 6: return function(a0, a1, a2, a3, a4, a5) { return fn.apply(this, arguments); };\n case 7: return function(a0, a1, a2, a3, a4, a5, a6) { return fn.apply(this, arguments); };\n case 8: return function(a0, a1, a2, a3, a4, a5, a6, a7) { return fn.apply(this, arguments); };\n case 9: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8) { return fn.apply(this, arguments); };\n case 10: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { return fn.apply(this, arguments); };\n default: throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n};\n","module.exports = function _pipe(f, g) {\n return function() {\n return g.call(this, f.apply(this, arguments));\n };\n};\n","module.exports = (function() {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function() {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function(acc) { return acc; };\n XWrap.prototype['@@transducer/step'] = function(acc, x) {\n return this.f(acc, x);\n };\n\n return function _xwrap(fn) { return new XWrap(fn); };\n}());\n","var _arity = require('./internal/_arity');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * var log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n */\nmodule.exports = _curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function() {\n return fn.apply(thisObj, arguments);\n });\n});\n","module.exports = function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n};\n","var _curry1 = require('./internal/_curry1');\nvar _isArray = require('./internal/_isArray');\nvar _isString = require('./internal/_isString');\n\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * R.isArrayLike([]); //=> true\n * R.isArrayLike(true); //=> false\n * R.isArrayLike({}); //=> false\n * R.isArrayLike({length: 10}); //=> false\n * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\nmodule.exports = _curry1(function isArrayLike(x) {\n if (_isArray(x)) { return true; }\n if (!x) { return false; }\n if (typeof x !== 'object') { return false; }\n if (_isString(x)) { return false; }\n if (x.nodeType === 1) { return !!x.length; }\n if (x.length === 0) { return true; }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\n","var _xwrap = require('./_xwrap');\nvar bind = require('../bind');\nvar isArrayLike = require('../isArrayLike');\n\n\nmodule.exports = (function() {\n function _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n }\n\n function _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n }\n\n function _methodReduce(xf, acc, obj) {\n return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc));\n }\n\n var symIterator = (typeof Symbol !== 'undefined') ? Symbol.iterator : '@@iterator';\n return function _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list);\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n throw new TypeError('reduce: list must be array or iterable');\n };\n}());\n","var _curry3 = require('./internal/_curry3');\nvar _reduce = require('./internal/_reduce');\n\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * The iterator function receives two values: *(acc, value)*. It may use\n * `R.reduced` to shortcut the iteration.\n *\n * Note: `R.reduce` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description\n *\n * Dispatches to the `reduce` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduced, R.addIndex\n * @example\n *\n * var numbers = [1, 2, 3];\n * var plus = (a, b) => a + b;\n *\n * R.reduce(plus, 10, numbers); //=> 16\n */\nmodule.exports = _curry3(_reduce);\n","var _checkForMethod = require('./internal/_checkForMethod');\nvar slice = require('./slice');\n\n\n/**\n * Returns all but the first element of the given list or string (or object\n * with a `tail` method).\n *\n * Dispatches to the `slice` method of the first argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a]\n * @sig String -> String\n * @param {*} list\n * @return {*}\n * @see R.head, R.init, R.last\n * @example\n *\n * R.tail([1, 2, 3]); //=> [2, 3]\n * R.tail([1, 2]); //=> [2]\n * R.tail([1]); //=> []\n * R.tail([]); //=> []\n *\n * R.tail('abc'); //=> 'bc'\n * R.tail('ab'); //=> 'b'\n * R.tail('a'); //=> ''\n * R.tail(''); //=> ''\n */\nmodule.exports = _checkForMethod('tail', slice(1, Infinity));\n","var _arity = require('./internal/_arity');\nvar _pipe = require('./internal/_pipe');\nvar reduce = require('./reduce');\nvar tail = require('./tail');\n\n\n/**\n * Performs left-to-right function composition. The leftmost function may have\n * any arity; the remaining functions must be unary.\n *\n * In some libraries this function is named `sequence`.\n *\n * **Note:** The result of pipe is not automatically curried.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)\n * @param {...Function} functions\n * @return {Function}\n * @see R.compose\n * @example\n *\n * var f = R.pipe(Math.pow, R.negate, R.inc);\n *\n * f(3, 4); // -(3^4) + 1\n */\nmodule.exports = function pipe() {\n if (arguments.length === 0) {\n throw new Error('pipe requires at least one argument');\n }\n return _arity(arguments[0].length,\n reduce(_pipe, arguments[0], tail(arguments)));\n};\n","/**\n * Private `concat` function to merge two array-like objects.\n *\n * @private\n * @param {Array|Arguments} [set1=[]] An array-like object.\n * @param {Array|Arguments} [set2=[]] An array-like object.\n * @return {Array} A new, merged array.\n * @example\n *\n * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n */\nmodule.exports = function _concat(set1, set2) {\n set1 = set1 || [];\n set2 = set2 || [];\n var idx;\n var len1 = set1.length;\n var len2 = set2.length;\n var result = [];\n\n idx = 0;\n while (idx < len1) {\n result[result.length] = set1[idx];\n idx += 1;\n }\n idx = 0;\n while (idx < len2) {\n result[result.length] = set2[idx];\n idx += 1;\n }\n return result;\n};\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a new list with the given element at the front, followed by the\n * contents of the list.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The item to add to the head of the output list.\n * @param {Array} list The array to add to the tail of the output list.\n * @return {Array} A new array.\n * @see R.append\n * @example\n *\n * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']\n */\nmodule.exports = _curry2(function prepend(el, list) {\n return _concat([el], list);\n});\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a function that when supplied an object returns the indicated\n * property of that object, if it exists.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig s -> {s: a} -> a | Undefined\n * @param {String} p The property name\n * @param {Object} obj The object to query\n * @return {*} The value at `obj.p`.\n * @see R.path\n * @example\n *\n * R.prop('x', {x: 100}); //=> 100\n * R.prop('x', {}); //=> undefined\n */\nmodule.exports = _curry2(function prop(p, obj) { return obj[p]; });\n","module.exports = function _isTransformer(obj) {\n return typeof obj['@@transducer/step'] === 'function';\n};\n","var _isArray = require('./_isArray');\nvar _isTransformer = require('./_isTransformer');\nvar _slice = require('./_slice');\n\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with [methodname], it will execute that\n * function (functor case). Otherwise, if it is a transformer, uses transducer\n * [xf] to return a new transformer (transducer case). Otherwise, it will\n * default to executing [fn].\n *\n * @private\n * @param {String} methodname property to check for a custom implementation\n * @param {Function} xf transducer to initialize if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nmodule.exports = function _dispatchable(methodname, xf, fn) {\n return function() {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n if (!_isArray(obj)) {\n var args = _slice(arguments, 0, length - 1);\n if (typeof obj[methodname] === 'function') {\n return obj[methodname].apply(obj, args);\n }\n if (_isTransformer(obj)) {\n var transducer = xf.apply(null, args);\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n};\n","module.exports = function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n};\n","module.exports = {\n init: function() {\n return this.xf['@@transducer/init']();\n },\n result: function(result) {\n return this.xf['@@transducer/result'](result);\n }\n};\n","var _curry2 = require('./_curry2');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XMap(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XMap.prototype['@@transducer/init'] = _xfBase.init;\n XMap.prototype['@@transducer/result'] = _xfBase.result;\n XMap.prototype['@@transducer/step'] = function(result, input) {\n return this.xf['@@transducer/step'](result, this.f(input));\n };\n\n return _curry2(function _xmap(f, xf) { return new XMap(f, xf); });\n}());\n","var _arity = require('./_arity');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curryN(length, received, fn) {\n return function() {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length &&\n (!_isPlaceholder(received[combinedIdx]) ||\n argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined)\n : _arity(left, _curryN(length, combined, fn));\n };\n};\n","var _arity = require('./internal/_arity');\nvar _curry1 = require('./internal/_curry1');\nvar _curry2 = require('./internal/_curry2');\nvar _curryN = require('./internal/_curryN');\n\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value `R.__` may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is `R.__`, the\n * following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * var sumArgs = (...args) => R.sum(args);\n *\n * var curriedAddFourNumbers = R.curryN(4, sumArgs);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\nmodule.exports = _curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\n","module.exports = function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n};\n","var _has = require('./_has');\n\n\nmodule.exports = (function() {\n var toString = Object.prototype.toString;\n return toString.call(arguments) === '[object Arguments]' ?\n function _isArguments(x) { return toString.call(x) === '[object Arguments]'; } :\n function _isArguments(x) { return _has('callee', x); };\n}());\n","var _curry1 = require('./internal/_curry1');\nvar _has = require('./internal/_has');\nvar _isArguments = require('./internal/_isArguments');\n\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nmodule.exports = (function() {\n // cover IE < 9 keys issues\n var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString');\n var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n // Safari bug\n var hasArgsEnumBug = (function() {\n 'use strict';\n return arguments.propertyIsEnumerable('length');\n }());\n\n var contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n };\n\n return typeof Object.keys === 'function' && !hasArgsEnumBug ?\n _curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n }) :\n _curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _map = require('./internal/_map');\nvar _reduce = require('./internal/_reduce');\nvar _xmap = require('./internal/_xmap');\nvar curryN = require('./curryN');\nvar keys = require('./keys');\n\n\n/**\n * Takes a function and\n * a [functor](https://github.com/fantasyland/fantasy-land#functor),\n * applies the function to each of the functor's values, and returns\n * a functor of the same shape.\n *\n * Ramda provides suitable `map` implementations for `Array` and `Object`,\n * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.\n *\n * Dispatches to the `map` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * Also treats functions as functors and will compose them together.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => (a -> b) -> f a -> f b\n * @param {Function} fn The function to be called on every element of the input `list`.\n * @param {Array} list The list to be iterated over.\n * @return {Array} The new list.\n * @see R.transduce, R.addIndex\n * @example\n *\n * var double = x => x * 2;\n *\n * R.map(double, [1, 2, 3]); //=> [2, 4, 6]\n *\n * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}\n */\nmodule.exports = _curry2(_dispatchable('map', _xmap, function map(fn, functor) {\n switch (Object.prototype.toString.call(functor)) {\n case '[object Function]':\n return curryN(functor.length, function() {\n return fn.call(this, functor.apply(this, arguments));\n });\n case '[object Object]':\n return _reduce(function(acc, key) {\n acc[key] = fn(functor[key]);\n return acc;\n }, {}, keys(functor));\n default:\n return _map(fn, functor);\n }\n}));\n","var _curry2 = require('./internal/_curry2');\nvar map = require('./map');\n\n\n/**\n * Returns a lens for the given getter and setter functions. The getter \"gets\"\n * the value of the focus; the setter \"sets\" the value of the focus. The setter\n * should not mutate the data structure.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig (s -> a) -> ((a, s) -> s) -> Lens s a\n * @param {Function} getter\n * @param {Function} setter\n * @return {Lens}\n * @see R.view, R.set, R.over, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lens(R.prop('x'), R.assoc('x'));\n *\n * R.view(xLens, {x: 1, y: 2}); //=> 1\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2}\n */\nmodule.exports = _curry2(function lens(getter, setter) {\n return function(toFunctorFn) {\n return function(target) {\n return map(\n function(focus) {\n return setter(focus, target);\n },\n toFunctorFn(getter(target))\n );\n };\n };\n});\n","var _curry1 = require('./internal/_curry1');\nvar curryN = require('./curryN');\n\n\n/**\n * Returns a curried equivalent of the provided function. The curried function\n * has two unusual capabilities. First, its arguments needn't be provided one\n * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value `R.__` may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is `R.__`, the\n * following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (* -> a) -> (* -> a)\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curryN\n * @example\n *\n * var addFourNumbers = (a, b, c, d) => a + b + c + d;\n *\n * var curriedAddFourNumbers = R.curry(addFourNumbers);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\nmodule.exports = _curry1(function curry(fn) {\n return curryN(fn.length, fn);\n});\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/either\n */\nmodule.exports = Either\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Either(a, b)` structure represents the logical disjunction between `a`\n * and `b`. In other words, `Either` may contain either a value of type `a` or\n * a value of type `b`, at any given time. This particular implementation is\n * biased on the right value (`b`), thus projections will take the right value\n * over the left one.\n *\n * This class models two different cases: `Left a` and `Right b`, and can hold\n * one of the cases at any given time. The projections are, none the less,\n * biased for the `Right` case, thus a common use case for this structure is to\n * hold the results of computations that may fail, when you want to store\n * additional information on the failure (instead of throwing an exception).\n *\n * Furthermore, the values of `Either(a, b)` can be combined and manipulated by\n * using the expressive monadic operations. This allows safely sequencing\n * operations that may fail, and safely composing values that you don't know\n * whether they're present or not, failing early (returning a `Left a`) if any\n * of the operations fail.\n *\n * While this class can certainly model input validations, the [Validation][]\n * structure lends itself better to that use case, since it can naturally\n * aggregate failures — monads shortcut on the first failure.\n *\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n * @summary\n * Either[α, β] <: Applicative[β]\n * , Functor[β]\n * , Chain[β]\n * , Show\n * , Eq\n */\nfunction Either() { }\n\nLeft.prototype = clone(Either.prototype)\nfunction Left(a) {\n this.value = a\n}\n\nRight.prototype = clone(Either.prototype)\nfunction Right(a) {\n this.value = a\n}\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Left` value. This\n * usually represents a failure due to the right-bias of this structure.\n *\n * @summary a → Either[α, β]\n */\nEither.Left = function(a) {\n return new Left(a)\n}\nEither.prototype.Left = Either.Left\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Right` value. This\n * usually represents a successful value due to the right bias of this\n * structure.\n *\n * @summary β → Either[α, β]\n */\nEither.Right = function(a) {\n return new Right(a)\n}\nEither.prototype.Right = Either.Right\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure from a nullable type.\n *\n * Takes the `Left` case if the value is `null` or `undefined`. Takes the\n * `Right` case otherwise.\n *\n * @summary α → Either[α, α]\n */\nEither.fromNullable = function(a) {\n return a != null? new Right(a)\n : /* otherwise */ new Left(a)\n}\nEither.prototype.fromNullable = Either.fromNullable\n\n/**\n * Constructs a new `Either[α, β]` structure from a `Validation[α, β]` type.\n *\n * @summary Validation[α, β] → Either[α, β]\n */\nEither.fromValidation = function(a) {\n return a.fold(Either.Left, Either.Right)\n}\n\n/**\n * Executes a synchronous computation that may throw and converts it to an\n * Either type.\n *\n * @summary (α₁, α₂, ..., αₙ -> β :: throws γ) -> (α₁, α₂, ..., αₙ -> Either[γ, β])\n */\nEither.try = function(f) {\n return function() {\n try {\n return new Right(f.apply(null, arguments))\n } catch(e) {\n return new Left(e)\n }\n }\n}\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Either[α, β]` contains a `Left` value.\n *\n * @summary Boolean\n */\nEither.prototype.isLeft = false\nLeft.prototype.isLeft = true\n\n/**\n * True if the `Either[α, β]` contains a `Right` value.\n *\n * @summary Boolean\n */\nEither.prototype.isRight = false\nRight.prototype.isRight = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Either[α, β]` instance holding the `Right` value `b`.\n *\n * `b` can be any value, including `null`, `undefined` or another\n * `Either[α, β]` structure.\n *\n * @summary β → Either[α, β]\n */\nEither.of = function(a) {\n return new Right(a)\n}\nEither.prototype.of = Either.of\n\n\n/**\n * Applies the function inside the `Right` case of the `Either[α, β]` structure\n * to another applicative type.\n *\n * The `Either[α, β]` should contain a function value, otherwise a `TypeError`\n * is thrown.\n *\n * @method\n * @summary (@Either[α, β → γ], f:Applicative[_]) => f[β] → f[γ]\n */\nEither.prototype.ap = unimplemented\n\nLeft.prototype.ap = function(b) {\n return this\n}\n\nRight.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using a regular\n * unary function.\n *\n * @method\n * @summary (@Either[α, β]) => (β → γ) → Either[α, γ]\n */\nEither.prototype.map = unimplemented\nLeft.prototype.map = noop\n\nRight.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using an unary\n * function to monads.\n *\n * @method\n * @summary (@Either[α, β], m:Monad[_]) => (β → m[γ]) → m[γ]\n */\nEither.prototype.chain = unimplemented\nLeft.prototype.chain = noop\n\nRight.prototype.chain = function(f) {\n return f(this.value)\n}\n\n// -- Semigroup ----------------------------------------------------------\n\n/**\n * Concats the `Right` value of the `Either[α, β]` structure with another `Right` or keeps the `Left` on either side\n *\n * @method\n * @summary (@Either[α, m:Monoid]) => Either[β, m] → Either[α, m]\n */\nEither.prototype.concat = unimplemented\n\nLeft.prototype.concat = function(other) {\n return this\n}\n\nRight.prototype.concat = function(other) {\n var that = this\n return other.fold(function(_){\n return other\n },\n function(y) {\n return that.Right(that.value.concat(y))\n })\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Either[α, β]` structure.\n *\n * @method\n * @summary (@Either[α, β]) => Void → String\n */\nEither.prototype.toString = unimplemented\n\nLeft.prototype.toString = function() {\n return 'Either.Left(' + this.value + ')'\n}\n\nRight.prototype.toString = function() {\n return 'Either.Right(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if an `Either[α, β]` structure is equal to another `Either[α, β]`\n * structure.\n *\n * @method\n * @summary (@Either[α, β]) => Either[α, β] → Boolean\n */\nEither.prototype.isEqual = unimplemented\n\nLeft.prototype.isEqual = function(a) {\n return a.isLeft && (a.value === this.value)\n}\n\nRight.prototype.isEqual = function(a) {\n return a.isRight && (a.value === this.value)\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary (@Either[α, β]) => Void → β :: partial, throws\n * @see {@link module:lib/either~Either#getOrElse} — A getter that can handle failures.\n * @see {@link module:lib/either~Either#merge} — The convergence of both values.\n * @throws {TypeError} if the structure has no `Right` value.\n */\nEither.prototype.get = unimplemented\n\nLeft.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Left(a).\")\n}\n\nRight.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure. If the\n * structure doesn't have a `Right` value, returns the given default.\n *\n * @method\n * @summary (@Either[α, β]) => β → β\n */\nEither.prototype.getOrElse = unimplemented\n\nLeft.prototype.getOrElse = function(a) {\n return a\n}\n\nRight.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a `Left` value into a new `Either[α, β]` structure. Does nothing\n * if the structure contain a `Right` value.\n *\n * @method\n * @summary (@Either[α, β]) => (α → Either[γ, β]) → Either[γ, β]\n */\nEither.prototype.orElse = unimplemented\nRight.prototype.orElse = noop\n\nLeft.prototype.orElse = function(f) {\n return f(this.value)\n}\n\n\n/**\n * Returns the value of whichever side of the disjunction that is present.\n *\n * @summary (@Either[α, α]) => Void → α\n */\nEither.prototype.merge = function() {\n return this.value\n}\n\n\n// -- Folds and Extended Transformations -------------------------------\n\n/**\n * Applies a function to each case in this data structure.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → γ) → γ\n */\nEither.prototype.fold = unimplemented\n\nLeft.prototype.fold = function(f, _) {\n return f(this.value)\n}\n\nRight.prototype.fold = function(_, g) {\n return g(this.value)\n}\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary (@Either[α, β]) => { Left: α → γ, Right: β → γ } → γ\n */\nEither.prototype.cata = unimplemented\n\nLeft.prototype.cata = function(pattern) {\n return pattern.Left(this.value)\n}\n\nRight.prototype.cata = function(pattern) {\n return pattern.Right(this.value)\n}\n\n\n/**\n * Swaps the disjunction values.\n *\n * @method\n * @summary (@Either[α, β]) => Void → Either[β, α]\n */\nEither.prototype.swap = unimplemented\n\nLeft.prototype.swap = function() {\n return this.Right(this.value)\n}\n\nRight.prototype.swap = function() {\n return this.Left(this.value)\n}\n\n\n/**\n * Maps both sides of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → δ) → Either[γ, δ]\n */\nEither.prototype.bimap = unimplemented\n\nLeft.prototype.bimap = function(f, _) {\n return this.Left(f(this.value))\n}\n\nRight.prototype.bimap = function(_, g) {\n return this.Right(g(this.value))\n}\n\n\n/**\n * Maps the left side of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ) → Either[γ, β]\n */\nEither.prototype.leftMap = unimplemented\nRight.prototype.leftMap = noop\n\nLeft.prototype.leftMap = function(f) {\n return this.Left(f(this.value))\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./either')","/* eslint-disable new-cap */\n\nimport Immutable from \"seamless-immutable\";\nimport { curry, lens, prop, prepend, over, set, pipe } from \"ramda\";\nimport Either from \"data.either\";\n\nexport const updateAt = curry((keyArray, newVal, obj) => {\n const deepNewVal = keyArray.reduceRight(\n (result, key) => ({ [key]: result })\n , newVal\n );\n\n return Immutable(obj).merge(deepNewVal, { deep: true });\n});\n\n// State lenses\nexport const StateLenses = {\n fieldTypes: lens(prop(\"fieldTypes\"), updateAt([\"fieldTypes\"])),\n fieldsState: lens(prop(\"fieldsState\"), updateAt([\"fieldsState\"])),\n fieldsStateHistory: lens(prop(\"fieldsStateHistory\"), updateAt([\"fieldsStateHistory\"])),\n};\n\n// _ => String\nexport const createId = _ =>\n (Date.now() + Math.random()).toString();\n\n// State -> [fieldsState] -> State\nexport const pushHistoryState = curry((state, newHistoryState) => pipe(\n // Add current state to history\n over(StateLenses.fieldsStateHistory, prepend(state.fieldsState)),\n // Make new State the current\n set(StateLenses.fieldsState, newHistoryState)\n)(state));\n\n\n// State -> State\nexport const hideConfigs = state =>\n set(\n StateLenses.fieldsState,\n state.fieldsState.map(s => Object.assign({}, s, { configShowing: false })),\n state\n );\n\n\n// String -> String -> Object -> Either String Object\nexport const propertyTypeCheck = curry((propertyName, type, obj) =>\n typeof obj[propertyName] === type\n ? Either.Right(obj)\n : Either.Left(`Property '${propertyName}' cannot be of type ${typeof obj[propertyName]}`)\n);\n\n// Checks that a field has its essential properties\n// Object -> Either String Object\nexport const validateField = fieldState =>\n Either.fromNullable(fieldState)\n .leftMap(fs => `A field State cannot be empty ${typeof fs}`)\n .chain(propertyTypeCheck(\"required\", \"boolean\"))\n .chain(propertyTypeCheck(\"configShowing\", \"boolean\"))\n .chain(propertyTypeCheck(\"id\", \"string\"));\n","import { StateLenses } from \"./utils\";\nimport { set, over, slice, pipe } from \"ramda\";\n\nconst lastHistoryState = state =>\n state.fieldsStateHistory[0] || [];\n\nconst undo = (state, _) => pipe(\n // Make last history last state the current one\n set(StateLenses.fieldsState, lastHistoryState(state)),\n // Remove last history state from the history array\n over(StateLenses.fieldsStateHistory, slice(1, Infinity))\n)(state);\n\nexport default undo;\n","module.exports = function _identity(x) { return x; };\n","var _curry1 = require('./internal/_curry1');\nvar _identity = require('./internal/_identity');\n\n\n/**\n * A function that does nothing but return the parameter supplied to it. Good\n * as a default or placeholder function.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> a\n * @param {*} x The value to return.\n * @return {*} The input value, `x`.\n * @example\n *\n * R.identity(1); //=> 1\n *\n * var obj = {};\n * R.identity(obj) === obj; //=> true\n */\nmodule.exports = _curry1(_identity);\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Retrieve the value at a given path.\n *\n * @func\n * @memberOf R\n * @since v0.2.0\n * @category Object\n * @sig [String] -> {k: v} -> v | Undefined\n * @param {Array} path The path to use.\n * @param {Object} obj The object to retrieve the nested property from.\n * @return {*} The data at `path`.\n * @see R.prop\n * @example\n *\n * R.path(['a', 'b'], {a: {b: 2}}); //=> 2\n * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined\n */\nmodule.exports = _curry2(function path(paths, obj) {\n var val = obj;\n var idx = 0;\n while (idx < paths.length) {\n if (val == null) {\n return;\n }\n val = val[paths[idx]];\n idx += 1;\n }\n return val;\n});\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\nvar _reduce = require('./internal/_reduce');\nvar map = require('./map');\n\n\n/**\n * ap applies a list of functions to a list of values.\n *\n * Dispatches to the `ap` method of the second argument, if present. Also\n * treats curried functions as applicatives.\n *\n * @func\n * @memberOf R\n * @since v0.3.0\n * @category Function\n * @sig [a -> b] -> [a] -> [b]\n * @sig Apply f => f (a -> b) -> f a -> f b\n * @param {Array} fns An array of functions\n * @param {Array} vs An array of values\n * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn.\n * @example\n *\n * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]\n */\nmodule.exports = _curry2(function ap(applicative, fn) {\n return (\n typeof applicative.ap === 'function' ?\n applicative.ap(fn) :\n typeof applicative === 'function' ?\n function(x) { return applicative(x)(fn(x)); } :\n // else\n _reduce(function(acc, f) { return _concat(acc, map(f, fn)); }, [], applicative)\n );\n});\n","var _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * Similar to `reduce`, except moves through the input list from the right to\n * the left.\n *\n * The iterator function receives two values: *(acc, value)*\n *\n * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a,b -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.addIndex\n * @example\n *\n * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ];\n * var flattenPairs = (acc, pair) => acc.concat(pair);\n *\n * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ]\n */\nmodule.exports = _curry3(function reduceRight(fn, acc, list) {\n var idx = list.length - 1;\n while (idx >= 0) {\n acc = fn(acc, list[idx]);\n idx -= 1;\n }\n return acc;\n});\n","var _curry2 = require('./internal/_curry2');\nvar ap = require('./ap');\nvar map = require('./map');\nvar prepend = require('./prepend');\nvar reduceRight = require('./reduceRight');\n\n\n/**\n * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)\n * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an\n * Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the second argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)\n * @param {Function} of\n * @param {*} traversable\n * @return {*}\n * @see R.traverse\n * @example\n *\n * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3])\n * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()\n *\n * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]\n * R.sequence(R.of, Nothing()); //=> [Nothing()]\n */\nmodule.exports = _curry2(function sequence(of, traversable) {\n return typeof traversable.sequence === 'function' ?\n traversable.sequence(of) :\n reduceRight(function(acc, x) { return ap(map(prepend, x), acc); },\n of([]),\n traversable);\n});\n","var _curry3 = require('./internal/_curry3');\nvar map = require('./map');\nvar sequence = require('./sequence');\n\n\n/**\n * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning\n * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),\n * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative\n * into an Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)\n * @param {Function} of\n * @param {Function} f\n * @param {*} traversable\n * @return {*}\n * @see R.sequence\n * @example\n *\n * // Returns `Nothing` if the given divisor is `0`\n * safeDiv = n => d => d === 0 ? Nothing() : Just(n / d)\n *\n * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Just([5, 2.5, 2])\n * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Nothing\n */\nmodule.exports = _curry3(function traverse(of, f, traversable) {\n return sequence(of, map(f, traversable));\n});\n","module.exports = function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n};\n","module.exports = function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n};\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns true if its arguments are identical, false otherwise. Values are\n * identical if they reference the same memory. `NaN` is identical to `NaN`;\n * `0` and `-0` are not identical.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> a -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * var o = {};\n * R.identical(o, o); //=> true\n * R.identical(1, 1); //=> true\n * R.identical(1, '1'); //=> false\n * R.identical([], []); //=> false\n * R.identical(0, -0); //=> false\n * R.identical(NaN, NaN); //=> true\n */\nmodule.exports = _curry2(function identical(a, b) {\n // SameValue algorithm\n if (a === b) { // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n});\n","var _curry1 = require('./internal/_curry1');\n\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n */\nmodule.exports = _curry1(function type(val) {\n return val === null ? 'Null' :\n val === undefined ? 'Undefined' :\n Object.prototype.toString.call(val).slice(8, -1);\n});\n","var _arrayFromIterator = require('./_arrayFromIterator');\nvar _functionName = require('./_functionName');\nvar _has = require('./_has');\nvar identical = require('../identical');\nvar keys = require('../keys');\nvar type = require('../type');\n\n\nmodule.exports = function _equals(a, b, stackA, stackB) {\n if (identical(a, b)) {\n return true;\n }\n\n if (type(a) !== type(b)) {\n return false;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) &&\n typeof b.equals === 'function' && b.equals(a);\n }\n\n switch (type(a)) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' &&\n _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!identical(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.sticky === b.sticky &&\n a.unicode === b.unicode)) {\n return false;\n }\n break;\n case 'Map':\n case 'Set':\n if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) {\n return false;\n }\n break;\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n break;\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n\n stackA.push(a);\n stackB.push(b);\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) {\n return false;\n }\n idx -= 1;\n }\n stackA.pop();\n stackB.pop();\n return true;\n};\n","var _curry2 = require('./internal/_curry2');\nvar _equals = require('./internal/_equals');\n\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * var a = {}; a.v = a;\n * var b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\nmodule.exports = _curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { pushHistoryState, createId } from \"./utils\";\nimport { curry, equals, traverse, identity, path } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Invalid states sent with importState. Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\nconst fieldTypeIsValid = curry((validTypes, field) =>\n validTypes.find(equals(field.type))\n ? Either.Right(field)\n : Either.Left(`Invalid field type ${field.type}`)\n);\n\nconst validFieldTypes = curry((validTypes, fieldsState) =>\n traverse(Either.of, fieldTypeIsValid(validTypes), fieldsState)\n);\n\n\n// [a] -> [a] -> Either String [a]\nconst validateFieldsState = curry((fieldsState, state) =>\n Either.of(fieldsState)\n .chain(isArray)\n .chain(validFieldTypes(state.fieldTypes.map(path([\"info\", \"type\"]))))\n);\n\n\n// Add required properties that are not managed by the field\n// component but by the FormBuilder component itself, so may\n// not be there.\n// [a] => [a]\nconst addRequiredProperties = fieldStates =>\n fieldStates\n .map(s => Object.assign(\n {\n configShowing: false,\n required: false,\n },\n s,\n { id: createId() }\n ));\n\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { newFieldsState }) =>\n validateFieldsState(newFieldsState, state)\n .map(addRequiredProperties)\n .map(pushHistoryState(state))\n .bimap(console.error, identity)\n .getOrElse(state);\n","module.exports = function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x :\n {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n};\n","var _curry2 = require('./_curry2');\nvar _reduced = require('./_reduced');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XFind(f, xf) {\n this.xf = xf;\n this.f = f;\n this.found = false;\n }\n XFind.prototype['@@transducer/init'] = _xfBase.init;\n XFind.prototype['@@transducer/result'] = function(result) {\n if (!this.found) {\n result = this.xf['@@transducer/step'](result, void 0);\n }\n return this.xf['@@transducer/result'](result);\n };\n XFind.prototype['@@transducer/step'] = function(result, input) {\n if (this.f(input)) {\n this.found = true;\n result = _reduced(this.xf['@@transducer/step'](result, input));\n }\n return result;\n };\n\n return _curry2(function _xfind(f, xf) { return new XFind(f, xf); });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _xfind = require('./internal/_xfind');\n\n\n/**\n * Returns the first element of the list which matches the predicate, or\n * `undefined` if no element matches.\n *\n * Dispatches to the `find` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> a | undefined\n * @param {Function} fn The predicate function used to determine if the element is the\n * desired one.\n * @param {Array} list The array to consider.\n * @return {Object} The element found, or `undefined`.\n * @see R.transduce\n * @example\n *\n * var xs = [{a: 1}, {a: 2}, {a: 3}];\n * R.find(R.propEq('a', 2))(xs); //=> {a: 2}\n * R.find(R.propEq('a', 4))(xs); //=> undefined\n */\nmodule.exports = _curry2(_dispatchable('find', _xfind, function find(fn, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n if (fn(list[idx])) {\n return list[idx];\n }\n idx += 1;\n }\n}));\n","'use strict';\n\n\n/**\n * A helper for delaying the execution of a function.\n * @private\n * @summary (Any... -> Any) -> Void\n */\nvar delayed = typeof setImmediate !== 'undefined'? setImmediate\n : typeof process !== 'undefined'? process.nextTick\n : /* otherwise */ setTimeout\n\n/**\n * @module lib/task\n */\nmodule.exports = Task;\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Task[α, β]` structure represents values that depend on time. This\n * allows one to model time-based effects explicitly, such that one can have\n * full knowledge of when they're dealing with delayed computations, latency,\n * or anything that can not be computed immediately.\n *\n * A common use for this structure is to replace the usual Continuation-Passing\n * Style form of programming, in order to be able to compose and sequence\n * time-dependent effects using the generic and powerful monadic operations.\n *\n * @class\n * @summary\n * ((α → Void), (β → Void) → Void), (Void → Void) → Task[α, β]\n *\n * Task[α, β] <: Chain[β]\n * , Monad[β]\n * , Functor[β]\n * , Applicative[β]\n * , Semigroup[β]\n * , Monoid[β]\n * , Show\n */\nfunction Task(computation, cleanup) {\n this.fork = computation;\n\n this.cleanup = cleanup || function() {};\n}\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `β`.\n *\n * `β` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary β → Task[α, β]\n */\nTask.prototype.of = function _of(b) {\n return new Task(function(_, resolve) {\n return resolve(b);\n });\n};\n\nTask.of = Task.prototype.of;\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary α → Task[α, β]\n */\nTask.prototype.rejected = function _rejected(a) {\n return new Task(function(reject) {\n return reject(a);\n });\n};\n\nTask.rejected = Task.prototype.rejected;\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the successful value of the `Task[α, β]` using a regular unary\n * function.\n *\n * @summary @Task[α, β] => (β → γ) → Task[α, γ]\n */\nTask.prototype.map = function _map(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return resolve(f(b));\n });\n }, cleanup);\n};\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the succesful value of the `Task[α, β]` using a function to a\n * monad.\n *\n * @summary @Task[α, β] => (β → Task[α, γ]) → Task[α, γ]\n */\nTask.prototype.chain = function _chain(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return f(b).fork(reject, resolve);\n });\n }, cleanup);\n};\n\n// -- Apply ------------------------------------------------------------\n\n/**\n * Applys the successful value of the `Task[α, (β → γ)]` to the successful\n * value of the `Task[α, β]`\n *\n * @summary @Task[α, (β → γ)] => Task[α, β] → Task[α, γ]\n */\n\nTask.prototype.ap = function _ap(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var func, funcLoaded = false;\n var val, valLoaded = false;\n var rejected = false;\n var allState;\n\n var thisState = forkThis(guardReject, guardResolve(function(x) {\n funcLoaded = true;\n func = x;\n }));\n\n var thatState = forkThat(guardReject, guardResolve(function(x) {\n valLoaded = true;\n val = x;\n }));\n\n function guardResolve(setter) {\n return function(x) {\n if (rejected) {\n return;\n }\n\n setter(x);\n if (funcLoaded && valLoaded) {\n delayed(function(){ cleanupBoth(allState) });\n return resolve(func(val));\n } else {\n return x;\n }\n }\n }\n\n function guardReject(x) {\n if (!rejected) {\n rejected = true;\n return reject(x);\n }\n }\n\n return allState = [thisState, thatState];\n }, cleanupBoth);\n};\n\n// -- Semigroup ------------------------------------------------------------\n\n/**\n * Selects the earlier of the two tasks `Task[α, β]`\n *\n * @summary @Task[α, β] => Task[α, β] → Task[α, β]\n */\n\nTask.prototype.concat = function _concat(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var done = false;\n var allState;\n var thisState = forkThis(guard(reject), guard(resolve));\n var thatState = forkThat(guard(reject), guard(resolve));\n\n return allState = [thisState, thatState];\n\n function guard(f) {\n return function(x) {\n if (!done) {\n done = true;\n delayed(function(){ cleanupBoth(allState) })\n return f(x);\n }\n };\n }\n }, cleanupBoth);\n\n};\n\n// -- Monoid ------------------------------------------------------------\n\n/**\n * Returns a Task that will never resolve\n *\n * @summary Void → Task[α, _]\n */\nTask.empty = function _empty() {\n return new Task(function() {});\n};\n\nTask.prototype.empty = Task.empty;\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Task[α, β]`\n *\n * @summary @Task[α, β] => Void → String\n */\nTask.prototype.toString = function _toString() {\n return 'Task';\n};\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Transforms a failure value into a new `Task[α, β]`. Does nothing if the\n * structure already contains a successful value.\n *\n * @summary @Task[α, β] => (α → Task[γ, β]) → Task[γ, β]\n */\nTask.prototype.orElse = function _orElse(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return f(a).fork(reject, resolve);\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n\n// -- Folds and extended transformations -------------------------------\n\n/**\n * Catamorphism. Takes two functions, applies the leftmost one to the failure\n * value, and the rightmost one to the successful value, depending on which one\n * is present.\n *\n * @summary @Task[α, β] => (α → γ), (β → γ) → Task[δ, γ]\n */\nTask.prototype.fold = function _fold(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Catamorphism.\n *\n * @summary @Task[α, β] => { Rejected: α → γ, Resolved: β → γ } → Task[δ, γ]\n */\nTask.prototype.cata = function _cata(pattern) {\n return this.fold(pattern.Rejected, pattern.Resolved);\n};\n\n/**\n * Swaps the disjunction values.\n *\n * @summary @Task[α, β] => Void → Task[β, α]\n */\nTask.prototype.swap = function _swap() {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(a);\n }, function(b) {\n return reject(b);\n });\n }, cleanup);\n};\n\n/**\n * Maps both sides of the disjunction.\n *\n * @summary @Task[α, β] => (α → γ), (β → δ) → Task[γ, δ]\n */\nTask.prototype.bimap = function _bimap(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Maps the left side of the disjunction (failure).\n *\n * @summary @Task[α, β] => (α → γ) → Task[γ, β]\n */\nTask.prototype.rejectedMap = function _rejectedMap(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n","module.exports = require('./task');\n","/* eslint-disable new-cap */\nimport { prop, find, identity, pipe } from \"ramda\";\nimport { createId } from \"./utils\";\nimport Either from \"data.either\";\nimport Task from \"data.task\";\nimport Immutable from \"seamless-immutable\";\nimport { fieldCreated } from \"../Actions\";\n\n// State -> String -> Either String Function\nconst typeConstructor = (state, fieldType) => {\n return Either.of(state)\n .map(prop(\"fieldTypes\"))\n .map(find(v => v.info.type === fieldType))\n .chain(Either.fromNullable)\n .bimap(_ => `Field \"${fieldType}\" does not exist.`, identity);\n};\n\n// { initialState: Function } -> Task String Object\nconst createField = constr =>\n new Task((reject, resolve) => {\n // Make sure the promise is only resolved once\n let called = false;\n const fieldState = constr.initialState();\n\n if (!(fieldState instanceof Promise)) {\n resolve(fieldState);\n } else {\n fieldState\n .then(v => {\n if (called) { return; }\n called = true;\n resolve(v);\n })\n .catch(v => {\n if (called) { throw v; }\n called = true;\n reject(v);\n });\n }\n });\n\n// Object -> Object\nconst insertRequiredProps = field =>\n Immutable(field).merge({\n id: createId(),\n configShowing: true,\n }, {\n deep: true,\n });\n\nconst createFieldAsynchronously = (state, fieldType, asyncDispatch) =>\n typeConstructor(state, fieldType)\n .map(createField) // Either String (Task String Object)\n .leftMap(Task.rejected)\n .merge() // Task String Object\n .map(insertRequiredProps)\n .fork( // execute task\n err => console.error(\"Task rejected\", err),\n pipe(fieldCreated, asyncDispatch)\n );\n\n// This is an async action. When it is finished it will trigger the\n// field created action\nexport default (state, { fieldType, asyncDispatch }) => {\n createFieldAsynchronously(state, fieldType, asyncDispatch);\n return state;\n};\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a new list containing the contents of the given list, followed by\n * the given element.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The element to add to the end of the new list.\n * @param {Array} list The list whose contents will be added to the beginning of the output\n * list.\n * @return {Array} A new list containing the contents of the old list followed by `el`.\n * @see R.prepend\n * @example\n *\n * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']\n * R.append('tests', []); //=> ['tests']\n * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]\n */\nmodule.exports = _curry2(function append(el, list) {\n return _concat(list, [el]);\n});\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/maybe\n */\nmodule.exports = Maybe\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * A structure for values that may not be present, or computations that may\n * fail. `Maybe(a)` explicitly models the effects that are implicit in\n * `Nullable` types, thus has none of the problems associated with\n * `null` or `undefined` — like `NullPointerExceptions`.\n *\n * The class models two different cases:\n *\n * + `Just a` — represents a `Maybe(a)` that contains a value. `a` may\n * be any value, including `null` or `undefined`.\n *\n * + `Nothing` — represents a `Maybe(a)` that has no values. Or a\n * failure that needs no additional information.\n *\n * Common uses of this structure includes modelling values that may or may\n * not be present in a collection, thus instead of needing a\n * `collection.has(a)`, the `collection.get(a)` operation gives you all\n * the information you need — `collection.get(a).is-nothing` being\n * equivalent to `collection.has(a)`; Similarly the same reasoning may\n * be applied to computations that may fail to provide a value, e.g.:\n * `collection.find(predicate)` can safely return a `Maybe(a)` instance,\n * even if the collection contains nullable values.\n *\n * Furthermore, the values of `Maybe(a)` can be combined and manipulated\n * by using the expressive monadic operations. This allows safely\n * sequencing operations that may fail, and safely composing values that\n * you don't know whether they're present or not, failing early\n * (returning a `Nothing`) if any of the operations fail.\n *\n * If one wants to store additional information about failures, the\n * [Either][] and [Validation][] structures provide such a capability, and\n * should be used instead of the `Maybe(a)` structure.\n *\n * [Either]: https://github.com/folktale/data.either\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n */\nfunction Maybe() {}\n\n// The case for successful values\nJust.prototype = clone(Maybe.prototype)\nfunction Just(a){\n this.value = a\n}\n\n// The case for failure values\nNothing.prototype = clone(Maybe.prototype)\nfunction Nothing(){}\n\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure with an absent value. Commonly used\n * to represent a failure.\n *\n * @summary Void → Maybe[α]\n */\nMaybe.Nothing = function() {\n return new Nothing\n}\nMaybe.prototype.Nothing = Maybe.Nothing\n\n/**\n * Constructs a new `Maybe[α]` structure that holds the single value\n * `α`. Commonly used to represent a success.\n *\n * `α` can be any value, including `null`, `undefined` or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.Just = function(a) {\n return new Just(a)\n}\nMaybe.prototype.Just = Maybe.Just\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure from a nullable type.\n *\n * If the value is either `null` or `undefined`, this function returns a\n * `Nothing`, otherwise the value is wrapped in a `Just(α)`.\n *\n * @summary α → Maybe[α]\n */\nMaybe.fromNullable = function(a) {\n return a != null? new Just(a)\n : /* otherwise */ new Nothing\n}\nMaybe.prototype.fromNullable = Maybe.fromNullable\n\n/**\n * Constructs a new `Maybe[β]` structure from an `Either[α, β]` type.\n *\n * The left side of the `Either` becomes `Nothing`, and the right side\n * is wrapped in a `Just(β)`.\n *\n * @summary Either[α, β] → Maybe[β]\n */\nMaybe.fromEither = function(a) {\n return a.fold(Maybe.Nothing, Maybe.Just)\n}\nMaybe.prototype.fromEither = Maybe.fromEither\n\n/**\n * Constructs a new `Maybe[β]` structure from a `Validation[α, β]` type.\n *\n * The failure side of the `Validation` becomes `Nothing`, and the right\n * side is wrapped in a `Just(β)`.\n *\n * @method\n * @summary Validation[α, β] → Maybe[β]\n */\nMaybe.fromValidation = Maybe.fromEither\nMaybe.prototype.fromValidation = Maybe.fromEither\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Maybe[α]` structure contains a failure (i.e.: `Nothing`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isNothing = false\nNothing.prototype.isNothing = true\n\n\n/**\n * True if the `Maybe[α]` structure contains a single value (i.e.: `Just(α)`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isJust = false\nJust.prototype.isJust = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Maybe[α]` structure holding the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.of = function(a) {\n return new Just(a)\n}\nMaybe.prototype.of = Maybe.of\n\n\n/**\n * Applies the function inside the `Maybe[α]` structure to another\n * applicative type.\n *\n * The `Maybe[α]` structure should contain a function value, otherwise a\n * `TypeError` is thrown.\n *\n * @method\n * @summary (@Maybe[α → β], f:Applicative[_]) => f[α] → f[β]\n */\nMaybe.prototype.ap = unimplemented\n\nNothing.prototype.ap = noop\n\nJust.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using a regular unary\n * function.\n *\n * @method\n * @summary @Maybe[α] => (α → β) → Maybe[β]\n */\nMaybe.prototype.map = unimplemented\nNothing.prototype.map = noop\n\nJust.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using an unary function\n * to monads.\n *\n * @method\n * @summary (@Maybe[α], m:Monad[_]) => (α → m[β]) → m[β]\n */\nMaybe.prototype.chain = unimplemented\nNothing.prototype.chain = noop\n\nJust.prototype.chain = function(f) {\n return f(this.value)\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Void → String\n */\nMaybe.prototype.toString = unimplemented\n\nNothing.prototype.toString = function() {\n return 'Maybe.Nothing'\n}\n\nJust.prototype.toString = function() {\n return 'Maybe.Just(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if a `Maybe[α]` structure is equal to another `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Maybe[α] → Boolean\n */\nMaybe.prototype.isEqual = unimplemented\n\nNothing.prototype.isEqual = function(b) {\n return b.isNothing\n}\n\nJust.prototype.isEqual = function(b) {\n return b.isJust\n && b.value === this.value\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the value out of the `Maybe[α]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary @Maybe[α] => Void → a, :: partial, throws\n * @see {@link module:lib/maybe~Maybe#getOrElse} — A getter that can handle failures\n * @throws {TypeError} if the structure has no value (`Nothing`).\n */\nMaybe.prototype.get = unimplemented\n\nNothing.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Nothing.\")\n}\n\nJust.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the value out of the `Maybe[α]` structure. If there is no value,\n * returns the given default.\n *\n * @method\n * @summary @Maybe[α] => α → α\n */\nMaybe.prototype.getOrElse = unimplemented\n\nNothing.prototype.getOrElse = function(a) {\n return a\n}\n\nJust.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a failure into a new `Maybe[α]` structure. Does nothing if the\n * structure already contains a value.\n *\n * @method\n * @summary @Maybe[α] => (Void → Maybe[α]) → Maybe[α]\n */\nMaybe.prototype.orElse = unimplemented\n\nNothing.prototype.orElse = function(f) {\n return f()\n}\n\nJust.prototype.orElse = function(_) {\n return this\n}\n\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary @Maybe[α] => { Nothing: Void → β, Just: α → β } → β\n */\nMaybe.prototype.cata = unimplemented\n\nNothing.prototype.cata = function(pattern) {\n return pattern.Nothing()\n}\n\nJust.prototype.cata = function(pattern) {\n return pattern.Just(this.value);\n}\n\n\n/**\n * JSON serialisation\n *\n * @method\n * @summary @Maybe[α] => Void → Object\n */\nMaybe.prototype.toJSON = unimplemented\n\nNothing.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Nothing' }\n}\n\nJust.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Just'\n , value: this.value }\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./maybe')","import { curry, pipe, prop, over, append } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithNewField = curry((state, newField) => pipe(\n hideConfigs,\n over(StateLenses.fieldsState, append(newField))\n)(state));\n\nexport default (state, { createdFieldState }) =>\n Maybe.fromNullable(createdFieldState)\n .map(historyStateWithNewField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleConfig = fieldState =>\n Immutable(fieldState).set(\"configShowing\", !fieldState.configShowing);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleConfig)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleRequired = fieldState =>\n Immutable(fieldState).set(\"required\", !fieldState.required);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleRequired)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","module.exports = function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n};\n","module.exports = function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n};\n","var _curry2 = require('./_curry2');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function(result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n\n return _curry2(function _xfilter(f, xf) { return new XFilter(f, xf); });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _filter = require('./internal/_filter');\nvar _isObject = require('./internal/_isObject');\nvar _reduce = require('./internal/_reduce');\nvar _xfilter = require('./internal/_xfilter');\nvar keys = require('./keys');\n\n\n/**\n * Takes a predicate and a \"filterable\", and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array}\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * var isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nmodule.exports = _curry2(_dispatchable('filter', _xfilter, function(pred, filterable) {\n return (\n _isObject(filterable) ?\n _reduce(function(acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) :\n // else\n _filter(pred, filterable)\n );\n}));\n","import { curry, prop, over, filter } from \"ramda\";\nimport { StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithoutField = curry((state, fieldState) =>\n over(\n StateLenses.fieldsState,\n filter(fs => fs.id !== fieldState.id),\n state\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(historyStateWithoutField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","import { curry, prop, over, map } from \"ramda\";\nimport { StateLenses, pushHistoryState, validateField } from \"./utils\";\n\n// State -> Object -> State\nconst updateFieldState = curry((state, newFieldState) =>\n over(\n StateLenses.fieldsState,\n map(fs => fs.id === newFieldState.id ? newFieldState : fs),\n state\n )\n);\n\nexport default (state, { newFieldState }) =>\n validateField(newFieldState) // Either\n .map(updateFieldState(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(console.error)\n .getOrElse(state);\n","var _curry2 = require('./internal/_curry2');\nvar _slice = require('./internal/_slice');\n\n\n/**\n * Returns a copy of the list, sorted according to the comparator function,\n * which should accept two values at a time and return a negative number if the\n * first value is smaller, a positive number if it's larger, and zero if they\n * are equal. Please note that this is a **copy** of the list. It does not\n * modify the original.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a,a -> Number) -> [a] -> [a]\n * @param {Function} comparator A sorting function :: a -> b -> Int\n * @param {Array} list The list to sort\n * @return {Array} a new array with its elements sorted by the comparator function.\n * @example\n *\n * var diff = function(a, b) { return a - b; };\n * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]\n */\nmodule.exports = _curry2(function sort(comparator, list) {\n return _slice(list).sort(comparator);\n});\n","/* eslint-disable new-cap */\nimport { curry, pipe, prop, over, sort } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Either from \"data.either\";\n\n// State -> Object -> State\nconst historyStateWithNewOrder = curry((state, newOrder) => pipe(\n hideConfigs,\n over(\n StateLenses.fieldsState,\n sort((f1, f2) => newOrder.indexOf(f1.id) - newOrder.indexOf(f2.id))\n )\n)(state));\n\nexport default (state, { newFieldsOrder }) =>\n (newFieldsOrder && Array.isArray(newFieldsOrder)\n ? Either.Right(newFieldsOrder)\n : Either.Left(`newFieldsOrder must be an array but received ${typeof newFieldsOrder}`)\n )\n .chain(o =>\n o.length === state.fieldsState.length\n ? Either.Right(o)\n : Either.Left(`newFieldsOrder has ${o.length} elements, but the current state has ${state.fieldsState.length} elements`) // eslint-disable-line max-len\n )\n .chain(o => {\n const stateIds = state.fieldsState.map(prop(\"id\"));\n const noMissingId = stateIds.reduce((acc, fId) => acc && o.includes(fId), true);\n return noMissingId\n ? Either.Right(o)\n : Either.Left(\"Not all ids in the new order are matched in the existing state ids.\");\n })\n .map(historyStateWithNewOrder(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(err => console.error(`Unable to reorder: ${err}`))\n .getOrElse(state);\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { StateLenses, propertyTypeCheck } from \"./utils\";\nimport { over, traverse, curry } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\n// Object -> Either String Object\nconst hasRequiredInfo = component =>\n propertyTypeCheck(\"initialState\", \"function\", component)\n .chain(propertyTypeCheck(\"RenderEditor\", \"function\"))\n .chain(propertyTypeCheck(\"info\", \"object\"))\n .chain(c => Either.fromNullable(c.info))\n .chain(propertyTypeCheck(\"type\", \"string\"))\n .chain(propertyTypeCheck(\"displayName\", \"string\"))\n .chain(propertyTypeCheck(\"group\", \"string\"))\n .chain(_ => Either.Right(component));\n\nconst isComponentValid = customComponents =>\n traverse(Either.of, hasRequiredInfo, customComponents);\n\n// [a] -> [a] -> Either String [a]\nconst validateComponents = customComponents =>\n Either.Right(customComponents)\n .chain(isArray)\n .chain(isComponentValid);\n\nconst addToFieldTypes = curry((state, customComponents) =>\n over(StateLenses.fieldTypes, s => s.concat(customComponents), state)\n);\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { customComponents }) =>\n (customComponents\n ? Either.Right(customComponents)\n : Either.Left(\"Empty custom components\")\n )\n .chain(validateComponents)\n .leftMap(err => console.error(\"Invalid custom components:\", err))\n .map(addToFieldTypes(state))\n .getOrElse(state);\n","/* eslint-disable no-nested-ternary */\nimport assert from \"fl-assert\";\nimport undo from \"./undo\";\nimport importState from \"./importState\";\nimport createField from \"./createField\";\nimport fieldCreated from \"./fieldCreated\";\nimport toggleConfig from \"./field.toggleConfig\";\nimport toggleRequired from \"./field.toggleRequired\";\nimport deleteField from \"./field.deleteField\";\nimport updateField from \"./field.updateField\";\nimport reorderFields from \"./reorderFields\";\nimport importCustomComponents from \"./importCustomComponents\";\n\nconst actionHandlers = {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n};\n\nconst isExpectedAction = a => a && a.type && actionHandlers[a.type];\nconst isReduxAction = a => a && a.type && a.type.includes(\"@@redux\");\n\n\nconst update = (state, action) =>\n isExpectedAction(action)\n ? actionHandlers[action.type](state, action)\n : isReduxAction(action)\n ? state\n : assert(false, `Invalid action type: ${action.type}`);\n\nexport default update;\n","/* eslint-env jasmine */\n\nimport { undo as undoAction } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst currentFieldsState = [\"current\"];\nconst oldFieldsState = [\"old\"];\nconst mockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [oldFieldsState],\n};\n\nconst emptyMockState = {\n fieldTypes: [],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst emptyHistoryMockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.undo\", () => {\n it(\"removes first old state from history\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsStateHistory.length).toEqual(0);\n });\n\n it(\"sets first old state as current state\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsState).toEqual(oldFieldsState);\n });\n\n it(\"doesn't modify the state if there aren't more history states to undo\", () => {\n const modifiedState = update(emptyMockState, undoAction());\n expect(modifiedState).toEqual(emptyMockState);\n });\n\n it(\"set's the current state to empty if there are no more history states\", () => {\n const modifiedState = update(emptyHistoryMockState, undoAction());\n expect(modifiedState.fieldsState.length).toEqual(0);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importState } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst typesArray = [{\n \"info\": {\n \"type\": \"RadioButtons\",\n },\n}, {\n \"info\": {\n \"type\": \"Checkboxes\",\n },\n}, {\n \"info\": {\n \"type\": \"Dropdown\",\n },\n}, {\n \"info\": {\n \"type\": \"TextBox\",\n },\n}, {\n \"info\": {\n \"type\": \"EmailBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TelephoneBox\",\n },\n}, {\n \"info\": {\n \"type\": \"NumberBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TextArea\",\n },\n}, {\n \"info\": {\n \"type\": \"DateField\",\n },\n}];\n\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newValidState = [{\n \"type\": \"Checkboxes\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"id\": 2,\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\nconst newInvalidState = [{\n \"type\": \"Invalid type\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\ndescribe(\"Update.importState\", () => {\n it(\"Returns an unchanged array if the new state is invalid\", () => {\n expect(update(mockState, importState({}))).toEqual(mockState);\n expect(update(mockState, importState(null))).toEqual(mockState);\n });\n\n it(\"Returns an unchanged array if the a field's type is not in fieldTypes\", () => {\n expect(update(mockState, importState(newInvalidState))).toEqual(mockState);\n });\n\n it(\"Sends the last current state to the history\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsStateHistory[0].toString()).toEqual(mockCurrentState.toString());\n expect(updated.fieldsStateHistory.length).toEqual(mockHistory.length + 1);\n });\n\n it(\"Sets the new state as current\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsState[0].type).toEqual(newValidState[0].type);\n expect(updated.fieldsState[0].type).not.toEqual(undefined);\n expect(updated.fieldsState[0].displayName).toEqual(newValidState[0].displayName);\n expect(updated.fieldsState[0].displayName).not.toEqual(undefined);\n expect(updated.fieldsState[0].group).toEqual(newValidState[0].group);\n expect(updated.fieldsState[0].group).not.toEqual(undefined);\n });\n\n it(\"Makes sure all ids are strings\", () => {\n const validState2 = newValidState\n .map((v, idx) => idx !== 0 ? v : Object.assign({}, v, { id: 2 }));\n const updated = update(mockState, importState(validState2));\n expect(typeof updated.fieldsState[0].id).toEqual(\"string\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { createField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst promiseTypeInstance = { type: \"promise-instance\" };\nconst promiseType = {\n info: { type: \"PromiseType\" },\n initialState: () => Promise.resolve(promiseTypeInstance),\n};\n\nconst syncTypeInstance = { type: \"sync-instance\" };\nconst syncType = {\n info: { type: \"SyncType\" },\n initialState: () => syncTypeInstance,\n};\n\nconst typesArray = [promiseType, syncType];\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\ndescribe(\"Update.createField\", () => {\n it(\"creates fields asynchronously\", done => {\n const asyncDispatch = v => {\n expect(v).not.toEqual(undefined);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"returns a 'fieldCreated' action when field is created\", done => {\n const asyncDispatch = action => {\n expect(action.type).toEqual(\"fieldCreated\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a plain object\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(syncTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a promise\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(promiseTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"adds required fields to instance\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState.id).not.toEqual(undefined);\n expect(typeof action.createdFieldState.configShowing).toEqual(\"boolean\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"does not create a field if type is not in model.fieldTypes\", done => {\n const asyncDispatch = jasmine.createSpy(\"asyncDispatch\");\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(\"non-existing-type\")\n );\n\n update(mockState, asyncAcion);\n\n setTimeout(\n () => { expect(asyncDispatch).not.toHaveBeenCalled(); done(); },\n 50\n );\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { fieldCreated } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createdFieldState = { type: \"fictitious-instance\" };\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldCreatedAction = fieldCreated(createdFieldState);\nconst newState = update(mockState, fieldCreatedAction);\n\ndescribe(\"Update.fieldCreated\", () => {\n it(\"outputs a state with the new field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length + 1);\n expect(\n newState.fieldsState\n .find(v => v.type === createdFieldState.type)\n ).not.toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0]).toEqual(mockCurrentState[0]);\n expect(newState.fieldsStateHistory[0][1]).toEqual(mockCurrentState[1]);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, fieldCreated(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, fieldCreated(createdFieldState));\n const changed2 = update(changed1, fieldCreated(createdFieldState));\n const changed3 = update(changed2, fieldCreated(createdFieldState));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length + 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleConfig } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateConfigShowing = {\n id: 123,\n configShowing: true,\n};\n\nconst fieldStateConfigNotShowing = {\n id: 321,\n configShowing: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateConfigShowing, fieldStateConfigNotShowing],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleConfig\", () => {\n it(\"turns the config option to false when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(false);\n });\n\n it(\"turns the config option to true when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigNotShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleRequired } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateIsRequired = {\n id: 123,\n required: true,\n};\n\nconst fieldStateIsNotRequired = {\n id: 321,\n required: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateIsRequired, fieldStateIsNotRequired],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleRequired\", () => {\n it(\"turns the required option to false when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(false);\n });\n\n it(\"turns the required option to true when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsNotRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { deleteField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst toBeDeletedFieldState = { type: \"fictitious-instance\", id: 0 };\nconst mockCurrentState = [toBeDeletedFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldDeleteAction = deleteField(toBeDeletedFieldState);\nconst newState = update(mockState, fieldDeleteAction);\n\ndescribe(\"Update.deleteField\", () => {\n it(\"outputs a state without the field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length - 1);\n expect(\n newState.fieldsState\n .find(v => v.id === toBeDeletedFieldState.id)\n ).toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[1].id).toEqual(mockCurrentState[1].id);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, deleteField(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after deleting a field\", () => {\n const mockField1 = Object.assign({}, toBeDeletedFieldState, { id: 5 });\n const mockField2 = Object.assign({}, toBeDeletedFieldState, { id: 6 });\n const mockField3 = Object.assign({}, toBeDeletedFieldState, { id: 7 });\n\n const mockState2 = Object.assign({}, mockState, {\n fieldsState: [\n mockField1,\n mockField2,\n mockField3,\n ],\n });\n const changed1 = update(mockState2, deleteField(mockField1));\n const changed2 = update(changed1, deleteField(mockField2));\n const changed3 = update(changed2, deleteField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState2.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState2.fieldsState.length - 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { updateField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst oldFieldState = {\n type: \"fictitious-instance\",\n id: \"0\",\n configShowing: false,\n required: false,\n color: \"blue\",\n};\nconst newFieldState = Object.assign({}, oldFieldState, { color: \"green\" });\nconst mockCurrentState = [oldFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldUpdateAction = updateField(newFieldState);\nconst newState = update(mockState, fieldUpdateAction);\n\ndescribe(\"Update.updateField\", () => {\n it(\"outputs a state the field updated\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(\n newState.fieldsState\n .find(v => v.color === newFieldState.color)\n ).not.toEqual(undefined);\n });\n\n it(\"outputs a state the updated field in the correct order\", () => {\n expect(newState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(newState.fieldsState[0].color).toEqual(newFieldState.color);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[0].color).toEqual(mockCurrentState[0].color);\n });\n\n it(\"Returns the current state if an invalid field state is given to it\", () => {\n const isSame = (state1, state2) => {\n expect(state1.fieldTypes.length).toEqual(state2.fieldTypes.length);\n expect(state1.fieldsState.length).toEqual(state2.fieldsState.length);\n expect(state1.fieldsState[0].color).toEqual(state2.fieldsState[0].color);\n expect(state1.fieldsState[0].id).toEqual(state2.fieldsState[0].id);\n expect(state1.fieldsStateHistory.length).toEqual(state2.fieldsStateHistory.length);\n };\n\n const sameState1 = update(mockState, updateField(null));\n isSame(mockState, sameState1);\n\n const sameState2 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { id: null }))\n );\n isSame(mockState, sameState2);\n\n const sameState3 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { configShowing: null }))\n );\n isSame(mockState, sameState3);\n\n const sameState4 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { required: null }))\n );\n\n isSame(mockState, sameState4);\n });\n\n it(\"does not break the state after updating a field multiple times a field\", () => {\n const mockField1 = Object.assign({}, oldFieldState, { color: \"yellow\" });\n const mockField2 = Object.assign({}, oldFieldState, { color: \"orange\" });\n const mockField3 = Object.assign({}, oldFieldState, { color: \"purple\" });\n\n const changed1 = update(mockState, updateField(mockField1));\n const changed2 = update(changed1, updateField(mockField2));\n const changed3 = update(changed2, updateField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(changed3.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(changed3.fieldsState[0].color).toEqual(mockField3.color);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { reorderFields } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst templateField = {\n type: \"fictitious-instance\",\n required: false,\n configShowing: false,\n id: \"0\",\n};\nconst field1 = Object.assign({}, templateField, { id: \"1\" });\nconst field2 = Object.assign({}, templateField, { id: \"2\" });\nconst field3 = Object.assign({}, templateField, { id: \"3\" });\nconst mockCurrentState = [field1, field2, field3];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newOrder = [\"2\", \"3\", \"1\"];\nconst reorderFieldsAction = reorderFields(newOrder);\nconst newState = update(mockState, reorderFieldsAction);\n\ndescribe(\"Update.reorderFields\", () => {\n it(\"outputs a state with fields in the new order\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(newState.fieldsState[0].id).toEqual(newOrder[0]);\n expect(newState.fieldsState[1].id).toEqual(newOrder[1]);\n expect(newState.fieldsState[2].id).toEqual(newOrder[2]);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0].id).toEqual(mockCurrentState[0].id);\n expect(newState.fieldsStateHistory[0][1].id).toEqual(mockCurrentState[1].id);\n expect(newState.fieldsStateHistory[0][2].id).toEqual(mockCurrentState[2].id);\n });\n\n it(\"Returns the current state if any field id is missing\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"Returns the current state if the reorder array has more elements than it should\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\", \"3\", \"4\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, reorderFields([\"1\", \"2\", \"3\"]));\n const changed2 = update(changed1, reorderFields([\"3\", \"1\", \"2\"]));\n const changed3 = update(changed2, reorderFields([\"3\", \"2\", \"1\"]));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n expect(changed3.fieldsState[0].id).toEqual(\"3\");\n expect(changed3.fieldsState[1].id).toEqual(\"2\");\n expect(changed3.fieldsState[2].id).toEqual(\"1\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importCustomComponents } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createType = name => ({\n initialState: _ => _,\n RenderEditor: _ => _,\n info: { type: name, group: \"custom\", displayName: name },\n});\n\nconst mockState = {\n fieldTypes: [createType(\"fictitious-instance\")],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst customTypes = [\n createType(\"custom-1\"),\n createType(\"custom-2\"),\n createType(\"custom-3\"),\n];\n\nconst importCustomComponentsAction = importCustomComponents(customTypes);\nconst newState = update(mockState, importCustomComponentsAction);\n\n\ndescribe(\"Update.importCustomComponents\", () => {\n it(\"Appends the new valid custom types to the end of the existing types\", () => {\n expect(newState.fieldTypes.length).toEqual(mockState.fieldTypes.length + customTypes.length);\n expect(newState.fieldTypes[1].info.type).toEqual(customTypes[0].info.type);\n expect(newState.fieldTypes[2].info.type).toEqual(customTypes[1].info.type);\n expect(newState.fieldTypes[3].info.type).toEqual(customTypes[2].info.type);\n });\n\n it(\"Returns an unchanged array if customTypes is invalid\", () => {\n expect(update(mockState, importCustomComponents(null))).toEqual(mockState);\n\n const invalid1 = [\n Object.assign({}, createType(\"custom-1\"), { info: null }),\n ];\n expect(update(mockState, importCustomComponents(invalid1))).toEqual(mockState);\n\n const invalid2 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: null, group: \"custom\", displayName: \"custom\" } }),\n ];\n expect(update(mockState, importCustomComponents(invalid2))).toEqual(mockState);\n\n const invalid3 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: null, displayName: \"custom\" } }\n ),\n ];\n expect(update(mockState, importCustomComponents(invalid3))).toEqual(mockState);\n\n const invalid4 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: \"custom\", displayName: null } }),\n ];\n expect(update(mockState, importCustomComponents(invalid4))).toEqual(mockState);\n\n const invalid5 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { RenderEditor: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid5))).toEqual(mockState);\n\n const invalid6 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { initialState: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid6))).toEqual(mockState);\n });\n});\n"],"names":["undo","importCustomComponents","importState","createField","fieldCreated","toggleConfig","toggleRequired","deleteField","updateField","reorderFields","describe","action","type","toEqual","mockStateToImport","newFieldsState","fieldType","createdFieldState","fieldState","newFieldState","newFieldsOrder","customComponents","define","asyncDispatchMiddleware","syncActivityFinished","actionQueue","flushQueue","forEach","store","dispatch","a","asyncDispatch","asyncAction","concat","actionWithAsyncDispatch","Immutable","merge","fakeAction","done","next","returnedAction","not","undefined","fakeAsyncAction","fakeStore","Either","require$$0","updateAt","_default","keyArray","newVal","obj","deepNewVal","reduceRight","result","key","deep","StateLenses","_default2","_default3","createId","Date","now","Math","random","toString","pushHistoryState","state","newHistoryState","_default4","fieldsStateHistory","_default6","fieldsState","hideConfigs","_default7","map","Object","assign","s","configShowing","propertyTypeCheck","propertyName","babelHelpers.typeof","Right","Left","validateField","fromNullable","leftMap","fs","chain","lastHistoryState","_","Infinity","isArray","Array","arr","fieldTypeIsValid","validTypes","field","find","validFieldTypes","of","validateFieldsState","fieldTypes","addRequiredProperties","fieldStates","id","bimap","console","error","getOrElse","Task","typeConstructor","v","info","reject","resolve","called","constr","initialState","Promise","then","catch","insertRequiredProps","createFieldAsynchronously","rejected","fork","err","Maybe","clone","unimplemented","noop","historyStateWithNewField","newField","_default5","set","replaceFieldState","aField","required","historyStateWithoutField","updateFieldState","historyStateWithNewOrder","newOrder","f1","f2","indexOf","o","length","stateIds","noMissingId","reduce","acc","fId","includes","hasRequiredInfo","component","c","isComponentValid","validateComponents","addToFieldTypes","actionHandlers","isExpectedAction","isReduxAction","update","assert","currentFieldsState","oldFieldsState","mockState","emptyMockState","emptyHistoryMockState","modifiedState","undoAction","typesArray","mockCurrentState","mockHistory","newValidState","newInvalidState","updated","displayName","group","validState2","idx","promiseTypeInstance","promiseType","syncTypeInstance","syncType","asyncAcion","jasmine","createSpy","toHaveBeenCalled","fieldCreatedAction","newState","sameState","changed1","changed2","changed3","fieldStateConfigShowing","fieldStateConfigNotShowing","f","fieldStateIsRequired","fieldStateIsNotRequired","toBeDeletedFieldState","fieldDeleteAction","recentHistoryState","mockField1","mockField2","mockField3","mockState2","oldFieldState","color","fieldUpdateAction","isSame","state1","state2","sameState1","sameState2","sameState3","sameState4","templateField","field1","field2","field3","reorderFieldsAction","createType","name","customTypes","importCustomComponentsAction","invalid1","invalid2","invalid3","invalid4","invalid5","RenderEditor","invalid6"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvQWN0aW9ucy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvYWN0aW9ucy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvc2VhbWxlc3MtaW1tdXRhYmxlL3NyYy9zZWFtbGVzcy1pbW11dGFibGUuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL3V0aWxzL2FzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91dGlscy5hc3luY0Rpc3BhdGNoTWlkZGxld2FyZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZmwtYXNzZXJ0L2Rpc3QvYXNzZXJ0LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzQXJyYXkuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fc2xpY2UuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNQbGFjZWhvbGRlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeTEuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY3VycnkyLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2N1cnJ5My5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NsaWNlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvb3Zlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Fsd2F5cy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NldC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19hcml0eS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19waXBlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3h3cmFwLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYmluZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc1N0cmluZy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2lzQXJyYXlMaWtlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3JlZHVjZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3JlZHVjZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3RhaWwuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waXBlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2NvbmNhdC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3ByZXBlbmQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9wLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXIuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX21hcC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZkJhc2UuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feG1hcC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeU4uanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeU4uanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faGFzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMva2V5cy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21hcC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2xlbnMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5laXRoZXIvbGliL2VpdGhlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5laXRoZXIvbGliL2luZGV4LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvdXRpbHMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS91bmRvLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lkZW50aXR5LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWRlbnRpdHkuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wYXRoLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXAuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZWR1Y2VSaWdodC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NlcXVlbmNlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHJhdmVyc2UuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fYXJyYXlGcm9tSXRlcmF0b3IuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZnVuY3Rpb25OYW1lLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWRlbnRpY2FsLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHlwZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19lcXVhbHMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9lcXVhbHMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9pbXBvcnRTdGF0ZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19yZWR1Y2VkLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hmaW5kLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZmluZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS50YXNrL2xpYi90YXNrLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLnRhc2svbGliL2luZGV4LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvY3JlYXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hcHBlbmQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL2RhdGEubWF5YmUvbGliL21heWJlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLm1heWJlL2xpYi9pbmRleC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkQ3JlYXRlZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkLnRvZ2dsZUNvbmZpZy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkLnRvZ2dsZVJlcXVpcmVkLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2ZpbHRlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc09iamVjdC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZmlsdGVyLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZmlsdGVyLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvZmllbGQuZGVsZXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9maWVsZC51cGRhdGVGaWVsZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NvcnQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9yZW9yZGVyRmllbGRzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvaW1wb3J0Q3VzdG9tQ29tcG9uZW50cy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2luZGV4LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvdW5kby5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ltcG9ydFN0YXRlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvY3JlYXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZENyZWF0ZWQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZC50b2dnbGVDb25maWcuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZC50b2dnbGVSZXF1aXJlZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ZpZWxkLmRlbGV0ZUZpZWxkLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvZmllbGQudXBkYXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9yZW9yZGVyRmllbGRzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvaW1wb3J0Q3VzdG9tQ29tcG9uZW50cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvL1xuLy8gICAgQUNUSU9OIENSRUFUT1JTXG4vL1xuXG5leHBvcnQgY29uc3QgdW5kbyA9IF8gPT5cbih7XG4gIHR5cGU6IFwidW5kb1wiLFxufSk7XG5cbmV4cG9ydCBjb25zdCBpbXBvcnRDdXN0b21Db21wb25lbnRzID0gY3VzdG9tQ29tcG9uZW50cyA9PlxuKHtcbiAgdHlwZTogXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIsXG4gIGN1c3RvbUNvbXBvbmVudHMsXG59KTtcblxuXG5leHBvcnQgY29uc3QgaW1wb3J0U3RhdGUgPSBuZXdGaWVsZHNTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJpbXBvcnRTdGF0ZVwiLFxuICBuZXdGaWVsZHNTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmllbGQgPSBmaWVsZFR5cGUgPT5cbih7XG4gIHR5cGU6IFwiY3JlYXRlRmllbGRcIixcbiAgZmllbGRUeXBlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBmaWVsZENyZWF0ZWQgPSBjcmVhdGVkRmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJmaWVsZENyZWF0ZWRcIixcbiAgY3JlYXRlZEZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZUNvbmZpZyA9IGZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwidG9nZ2xlQ29uZmlnXCIsXG4gIGZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZVJlcXVpcmVkID0gZmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJ0b2dnbGVSZXF1aXJlZFwiLFxuICBmaWVsZFN0YXRlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVGaWVsZCA9IGZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwiZGVsZXRlRmllbGRcIixcbiAgZmllbGRTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlRmllbGQgPSBuZXdGaWVsZFN0YXRlID0+XG4oe1xuICB0eXBlOiBcInVwZGF0ZUZpZWxkXCIsXG4gIG5ld0ZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHJlb3JkZXJGaWVsZHMgPSBuZXdGaWVsZHNPcmRlciA9PlxuKHtcbiAgdHlwZTogXCJyZW9yZGVyRmllbGRzXCIsXG4gIG5ld0ZpZWxkc09yZGVyLFxufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHtcbiAgdW5kbyxcbiAgaW1wb3J0U3RhdGUsXG4gIGNyZWF0ZUZpZWxkLFxuICBmaWVsZENyZWF0ZWQsXG4gIHRvZ2dsZUNvbmZpZyxcbiAgdG9nZ2xlUmVxdWlyZWQsXG4gIGRlbGV0ZUZpZWxkLFxuICB1cGRhdGVGaWVsZCxcbiAgcmVvcmRlckZpZWxkcyxcbiAgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyxcbn0gZnJvbSBcIi4uL2pzL0FjdGlvbnNcIjtcblxuZGVzY3JpYmUoXCJBY3Rpb25cIiwgKCkgPT4ge1xuICBkZXNjcmliZShcInVuZG9cIiwgKCkgPT4ge1xuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB1bmRvKCk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ1bmRvXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImltcG9ydFN0YXRlXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrU3RhdGVUb0ltcG9ydCA9IFtcImFcIiwgXCJiXCJdO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydFN0YXRlKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcImltcG9ydFN0YXRlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpbXBvcnRTdGF0ZShtb2NrU3RhdGVUb0ltcG9ydCk7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkc1N0YXRlKS50b0VxdWFsKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJjcmVhdGVGaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRUeXBlID0gXCJ0ZXN0RmllbGRcIjtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVGaWVsZChmaWVsZFR5cGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiY3JlYXRlRmllbGRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZpZWxkKGZpZWxkVHlwZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkVHlwZSkudG9FcXVhbChmaWVsZFR5cGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImZpZWxkQ3JlYXRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZEZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZmllbGRDcmVhdGVkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkudG9FcXVhbChjcmVhdGVkRmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidG9nZ2xlQ29uZmlnXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdG9nZ2xlQ29uZmlnKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwidG9nZ2xlQ29uZmlnXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVDb25maWcoZmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkU3RhdGUpLnRvRXF1YWwoZmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidG9nZ2xlUmVxdWlyZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInRvZ2dsZVJlcXVpcmVkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uZmllbGRTdGF0ZSkudG9FcXVhbChmaWVsZFN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJkZWxldGVGaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRTdGF0ZSA9IHt9O1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGRlbGV0ZUZpZWxkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZGVsZXRlRmllbGRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGRlbGV0ZUZpZWxkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5maWVsZFN0YXRlKS50b0VxdWFsKGZpZWxkU3RhdGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcInVwZGF0ZUZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBuZXdGaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ1cGRhdGVGaWVsZFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiQ3JlYXRlcyB0aGUgY29ycmVjdCB2YXJpYWJsZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkU3RhdGUpLnRvRXF1YWwobmV3RmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwicmVvcmRlckZpZWxkc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3RmllbGRzT3JkZXIgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSByZW9yZGVyRmllbGRzKG5ld0ZpZWxkc09yZGVyKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInJlb3JkZXJGaWVsZHNcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHJlb3JkZXJGaWVsZHMobmV3RmllbGRzT3JkZXIpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5uZXdGaWVsZHNPcmRlcikudG9FcXVhbChuZXdGaWVsZHNPcmRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiaW1wb3J0Q3VzdG9tQ29tcG9uZW50c1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydEN1c3RvbUNvbXBvbmVudHMoY3VzdG9tQ29tcG9uZW50cyk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpbXBvcnRDdXN0b21Db21wb25lbnRzKGN1c3RvbUNvbXBvbmVudHMpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jdXN0b21Db21wb25lbnRzKS50b0VxdWFsKGN1c3RvbUNvbXBvbmVudHMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIiwiKGZ1bmN0aW9uKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gaW1tdXRhYmxlSW5pdChjb25maWcpIHtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTUuMC4xL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxXG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xuICB2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFX0ZBTExCQUNLID0gMHhlYWM3O1xuXG4gIHZhciBnbG9iYWxDb25maWcgPSB7XG4gICAgdXNlX3N0YXRpYzogZmFsc2VcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIGlmIChjb25maWcudXNlX3N0YXRpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ2xvYmFsQ29uZmlnLnVzZV9zdGF0aWMgPSBCb29sZWFuKGNvbmZpZy51c2Vfc3RhdGljKTtcbiAgICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgZGF0YSAhPT0gbnVsbFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KG9iaikge1xuICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgaWYgKCFwcm90b3R5cGUpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eVRvKHRhcmdldCwgbWV0aG9kTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhblByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIGFkZFByb3BlcnR5VG8odGFyZ2V0LCBtZXRob2ROYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBJbW11dGFibGVFcnJvcihcIlRoZSBcIiArIG1ldGhvZE5hbWUgK1xuICAgICAgICBcIiBtZXRob2QgY2Fubm90IGJlIGludm9rZWQgb24gYW4gSW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlLlwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBpbW11dGFiaWxpdHlUYWcgPSBcIl9faW1tdXRhYmxlX2ludmFyaWFudHNfaG9sZFwiO1xuXG4gIGZ1bmN0aW9uIGFkZEltbXV0YWJpbGl0eVRhZyh0YXJnZXQpIHtcbiAgICBhZGRQcm9wZXJ0eVRvKHRhcmdldCwgaW1tdXRhYmlsaXR5VGFnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW1tdXRhYmxlKHRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0ID09PSBudWxsIHx8IEJvb2xlYW4oXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBpbW11dGFiaWxpdHlUYWcpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBKYXZhU2NyaXB0LCBvbmx5IG9iamVjdHMgYXJlIGV2ZW4gcG90ZW50aWFsbHkgbXV0YWJsZS5cbiAgICAgIC8vIHN0cmluZ3MsIG51bWJlcnMsIG51bGwsIGFuZCB1bmRlZmluZWQgYXJlIGFsbCBuYXR1cmFsbHkgaW1tdXRhYmxlLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gICAgLy8gQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byAoTmFOICE9PSBOYU4pIGV2YWx1YXRpbmcgdG8gdHJ1ZVxuICAgIHJldHVybiAoYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc01lcmdhYmxlT2JqZWN0KHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQgIT09IG51bGwgJiYgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiAhKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBEYXRlKTtcbiAgfVxuXG4gIHZhciBtdXRhdGluZ09iamVjdE1ldGhvZHMgPSBbXG4gICAgXCJzZXRQcm90b3R5cGVPZlwiXG4gIF07XG5cbiAgdmFyIG5vbk11dGF0aW5nT2JqZWN0TWV0aG9kcyA9IFtcbiAgICBcImtleXNcIlxuICBdO1xuXG4gIHZhciBtdXRhdGluZ0FycmF5TWV0aG9kcyA9IG11dGF0aW5nT2JqZWN0TWV0aG9kcy5jb25jYXQoW1xuICAgIFwicHVzaFwiLCBcInBvcFwiLCBcInNvcnRcIiwgXCJzcGxpY2VcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJyZXZlcnNlXCJcbiAgXSk7XG5cbiAgdmFyIG5vbk11dGF0aW5nQXJyYXlNZXRob2RzID0gbm9uTXV0YXRpbmdPYmplY3RNZXRob2RzLmNvbmNhdChbXG4gICAgXCJtYXBcIiwgXCJmaWx0ZXJcIiwgXCJzbGljZVwiLCBcImNvbmNhdFwiLCBcInJlZHVjZVwiLCBcInJlZHVjZVJpZ2h0XCJcbiAgXSk7XG5cbiAgdmFyIG11dGF0aW5nRGF0ZU1ldGhvZHMgPSBtdXRhdGluZ09iamVjdE1ldGhvZHMuY29uY2F0KFtcbiAgICBcInNldERhdGVcIiwgXCJzZXRGdWxsWWVhclwiLCBcInNldEhvdXJzXCIsIFwic2V0TWlsbGlzZWNvbmRzXCIsIFwic2V0TWludXRlc1wiLCBcInNldE1vbnRoXCIsIFwic2V0U2Vjb25kc1wiLFxuICAgIFwic2V0VGltZVwiLCBcInNldFVUQ0RhdGVcIiwgXCJzZXRVVENGdWxsWWVhclwiLCBcInNldFVUQ0hvdXJzXCIsIFwic2V0VVRDTWlsbGlzZWNvbmRzXCIsIFwic2V0VVRDTWludXRlc1wiLFxuICAgIFwic2V0VVRDTW9udGhcIiwgXCJzZXRVVENTZWNvbmRzXCIsIFwic2V0WWVhclwiXG4gIF0pO1xuXG4gIGZ1bmN0aW9uIEltbXV0YWJsZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm5hbWUgPSAnTXlFcnJvcic7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuICBJbW11dGFibGVFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgSW1tdXRhYmxlRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXJyb3I7XG5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZShvYmosIGJhbm5lZE1ldGhvZHMpIHtcbiAgICAvLyBUYWcgaXQgc28gd2UgY2FuIHF1aWNrbHkgdGVsbCBpdCdzIGltbXV0YWJsZSBsYXRlci5cbiAgICBhZGRJbW11dGFiaWxpdHlUYWcob2JqKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIC8vIE1ha2UgYWxsIG11dGF0aW5nIG1ldGhvZHMgdGhyb3cgZXhjZXB0aW9ucy5cbiAgICAgIGZvciAodmFyIGluZGV4IGluIGJhbm5lZE1ldGhvZHMpIHtcbiAgICAgICAgaWYgKGJhbm5lZE1ldGhvZHMuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG4gICAgICAgICAgYmFuUHJvcGVydHkob2JqLCBiYW5uZWRNZXRob2RzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRnJlZXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICBPYmplY3QuZnJlZXplKG9iaik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VNZXRob2RSZXR1cm5JbW11dGFibGUob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgdmFyIGN1cnJlbnRNZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07XG5cbiAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgbWV0aG9kTmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlKGN1cnJlbnRNZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5U2V0KGlkeCwgdmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgaWYgKGlkeCBpbiB0aGlzKSB7XG4gICAgICBpZiAoZGVlcCAmJiB0aGlzW2lkeF0gIT09IHZhbHVlICYmIGlzTWVyZ2FibGVPYmplY3QodmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QodGhpc1tpZHhdKSkge1xuICAgICAgICB2YWx1ZSA9IEltbXV0YWJsZS5tZXJnZSh0aGlzW2lkeF0sIHZhbHVlLCB7ZGVlcDogdHJ1ZSwgbW9kZTogJ3JlcGxhY2UnfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcXVhbCh0aGlzW2lkeF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IGFzTXV0YWJsZUFycmF5LmNhbGwodGhpcyk7XG4gICAgbXV0YWJsZVtpZHhdID0gSW1tdXRhYmxlKHZhbHVlKTtcbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZUFycmF5KG11dGFibGUpO1xuICB9XG5cbiAgdmFyIGltbXV0YWJsZUVtcHR5QXJyYXkgPSBJbW11dGFibGUoW10pO1xuXG4gIGZ1bmN0aW9uIGFycmF5U2V0SW4ocHRoLCB2YWx1ZSwgY29uZmlnKSB7XG4gICAgdmFyIGhlYWQgPSBwdGhbMF07XG5cbiAgICBpZiAocHRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFycmF5U2V0LmNhbGwodGhpcywgaGVhZCwgdmFsdWUsIGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWlsID0gcHRoLnNsaWNlKDEpO1xuICAgICAgdmFyIHRoaXNIZWFkID0gdGhpc1toZWFkXTtcbiAgICAgIHZhciBuZXdWYWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZih0aGlzSGVhZCkgPT09IFwib2JqZWN0XCIgJiYgdGhpc0hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWlnaHQgKHZhbGlkbHkpIGJlIG9iamVjdCBvciBhcnJheVxuICAgICAgICBuZXdWYWx1ZSA9IEltbXV0YWJsZS5zZXRJbih0aGlzSGVhZCwgdGFpbCwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5leHRIZWFkID0gdGFpbFswXTtcbiAgICAgICAgLy8gSWYgdGhlIG5leHQgcGF0aCBwYXJ0IGlzIGEgbnVtYmVyLCB0aGVuIHdlIGFyZSBzZXR0aW5nIGludG8gYW4gYXJyYXksIGVsc2UgYW4gb2JqZWN0LlxuICAgICAgICBpZiAobmV4dEhlYWQgIT09ICcnICYmIGlzRmluaXRlKG5leHRIZWFkKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gYXJyYXlTZXRJbi5jYWxsKGltbXV0YWJsZUVtcHR5QXJyYXksIHRhaWwsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9iamVjdFNldEluLmNhbGwoaW1tdXRhYmxlRW1wdHlPYmplY3QsIHRhaWwsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGVhZCBpbiB0aGlzICYmIHRoaXNIZWFkID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG11dGFibGUgPSBhc011dGFibGVBcnJheS5jYWxsKHRoaXMpO1xuICAgICAgbXV0YWJsZVtoZWFkXSA9IG5ld1ZhbHVlO1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVBcnJheShtdXRhYmxlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlSW1tdXRhYmxlQXJyYXkoYXJyYXkpIHtcbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlaXIgaW1wbGVtZW50YXRpb25zLCBidXQgd3JhcCB0aGVzZSBmdW5jdGlvbnMgdG8gbWFrZSBzdXJlXG4gICAgLy8gdGhleSBhbHdheXMgcmV0dXJuIGFuIGltbXV0YWJsZSB2YWx1ZS5cbiAgICBmb3IgKHZhciBpbmRleCBpbiBub25NdXRhdGluZ0FycmF5TWV0aG9kcykge1xuICAgICAgaWYgKG5vbk11dGF0aW5nQXJyYXlNZXRob2RzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG5vbk11dGF0aW5nQXJyYXlNZXRob2RzW2luZGV4XTtcbiAgICAgICAgbWFrZU1ldGhvZFJldHVybkltbXV0YWJsZShhcnJheSwgbWV0aG9kTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFnbG9iYWxDb25maWcudXNlX3N0YXRpYykge1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJmbGF0TWFwXCIsICBmbGF0TWFwKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwiYXNPYmplY3RcIiwgYXNPYmplY3QpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJhc011dGFibGVcIiwgYXNNdXRhYmxlQXJyYXkpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJzZXRcIiwgYXJyYXlTZXQpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJzZXRJblwiLCBhcnJheVNldEluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwidXBkYXRlXCIsIHVwZGF0ZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcInVwZGF0ZUluXCIsIHVwZGF0ZUluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwiZ2V0SW5cIiwgZ2V0SW4pO1xuICAgIH1cblxuICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IEltbXV0YWJsZShhcnJheVtpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGUoYXJyYXksIG11dGF0aW5nQXJyYXlNZXRob2RzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VJbW11dGFibGVEYXRlKGRhdGUpIHtcbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGRhdGUsIFwiYXNNdXRhYmxlXCIsIGFzTXV0YWJsZURhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlKGRhdGUsIG11dGF0aW5nRGF0ZU1ldGhvZHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVmZmVjdGl2ZWx5IHBlcmZvcm1zIGEgbWFwKCkgb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB1c2luZyB0aGVcbiAgICogcHJvdmlkZWQgaXRlcmF0b3IsIGV4Y2VwdCB0aGF0IHdoZW5ldmVyIHRoZSBpdGVyYXRvciByZXR1cm5zIGFuIGFycmF5LCB0aGF0XG4gICAqIGFycmF5J3MgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBmaW5hbCByZXN1bHQgaW5zdGVhZCBvZiB0aGUgYXJyYXkgaXRzZWxmLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRvciAtIFRoZSBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5LiBJdCB3aWxsIHJlY2VpdmUgdGhyZWUgYXJndW1lbnRzOiB0aGUgY3VycmVudCB2YWx1ZSwgdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCB0aGUgY3VycmVudCBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBmbGF0TWFwKGl0ZXJhdG9yKSB7XG4gICAgLy8gQ2FsbGluZyAuZmxhdE1hcCgpIHdpdGggbm8gYXJndW1lbnRzIGlzIGEgbm8tb3AuIERvbid0IGJvdGhlciBjbG9uaW5nLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gW10sXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBpbmRleDtcblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGl0ZXJhdG9yUmVzdWx0ID0gaXRlcmF0b3IodGhpc1tpbmRleF0sIGluZGV4LCB0aGlzKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlcmF0b3JSZXN1bHQpKSB7XG4gICAgICAgIC8vIENvbmNhdGVuYXRlIEFycmF5IHJlc3VsdHMgaW50byB0aGUgcmV0dXJuIHZhbHVlIHdlJ3JlIGJ1aWxkaW5nIHVwLlxuICAgICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIGl0ZXJhdG9yUmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBub24tQXJyYXkgcmVzdWx0cyB0aGUgc2FtZSB3YXkgbWFwKCkgZG9lcy5cbiAgICAgICAgcmVzdWx0LnB1c2goaXRlcmF0b3JSZXN1bHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkocmVzdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEltbXV0YWJsZSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cyBpbmNsdWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0ga2V5c1RvUmVtb3ZlIC0gQSBsaXN0IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBrZXlzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybiB2YWx1ZS4gSW5zdGVhZCBvZiBwcm92aWRpbmcgYSBzaW5nbGUgYXJyYXksIHRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIGNhbGxlZCBieSBwYXNzaW5nIG11bHRpcGxlIHN0cmluZ3MgYXMgc2VwYXJhdGUgYXJndW1lbnRzLlxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aG91dChyZW1vdmUpIHtcbiAgICAvLyBDYWxsaW5nIC53aXRob3V0KCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKHR5cGVvZiByZW1vdmUgPT09IFwidW5kZWZpbmVkXCIgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZW1vdmUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSWYgd2Ugd2VyZW4ndCBnaXZlbiBhbiBhcnJheSwgdXNlIHRoZSBhcmd1bWVudHMgbGlzdC5cbiAgICAgIHZhciBrZXlzVG9SZW1vdmVBcnJheSA9IChBcnJheS5pc0FycmF5KHJlbW92ZSkpID9cbiAgICAgICAgIHJlbW92ZS5zbGljZSgpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgICAgLy8gQ29udmVydCBudW1lcmljIGtleXMgdG8gc3RyaW5ncyBzaW5jZSB0aGF0J3MgaG93IHRoZXknbGxcbiAgICAgIC8vIGNvbWUgZnJvbSB0aGUgZW51bWVyYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgICAgIGtleXNUb1JlbW92ZUFycmF5LmZvckVhY2goZnVuY3Rpb24oZWwsIGlkeCwgYXJyKSB7XG4gICAgICAgIGlmKHR5cGVvZihlbCkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBhcnJbaWR4XSA9IGVsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZW1vdmUgPSBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5c1RvUmVtb3ZlQXJyYXkuaW5kZXhPZihrZXkpICE9PSAtMTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcyk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiByZW1vdmUodGhpc1trZXldLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlQXJyYXkob3B0cykge1xuICAgIHZhciByZXN1bHQgPSBbXSwgaSwgbGVuZ3RoO1xuXG4gICAgaWYob3B0cyAmJiBvcHRzLmRlZXApIHtcbiAgICAgIGZvcihpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChhc0RlZXBNdXRhYmxlKHRoaXNbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRWZmZWN0aXZlbHkgcGVyZm9ybXMgYSBbbWFwXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSwgZXhwZWN0aW5nIHRoYXQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gICAqIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIHR3byBlbGVtZW50cyAtIHRoZSBmaXJzdCByZXByZXNlbnRpbmcgYSBrZXksIHRoZSBvdGhlclxuICAgKiBhIHZhbHVlLiBUaGVuIHJldHVybnMgYW4gSW1tdXRhYmxlIE9iamVjdCBjb25zdHJ1Y3RlZCBvZiB0aG9zZSBrZXlzIGFuZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdG9yIC0gQSBmdW5jdGlvbiB3aGljaCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIHR3byBlbGVtZW50cyAtIHRoZSBmaXJzdCByZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQga2V5LCB0aGUgb3RoZXIgdGhlIGRlc2lyZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhc09iamVjdChpdGVyYXRvcikge1xuICAgIC8vIElmIG5vIGl0ZXJhdG9yIHdhcyBwcm92aWRlZCwgYXNzdW1lIHRoZSBpZGVudGl0eSBmdW5jdGlvblxuICAgIC8vIChzdWdnZXN0aW5nIHRoaXMgYXJyYXkgaXMgYWxyZWFkeSBhIGxpc3Qgb2Yga2V5L3ZhbHVlIHBhaXJzLilcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGl0ZXJhdG9yID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7fSxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGluZGV4O1xuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgcGFpciAgPSBpdGVyYXRvcih0aGlzW2luZGV4XSwgaW5kZXgsIHRoaXMpLFxuICAgICAgICAgIGtleSAgID0gcGFpclswXSxcbiAgICAgICAgICB2YWx1ZSA9IHBhaXJbMV07XG5cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QocmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzRGVlcE11dGFibGUob2JqKSB7XG4gICAgaWYgKFxuICAgICAgKCFvYmopIHx8XG4gICAgICAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHx8XG4gICAgICAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBpbW11dGFiaWxpdHlUYWcpKSB8fFxuICAgICAgKG9iaiBpbnN0YW5jZW9mIERhdGUpXG4gICAgKSB7IHJldHVybiBvYmo7IH1cbiAgICByZXR1cm4gSW1tdXRhYmxlLmFzTXV0YWJsZShvYmosIHtkZWVwOiB0cnVlfSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWlja0NvcHkoc3JjLCBkZXN0KSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBrZXkpKSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSW1tdXRhYmxlIE9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgb2YgYm90aFxuICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlIHByb3ZpZGVkIG9iamVjdCwgcHJpb3JpdGl6aW5nIHRoZSBwcm92aWRlZCBvYmplY3Qnc1xuICAgKiB2YWx1ZXMgd2hlbmV2ZXIgdGhlIHNhbWUga2V5IGlzIHByZXNlbnQgaW4gYm90aCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3RoZXIgLSBUaGUgb3RoZXIgb2JqZWN0IHRvIG1lcmdlLiBNdWx0aXBsZSBvYmplY3RzIGNhbiBiZSBwYXNzZWQgYXMgYW4gYXJyYXkuIEluIHN1Y2ggYSBjYXNlLCB0aGUgbGF0ZXIgYW4gb2JqZWN0IGFwcGVhcnMgaW4gdGhhdCBsaXN0LCB0aGUgaGlnaGVyIGl0cyBwcmlvcml0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdGhhdCBjb250YWlucyBzZXR0aW5ncy4gU3VwcG9ydGVkIHNldHRpbmdzIGFyZToge2RlZXA6IHRydWV9IGZvciBkZWVwIG1lcmdlIGFuZCB7bWVyZ2VyOiBtZXJnZXJGdW5jfSB3aGVyZSBtZXJnZXJGdW5jIGlzIGEgZnVuY3Rpb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGFrZXMgYSBwcm9wZXJ0eSBmcm9tIGJvdGggb2JqZWN0cy4gSWYgYW55dGhpbmcgaXMgcmV0dXJuZWQgaXQgb3ZlcnJpZGVzIHRoZSBub3JtYWwgbWVyZ2UgYmVoYXZpb3VyLlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2Uob3RoZXIsIGNvbmZpZykge1xuICAgIC8vIENhbGxpbmcgLm1lcmdlKCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChvdGhlciA9PT0gbnVsbCB8fCAodHlwZW9mIG90aGVyICE9PSBcIm9iamVjdFwiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkltbXV0YWJsZSNtZXJnZSBjYW4gb25seSBiZSBpbnZva2VkIHdpdGggb2JqZWN0cyBvciBhcnJheXMsIG5vdCBcIiArIEpTT04uc3RyaW5naWZ5KG90aGVyKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlY2VpdmVkQXJyYXkgPSAoQXJyYXkuaXNBcnJheShvdGhlcikpLFxuICAgICAgICBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwLFxuICAgICAgICBtb2RlICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5tb2RlIHx8ICdtZXJnZScsXG4gICAgICAgIG1lcmdlciAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLm1lcmdlcixcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgLy8gVXNlIHRoZSBnaXZlbiBrZXkgdG8gZXh0cmFjdCBhIHZhbHVlIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgdGhlbiBwbGFjZVxuICAgIC8vIHRoYXQgdmFsdWUgaW4gdGhlIHJlc3VsdCBvYmplY3QgdW5kZXIgdGhlIHNhbWUga2V5LiBJZiB0aGF0IHJlc3VsdGVkXG4gICAgLy8gaW4gYSBjaGFuZ2UgZnJvbSB0aGlzIG9iamVjdCdzIHZhbHVlIGF0IHRoYXQga2V5LCBzZXQgYW55Q2hhbmdlcyA9IHRydWUuXG4gICAgZnVuY3Rpb24gYWRkVG9SZXN1bHQoY3VycmVudE9iaiwgb3RoZXJPYmosIGtleSkge1xuICAgICAgdmFyIGltbXV0YWJsZVZhbHVlID0gSW1tdXRhYmxlKG90aGVyT2JqW2tleV0pO1xuICAgICAgdmFyIG1lcmdlclJlc3VsdCA9IG1lcmdlciAmJiBtZXJnZXIoY3VycmVudE9ialtrZXldLCBpbW11dGFibGVWYWx1ZSwgY29uZmlnKTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50T2JqW2tleV07XG5cbiAgICAgIGlmICgocmVzdWx0ICE9PSB1bmRlZmluZWQpIHx8XG4gICAgICAgIChtZXJnZXJSZXN1bHQgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICAgKCFjdXJyZW50T2JqLmhhc093blByb3BlcnR5KGtleSkpIHx8XG4gICAgICAgICFpc0VxdWFsKGltbXV0YWJsZVZhbHVlLCBjdXJyZW50VmFsdWUpKSB7XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuXG4gICAgICAgIGlmIChtZXJnZXJSZXN1bHQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG1lcmdlclJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWVwICYmIGlzTWVyZ2FibGVPYmplY3QoY3VycmVudFZhbHVlKSAmJiBpc01lcmdhYmxlT2JqZWN0KGltbXV0YWJsZVZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKGN1cnJlbnRWYWx1ZSwgaW1tdXRhYmxlVmFsdWUsIGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBpbW11dGFibGVWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNFcXVhbChjdXJyZW50VmFsdWUsIG5ld1ZhbHVlKSB8fCAhY3VycmVudE9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgICAgICAgICByZXN1bHQgPSBxdWlja0NvcHkoY3VycmVudE9iaiwgaW5zdGFudGlhdGVFbXB0eU9iamVjdChjdXJyZW50T2JqKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyRHJvcHBlZEtleXMoY3VycmVudE9iaiwgb3RoZXJPYmopIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBjdXJyZW50T2JqKSB7XG4gICAgICAgIGlmICghb3RoZXJPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTWFrZSBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LlxuICAgICAgICAgICAgcmVzdWx0ID0gcXVpY2tDb3B5KGN1cnJlbnRPYmosIGluc3RhbnRpYXRlRW1wdHlPYmplY3QoY3VycmVudE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5O1xuXG4gICAgLy8gQWNoaWV2ZSBwcmlvcml0aXphdGlvbiBieSBvdmVycmlkaW5nIHByZXZpb3VzIHZhbHVlcyB0aGF0IGdldCBpbiB0aGUgd2F5LlxuICAgIGlmICghcmVjZWl2ZWRBcnJheSkge1xuICAgICAgLy8gVGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlOiBqdXN0IG1lcmdlIG9uZSBvYmplY3QgaW50byB0aGUgZXhpc3Rpbmcgb25lLlxuICAgICAgZm9yIChrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3RoZXIsIGtleSkpIHtcbiAgICAgICAgICBhZGRUb1Jlc3VsdCh0aGlzLCBvdGhlciwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1vZGUgPT09ICdyZXBsYWNlJykge1xuICAgICAgICBjbGVhckRyb3BwZWRLZXlzKHRoaXMsIG90aGVyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgYWxzbyBhY2NlcHQgYW4gQXJyYXlcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0gb3RoZXIubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgb3RoZXJGcm9tQXJyYXkgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgZm9yIChrZXkgaW4gb3RoZXJGcm9tQXJyYXkpIHtcbiAgICAgICAgICBpZiAob3RoZXJGcm9tQXJyYXkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgYWRkVG9SZXN1bHQocmVzdWx0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0aGlzLCBvdGhlckZyb21BcnJheSwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9iamVjdFJlcGxhY2UodmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgLy8gQ2FsbGluZyAucmVwbGFjZSgpIHdpdGggbm8gYXJndW1lbnRzIGlzIGEgbm8tb3AuIERvbid0IGJvdGhlciBjbG9uaW5nLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW1tdXRhYmxlI3JlcGxhY2UgY2FuIG9ubHkgYmUgaW52b2tlZCB3aXRoIG9iamVjdHMgb3IgYXJyYXlzLCBub3QgXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBJbW11dGFibGUubWVyZ2UodGhpcywgdmFsdWUsIHtkZWVwOiBkZWVwLCBtb2RlOiAncmVwbGFjZSd9KTtcbiAgfVxuXG4gIHZhciBpbW11dGFibGVFbXB0eU9iamVjdCA9IEltbXV0YWJsZSh7fSk7XG5cbiAgZnVuY3Rpb24gb2JqZWN0U2V0SW4ocGF0aCwgdmFsdWUsIGNvbmZpZykge1xuICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBBcnJheSkgfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgdG8gSW1tdXRhYmxlI3NldEluIG11c3QgYmUgYW4gYXJyYXkgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgXFxcImtleVxcXCIgc3RyaW5nLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgaGVhZCA9IHBhdGhbMF07XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gb2JqZWN0U2V0LmNhbGwodGhpcywgaGVhZCwgdmFsdWUsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgdmFyIHRhaWwgPSBwYXRoLnNsaWNlKDEpO1xuICAgIHZhciBuZXdWYWx1ZTtcbiAgICB2YXIgdGhpc0hlYWQgPSB0aGlzW2hlYWRdO1xuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaGVhZCkgJiYgdHlwZW9mKHRoaXNIZWFkKSA9PT0gXCJvYmplY3RcIiAmJiB0aGlzSGVhZCAhPT0gbnVsbCkge1xuICAgICAgLy8gTWlnaHQgKHZhbGlkbHkpIGJlIG9iamVjdCBvciBhcnJheVxuICAgICAgbmV3VmFsdWUgPSBJbW11dGFibGUuc2V0SW4odGhpc0hlYWQsIHRhaWwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSBvYmplY3RTZXRJbi5jYWxsKGltbXV0YWJsZUVtcHR5T2JqZWN0LCB0YWlsLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaGVhZCkgJiYgdGhpc0hlYWQgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IHF1aWNrQ29weSh0aGlzLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KHRoaXMpKTtcbiAgICBtdXRhYmxlW2hlYWRdID0gbmV3VmFsdWU7XG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QobXV0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYmplY3RTZXQocHJvcGVydHksIHZhbHVlLCBjb25maWcpIHtcbiAgICB2YXIgZGVlcCAgICAgICAgICA9IGNvbmZpZyAmJiBjb25maWcuZGVlcDtcblxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgaWYgKGRlZXAgJiYgdGhpc1twcm9wZXJ0eV0gIT09IHZhbHVlICYmIGlzTWVyZ2FibGVPYmplY3QodmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QodGhpc1twcm9wZXJ0eV0pKSB7XG4gICAgICAgIHZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKHRoaXNbcHJvcGVydHldLCB2YWx1ZSwge2RlZXA6IHRydWUsIG1vZGU6ICdyZXBsYWNlJ30pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXF1YWwodGhpc1twcm9wZXJ0eV0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IHF1aWNrQ29weSh0aGlzLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KHRoaXMpKTtcbiAgICBtdXRhYmxlW3Byb3BlcnR5XSA9IEltbXV0YWJsZSh2YWx1ZSk7XG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QobXV0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUocHJvcGVydHksIHVwZGF0ZXIpIHtcbiAgICB2YXIgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpbml0aWFsVmFsID0gdGhpc1twcm9wZXJ0eV07XG4gICAgcmV0dXJuIEltbXV0YWJsZS5zZXQodGhpcywgcHJvcGVydHksIHVwZGF0ZXIuYXBwbHkoaW5pdGlhbFZhbCwgW2luaXRpYWxWYWxdLmNvbmNhdChyZXN0QXJncykpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluUGF0aChvYmosIHBhdGgpIHtcbiAgICAvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aC5sZW5ndGg7IG9iaiAhPSBudWxsICYmIGkgPCBsOyBpKyspIHtcbiAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGkgJiYgaSA9PSBsKSA/IG9iaiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUluKHBhdGgsIHVwZGF0ZXIpIHtcbiAgICB2YXIgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpbml0aWFsVmFsID0gZ2V0SW5QYXRoKHRoaXMsIHBhdGgpO1xuXG4gICAgcmV0dXJuIEltbXV0YWJsZS5zZXRJbih0aGlzLCBwYXRoLCB1cGRhdGVyLmFwcGx5KGluaXRpYWxWYWwsIFtpbml0aWFsVmFsXS5jb25jYXQocmVzdEFyZ3MpKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbihwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRJblBhdGgodGhpcywgcGF0aCk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzTXV0YWJsZU9iamVjdChvcHRzKSB7XG4gICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcyksIGtleTtcblxuICAgIGlmKG9wdHMgJiYgb3B0cy5kZWVwKSB7XG4gICAgICBmb3IgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGFzRGVlcE11dGFibGUodGhpc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDcmVhdGVzIHBsYWluIG9iamVjdCB0byBiZSB1c2VkIGZvciBjbG9uaW5nXG4gIGZ1bmN0aW9uIGluc3RhbnRpYXRlUGxhaW5PYmplY3QoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLy8gRmluYWxpemVzIGFuIG9iamVjdCB3aXRoIGltbXV0YWJsZSBtZXRob2RzLCBmcmVlemVzIGl0LCBhbmQgcmV0dXJucyBpdC5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZU9iamVjdChvYmopIHtcbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJtZXJnZVwiLCBtZXJnZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJyZXBsYWNlXCIsIG9iamVjdFJlcGxhY2UpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwid2l0aG91dFwiLCB3aXRob3V0KTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcImFzTXV0YWJsZVwiLCBhc011dGFibGVPYmplY3QpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwic2V0XCIsIG9iamVjdFNldCk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJzZXRJblwiLCBvYmplY3RTZXRJbik7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJ1cGRhdGVcIiwgdXBkYXRlKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcInVwZGF0ZUluXCIsIHVwZGF0ZUluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcImdldEluXCIsIGdldEluKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZShvYmosIG11dGF0aW5nT2JqZWN0TWV0aG9kcyk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgdmFsaWQgcmVhY3QgZWxlbWVudFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTUuMC4xL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDMyNlxuICBmdW5jdGlvbiBpc1JlYWN0RWxlbWVudChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgb2JqICE9PSBudWxsICYmXG4gICAgICAgICAgIChvYmouJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRV9GQUxMQkFDSyB8fCBvYmouJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0ZpbGVPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBGaWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcm9taXNlKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Vycm9yKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBFcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIEltbXV0YWJsZShvYmosIG9wdGlvbnMsIHN0YWNrUmVtYWluaW5nKSB7XG4gICAgaWYgKGlzSW1tdXRhYmxlKG9iaikgfHwgaXNSZWFjdEVsZW1lbnQob2JqKSB8fCBpc0ZpbGVPYmplY3Qob2JqKSB8fCBpc0Vycm9yKG9iaikpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSBlbHNlIGlmIChpc1Byb21pc2Uob2JqKSkge1xuICAgICAgcmV0dXJuIG9iai50aGVuKEltbXV0YWJsZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkob2JqLnNsaWNlKCkpO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVEYXRlKG5ldyBEYXRlKG9iai5nZXRUaW1lKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRG9uJ3QgZnJlZXplIHRoZSBvYmplY3Qgd2Ugd2VyZSBnaXZlbjsgbWFrZSBhIGNsb25lIGFuZCB1c2UgdGhhdC5cbiAgICAgIHZhciBwcm90b3R5cGUgPSBvcHRpb25zICYmIG9wdGlvbnMucHJvdG90eXBlO1xuICAgICAgdmFyIGluc3RhbnRpYXRlRW1wdHlPYmplY3QgPVxuICAgICAgICAoIXByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpID9cbiAgICAgICAgICBpbnN0YW50aWF0ZVBsYWluT2JqZWN0IDogKGZ1bmN0aW9uKCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpOyB9KTtcbiAgICAgIHZhciBjbG9uZSA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QoKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgICAgICBpZiAoc3RhY2tSZW1haW5pbmcgPT0gbnVsbCkge1xuICAgICAgICAgIHN0YWNrUmVtYWluaW5nID0gNjQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWNrUmVtYWluaW5nIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW1tdXRhYmxlRXJyb3IoXCJBdHRlbXB0IHRvIGNvbnN0cnVjdCBJbW11dGFibGUgZnJvbSBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IHdhcyBkZXRlY3RlZC5cIiArXG4gICAgICAgICAgICBcIiBIYXZlIHlvdSB0cmllZCB0byB3cmFwIGFuIG9iamVjdCB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gUmVhY3QgZWxlbWVudCk/XCIgK1xuICAgICAgICAgICAgXCIgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ydGZlbGRtYW4vc2VhbWxlc3MtaW1tdXRhYmxlL3dpa2kvRGVlcGx5LW5lc3RlZC1vYmplY3Qtd2FzLWRldGVjdGVkIGZvciBkZXRhaWxzLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFja1JlbWFpbmluZyAtPSAxO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSkge1xuICAgICAgICAgIGNsb25lW2tleV0gPSBJbW11dGFibGUob2JqW2tleV0sIHVuZGVmaW5lZCwgc3RhY2tSZW1haW5pbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlT2JqZWN0KGNsb25lKTtcbiAgICB9XG4gIH1cblxuICAvLyBXcmFwcGVyIHRvIGFsbG93IHRoZSB1c2Ugb2Ygb2JqZWN0IG1ldGhvZHMgYXMgc3RhdGljIG1ldGhvZHMgb2YgSW1tdXRhYmxlLlxuICBmdW5jdGlvbiB0b1N0YXRpYyhmbikge1xuICAgIGZ1bmN0aW9uIHN0YXRpY1dyYXBwZXIoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIHZhciBzZWxmID0gYXJncy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0aWNXcmFwcGVyO1xuICB9XG5cbiAgLy8gV3JhcHBlciB0byBhbGxvdyB0aGUgdXNlIG9mIG9iamVjdCBtZXRob2RzIGFzIHN0YXRpYyBtZXRob2RzIG9mIEltbXV0YWJsZS5cbiAgLy8gd2l0aCB0aGUgYWRkaXRpb25hbCBjb25kaXRpb24gb2YgY2hvb3Npbmcgd2hpY2ggZnVuY3Rpb24gdG8gY2FsbCBkZXBlbmRpbmdcbiAgLy8gaWYgYXJndW1lbnQgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LlxuICBmdW5jdGlvbiB0b1N0YXRpY09iamVjdE9yQXJyYXkoZm5PYmplY3QsIGZuQXJyYXkpIHtcbiAgICBmdW5jdGlvbiBzdGF0aWNXcmFwcGVyKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgc2VsZiA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGYpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXkuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbk9iamVjdC5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGljV3JhcHBlcjtcbiAgfVxuXG4gIC8vIFdyYXBwZXIgdG8gYWxsb3cgdGhlIHVzZSBvZiBvYmplY3QgbWV0aG9kcyBhcyBzdGF0aWMgbWV0aG9kcyBvZiBJbW11dGFibGUuXG4gIC8vIHdpdGggdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9uIG9mIGNob29zaW5nIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwgZGVwZW5kaW5nXG4gIC8vIGlmIGFyZ3VtZW50IGlzIGFuIGFycmF5IG9yIGFuIG9iamVjdCBvciBhIGRhdGUuXG4gIGZ1bmN0aW9uIHRvU3RhdGljT2JqZWN0T3JEYXRlT3JBcnJheShmbk9iamVjdCwgZm5BcnJheSwgZm5EYXRlKSB7XG4gICAgZnVuY3Rpb24gc3RhdGljV3JhcHBlcigpIHtcbiAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgdmFyIHNlbGYgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxmKSkge1xuICAgICAgICAgIHJldHVybiBmbkFycmF5LmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHJldHVybiBmbkRhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbk9iamVjdC5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGljV3JhcHBlcjtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgbGlicmFyeVxuICBJbW11dGFibGUuZnJvbSAgICAgICAgICAgPSBJbW11dGFibGU7XG4gIEltbXV0YWJsZS5pc0ltbXV0YWJsZSAgICA9IGlzSW1tdXRhYmxlO1xuICBJbW11dGFibGUuSW1tdXRhYmxlRXJyb3IgPSBJbW11dGFibGVFcnJvcjtcbiAgSW1tdXRhYmxlLm1lcmdlICAgICAgICAgID0gdG9TdGF0aWMobWVyZ2UpO1xuICBJbW11dGFibGUucmVwbGFjZSAgICAgICAgPSB0b1N0YXRpYyhvYmplY3RSZXBsYWNlKTtcbiAgSW1tdXRhYmxlLndpdGhvdXQgICAgICAgID0gdG9TdGF0aWMod2l0aG91dCk7XG4gIEltbXV0YWJsZS5hc011dGFibGUgICAgICA9IHRvU3RhdGljT2JqZWN0T3JEYXRlT3JBcnJheShhc011dGFibGVPYmplY3QsIGFzTXV0YWJsZUFycmF5LCBhc011dGFibGVEYXRlKTtcbiAgSW1tdXRhYmxlLnNldCAgICAgICAgICAgID0gdG9TdGF0aWNPYmplY3RPckFycmF5KG9iamVjdFNldCwgYXJyYXlTZXQpO1xuICBJbW11dGFibGUuc2V0SW4gICAgICAgICAgPSB0b1N0YXRpY09iamVjdE9yQXJyYXkob2JqZWN0U2V0SW4sIGFycmF5U2V0SW4pO1xuICBJbW11dGFibGUudXBkYXRlICAgICAgICAgPSB0b1N0YXRpYyh1cGRhdGUpO1xuICBJbW11dGFibGUudXBkYXRlSW4gICAgICAgPSB0b1N0YXRpYyh1cGRhdGVJbik7XG4gIEltbXV0YWJsZS5nZXRJbiAgICAgICAgICA9IHRvU3RhdGljKGdldEluKTtcbiAgSW1tdXRhYmxlLmZsYXRNYXAgICAgICAgID0gdG9TdGF0aWMoZmxhdE1hcCk7XG4gIEltbXV0YWJsZS5hc09iamVjdCAgICAgICA9IHRvU3RhdGljKGFzT2JqZWN0KTtcbiAgaWYgKCFnbG9iYWxDb25maWcudXNlX3N0YXRpYykge1xuICAgICAgSW1tdXRhYmxlLnN0YXRpYyA9IGltbXV0YWJsZUluaXQoe1xuICAgICAgICAgIHVzZV9zdGF0aWM6IHRydWVcbiAgICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShJbW11dGFibGUpO1xuXG4gIHJldHVybiBJbW11dGFibGU7XG59XG5cbiAgdmFyIEltbXV0YWJsZSA9IGltbXV0YWJsZUluaXQoKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEltbXV0YWJsZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIGV4cG9ydHMuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIHtcbiAgICB3aW5kb3cuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIpIHtcbiAgICBnbG9iYWwuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9XG59KSgpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tIFwic2VhbWxlc3MtaW1tdXRhYmxlXCI7XG5cbi8vIFRoaXMgbWlkZGxld2FyZSB3aWxsIGp1c3QgYWRkIHRoZSBwcm9wZXJ0eSBcImFzeW5jIGRpc3BhdGNoXCJcbi8vIHRvIGFjdGlvbnMgd2l0aCB0aGUgXCJhc3luY1wiIHByb3BwZXJ0eSBzZXQgdG8gdHJ1ZVxuY29uc3QgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmUgPSBzdG9yZSA9PiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gIGxldCBzeW5jQWN0aXZpdHlGaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYWN0aW9uUXVldWUgPSBbXTtcblxuICBmdW5jdGlvbiBmbHVzaFF1ZXVlKCkge1xuICAgIGFjdGlvblF1ZXVlLmZvckVhY2goYSA9PiBzdG9yZS5kaXNwYXRjaChhKSk7IC8vIGZsdXNoIHF1ZXVlXG4gICAgYWN0aW9uUXVldWUgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzeW5jRGlzcGF0Y2goYXN5bmNBY3Rpb24pIHtcbiAgICBhY3Rpb25RdWV1ZSA9IGFjdGlvblF1ZXVlLmNvbmNhdChbYXN5bmNBY3Rpb25dKTtcblxuICAgIGlmIChzeW5jQWN0aXZpdHlGaW5pc2hlZCkge1xuICAgICAgZmx1c2hRdWV1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdGlvbldpdGhBc3luY0Rpc3BhdGNoID1cbiAgICAgIEltbXV0YWJsZShhY3Rpb24pLm1lcmdlKHsgYXN5bmNEaXNwYXRjaCB9KTtcblxuICBuZXh0KGFjdGlvbldpdGhBc3luY0Rpc3BhdGNoKTtcbiAgc3luY0FjdGl2aXR5RmluaXNoZWQgPSB0cnVlO1xuICBmbHVzaFF1ZXVlKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuaW1wb3J0IGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlIGZyb20gXCIuLi9qcy91dGlscy9hc3luY0Rpc3BhdGNoTWlkZGxld2FyZVwiO1xuXG5jb25zdCBmYWtlQWN0aW9uID0geyB0eXBlOiBcImZha2UgYWN0aW9uXCIgfTtcblxuZGVzY3JpYmUoXCJUaGUgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmVcIiwgKCkgPT4ge1xuICBpdChcImNhbGxzIG5leHQgd2l0aCBhc3luY0Rpc3BhdGNoIHByb3BlcnR5XCIsIChkb25lKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHJldHVybmVkQWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChyZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHR5cGVvZiByZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKS50b0VxdWFsKFwiZnVuY3Rpb25cIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlKFwiZmFrZVN0b3JlXCIpKG5leHQpKGZha2VBY3Rpb24pO1xuICB9KTtcblxuXG4gIGl0KFwiYXN5bmNEaXNwYXRjaCB0cmlnZ2VycyBhIHN0b3JlIGRpc3BhdGNoXCIsIChkb25lKSA9PiB7XG4gICAgY29uc3QgZmFrZUFzeW5jQWN0aW9uID0geyB0eXBlOiBcImZha2VBc3luY0FjdGlvblwiIH07XG5cbiAgICBjb25zdCBmYWtlU3RvcmUgPSB7XG4gICAgICBkaXNwYXRjaDogYWN0aW9uID0+IHtcbiAgICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKGZha2VBc3luY0FjdGlvbi50eXBlKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgbmV4dCA9IHJldHVybmVkQWN0aW9uID0+XG4gICAgICByZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKGZha2VBc3luY0FjdGlvbik7XG5cbiAgICBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZShmYWtlU3RvcmUpKG5leHQpKGZha2VBY3Rpb24pO1xuICB9KTtcbn0pO1xuIiwiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdmFyIHJlID0gL2F0IChbXlxcc10rKVxcc1xcKC9nO1xuICAgIHZhciBzdGFja1RyYWNlID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgdmFyIHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICB2YXIgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IHN0YWNrRnVuY3Rpb25zWzJdICsgJzogJyArIGNvbXBsZXRlRXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBlcnJvciA9IHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpO1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2dzIGEgd2FybmluZyBpZiB0aGUgYm9vbGVhbiBwYXNzZWQgdG8gaXQgZXZhbHVhdGVzIHRvIGZhbHNlLlxuICogVG8gYmUgdXNlZCBsaWtlIHRoaXM6XG4gKiBcdFx0YXNzZXJ0Lndhcm4obXlEYXRlICE9PSB1bmRlZmluZWQsIFwiTm8gZGF0ZSBwcm92aWRlZC5cIik7XG4gKiBAYXBpIHB1YmxpY1xuICogQG1ldGhvZCB3YXJuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuYXNzZXJ0Lndhcm4gPSBmdW5jdGlvbiB3YXJuKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBlcnJvciA9IHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpO1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFzc2VydDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pSWl3aWMyOTFjbU5sY3lJNld5SmhjM05sY25RdWFuTWlYU3dpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1FuVm5JR05vWldOcmFXNW5JR1oxYm1OMGFXOXVJSFJvWVhRZ2QybHNiQ0IwYUhKdmR5QmhiaUJsY25KdmNpQjNhR1Z1WlhabGNseHVMeThnZEdobElHTnZibVJwZEdsdmJpQnpaVzUwSUhSdklHbDBJR2x6SUdWMllXeDFZWFJsWkNCMGJ5Qm1ZV3h6WlZ4dUx5b3FYRzRnS2lCUWNtOWpaWE56WlhNZ2RHaGxJRzFsYzNOaFoyVWdZVzVrSUc5MWRIQjFkSE1nZEdobElHTnZjbkpsWTNRZ2JXVnpjMkZuWlNCcFppQjBhR1VnWTI5dVpHbDBhVzl1WEc0Z0tpQnBjeUJtWVd4elpTNGdUM1JvWlhKM2FYTmxJR2wwSUc5MWRIQjFkSE1nYm5Wc2JDNWNiaUFxSUVCaGNHa2djSEpwZG1GMFpWeHVJQ29nUUcxbGRHaHZaQ0J3Y205alpYTnpRMjl1WkdsMGFXOXVYRzRnS2lCQWNHRnlZVzBnSUh0Q2IyOXNaV0Z1ZlNCamIyNWthWFJwYjI0Z0xTQlNaWE4xYkhRZ2IyWWdkR2hsSUdWMllXeDFZWFJsWkNCamIyNWthWFJwYjI1Y2JpQXFJRUJ3WVhKaGJTQWdlMU4wY21sdVozMGdaWEp5YjNKTlpYTnpZV2RsSUMwZ1RXVnpjMkZuWlNCbGVIQnNZV2x1YVdjZ2RHaGxJR1Z5Y205eUlHbHVJR05oYzJVZ2FYUWdhWE1nZEdoeWIzZHVYRzRnS2lCQWNtVjBkWEp1SUh0VGRISnBibWNnZkNCdWRXeHNmU0FnTFNCRmNuSnZjaUJ0WlhOellXZGxJR2xtSUhSb1pYSmxJR2x6SUdGdUlHVnljbTl5TENCdWRXd2diM1JvWlhKM2FYTmxMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQndjbTlqWlhOelEyOXVaR2wwYVc5dUtHTnZibVJwZEdsdmJpd2daWEp5YjNKTlpYTnpZV2RsS1NCN1hHNGdJR2xtSUNnaFkyOXVaR2wwYVc5dUtTQjdYRzRnSUNBZ2JHVjBJR052YlhCc1pYUmxSWEp5YjNKTlpYTnpZV2RsSUQwZ0p5YzdYRzRnSUNBZ1kyOXVjM1FnY21VZ1BTQXZZWFFnS0Z0ZVhGeHpYU3NwWEZ4elhGd29MMmM3WEc0Z0lDQWdZMjl1YzNRZ2MzUmhZMnRVY21GalpTQTlJRzVsZHlCRmNuSnZjaWdwTG5OMFlXTnJPMXh1SUNBZ0lHTnZibk4wSUhOMFlXTnJSblZ1WTNScGIyNXpJRDBnVzEwN1hHNWNiaUFnSUNCc1pYUWdablZ1WTA1aGJXVWdQU0J5WlM1bGVHVmpLSE4wWVdOclZISmhZMlVwTzF4dUlDQWdJSGRvYVd4bElDaG1kVzVqVG1GdFpTQW1KaUJtZFc1alRtRnRaVnN4WFNrZ2UxeHVJQ0FnSUNBZ2MzUmhZMnRHZFc1amRHbHZibk11Y0hWemFDaG1kVzVqVG1GdFpWc3hYU2s3WEc0Z0lDQWdJQ0JtZFc1alRtRnRaU0E5SUhKbExtVjRaV01vYzNSaFkydFVjbUZqWlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHk4Z1RuVnRZbVZ5SURBZ2FYTWdjSEp2WTJWemMwTnZibVJwZEdsdmJpQnBkSE5sYkdZc1hHNGdJQ0FnTHk4Z1RuVnRZbVZ5SURFZ2FYTWdZWE56WlhKMExGeHVJQ0FnSUM4dklFNTFiV0psY2lBeUlHbHpJSFJvWlNCallXeHNaWElnWm5WdVkzUnBiMjR1WEc0Z0lDQWdhV1lnS0hOMFlXTnJSblZ1WTNScGIyNXpXekpkS1NCN1hHNGdJQ0FnSUNCamIyMXdiR1YwWlVWeWNtOXlUV1Z6YzJGblpTQTlJR0FrZTNOMFlXTnJSblZ1WTNScGIyNXpXekpkZlRvZ0pIdGpiMjF3YkdWMFpVVnljbTl5VFdWemMyRm5aWDFnTzF4dUlDQWdJSDFjYmx4dUlDQWdJR052YlhCc1pYUmxSWEp5YjNKTlpYTnpZV2RsSUNzOUlHVnljbTl5VFdWemMyRm5aVHRjYmlBZ0lDQnlaWFIxY200Z1kyOXRjR3hsZEdWRmNuSnZjazFsYzNOaFoyVTdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdiblZzYkR0Y2JuMWNibHh1THlvcVhHNGdLaUJVYUhKdmQzTWdZVzRnWlhKeWIzSWdhV1lnZEdobElHSnZiMnhsWVc0Z2NHRnpjMlZrSUhSdklHbDBJR1YyWVd4MVlYUmxjeUIwYnlCbVlXeHpaUzVjYmlBcUlGUnZJR0psSUhWelpXUWdiR2xyWlNCMGFHbHpPbHh1SUNvZ1hIUmNkR0Z6YzJWeWRDaHRlVVJoZEdVZ0lUMDlJSFZ1WkdWbWFXNWxaQ3dnWENKRVlYUmxJR05oYm01dmRDQmlaU0IxYm1SbFptbHVaV1F1WENJcE8xeHVJQ29nUUdGd2FTQndkV0pzYVdOY2JpQXFJRUJ0WlhSb2IyUWdZWE56WlhKMFhHNGdLaUJBY0dGeVlXMGdJSHRDYjI5c1pXRnVmU0JqYjI1a2FYUnBiMjRnTFNCU1pYTjFiSFFnYjJZZ2RHaGxJR1YyWVd4MVlYUmxaQ0JqYjI1a2FYUnBiMjVjYmlBcUlFQndZWEpoYlNBZ2UxTjBjbWx1WjMwZ1pYSnliM0pOWlhOellXZGxJQzBnVFdWemMyRm5aU0JsZUhCc1lXbHVhV2NnZEdobElHVnljbTl5SUdsdUlHTmhjMlVnYVhRZ2FYTWdkR2h5YjNkdVhHNGdLaUJBY21WMGRYSnVJSFp2YVdSY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWVhOelpYSjBLR052Ym1ScGRHbHZiaXdnWlhKeWIzSk5aWE56WVdkbEtTQjdYRzRnSUdOdmJuTjBJR1Z5Y205eUlEMGdjSEp2WTJWemMwTnZibVJwZEdsdmJpaGpiMjVrYVhScGIyNHNJR1Z5Y205eVRXVnpjMkZuWlNrN1hHNGdJR2xtSUNoMGVYQmxiMllnWlhKeWIzSWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR1Z5Y205eUtUdGNiaUFnZlZ4dWZWeHVYRzR2S2lwY2JpQXFJRXh2WjNNZ1lTQjNZWEp1YVc1bklHbG1JSFJvWlNCaWIyOXNaV0Z1SUhCaGMzTmxaQ0IwYnlCcGRDQmxkbUZzZFdGMFpYTWdkRzhnWm1Gc2MyVXVYRzRnS2lCVWJ5QmlaU0IxYzJWa0lHeHBhMlVnZEdocGN6cGNiaUFxSUZ4MFhIUmhjM05sY25RdWQyRnliaWh0ZVVSaGRHVWdJVDA5SUhWdVpHVm1hVzVsWkN3Z1hDSk9ieUJrWVhSbElIQnliM1pwWkdWa0xsd2lLVHRjYmlBcUlFQmhjR2tnY0hWaWJHbGpYRzRnS2lCQWJXVjBhRzlrSUhkaGNtNWNiaUFxSUVCd1lYSmhiU0FnZTBKdmIyeGxZVzU5SUdOdmJtUnBkR2x2YmlBdElGSmxjM1ZzZENCdlppQjBhR1VnWlhaaGJIVmhkR1ZrSUdOdmJtUnBkR2x2Ymx4dUlDb2dRSEJoY21GdElDQjdVM1J5YVc1bmZTQmxjbkp2Y2sxbGMzTmhaMlVnTFNCTlpYTnpZV2RsSUdWNGNHeGhhVzVwWnlCMGFHVWdaWEp5YjNJZ2FXNGdZMkZ6WlNCcGRDQnBjeUIwYUhKdmQyNWNiaUFxSUVCeVpYUjFjbTRnZG05cFpGeHVJQ292WEc1aGMzTmxjblF1ZDJGeWJpQTlJR1oxYm1OMGFXOXVJSGRoY200b1kyOXVaR2wwYVc5dUxDQmxjbkp2Y2sxbGMzTmhaMlVwSUh0Y2JpQWdZMjl1YzNRZ1pYSnliM0lnUFNCd2NtOWpaWE56UTI5dVpHbDBhVzl1S0dOdmJtUnBkR2x2Yml3Z1pYSnliM0pOWlhOellXZGxLVHRjYmlBZ2FXWWdLSFI1Y0dWdlppQmxjbkp2Y2lBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWlhKeWIzSXBPMXh1SUNCOVhHNTlPMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JoYzNObGNuUTdYRzRpWFN3aVptbHNaU0k2SW1GemMyVnlkQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUl2YzI5MWNtTmxMeUo5XG4iLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIF9pc0FycmF5KHZhbCkge1xuICByZXR1cm4gKHZhbCAhPSBudWxsICYmXG4gICAgICAgICAgdmFsLmxlbmd0aCA+PSAwICYmXG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XScpO1xufTtcbiIsIi8qKlxuICogQW4gb3B0aW1pemVkLCBwcml2YXRlIGFycmF5IGBzbGljZWAgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJndW1lbnRzfEFycmF5fSBhcmdzIFRoZSBhcnJheSBvciBhcmd1bWVudHMgb2JqZWN0IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtmcm9tPTBdIFRoZSBhcnJheSBpbmRleCB0byBzbGljZSBmcm9tLCBpbmNsdXNpdmUuXG4gKiBAcGFyYW0ge051bWJlcn0gW3RvPWFyZ3MubGVuZ3RoXSBUaGUgYXJyYXkgaW5kZXggdG8gc2xpY2UgdG8sIGV4Y2x1c2l2ZS5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldywgc2xpY2VkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9zbGljZShbMSwgMiwgMywgNCwgNV0sIDEsIDMpOyAvLz0+IFsyLCAzXVxuICpcbiAqICAgICAgdmFyIGZpcnN0VGhyZWVBcmdzID0gZnVuY3Rpb24oYSwgYiwgYywgZCkge1xuICogICAgICAgIHJldHVybiBfc2xpY2UoYXJndW1lbnRzLCAwLCAzKTtcbiAqICAgICAgfTtcbiAqICAgICAgZmlyc3RUaHJlZUFyZ3MoMSwgMiwgMywgNCk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX3NsaWNlKGFyZ3MsIGZyb20sIHRvKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIF9zbGljZShhcmdzLCAwLCBhcmdzLmxlbmd0aCk7XG4gICAgY2FzZSAyOiByZXR1cm4gX3NsaWNlKGFyZ3MsIGZyb20sIGFyZ3MubGVuZ3RoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgdmFyIGxlbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKGFyZ3MubGVuZ3RoLCB0bykgLSBmcm9tKTtcbiAgICAgIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICAgICAgbGlzdFtpZHhdID0gYXJnc1tmcm9tICsgaWR4XTtcbiAgICAgICAgaWR4ICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdDtcbiAgfVxufTtcbiIsInZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzQXJyYXknKTtcbnZhciBfc2xpY2UgPSByZXF1aXJlKCcuL19zbGljZScpO1xuXG5cbi8qKlxuICogU2ltaWxhciB0byBoYXNNZXRob2QsIHRoaXMgY2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYSBbbWV0aG9kbmFtZV1cbiAqIGZ1bmN0aW9uLiBJZiBpdCBpc24ndCBhbiBhcnJheSBpdCB3aWxsIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiBvdGhlcndpc2UgaXRcbiAqIHdpbGwgZGVmYXVsdCB0byB0aGUgcmFtZGEgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHJhbWRhIGltcGxlbXRhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZG5hbWUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFdoYXRldmVyIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoX2lzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqW21ldGhvZG5hbWVdICE9PSAnZnVuY3Rpb24nKSA/XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDpcbiAgICAgIG9ialttZXRob2RuYW1lXS5hcHBseShvYmosIF9zbGljZShhcmd1bWVudHMsIDAsIGxlbmd0aCAtIDEpKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKGEpIHtcbiAgcmV0dXJuIGEgIT0gbnVsbCAmJlxuICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn07XG4iLCJ2YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9fY3VycnkxJyk7XG52YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdHdvLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjJcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBmMlxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYik7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iKTsgfSlcbiAgICAgICAgICAgICA6IGZuKGEsIGIpO1xuICAgIH1cbiAgfTtcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vX2N1cnJ5MScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfaXNQbGFjZWhvbGRlciA9IHJlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzXG4gICAgICAgICAgICAgOiBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYzXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2EsIF9jKSB7IHJldHVybiBmbihfYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSlcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2MpIHsgcmV0dXJuIGZuKGEsIGIsIF9jKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBmM1xuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9hLCBfYikgeyByZXR1cm4gZm4oX2EsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbihfYSwgX2MpIHsgcmV0dXJuIGZuKF9hLCBiLCBfYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2IsIF9jKSB7IHJldHVybiBmbihhLCBfYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYiwgYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MShmdW5jdGlvbihfYykgeyByZXR1cm4gZm4oYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY2hlY2tGb3JNZXRob2QgPSByZXF1aXJlKCcuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZCcpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhfY2hlY2tGb3JNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2UoZnJvbUluZGV4LCB0b0luZGV4LCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xufSkpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5wcm9wLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydGT08nLCAnYmFyJywgJ2JheiddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICAvLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbiAgLy8gdHJhbnNmb3JtcyB0aGUgaGVsZCB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgdmFyIElkZW50aXR5ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB7dmFsdWU6IHgsIG1hcDogZnVuY3Rpb24oZikgeyByZXR1cm4gSWRlbnRpdHkoZih4KSk7IH19O1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkzKGZ1bmN0aW9uIG92ZXIobGVucywgZiwgeCkge1xuICAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIGZpcnN0IHRyYW5zZm9ybWVkIHdpdGggYGZgLFxuICAgIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgICAvLyBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGxlbnMuXG4gICAgcmV0dXJuIGxlbnMoZnVuY3Rpb24oeSkgeyByZXR1cm4gSWRlbnRpdHkoZih5KSk7IH0pKHgpLnZhbHVlO1xuICB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gYWx3YXlzKHZhbCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBhbHdheXMgPSByZXF1aXJlKCcuL2Fsd2F5cycpO1xudmFyIG92ZXIgPSByZXF1aXJlKCcuL292ZXInKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnByb3AsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYTApIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYTAsIGExKSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgNjogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA3OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA4OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgOTogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxMDogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9waXBlKGYsIGcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBnLmNhbGwodGhpcywgZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2luaXQgbm90IGltcGxlbWVudGVkIG9uIFhXcmFwJyk7XG4gIH07XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24oYWNjKSB7IHJldHVybiBhY2M7IH07XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gX3h3cmFwKGZuKSB7IHJldHVybiBuZXcgWFdyYXAoZm4pOyB9O1xufSgpKTtcbiIsInZhciBfYXJpdHkgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGJvdW5kIHRvIGEgY29udGV4dC5cbiAqIE5vdGU6IGBSLmJpbmRgIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQtYmluZGluZyBjYXBhYmlsaXRpZXMgb2ZcbiAqIFtGdW5jdGlvbi5wcm90b3R5cGUuYmluZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCogLT4gKikgLT4geyp9IC0+ICgqIC0+ICopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmluZCB0byBjb250ZXh0XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc09iaiBUaGUgY29udGV4dCB0byBiaW5kIGBmbmAgdG9cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIGB0aGlzT2JqYC5cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGxvZyA9IFIuYmluZChjb25zb2xlLmxvZywgY29uc29sZSk7XG4gKiAgICAgIFIucGlwZShSLmFzc29jKCdhJywgMiksIFIudGFwKGxvZyksIFIuYXNzb2MoJ2EnLCAzKSkoe2E6IDF9KTsgLy89PiB7YTogM31cbiAqICAgICAgLy8gbG9ncyB7YTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNPYmopIHtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzT2JqLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcnJheScpO1xudmFyIF9pc1N0cmluZyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzU3RyaW5nJyk7XG5cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC41LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGhhcyBhIG51bWVyaWMgbGVuZ3RoIHByb3BlcnR5IGFuZCBleHRyZW1lIGluZGljZXMgZGVmaW5lZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNBcnJheUxpa2Uoe30pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHswOiAnemVybycsIDk6ICduaW5lJywgbGVuZ3RoOiAxMH0pOyAvLz0+IHRydWVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKF9pc0FycmF5KHgpKSB7IHJldHVybiB0cnVlOyB9XG4gIGlmICgheCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKF9pc1N0cmluZyh4KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHgubm9kZVR5cGUgPT09IDEpIHsgcmV0dXJuICEheC5sZW5ndGg7IH1cbiAgaWYgKHgubGVuZ3RoID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG4gIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geC5oYXNPd25Qcm9wZXJ0eSgwKSAmJiB4Lmhhc093blByb3BlcnR5KHgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG4iLCJ2YXIgX3h3cmFwID0gcmVxdWlyZSgnLi9feHdyYXAnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vYmluZCcpO1xudmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaXNBcnJheUxpa2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gX2FycmF5UmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBsaXN0W2lkeF0pO1xuICAgICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gICAgdmFyIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShhY2MpO1xuICB9XG5cbiAgZnVuY3Rpb24gX21ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmopIHtcbiAgICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmoucmVkdWNlKGJpbmQoeGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10sIHhmKSwgYWNjKSk7XG4gIH1cblxuICB2YXIgc3ltSXRlcmF0b3IgPSAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InO1xuICByZXR1cm4gZnVuY3Rpb24gX3JlZHVjZShmbiwgYWNjLCBsaXN0KSB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm4gPSBfeHdyYXAoZm4pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UobGlzdCkpIHtcbiAgICAgIHJldHVybiBfYXJyYXlSZWR1Y2UoZm4sIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBfbWV0aG9kUmVkdWNlKGZuLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAobGlzdFtzeW1JdGVyYXRvcl0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIF9pdGVyYWJsZVJlZHVjZShmbiwgYWNjLCBsaXN0W3N5bUl0ZXJhdG9yXSgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsaXN0Lm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBfaXRlcmFibGVSZWR1Y2UoZm4sIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZTogbGlzdCBtdXN0IGJlIGFycmF5IG9yIGl0ZXJhYmxlJyk7XG4gIH07XG59KCkpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBgUi5yZWR1Y2VkYCB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbnVtYmVycyA9IFsxLCAyLCAzXTtcbiAqICAgICAgdmFyIHBsdXMgPSAoYSwgYikgPT4gYSArIGI7XG4gKlxuICogICAgICBSLnJlZHVjZShwbHVzLCAxMCwgbnVtYmVycyk7IC8vPT4gMTZcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKF9yZWR1Y2UpO1xuIiwidmFyIF9jaGVja0Zvck1ldGhvZCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kJyk7XG52YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nIChvciBvYmplY3RcbiAqIHdpdGggYSBgdGFpbGAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2xpY2VgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5oZWFkLCBSLmluaXQsIFIubGFzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFpbChbMSwgMiwgM10pOyAgLy89PiBbMiwgM11cbiAqICAgICAgUi50YWlsKFsxLCAyXSk7ICAgICAvLz0+IFsyXVxuICogICAgICBSLnRhaWwoWzFdKTsgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi50YWlsKFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLnRhaWwoJ2FiYycpOyAgLy89PiAnYmMnXG4gKiAgICAgIFIudGFpbCgnYWInKTsgICAvLz0+ICdiJ1xuICogICAgICBSLnRhaWwoJ2EnKTsgICAgLy89PiAnJ1xuICogICAgICBSLnRhaWwoJycpOyAgICAgLy89PiAnJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jaGVja0Zvck1ldGhvZCgndGFpbCcsIHNsaWNlKDEsIEluZmluaXR5KSk7XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXJpdHknKTtcbnZhciBfcGlwZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3BpcGUnKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xudmFyIHRhaWwgPSByZXF1aXJlKCcuL3RhaWwnKTtcblxuXG4vKipcbiAqIFBlcmZvcm1zIGxlZnQtdG8tcmlnaHQgZnVuY3Rpb24gY29tcG9zaXRpb24uIFRoZSBsZWZ0bW9zdCBmdW5jdGlvbiBtYXkgaGF2ZVxuICogYW55IGFyaXR5OyB0aGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYHNlcXVlbmNlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIHJlc3VsdCBvZiBwaXBlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCgoYSwgYiwgLi4uLCBuKSAtPiBvKSwgKG8gLT4gcCksIC4uLiwgKHggLT4geSksICh5IC0+IHopKSAtPiAoKGEsIGIsIC4uLiwgbikgLT4geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBmID0gUi5waXBlKE1hdGgucG93LCBSLm5lZ2F0ZSwgUi5pbmMpO1xuICpcbiAqICAgICAgZigzLCA0KTsgLy8gLSgzXjQpICsgMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBpcGUoKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwaXBlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBfYXJpdHkoYXJndW1lbnRzWzBdLmxlbmd0aCxcbiAgICAgICAgICAgICAgICByZWR1Y2UoX3BpcGUsIGFyZ3VtZW50c1swXSwgdGFpbChhcmd1bWVudHMpKSk7XG59O1xuIiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2NvbmNhdChzZXQxLCBzZXQyKSB7XG4gIHNldDEgPSBzZXQxIHx8IFtdO1xuICBzZXQyID0gc2V0MiB8fCBbXTtcbiAgdmFyIGlkeDtcbiAgdmFyIGxlbjEgPSBzZXQxLmxlbmd0aDtcbiAgdmFyIGxlbjIgPSBzZXQyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4xKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MVtpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4yKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MltpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJlcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChbZWxdLCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gc3VwcGxpZWQgYW4gb2JqZWN0IHJldHVybnMgdGhlIGluZGljYXRlZFxuICogcHJvcGVydHkgb2YgdGhhdCBvYmplY3QsIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd9IHAgVGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IGBvYmoucGAuXG4gKiBAc2VlIFIucGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcCgneCcsIHt4OiAxMDB9KTsgLy89PiAxMDBcbiAqICAgICAgUi5wcm9wKCd4Jywge30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHsgcmV0dXJuIG9ialtwXTsgfSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1RyYW5zZm9ybWVyKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9ialsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuL19pc0FycmF5Jyk7XG52YXIgX2lzVHJhbnNmb3JtZXIgPSByZXF1aXJlKCcuL19pc1RyYW5zZm9ybWVyJyk7XG52YXIgX3NsaWNlID0gcmVxdWlyZSgnLi9fc2xpY2UnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgd2l0aCBkaWZmZXJlbnQgc3RyYXRlZ2llcyBiYXNlZCBvbiB0aGVcbiAqIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uIChsYXN0IGFyZ3VtZW50KS4gSWYgaXQgaXMgYW4gYXJyYXksIGV4ZWN1dGVzIFtmbl0uXG4gKiBPdGhlcndpc2UsIGlmIGl0IGhhcyBhIGZ1bmN0aW9uIHdpdGggW21ldGhvZG5hbWVdLCBpdCB3aWxsIGV4ZWN1dGUgdGhhdFxuICogZnVuY3Rpb24gKGZ1bmN0b3IgY2FzZSkuIE90aGVyd2lzZSwgaWYgaXQgaXMgYSB0cmFuc2Zvcm1lciwgdXNlcyB0cmFuc2R1Y2VyXG4gKiBbeGZdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lciAodHJhbnNkdWNlciBjYXNlKS4gT3RoZXJ3aXNlLCBpdCB3aWxsXG4gKiBkZWZhdWx0IHRvIGV4ZWN1dGluZyBbZm5dLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHhmIHRyYW5zZHVjZXIgdG8gaW5pdGlhbGl6ZSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9kaXNwYXRjaGFibGUobWV0aG9kbmFtZSwgeGYsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tsZW5ndGggLSAxXTtcbiAgICBpZiAoIV9pc0FycmF5KG9iaikpIHtcbiAgICAgIHZhciBhcmdzID0gX3NsaWNlKGFyZ3VtZW50cywgMCwgbGVuZ3RoIC0gMSk7XG4gICAgICBpZiAodHlwZW9mIG9ialttZXRob2RuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgYXJncyk7XG4gICAgICB9XG4gICAgICBpZiAoX2lzVHJhbnNmb3JtZXIob2JqKSkge1xuICAgICAgICB2YXIgdHJhbnNkdWNlciA9IHhmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9pbml0J10oKTtcbiAgfSxcbiAgcmVzdWx0OiBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH1cbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWE1hcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3htYXAoZiwgeGYpIHsgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTsgfSk7XG59KCkpO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vX2FyaXR5Jyk7XG52YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBJbnRlcm5hbCBjdXJyeU4gZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgb2YgdGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSByZWNlaXZlZCBBbiBhcnJheSBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgdGh1cyBmYXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbWJpbmVkID0gW107XG4gICAgdmFyIGFyZ3NJZHggPSAwO1xuICAgIHZhciBsZWZ0ID0gbGVuZ3RoO1xuICAgIHZhciBjb21iaW5lZElkeCA9IDA7XG4gICAgd2hpbGUgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoIHx8IGFyZ3NJZHggPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoICYmXG4gICAgICAgICAgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8XG4gICAgICAgICAgIGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG4gICAgICBpZiAoIV9pc1BsYWNlaG9sZGVyKHJlc3VsdCkpIHtcbiAgICAgICAgbGVmdCAtPSAxO1xuICAgICAgfVxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgOiBfYXJpdHkobGVmdCwgX2N1cnJ5TihsZW5ndGgsIGNvbWJpbmVkLCBmbikpO1xuICB9O1xufTtcbiIsInZhciBfYXJpdHkgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xudmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2N1cnJ5TiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24sIHdpdGggdGhlIHNwZWNpZmllZFxuICogYXJpdHkuIFRoZSBjdXJyaWVkIGZ1bmN0aW9uIGhhcyB0d28gdW51c3VhbCBjYXBhYmlsaXRpZXMuIEZpcnN0LCBpdHNcbiAqIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZSBhdCBhIHRpbWUuIElmIGBnYCBpcyBgUi5jdXJyeU4oMywgZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzdW1BcmdzID0gKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpO1xuICpcbiAqICAgICAgdmFyIGN1cnJpZWRBZGRGb3VyTnVtYmVycyA9IFIuY3VycnlOKDQsIHN1bUFyZ3MpO1xuICogICAgICB2YXIgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgdmFyIGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBjdXJyeU4obGVuZ3RoLCBmbikge1xuICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIF9jdXJyeTEoZm4pO1xuICB9XG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2hhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufTtcbiIsInZhciBfaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nID9cbiAgICBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkgeyByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7IH0gOlxuICAgIGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7IHJldHVybiBfaGFzKCdjYWxsZWUnLCB4KTsgfTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL2ludGVybmFsL19oYXMnKTtcbnZhciBfaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0FyZ3VtZW50cycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5rZXlzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICAvLyBjb3ZlciBJRSA8IDkga2V5cyBpc3N1ZXNcbiAgdmFyIGhhc0VudW1CdWcgPSAhKHt0b1N0cmluZzogbnVsbH0pLnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWydjb25zdHJ1Y3RvcicsICd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuICAvLyBTYWZhcmkgYnVnXG4gIHZhciBoYXNBcmdzRW51bUJ1ZyA9IChmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG4gIH0oKSk7XG5cbiAgdmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcmV0dXJuIHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiAhaGFzQXJnc0VudW1CdWcgP1xuICAgIF9jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgICAgIHJldHVybiBPYmplY3Qob2JqKSAhPT0gb2JqID8gW10gOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIH0pIDpcbiAgICBfY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gICAgICBpZiAoT2JqZWN0KG9iaikgIT09IG9iaikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcHJvcCwgbklkeDtcbiAgICAgIHZhciBrcyA9IFtdO1xuICAgICAgdmFyIGNoZWNrQXJnc0xlbmd0aCA9IGhhc0FyZ3NFbnVtQnVnICYmIF9pc0FyZ3VtZW50cyhvYmopO1xuICAgICAgZm9yIChwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoX2hhcyhwcm9wLCBvYmopICYmICghY2hlY2tBcmdzTGVuZ3RoIHx8IHByb3AgIT09ICdsZW5ndGgnKSkge1xuICAgICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGFzRW51bUJ1Zykge1xuICAgICAgICBuSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChuSWR4ID49IDApIHtcbiAgICAgICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25JZHhdO1xuICAgICAgICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgIWNvbnRhaW5zKGtzLCBwcm9wKSkge1xuICAgICAgICAgICAga3Nba3MubGVuZ3RoXSA9IHByb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5JZHggLT0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtzO1xuICAgIH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF9tYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL19tYXAnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3htYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL194bWFwJyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cblxuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZFxuICogYSBbZnVuY3Rvcl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNmdW5jdG9yKSxcbiAqIGFwcGxpZXMgdGhlIGZ1bmN0aW9uIHRvIGVhY2ggb2YgdGhlIGZ1bmN0b3IncyB2YWx1ZXMsIGFuZCByZXR1cm5zXG4gKiBhIGZ1bmN0b3Igb2YgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogUmFtZGEgcHJvdmlkZXMgc3VpdGFibGUgYG1hcGAgaW1wbGVtZW50YXRpb25zIGZvciBgQXJyYXlgIGFuZCBgT2JqZWN0YCxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFwcGxpZWQgdG8gYFsxLCAyLCAzXWAgb3IgYHt4OiAxLCB5OiAyLCB6OiAzfWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYG1hcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEFsc28gdHJlYXRzIGZ1bmN0aW9ucyBhcyBmdW5jdG9ycyBhbmQgd2lsbCBjb21wb3NlIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBpbnB1dCBgbGlzdGAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0LlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkb3VibGUgPSB4ID0+IHggKiAyO1xuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCBbMSwgMiwgM10pOyAvLz0+IFsyLCA0LCA2XVxuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCB7eDogMSwgeTogMiwgejogM30pOyAvLz0+IHt4OiAyLCB5OiA0LCB6OiA2fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZSgnbWFwJywgX3htYXAsIGZ1bmN0aW9uIG1hcChmbiwgZnVuY3Rvcikge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jdG9yKSkge1xuICAgIGNhc2UgJ1tvYmplY3QgRnVuY3Rpb25dJzpcbiAgICAgIHJldHVybiBjdXJyeU4oZnVuY3Rvci5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBmdW5jdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfSk7XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHJldHVybiBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gZm4oZnVuY3RvcltrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9LCBrZXlzKGZ1bmN0b3IpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIF9tYXAoZm4sIGZ1bmN0b3IpO1xuICB9XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyBmb3IgdGhlIGdpdmVuIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucy4gVGhlIGdldHRlciBcImdldHNcIlxuICogdGhlIHZhbHVlIG9mIHRoZSBmb2N1czsgdGhlIHNldHRlciBcInNldHNcIiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzLiBUaGUgc2V0dGVyXG4gKiBzaG91bGQgbm90IG11dGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyAocyAtPiBhKSAtPiAoKGEsIHMpIC0+IHMpIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlclxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4TGVucyA9IFIubGVucyhSLnByb3AoJ3gnKSwgUi5hc3NvYygneCcpKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgICAvLz0+IDFcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIub3Zlcih4TGVucywgUi5uZWdhdGUsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiAtMSwgeTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRvRnVuY3RvckZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChcbiAgICAgICAgZnVuY3Rpb24oZm9jdXMpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICB0b0Z1bmN0b3JGbihnZXR0ZXIodGFyZ2V0KSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBjdXJyeU4gPSByZXF1aXJlKCcuL2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIFRoZSBjdXJyaWVkIGZ1bmN0aW9uXG4gKiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZVxuICogYXQgYSB0aW1lLiBJZiBgZmAgaXMgYSB0ZXJuYXJ5IGZ1bmN0aW9uIGFuZCBgZ2AgaXMgYFIuY3VycnkoZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqIC0+IGEpIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcsIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnlOXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFkZEZvdXJOdW1iZXJzID0gKGEsIGIsIGMsIGQpID0+IGEgKyBiICsgYyArIGQ7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeShhZGRGb3VyTnVtYmVycyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGN1cnJ5KGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmbik7XG59KTtcbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9laXRoZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBFaXRoZXJcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuLy8gLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhlIGBFaXRoZXIoYSwgYilgIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBsb2dpY2FsIGRpc2p1bmN0aW9uIGJldHdlZW4gYGFgXG4gKiBhbmQgYGJgLiBJbiBvdGhlciB3b3JkcywgYEVpdGhlcmAgbWF5IGNvbnRhaW4gZWl0aGVyIGEgdmFsdWUgb2YgdHlwZSBgYWAgb3JcbiAqIGEgdmFsdWUgb2YgdHlwZSBgYmAsIGF0IGFueSBnaXZlbiB0aW1lLiBUaGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gaXNcbiAqIGJpYXNlZCBvbiB0aGUgcmlnaHQgdmFsdWUgKGBiYCksIHRodXMgcHJvamVjdGlvbnMgd2lsbCB0YWtlIHRoZSByaWdodCB2YWx1ZVxuICogb3ZlciB0aGUgbGVmdCBvbmUuXG4gKlxuICogVGhpcyBjbGFzcyBtb2RlbHMgdHdvIGRpZmZlcmVudCBjYXNlczogYExlZnQgYWAgYW5kIGBSaWdodCBiYCwgYW5kIGNhbiBob2xkXG4gKiBvbmUgb2YgdGhlIGNhc2VzIGF0IGFueSBnaXZlbiB0aW1lLiBUaGUgcHJvamVjdGlvbnMgYXJlLCBub25lIHRoZSBsZXNzLFxuICogYmlhc2VkIGZvciB0aGUgYFJpZ2h0YCBjYXNlLCB0aHVzIGEgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIHN0cnVjdHVyZSBpcyB0b1xuICogaG9sZCB0aGUgcmVzdWx0cyBvZiBjb21wdXRhdGlvbnMgdGhhdCBtYXkgZmFpbCwgd2hlbiB5b3Ugd2FudCB0byBzdG9yZVxuICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24pLlxuICpcbiAqIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWVzIG9mIGBFaXRoZXIoYSwgYilgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWQgYnlcbiAqIHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5IHNlcXVlbmNpbmdcbiAqIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXQgeW91IGRvbid0IGtub3dcbiAqIHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseSAocmV0dXJuaW5nIGEgYExlZnQgYWApIGlmIGFueVxuICogb2YgdGhlIG9wZXJhdGlvbnMgZmFpbC5cbiAqXG4gKiBXaGlsZSB0aGlzIGNsYXNzIGNhbiBjZXJ0YWlubHkgbW9kZWwgaW5wdXQgdmFsaWRhdGlvbnMsIHRoZSBbVmFsaWRhdGlvbl1bXVxuICogc3RydWN0dXJlIGxlbmRzIGl0c2VsZiBiZXR0ZXIgdG8gdGhhdCB1c2UgY2FzZSwgc2luY2UgaXQgY2FuIG5hdHVyYWxseVxuICogYWdncmVnYXRlIGZhaWx1cmVzIOKAlCBtb25hZHMgc2hvcnRjdXQgb24gdGhlIGZpcnN0IGZhaWx1cmUuXG4gKlxuICogW1ZhbGlkYXRpb25dOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS52YWxpZGF0aW9uXG4gKlxuICpcbiAqIEBjbGFzc1xuICogQHN1bW1hcnlcbiAqIEVpdGhlclvOsSwgzrJdIDw6IEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIEZ1bmN0b3JbzrJdXG4gKiAgICAgICAgICAgICAgICwgQ2hhaW5bzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICogICAgICAgICAgICAgICAsIEVxXG4gKi9cbmZ1bmN0aW9uIEVpdGhlcigpIHsgfVxuXG5MZWZ0LnByb3RvdHlwZSA9IGNsb25lKEVpdGhlci5wcm90b3R5cGUpXG5mdW5jdGlvbiBMZWZ0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuUmlnaHQucHJvdG90eXBlID0gY2xvbmUoRWl0aGVyLnByb3RvdHlwZSlcbmZ1bmN0aW9uIFJpZ2h0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBob2xkaW5nIGEgYExlZnRgIHZhbHVlLiBUaGlzXG4gKiB1c3VhbGx5IHJlcHJlc2VudHMgYSBmYWlsdXJlIGR1ZSB0byB0aGUgcmlnaHQtYmlhcyBvZiB0aGlzIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBhIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuTGVmdCA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBMZWZ0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLkxlZnQgPSBFaXRoZXIuTGVmdFxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgaG9sZGluZyBhIGBSaWdodGAgdmFsdWUuIFRoaXNcbiAqIHVzdWFsbHkgcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgdmFsdWUgZHVlIHRvIHRoZSByaWdodCBiaWFzIG9mIHRoaXNcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgRWl0aGVyW86xLCDOsl1cbiAqL1xuRWl0aGVyLlJpZ2h0ID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gbmV3IFJpZ2h0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLlJpZ2h0ID0gRWl0aGVyLlJpZ2h0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBmcm9tIGEgbnVsbGFibGUgdHlwZS5cbiAqXG4gKiBUYWtlcyB0aGUgYExlZnRgIGNhc2UgaWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4gVGFrZXMgdGhlXG4gKiBgUmlnaHRgIGNhc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBzdW1tYXJ5IM6xIOKGkiBFaXRoZXJbzrEsIM6xXVxuICovXG5FaXRoZXIuZnJvbU51bGxhYmxlID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYSAhPSBudWxsPyAgICAgICBuZXcgUmlnaHQoYSlcbiAgOiAgICAgIC8qIG90aGVyd2lzZSAqLyAgbmV3IExlZnQoYSlcbn1cbkVpdGhlci5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gRWl0aGVyLmZyb21OdWxsYWJsZVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhIGBWYWxpZGF0aW9uW86xLCDOsl1gIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuZnJvbVZhbGlkYXRpb24gPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmZvbGQoRWl0aGVyLkxlZnQsIEVpdGhlci5SaWdodClcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIHN5bmNocm9ub3VzIGNvbXB1dGF0aW9uIHRoYXQgbWF5IHRocm93IGFuZCBjb252ZXJ0cyBpdCB0byBhblxuICogRWl0aGVyIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgKM6x4oKBLCDOseKCgiwgLi4uLCDOseKCmSAtPiDOsiA6OiB0aHJvd3MgzrMpIC0+ICjOseKCgSwgzrHigoIsIC4uLiwgzrHigpkgLT4gRWl0aGVyW86zLCDOsl0pXG4gKi9cbkVpdGhlci50cnkgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBSaWdodChmLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICByZXR1cm4gbmV3IExlZnQoZSlcbiAgICB9XG4gIH1cbn1cblxuXG4vLyAtLSBQcmVkaWNhdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBgRWl0aGVyW86xLCDOsl1gIGNvbnRhaW5zIGEgYExlZnRgIHZhbHVlLlxuICpcbiAqIEBzdW1tYXJ5IEJvb2xlYW5cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5pc0xlZnQgPSBmYWxzZVxuTGVmdC5wcm90b3R5cGUuaXNMZWZ0ICAgPSB0cnVlXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBjb250YWlucyBhIGBSaWdodGAgdmFsdWUuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzUmlnaHQgPSBmYWxzZVxuUmlnaHQucHJvdG90eXBlLmlzUmlnaHQgID0gdHJ1ZVxuXG5cbi8vIC0tIEFwcGxpY2F0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBpbnN0YW5jZSBob2xkaW5nIHRoZSBgUmlnaHRgIHZhbHVlIGBiYC5cbiAqXG4gKiBgYmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYW5vdGhlclxuICogYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrIg4oaSIEVpdGhlclvOsSwgzrJdXG4gKi9cbkVpdGhlci5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBSaWdodChhKVxufVxuRWl0aGVyLnByb3RvdHlwZS5vZiA9IEVpdGhlci5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgUmlnaHRgIGNhc2Ugb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlXG4gKiB0byBhbm90aGVyIGFwcGxpY2F0aXZlIHR5cGUuXG4gKlxuICogVGhlIGBFaXRoZXJbzrEsIM6yXWAgc2hvdWxkIGNvbnRhaW4gYSBmdW5jdGlvbiB2YWx1ZSwgb3RoZXJ3aXNlIGEgYFR5cGVFcnJvcmBcbiAqIGlzIHRocm93bi5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrIg4oaSIM6zXSwgZjpBcHBsaWNhdGl2ZVtfXSkgPT4gZlvOsl0g4oaSIGZbzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuYXAgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmFwID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gdGhpc1xufVxuXG5SaWdodC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIEZ1bmN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGBSaWdodGAgdmFsdWUgb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhclxuICogdW5hcnkgZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6yIOKGkiDOsykg4oaSIEVpdGhlclvOsSwgzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUubWFwID0gdW5pbXBsZW1lbnRlZFxuTGVmdC5wcm90b3R5cGUubWFwICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLm9mKGYodGhpcy52YWx1ZSkpXG59XG5cblxuLy8gLS0gQ2hhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgYFJpZ2h0YCB2YWx1ZSBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnlcbiAqIGZ1bmN0aW9uIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdLCBtOk1vbmFkW19dKSA9PiAozrIg4oaSIG1bzrNdKSDihpIgbVvOs11cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5jaGFpbiA9IHVuaW1wbGVtZW50ZWRcbkxlZnQucHJvdG90eXBlLmNoYWluICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYodGhpcy52YWx1ZSlcbn1cblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb25jYXRzIHRoZSBgUmlnaHRgIHZhbHVlIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSB3aXRoIGFub3RoZXIgYFJpZ2h0YCBvciBrZWVwcyB0aGUgYExlZnRgIG9uIGVpdGhlciBzaWRlXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIG06TW9ub2lkXSkgPT4gRWl0aGVyW86yLCBtXSDihpIgRWl0aGVyW86xLCBtXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmNvbmNhdCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXNcbn1cblxuUmlnaHQucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIHZhciB0aGF0ID0gdGhpc1xuICByZXR1cm4gb3RoZXIuZm9sZChmdW5jdGlvbihfKXtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LlJpZ2h0KHRoYXQudmFsdWUuY29uY2F0KHkpKVxuICAgICAgICAgICAgICAgICAgICB9KVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS50b1N0cmluZyA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuTGVmdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5SaWdodC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuUmlnaHQoJyArIHRoaXMudmFsdWUgKyAnKSdcbn1cblxuXG4vLyAtLSBFcSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUZXN0cyBpZiBhbiBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBpcyBlcXVhbCB0byBhbm90aGVyIGBFaXRoZXJbzrEsIM6yXWBcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBFaXRoZXJbzrEsIM6yXSDihpIgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzRXF1YWwgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzTGVmdCAmJiAoYS52YWx1ZSA9PT0gdGhpcy52YWx1ZSlcbn1cblxuUmlnaHQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzUmlnaHQgJiYgKGEudmFsdWUgPT09IHRoaXMudmFsdWUpXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBSaWdodGAgdmFsdWUgb3V0IG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSwgaWYgaXRcbiAqIGV4aXN0cy4gT3RoZXJ3aXNlIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IFZvaWQg4oaSIM6yICAgICAgICAgOjogcGFydGlhbCwgdGhyb3dzXG4gKiBAc2VlIHtAbGluayBtb2R1bGU6bGliL2VpdGhlcn5FaXRoZXIjZ2V0T3JFbHNlfSDigJQgQSBnZXR0ZXIgdGhhdCBjYW4gaGFuZGxlIGZhaWx1cmVzLlxuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9laXRoZXJ+RWl0aGVyI21lcmdlfSDigJQgVGhlIGNvbnZlcmdlbmNlIG9mIGJvdGggdmFsdWVzLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBpZiB0aGUgc3RydWN0dXJlIGhhcyBubyBgUmlnaHRgIHZhbHVlLlxuICovXG5FaXRoZXIucHJvdG90eXBlLmdldCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW4ndCBleHRyYWN0IHRoZSB2YWx1ZSBvZiBhIExlZnQoYSkuXCIpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBgUmlnaHRgIHZhbHVlIG91dCBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIElmIHRoZVxuICogc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBhIGBSaWdodGAgdmFsdWUsIHJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gzrIg4oaSIM6yXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuZ2V0T3JFbHNlID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgYExlZnRgIHZhbHVlIGludG8gYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZ1xuICogaWYgdGhlIHN0cnVjdHVyZSBjb250YWluIGEgYFJpZ2h0YCB2YWx1ZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiAozrEg4oaSIEVpdGhlclvOsywgzrJdKSDihpIgRWl0aGVyW86zLCDOsl1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUub3JFbHNlICA9IG5vb3BcblxuTGVmdC5wcm90b3R5cGUub3JFbHNlID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygd2hpY2hldmVyIHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIHRoYXQgaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrFdKSA9PiBWb2lkIOKGkiDOsVxuICovXG5FaXRoZXIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRm9sZHMgYW5kIEV4dGVuZGVkIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIGVhY2ggY2FzZSBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgzrNcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5mb2xkID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24oZiwgXykge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uKF8sIGcpIHtcbiAgcmV0dXJuIGcodGhpcy52YWx1ZSlcbn1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IHsgTGVmdDogzrEg4oaSIM6zLCBSaWdodDogzrIg4oaSIM6zIH0g4oaSIM6zXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuY2F0YSA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uTGVmdCh0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uUmlnaHQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gVm9pZCDihpIgRWl0aGVyW86yLCDOsV1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5zd2FwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KHRoaXMudmFsdWUpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLkxlZnQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIE1hcHMgYm90aCBzaWRlcyBvZiB0aGUgZGlzanVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBFaXRoZXJbzrMsIM60XVxuICovXG5FaXRoZXIucHJvdG90eXBlLmJpbWFwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5iaW1hcCA9IGZ1bmN0aW9uKGYsIF8pIHtcbiAgcmV0dXJuIHRoaXMuTGVmdChmKHRoaXMudmFsdWUpKVxufVxuXG5SaWdodC5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbihfLCBnKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KGcodGhpcy52YWx1ZSkpXG59XG5cblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpIOKGkiBFaXRoZXJbzrMsIM6yXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmxlZnRNYXAgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUubGVmdE1hcCAgPSBub29wXG5cbkxlZnQucHJvdG90eXBlLmxlZnRNYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLkxlZnQoZih0aGlzLnZhbHVlKSlcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2VpdGhlcicpIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IGN1cnJ5LCBsZW5zLCBwcm9wLCBwcmVwZW5kLCBvdmVyLCBzZXQsIHBpcGUgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBdCA9IGN1cnJ5KChrZXlBcnJheSwgbmV3VmFsLCBvYmopID0+IHtcbiAgY29uc3QgZGVlcE5ld1ZhbCA9IGtleUFycmF5LnJlZHVjZVJpZ2h0KFxuICAgIChyZXN1bHQsIGtleSkgPT4gKHsgW2tleV06IHJlc3VsdCB9KVxuICAgICwgbmV3VmFsXG4gICk7XG5cbiAgcmV0dXJuIEltbXV0YWJsZShvYmopLm1lcmdlKGRlZXBOZXdWYWwsIHsgZGVlcDogdHJ1ZSB9KTtcbn0pO1xuXG4vLyBTdGF0ZSBsZW5zZXNcbmV4cG9ydCBjb25zdCBTdGF0ZUxlbnNlcyA9IHtcbiAgZmllbGRUeXBlczogbGVucyhwcm9wKFwiZmllbGRUeXBlc1wiKSwgdXBkYXRlQXQoW1wiZmllbGRUeXBlc1wiXSkpLFxuICBmaWVsZHNTdGF0ZTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVcIiksIHVwZGF0ZUF0KFtcImZpZWxkc1N0YXRlXCJdKSksXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVIaXN0b3J5XCIpLCB1cGRhdGVBdChbXCJmaWVsZHNTdGF0ZUhpc3RvcnlcIl0pKSxcbn07XG5cbi8vIF8gPT4gU3RyaW5nXG5leHBvcnQgY29uc3QgY3JlYXRlSWQgPSBfID0+XG4gIChEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKTtcblxuLy8gU3RhdGUgLT4gW2ZpZWxkc1N0YXRlXSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IHB1c2hIaXN0b3J5U3RhdGUgPSBjdXJyeSgoc3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSkgPT4gcGlwZShcbiAgLy8gQWRkIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVxuICBvdmVyKFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlSGlzdG9yeSwgcHJlcGVuZChzdGF0ZS5maWVsZHNTdGF0ZSkpLFxuICAvLyBNYWtlIG5ldyBTdGF0ZSB0aGUgY3VycmVudFxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSlcbikoc3RhdGUpKTtcblxuXG4vLyBTdGF0ZSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IGhpZGVDb25maWdzID0gc3RhdGUgPT5cbiAgc2V0KFxuICAgIFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlLFxuICAgIHN0YXRlLmZpZWxkc1N0YXRlLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMsIHsgY29uZmlnU2hvd2luZzogZmFsc2UgfSkpLFxuICAgIHN0YXRlXG4gICk7XG5cblxuLy8gU3RyaW5nIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gRWl0aGVyIFN0cmluZyBPYmplY3RcbmV4cG9ydCBjb25zdCBwcm9wZXJ0eVR5cGVDaGVjayA9IGN1cnJ5KChwcm9wZXJ0eU5hbWUsIHR5cGUsIG9iaikgPT5cbiAgdHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdID09PSB0eXBlXG4gICAgPyBFaXRoZXIuUmlnaHQob2JqKVxuICAgIDogRWl0aGVyLkxlZnQoYFByb3BlcnR5ICcke3Byb3BlcnR5TmFtZX0nIGNhbm5vdCBiZSBvZiB0eXBlICR7dHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdfWApXG4pO1xuXG4vLyBDaGVja3MgdGhhdCBhIGZpZWxkIGhhcyBpdHMgZXNzZW50aWFsIHByb3BlcnRpZXNcbi8vIE9iamVjdCAtPiBFaXRoZXIgU3RyaW5nIE9iamVjdFxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRmllbGQgPSBmaWVsZFN0YXRlID0+XG4gIEVpdGhlci5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgICAubGVmdE1hcChmcyA9PiBgQSBmaWVsZCBTdGF0ZSBjYW5ub3QgYmUgZW1wdHkgJHt0eXBlb2YgZnN9YClcbiAgICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJyZXF1aXJlZFwiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiY29uZmlnU2hvd2luZ1wiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiaWRcIiwgXCJzdHJpbmdcIikpO1xuIiwiaW1wb3J0IHsgU3RhdGVMZW5zZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgc2V0LCBvdmVyLCBzbGljZSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuXG5jb25zdCBsYXN0SGlzdG9yeVN0YXRlID0gc3RhdGUgPT5cbiAgc3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdIHx8IFtdO1xuXG5jb25zdCB1bmRvID0gKHN0YXRlLCBfKSA9PiBwaXBlKFxuICAvLyBNYWtlIGxhc3QgaGlzdG9yeSBsYXN0IHN0YXRlIHRoZSBjdXJyZW50IG9uZVxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGxhc3RIaXN0b3J5U3RhdGUoc3RhdGUpKSxcbiAgLy8gUmVtb3ZlIGxhc3QgaGlzdG9yeSBzdGF0ZSBmcm9tIHRoZSBoaXN0b3J5IGFycmF5XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGVIaXN0b3J5LCBzbGljZSgxLCBJbmZpbml0eSkpXG4pKHN0YXRlKTtcblxuZXhwb3J0IGRlZmF1bHQgdW5kbztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lkZW50aXR5KHgpIHsgcmV0dXJuIHg7IH07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pZGVudGl0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lkZW50aXR5Jyk7XG5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIHZhciBvYmogPSB7fTtcbiAqICAgICAgUi5pZGVudGl0eShvYmopID09PSBvYmo7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoX2lkZW50aXR5KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBbU3RyaW5nXSAtPiB7azogdn0gLT4gdiB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHtjOiB7YjogMn19KTsgLy89PiB1bmRlZmluZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHBhdGgocGF0aHMsIG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IHBhdGhzLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWwgPSB2YWxbcGF0aHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0pO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZScpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBBbHNvXG4gKiB0cmVhdHMgY3VycmllZCBmdW5jdGlvbnMgYXMgYXBwbGljYXRpdmVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBzaWcgQXBwbHkgZiA9PiBmIChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IHZzIEFuIGFycmF5IG9mIHZhbHVlc1xuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHJlc3VsdHMgb2YgYXBwbHlpbmcgZWFjaCBvZiBgZm5zYCB0byBhbGwgb2YgYHZzYCBpbiB0dXJuLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXAoW1IubXVsdGlwbHkoMiksIFIuYWRkKDMpXSwgWzEsMiwzXSk7IC8vPT4gWzIsIDQsIDYsIDQsIDUsIDZdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBsaWNhdGl2ZSwgZm4pIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYXBwbGljYXRpdmUuYXAgPT09ICdmdW5jdGlvbicgP1xuICAgICAgYXBwbGljYXRpdmUuYXAoZm4pIDpcbiAgICB0eXBlb2YgYXBwbGljYXRpdmUgPT09ICdmdW5jdGlvbicgP1xuICAgICAgZnVuY3Rpb24oeCkgeyByZXR1cm4gYXBwbGljYXRpdmUoeCkoZm4oeCkpOyB9IDpcbiAgICAvLyBlbHNlXG4gICAgICBfcmVkdWNlKGZ1bmN0aW9uKGFjYywgZikgeyByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBmbikpOyB9LCBbXSwgYXBwbGljYXRpdmUpXG4gICk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogU2ltaWxhciB0byBgcmVkdWNlYCwgZXhjZXB0IG1vdmVzIHRocm91Z2ggdGhlIGlucHV0IGxpc3QgZnJvbSB0aGUgcmlnaHQgdG9cbiAqIHRoZSBsZWZ0LlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZVJpZ2h0YCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2QuIEZvciBtb3JlIGRldGFpbHNcbiAqIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0I0Rlc2NyaXB0aW9uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSxiIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgcGFpcnMgPSBbIFsnYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM10gXTtcbiAqICAgICAgdmFyIGZsYXR0ZW5QYWlycyA9IChhY2MsIHBhaXIpID0+IGFjYy5jb25jYXQocGFpcik7XG4gKlxuICogICAgICBSLnJlZHVjZVJpZ2h0KGZsYXR0ZW5QYWlycywgW10sIHBhaXJzKTsgLy89PiBbICdjJywgMywgJ2InLCAyLCAnYScsIDEgXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcmVkdWNlUmlnaHQoZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBhY2MgPSBmbihhY2MsIGxpc3RbaWR4XSk7XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBhcCA9IHJlcXVpcmUoJy4vYXAnKTtcbnZhciBtYXAgPSByZXF1aXJlKCcuL21hcCcpO1xudmFyIHByZXBlbmQgPSByZXF1aXJlKCcuL3ByZXBlbmQnKTtcbnZhciByZWR1Y2VSaWdodCA9IHJlcXVpcmUoJy4vcmVkdWNlUmlnaHQnKTtcblxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpXG4gKiBvZiBbQXBwbGljYXRpdmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjYXBwbGljYXRpdmUpIGludG8gYW5cbiAqIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzZXF1ZW5jZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKEFwcGxpY2F0aXZlIGYsIFRyYXZlcnNhYmxlIHQpID0+IChhIC0+IGYgYSkgLT4gdCAoZiBhKSAtPiBmICh0IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi50cmF2ZXJzZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc2VxdWVuY2UoTWF5YmUub2YsIFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXSk7ICAgLy89PiBKdXN0KFsxLCAyLCAzXSlcbiAqICAgICAgUi5zZXF1ZW5jZShNYXliZS5vZiwgW0p1c3QoMSksIEp1c3QoMiksIE5vdGhpbmcoKV0pOyAvLz0+IE5vdGhpbmcoKVxuICpcbiAqICAgICAgUi5zZXF1ZW5jZShSLm9mLCBKdXN0KFsxLCAyLCAzXSkpOyAvLz0+IFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXVxuICogICAgICBSLnNlcXVlbmNlKFIub2YsIE5vdGhpbmcoKSk7ICAgICAgIC8vPT4gW05vdGhpbmcoKV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNlcXVlbmNlKG9mLCB0cmF2ZXJzYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHRyYXZlcnNhYmxlLnNlcXVlbmNlID09PSAnZnVuY3Rpb24nID9cbiAgICB0cmF2ZXJzYWJsZS5zZXF1ZW5jZShvZikgOlxuICAgIHJlZHVjZVJpZ2h0KGZ1bmN0aW9uKGFjYywgeCkgeyByZXR1cm4gYXAobWFwKHByZXBlbmQsIHgpLCBhY2MpOyB9LFxuICAgICAgICAgICAgICAgIG9mKFtdKSxcbiAgICAgICAgICAgICAgICB0cmF2ZXJzYWJsZSk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcbnZhciBzZXF1ZW5jZSA9IHJlcXVpcmUoJy4vc2VxdWVuY2UnKTtcblxuXG4vKipcbiAqIE1hcHMgYW4gW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9uIG92ZXIgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpLFxuICogdGhlbiB1c2VzIFtgc2VxdWVuY2VgXSgjc2VxdWVuY2UpIHRvIHRyYW5zZm9ybSB0aGUgcmVzdWx0aW5nIFRyYXZlcnNhYmxlIG9mIEFwcGxpY2F0aXZlXG4gKiBpbnRvIGFuIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzZXF1ZW5jZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoQXBwbGljYXRpdmUgZiwgVHJhdmVyc2FibGUgdCkgPT4gKGEgLT4gZiBhKSAtPiAoYSAtPiBmIGIpIC0+IHQgYSAtPiBmICh0IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIFJldHVybnMgYE5vdGhpbmdgIGlmIHRoZSBnaXZlbiBkaXZpc29yIGlzIGAwYFxuICogICAgICBzYWZlRGl2ID0gbiA9PiBkID0+IGQgPT09IDAgPyBOb3RoaW5nKCkgOiBKdXN0KG4gLyBkKVxuICpcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCA0LCA1XSk7IC8vPT4gSnVzdChbNSwgMi41LCAyXSlcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCAwLCA1XSk7IC8vPT4gTm90aGluZ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gdHJhdmVyc2Uob2YsIGYsIHRyYXZlcnNhYmxlKSB7XG4gIHJldHVybiBzZXF1ZW5jZShvZiwgbWFwKGYsIHRyYXZlcnNhYmxlKSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGl0cyBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBWYWx1ZXMgYXJlXG4gKiBpZGVudGljYWwgaWYgdGhleSByZWZlcmVuY2UgdGhlIHNhbWUgbWVtb3J5LiBgTmFOYCBpcyBpZGVudGljYWwgdG8gYE5hTmA7XG4gKiBgMGAgYW5kIGAtMGAgYXJlIG5vdCBpZGVudGljYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbyA9IHt9O1xuICogICAgICBSLmlkZW50aWNhbChvLCBvKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pZGVudGljYWwoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChbXSwgW10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDAsIC0wKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChOYU4sIE5hTik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gaWRlbnRpY2FsKGEsIGIpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoYSA9PT0gYikgeyAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIEdpdmVzIGEgc2luZ2xlLXdvcmQgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSAobmF0aXZlKSB0eXBlIG9mIGEgdmFsdWUsXG4gKiByZXR1cm5pbmcgc3VjaCBhbnN3ZXJzIGFzICdPYmplY3QnLCAnTnVtYmVyJywgJ0FycmF5Jywgb3IgJ051bGwnLiBEb2VzIG5vdFxuICogYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB1c2VyIE9iamVjdCB0eXBlcyBhbnkgZnVydGhlciwgcmVwb3J0aW5nIHRoZW0gYWxsIGFzXG4gKiAnT2JqZWN0Jy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHlwZSh7fSk7IC8vPT4gXCJPYmplY3RcIlxuICogICAgICBSLnR5cGUoMSk7IC8vPT4gXCJOdW1iZXJcIlxuICogICAgICBSLnR5cGUoZmFsc2UpOyAvLz0+IFwiQm9vbGVhblwiXG4gKiAgICAgIFIudHlwZSgncycpOyAvLz0+IFwiU3RyaW5nXCJcbiAqICAgICAgUi50eXBlKG51bGwpOyAvLz0+IFwiTnVsbFwiXG4gKiAgICAgIFIudHlwZShbXSk7IC8vPT4gXCJBcnJheVwiXG4gKiAgICAgIFIudHlwZSgvW0Etel0vKTsgLy89PiBcIlJlZ0V4cFwiXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB0eXBlKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsICAgICAgPyAnTnVsbCcgICAgICA6XG4gICAgICAgICB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDpcbiAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbn0pO1xuIiwidmFyIF9hcnJheUZyb21JdGVyYXRvciA9IHJlcXVpcmUoJy4vX2FycmF5RnJvbUl0ZXJhdG9yJyk7XG52YXIgX2Z1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4vX2Z1bmN0aW9uTmFtZScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBpZGVudGljYWwgPSByZXF1aXJlKCcuLi9pZGVudGljYWwnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi4va2V5cycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfZXF1YWxzKGEsIGIsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmIChpZGVudGljYWwoYSwgYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlKGEpICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYS5lcXVhbHMoYikgJiZcbiAgICAgICAgICAgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGIuZXF1YWxzKGEpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIF9mdW5jdGlvbk5hbWUoYS5jb25zdHJ1Y3RvcikgPT09ICdQcm9taXNlJykge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBpZGVudGljYWwoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICBpZiAoIWlkZW50aWNhbChhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBhLm5hbWUgPT09IGIubmFtZSAmJiBhLm1lc3NhZ2UgPT09IGIubWVzc2FnZTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgaWYgKCEoYS5zb3VyY2UgPT09IGIuc291cmNlICYmXG4gICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmXG4gICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJlxuICAgICAgICAgICAgYS51bmljb2RlID09PSBiLnVuaWNvZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIGlmICghX2VxdWFscyhfYXJyYXlGcm9tSXRlcmF0b3IoYS5lbnRyaWVzKCkpLCBfYXJyYXlGcm9tSXRlcmF0b3IoYi5lbnRyaWVzKCkpLCBzdGFja0EsIHN0YWNrQikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cblxuICBzdGFja0EucHVzaChhKTtcbiAgc3RhY2tCLnB1c2goYik7XG4gIGlkeCA9IGtleXNBLmxlbmd0aCAtIDE7XG4gIHdoaWxlIChpZHggPj0gMCkge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuICAgIGlmICghKF9oYXMoa2V5LCBiKSAmJiBfZXF1YWxzKGJba2V5XSwgYVtrZXldLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHN0YWNrQS5wb3AoKTtcbiAgc3RhY2tCLnBvcCgpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9lcXVhbHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19lcXVhbHMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGl0cyBhcmd1bWVudHMgYXJlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBIYW5kbGVzXG4gKiBjeWNsaWNhbCBkYXRhIHN0cnVjdHVyZXMuXG4gKlxuICogRGlzcGF0Y2hlcyBzeW1tZXRyaWNhbGx5IHRvIHRoZSBgZXF1YWxzYCBtZXRob2RzIG9mIGJvdGggYXJndW1lbnRzLCBpZlxuICogcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBiIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZXF1YWxzKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5lcXVhbHMoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmVxdWFscyhbMSwgMiwgM10sIFsxLCAyLCAzXSk7IC8vPT4gdHJ1ZVxuICpcbiAqICAgICAgdmFyIGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgdmFyIGIgPSB7fTsgYi52ID0gYjtcbiAqICAgICAgUi5lcXVhbHMoYSwgYik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuIiwiLyogQGZsb3cgd2VhayAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgcHVzaEhpc3RvcnlTdGF0ZSwgY3JlYXRlSWQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgY3VycnksIGVxdWFscywgdHJhdmVyc2UsIGlkZW50aXR5LCBwYXRoIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgRWl0aGVyIGZyb20gXCJkYXRhLmVpdGhlclwiO1xuXG4vLyBbYV0gPT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IGlzQXJyYXkgPSBhcnIgPT5cbiAgQXJyYXkuaXNBcnJheShhcnIpXG4gICAgPyBFaXRoZXIuUmlnaHQoYXJyKVxuICAgIDogRWl0aGVyLkxlZnQoYEludmFsaWQgc3RhdGVzIHNlbnQgd2l0aCBpbXBvcnRTdGF0ZS4gRXhwZWN0ZWQgQXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIGFycn1gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG5cbmNvbnN0IGZpZWxkVHlwZUlzVmFsaWQgPSBjdXJyeSgodmFsaWRUeXBlcywgZmllbGQpID0+XG4gIHZhbGlkVHlwZXMuZmluZChlcXVhbHMoZmllbGQudHlwZSkpXG4gICAgPyBFaXRoZXIuUmlnaHQoZmllbGQpXG4gICAgOiBFaXRoZXIuTGVmdChgSW52YWxpZCBmaWVsZCB0eXBlICR7ZmllbGQudHlwZX1gKVxuKTtcblxuY29uc3QgdmFsaWRGaWVsZFR5cGVzID0gY3VycnkoKHZhbGlkVHlwZXMsIGZpZWxkc1N0YXRlKSA9PlxuICB0cmF2ZXJzZShFaXRoZXIub2YsIGZpZWxkVHlwZUlzVmFsaWQodmFsaWRUeXBlcyksIGZpZWxkc1N0YXRlKVxuKTtcblxuXG4vLyBbYV0gLT4gW2FdIC0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCB2YWxpZGF0ZUZpZWxkc1N0YXRlID0gY3VycnkoKGZpZWxkc1N0YXRlLCBzdGF0ZSkgPT5cbiAgRWl0aGVyLm9mKGZpZWxkc1N0YXRlKVxuICAgIC5jaGFpbihpc0FycmF5KVxuICAgIC5jaGFpbih2YWxpZEZpZWxkVHlwZXMoc3RhdGUuZmllbGRUeXBlcy5tYXAocGF0aChbXCJpbmZvXCIsIFwidHlwZVwiXSkpKSlcbik7XG5cblxuLy8gQWRkIHJlcXVpcmVkIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIGZpZWxkXG4vLyBjb21wb25lbnQgYnV0IGJ5IHRoZSBGb3JtQnVpbGRlciBjb21wb25lbnQgaXRzZWxmLCBzbyBtYXlcbi8vIG5vdCBiZSB0aGVyZS5cbi8vIFthXSA9PiBbYV1cbmNvbnN0IGFkZFJlcXVpcmVkUHJvcGVydGllcyA9IGZpZWxkU3RhdGVzID0+XG4gIGZpZWxkU3RhdGVzXG4gICAgLm1hcChzID0+IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcyxcbiAgICAgIHsgaWQ6IGNyZWF0ZUlkKCkgfVxuICAgICkpO1xuXG5cbi8vIElmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgaW1wb3J0LCB0aGUgc2FtZSBzdGF0ZVxuLy8gd2lsbCBiZSByZXR1cm5lZFxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkc1N0YXRlIH0pID0+XG4gIHZhbGlkYXRlRmllbGRzU3RhdGUobmV3RmllbGRzU3RhdGUsIHN0YXRlKVxuICAgIC5tYXAoYWRkUmVxdWlyZWRQcm9wZXJ0aWVzKVxuICAgIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gICAgLmJpbWFwKGNvbnNvbGUuZXJyb3IsIGlkZW50aXR5KVxuICAgIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfcmVkdWNlZCh4KSB7XG4gIHJldHVybiB4ICYmIHhbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10gPyB4IDpcbiAgICB7XG4gICAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAgICdAQHRyYW5zZHVjZXIvcmVkdWNlZCc6IHRydWVcbiAgICB9O1xufTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3JlZHVjZWQgPSByZXF1aXJlKCcuL19yZWR1Y2VkJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdm9pZCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hmaW5kKGYsIHhmKSB7IHJldHVybiBuZXcgWEZpbmQoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfeGZpbmQgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmluZCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDIpKSh4cyk7IC8vPT4ge2E6IDJ9XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKCdmaW5kJywgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIEEgaGVscGVyIGZvciBkZWxheWluZyB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHN1bW1hcnkgKEFueS4uLiAtPiBBbnkpIC0+IFZvaWRcbiAqL1xudmFyIGRlbGF5ZWQgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJz8gIHNldEltbWVkaWF0ZVxuICAgICAgICAgICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCc/ICAgICAgIHByb2Nlc3MubmV4dFRpY2tcbiAgICAgICAgICAgIDogLyogb3RoZXJ3aXNlICovICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0XG5cbi8qKlxuICogQG1vZHVsZSBsaWIvdGFza1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IFRhc2s7XG5cbi8vIC0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gdGltZS4gVGhpc1xuICogYWxsb3dzIG9uZSB0byBtb2RlbCB0aW1lLWJhc2VkIGVmZmVjdHMgZXhwbGljaXRseSwgc3VjaCB0aGF0IG9uZSBjYW4gaGF2ZVxuICogZnVsbCBrbm93bGVkZ2Ugb2Ygd2hlbiB0aGV5J3JlIGRlYWxpbmcgd2l0aCBkZWxheWVkIGNvbXB1dGF0aW9ucywgbGF0ZW5jeSxcbiAqIG9yIGFueXRoaW5nIHRoYXQgY2FuIG5vdCBiZSBjb21wdXRlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBBIGNvbW1vbiB1c2UgZm9yIHRoaXMgc3RydWN0dXJlIGlzIHRvIHJlcGxhY2UgdGhlIHVzdWFsIENvbnRpbnVhdGlvbi1QYXNzaW5nXG4gKiBTdHlsZSBmb3JtIG9mIHByb2dyYW1taW5nLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbXBvc2UgYW5kIHNlcXVlbmNlXG4gKiB0aW1lLWRlcGVuZGVudCBlZmZlY3RzIHVzaW5nIHRoZSBnZW5lcmljIGFuZCBwb3dlcmZ1bCBtb25hZGljIG9wZXJhdGlvbnMuXG4gKlxuICogQGNsYXNzXG4gKiBAc3VtbWFyeVxuICogKCjOsSDihpIgVm9pZCksICjOsiDihpIgVm9pZCkg4oaSIFZvaWQpLCAoVm9pZCDihpIgVm9pZCkg4oaSIFRhc2tbzrEsIM6yXVxuICpcbiAqIFRhc2tbzrEsIM6yXSA8OiBDaGFpblvOsl1cbiAqICAgICAgICAgICAgICAgLCBNb25hZFvOsl1cbiAqICAgICAgICAgICAgICAgLCBGdW5jdG9yW86yXVxuICogICAgICAgICAgICAgICAsIEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIFNlbWlncm91cFvOsl1cbiAqICAgICAgICAgICAgICAgLCBNb25vaWRbzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICovXG5mdW5jdGlvbiBUYXNrKGNvbXB1dGF0aW9uLCBjbGVhbnVwKSB7XG4gIHRoaXMuZm9yayA9IGNvbXB1dGF0aW9uO1xuXG4gIHRoaXMuY2xlYW51cCA9IGNsZWFudXAgfHwgZnVuY3Rpb24oKSB7fTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBUYXNrW86xLCDOsl1gIGNvbnRhaW5pbmcgdGhlIHNpbmdsZSB2YWx1ZSBgzrJgLlxuICpcbiAqIGDOsmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFub3RoZXJcbiAqIGBUYXNrW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgVGFza1vOsSwgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLm9mID0gZnVuY3Rpb24gX29mKGIpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKF8sIHJlc29sdmUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZShiKTtcbiAgfSk7XG59O1xuXG5UYXNrLm9mID0gVGFzay5wcm90b3R5cGUub2Y7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgVGFza1vOsSwgzrJdYCBjb250YWluaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6xYC5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIFRhc2tbzrEsIM6yXVxuICovXG5UYXNrLnByb3RvdHlwZS5yZWplY3RlZCA9IGZ1bmN0aW9uIF9yZWplY3RlZChhKSB7XG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QpIHtcbiAgICByZXR1cm4gcmVqZWN0KGEpO1xuICB9KTtcbn07XG5cblRhc2sucmVqZWN0ZWQgPSBUYXNrLnByb3RvdHlwZS5yZWplY3RlZDtcblxuLy8gLS0gRnVuY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSBvZiB0aGUgYFRhc2tbzrEsIM6yXWAgdXNpbmcgYSByZWd1bGFyIHVuYXJ5XG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsiDihpIgzrMpIOKGkiBUYXNrW86xLCDOs11cbiAqL1xuVGFzay5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gX21hcChmKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlamVjdChhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShmKGIpKTtcbiAgICB9KTtcbiAgfSwgY2xlYW51cCk7XG59O1xuXG4vLyAtLSBDaGFpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBzdWNjZXNmdWwgdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gIHVzaW5nIGEgZnVuY3Rpb24gdG8gYVxuICogbW9uYWQuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrIg4oaSIFRhc2tbzrEsIM6zXSkg4oaSIFRhc2tbzrEsIM6zXVxuICovXG5UYXNrLnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uIF9jaGFpbihmKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlamVjdChhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gZihiKS5mb3JrKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLy8gLS0gQXBwbHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbHlzIHRoZSBzdWNjZXNzZnVsIHZhbHVlIG9mIHRoZSBgVGFza1vOsSwgKM6yIOKGkiDOsyldYCB0byB0aGUgc3VjY2Vzc2Z1bFxuICogdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsICjOsiDihpIgzrMpXSA9PiBUYXNrW86xLCDOsl0g4oaSIFRhc2tbzrEsIM6zXVxuICovXG5cblRhc2sucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gX2FwKHRoYXQpIHtcbiAgdmFyIGZvcmtUaGlzID0gdGhpcy5mb3JrO1xuICB2YXIgZm9ya1RoYXQgPSB0aGF0LmZvcms7XG4gIHZhciBjbGVhbnVwVGhpcyA9IHRoaXMuY2xlYW51cDtcbiAgdmFyIGNsZWFudXBUaGF0ID0gdGhhdC5jbGVhbnVwO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXBCb3RoKHN0YXRlKSB7XG4gICAgY2xlYW51cFRoaXMoc3RhdGVbMF0pO1xuICAgIGNsZWFudXBUaGF0KHN0YXRlWzFdKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICB2YXIgZnVuYywgZnVuY0xvYWRlZCA9IGZhbHNlO1xuICAgIHZhciB2YWwsIHZhbExvYWRlZCA9IGZhbHNlO1xuICAgIHZhciByZWplY3RlZCA9IGZhbHNlO1xuICAgIHZhciBhbGxTdGF0ZTtcblxuICAgIHZhciB0aGlzU3RhdGUgPSBmb3JrVGhpcyhndWFyZFJlamVjdCwgZ3VhcmRSZXNvbHZlKGZ1bmN0aW9uKHgpIHtcbiAgICAgIGZ1bmNMb2FkZWQgPSB0cnVlO1xuICAgICAgZnVuYyA9IHg7XG4gICAgfSkpO1xuXG4gICAgdmFyIHRoYXRTdGF0ZSA9IGZvcmtUaGF0KGd1YXJkUmVqZWN0LCBndWFyZFJlc29sdmUoZnVuY3Rpb24oeCkge1xuICAgICAgdmFsTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHZhbCA9IHg7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZ3VhcmRSZXNvbHZlKHNldHRlcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGVyKHgpO1xuICAgICAgICBpZiAoZnVuY0xvYWRlZCAmJiB2YWxMb2FkZWQpIHtcbiAgICAgICAgICBkZWxheWVkKGZ1bmN0aW9uKCl7IGNsZWFudXBCb3RoKGFsbFN0YXRlKSB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmdW5jKHZhbCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ3VhcmRSZWplY3QoeCkge1xuICAgICAgaWYgKCFyZWplY3RlZCkge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZWplY3QoeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFN0YXRlID0gW3RoaXNTdGF0ZSwgdGhhdFN0YXRlXTtcbiAgfSwgY2xlYW51cEJvdGgpO1xufTtcblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGVhcmxpZXIgb2YgdGhlIHR3byB0YXNrcyBgVGFza1vOsSwgzrJdYFxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gVGFza1vOsSwgzrJdIOKGkiBUYXNrW86xLCDOsl1cbiAqL1xuXG5UYXNrLnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBfY29uY2F0KHRoYXQpIHtcbiAgdmFyIGZvcmtUaGlzID0gdGhpcy5mb3JrO1xuICB2YXIgZm9ya1RoYXQgPSB0aGF0LmZvcms7XG4gIHZhciBjbGVhbnVwVGhpcyA9IHRoaXMuY2xlYW51cDtcbiAgdmFyIGNsZWFudXBUaGF0ID0gdGhhdC5jbGVhbnVwO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXBCb3RoKHN0YXRlKSB7XG4gICAgY2xlYW51cFRoaXMoc3RhdGVbMF0pO1xuICAgIGNsZWFudXBUaGF0KHN0YXRlWzFdKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgIHZhciBhbGxTdGF0ZTtcbiAgICB2YXIgdGhpc1N0YXRlID0gZm9ya1RoaXMoZ3VhcmQocmVqZWN0KSwgZ3VhcmQocmVzb2x2ZSkpO1xuICAgIHZhciB0aGF0U3RhdGUgPSBmb3JrVGhhdChndWFyZChyZWplY3QpLCBndWFyZChyZXNvbHZlKSk7XG5cbiAgICByZXR1cm4gYWxsU3RhdGUgPSBbdGhpc1N0YXRlLCB0aGF0U3RhdGVdO1xuXG4gICAgZnVuY3Rpb24gZ3VhcmQoZikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgZGVsYXllZChmdW5jdGlvbigpeyBjbGVhbnVwQm90aChhbGxTdGF0ZSkgfSlcbiAgICAgICAgICByZXR1cm4gZih4KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sIGNsZWFudXBCb3RoKTtcblxufTtcblxuLy8gLS0gTW9ub2lkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSBUYXNrIHRoYXQgd2lsbCBuZXZlciByZXNvbHZlXG4gKlxuICogQHN1bW1hcnkgVm9pZCDihpIgVGFza1vOsSwgX11cbiAqL1xuVGFzay5lbXB0eSA9IGZ1bmN0aW9uIF9lbXB0eSgpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKCkge30pO1xufTtcblxuVGFzay5wcm90b3R5cGUuZW1wdHkgPSBUYXNrLmVtcHR5O1xuXG4vLyAtLSBTaG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYFRhc2tbzrEsIM6yXWBcbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+IFZvaWQg4oaSIFN0cmluZ1xuICovXG5UYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIF90b1N0cmluZygpIHtcbiAgcmV0dXJuICdUYXNrJztcbn07XG5cbi8vIC0tIEV4dHJhY3RpbmcgYW5kIHJlY292ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBmYWlsdXJlIHZhbHVlIGludG8gYSBuZXcgYFRhc2tbzrEsIM6yXWAuIERvZXMgbm90aGluZyBpZiB0aGVcbiAqIHN0cnVjdHVyZSBhbHJlYWR5IGNvbnRhaW5zIGEgc3VjY2Vzc2Z1bCB2YWx1ZS5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgVGFza1vOsywgzrJdKSDihpIgVGFza1vOsywgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uIF9vckVsc2UoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiBmKGEpLmZvcmsocmVqZWN0LCByZXNvbHZlKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShiKTtcbiAgICB9KTtcbiAgfSwgY2xlYW51cCk7XG59O1xuXG4vLyAtLSBGb2xkcyBhbmQgZXh0ZW5kZWQgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uIFRha2VzIHR3byBmdW5jdGlvbnMsIGFwcGxpZXMgdGhlIGxlZnRtb3N0IG9uZSB0byB0aGUgZmFpbHVyZVxuICogdmFsdWUsIGFuZCB0aGUgcmlnaHRtb3N0IG9uZSB0byB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSwgZGVwZW5kaW5nIG9uIHdoaWNoIG9uZVxuICogaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgVGFza1vOtCwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiBfZm9sZChmLCBnKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZyhiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiB7IFJlamVjdGVkOiDOsSDihpIgzrMsIFJlc29sdmVkOiDOsiDihpIgzrMgfSDihpIgVGFza1vOtCwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLmNhdGEgPSBmdW5jdGlvbiBfY2F0YShwYXR0ZXJuKSB7XG4gIHJldHVybiB0aGlzLmZvbGQocGF0dGVybi5SZWplY3RlZCwgcGF0dGVybi5SZXNvbHZlZCk7XG59O1xuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiBWb2lkIOKGkiBUYXNrW86yLCDOsV1cbiAqL1xuVGFzay5wcm90b3R5cGUuc3dhcCA9IGZ1bmN0aW9uIF9zd2FwKCkge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGEpO1xuICAgIH0sIGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiByZWplY3QoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBNYXBzIGJvdGggc2lkZXMgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBUYXNrW86zLCDOtF1cbiAqL1xuVGFzay5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbiBfYmltYXAoZiwgZykge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZyhiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIChmYWlsdXJlKS5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpIOKGkiBUYXNrW86zLCDOsl1cbiAqL1xuVGFzay5wcm90b3R5cGUucmVqZWN0ZWRNYXAgPSBmdW5jdGlvbiBfcmVqZWN0ZWRNYXAoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi90YXNrJyk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBwcm9wLCBmaW5kLCBpZGVudGl0eSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IHsgY3JlYXRlSWQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcbmltcG9ydCBUYXNrIGZyb20gXCJkYXRhLnRhc2tcIjtcbmltcG9ydCBJbW11dGFibGUgZnJvbSBcInNlYW1sZXNzLWltbXV0YWJsZVwiO1xuaW1wb3J0IHsgZmllbGRDcmVhdGVkIH0gZnJvbSBcIi4uL0FjdGlvbnNcIjtcblxuLy8gU3RhdGUgLT4gU3RyaW5nIC0+IEVpdGhlciBTdHJpbmcgRnVuY3Rpb25cbmNvbnN0IHR5cGVDb25zdHJ1Y3RvciA9IChzdGF0ZSwgZmllbGRUeXBlKSA9PiB7XG4gIHJldHVybiBFaXRoZXIub2Yoc3RhdGUpXG4gICAgLm1hcChwcm9wKFwiZmllbGRUeXBlc1wiKSlcbiAgICAubWFwKGZpbmQodiA9PiB2LmluZm8udHlwZSA9PT0gZmllbGRUeXBlKSlcbiAgICAuY2hhaW4oRWl0aGVyLmZyb21OdWxsYWJsZSlcbiAgICAuYmltYXAoXyA9PiBgRmllbGQgXCIke2ZpZWxkVHlwZX1cIiBkb2VzIG5vdCBleGlzdC5gLCBpZGVudGl0eSk7XG59O1xuXG4vLyB7IGluaXRpYWxTdGF0ZTogRnVuY3Rpb24gfSAtPiBUYXNrIFN0cmluZyBPYmplY3RcbmNvbnN0IGNyZWF0ZUZpZWxkID0gY29uc3RyID0+XG4gIG5ldyBUYXNrKChyZWplY3QsIHJlc29sdmUpID0+IHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIHByb21pc2UgaXMgb25seSByZXNvbHZlZCBvbmNlXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSBjb25zdHIuaW5pdGlhbFN0YXRlKCk7XG5cbiAgICBpZiAoIShmaWVsZFN0YXRlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgIHJlc29sdmUoZmllbGRTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkU3RhdGVcbiAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKSB7IHJldHVybjsgfVxuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCh2ID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgeyB0aHJvdyB2OyB9XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdCh2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbi8vIE9iamVjdCAtPiBPYmplY3RcbmNvbnN0IGluc2VydFJlcXVpcmVkUHJvcHMgPSBmaWVsZCA9PlxuICBJbW11dGFibGUoZmllbGQpLm1lcmdlKHtcbiAgICBpZDogY3JlYXRlSWQoKSxcbiAgICBjb25maWdTaG93aW5nOiB0cnVlLFxuICB9LCB7XG4gICAgZGVlcDogdHJ1ZSxcbiAgfSk7XG5cbmNvbnN0IGNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkgPSAoc3RhdGUsIGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCkgPT5cbiAgdHlwZUNvbnN0cnVjdG9yKHN0YXRlLCBmaWVsZFR5cGUpXG4gIC5tYXAoY3JlYXRlRmllbGQpIC8vIEVpdGhlciBTdHJpbmcgKFRhc2sgU3RyaW5nIE9iamVjdClcbiAgLmxlZnRNYXAoVGFzay5yZWplY3RlZClcbiAgLm1lcmdlKCkgLy8gVGFzayBTdHJpbmcgT2JqZWN0XG4gIC5tYXAoaW5zZXJ0UmVxdWlyZWRQcm9wcylcbiAgLmZvcmsoIC8vIGV4ZWN1dGUgdGFza1xuICAgIGVyciA9PiBjb25zb2xlLmVycm9yKFwiVGFzayByZWplY3RlZFwiLCBlcnIpLFxuICAgIHBpcGUoZmllbGRDcmVhdGVkLCBhc3luY0Rpc3BhdGNoKVxuICApO1xuXG4vLyBUaGlzIGlzIGFuIGFzeW5jIGFjdGlvbi4gV2hlbiBpdCBpcyBmaW5pc2hlZCBpdCB3aWxsIHRyaWdnZXIgdGhlXG4vLyBmaWVsZCBjcmVhdGVkIGFjdGlvblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCB9KSA9PiB7XG4gIGNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkoc3RhdGUsIGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCk7XG4gIHJldHVybiBzdGF0ZTtcbn07XG4iLCJ2YXIgX2NvbmNhdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbmNhdCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgZm9sbG93ZWQgYnlcbiAqIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBlbGVtZW50IHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgd2hvc2UgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXRcbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuIiwiLy8gQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUXVpbGRyZWVuIE1vdHRhIDxxdWlsZHJlZW5AZ21haWwuY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG4vLyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlc1xuLy8gKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuLy8gaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcbi8vIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4vLyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbi8vIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG4vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG4vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vKipcbiAqIEBtb2R1bGUgbGliL21heWJlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF5YmVcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vIC0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgc3RydWN0dXJlIGZvciB2YWx1ZXMgdGhhdCBtYXkgbm90IGJlIHByZXNlbnQsIG9yIGNvbXB1dGF0aW9ucyB0aGF0IG1heVxuICogZmFpbC4gYE1heWJlKGEpYCBleHBsaWNpdGx5IG1vZGVscyB0aGUgZWZmZWN0cyB0aGF0IGFyZSBpbXBsaWNpdCBpblxuICogYE51bGxhYmxlYCB0eXBlcywgdGh1cyBoYXMgbm9uZSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoXG4gKiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAg4oCUIGxpa2UgYE51bGxQb2ludGVyRXhjZXB0aW9uc2AuXG4gKlxuICogVGhlIGNsYXNzIG1vZGVscyB0d28gZGlmZmVyZW50IGNhc2VzOlxuICpcbiAqICArIGBKdXN0IGFgIOKAlCByZXByZXNlbnRzIGEgYE1heWJlKGEpYCB0aGF0IGNvbnRhaW5zIGEgdmFsdWUuIGBhYCBtYXlcbiAqICAgICBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogICsgYE5vdGhpbmdgIOKAlCByZXByZXNlbnRzIGEgYE1heWJlKGEpYCB0aGF0IGhhcyBubyB2YWx1ZXMuIE9yIGFcbiAqICAgICBmYWlsdXJlIHRoYXQgbmVlZHMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBDb21tb24gdXNlcyBvZiB0aGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBtb2RlbGxpbmcgdmFsdWVzIHRoYXQgbWF5IG9yIG1heVxuICogbm90IGJlIHByZXNlbnQgaW4gYSBjb2xsZWN0aW9uLCB0aHVzIGluc3RlYWQgb2YgbmVlZGluZyBhXG4gKiBgY29sbGVjdGlvbi5oYXMoYSlgLCB0aGUgYGNvbGxlY3Rpb24uZ2V0KGEpYCBvcGVyYXRpb24gZ2l2ZXMgeW91IGFsbFxuICogdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkIOKAlCBgY29sbGVjdGlvbi5nZXQoYSkuaXMtbm90aGluZ2AgYmVpbmdcbiAqIGVxdWl2YWxlbnQgdG8gYGNvbGxlY3Rpb24uaGFzKGEpYDsgU2ltaWxhcmx5IHRoZSBzYW1lIHJlYXNvbmluZyBtYXlcbiAqIGJlIGFwcGxpZWQgdG8gY29tcHV0YXRpb25zIHRoYXQgbWF5IGZhaWwgdG8gcHJvdmlkZSBhIHZhbHVlLCBlLmcuOlxuICogYGNvbGxlY3Rpb24uZmluZChwcmVkaWNhdGUpYCBjYW4gc2FmZWx5IHJldHVybiBhIGBNYXliZShhKWAgaW5zdGFuY2UsXG4gKiBldmVuIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIG51bGxhYmxlIHZhbHVlcy5cbiAqXG4gKiBGdXJ0aGVybW9yZSwgdGhlIHZhbHVlcyBvZiBgTWF5YmUoYSlgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWRcbiAqIGJ5IHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5XG4gKiBzZXF1ZW5jaW5nIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXRcbiAqIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseVxuICogKHJldHVybmluZyBhIGBOb3RoaW5nYCkgaWYgYW55IG9mIHRoZSBvcGVyYXRpb25zIGZhaWwuXG4gKlxuICogSWYgb25lIHdhbnRzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHRoZVxuICogW0VpdGhlcl1bXSBhbmQgW1ZhbGlkYXRpb25dW10gc3RydWN0dXJlcyBwcm92aWRlIHN1Y2ggYSBjYXBhYmlsaXR5LCBhbmRcbiAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBNYXliZShhKWAgc3RydWN0dXJlLlxuICpcbiAqIFtFaXRoZXJdOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS5laXRoZXJcbiAqIFtWYWxpZGF0aW9uXTogaHR0cHM6Ly9naXRodWIuY29tL2ZvbGt0YWxlL2RhdGEudmFsaWRhdGlvblxuICpcbiAqXG4gKiBAY2xhc3NcbiAqL1xuZnVuY3Rpb24gTWF5YmUoKSB7fVxuXG4vLyBUaGUgY2FzZSBmb3Igc3VjY2Vzc2Z1bCB2YWx1ZXNcbkp1c3QucHJvdG90eXBlID0gY2xvbmUoTWF5YmUucHJvdG90eXBlKVxuZnVuY3Rpb24gSnVzdChhKXtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gVGhlIGNhc2UgZm9yIGZhaWx1cmUgdmFsdWVzXG5Ob3RoaW5nLnByb3RvdHlwZSA9IGNsb25lKE1heWJlLnByb3RvdHlwZSlcbmZ1bmN0aW9uIE5vdGhpbmcoKXt9XG5cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgd2l0aCBhbiBhYnNlbnQgdmFsdWUuIENvbW1vbmx5IHVzZWRcbiAqIHRvIHJlcHJlc2VudCBhIGZhaWx1cmUuXG4gKlxuICogQHN1bW1hcnkgVm9pZCDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLk5vdGhpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nXG59XG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IE1heWJlLk5vdGhpbmdcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBzaW5nbGUgdmFsdWVcbiAqIGDOsWAuIENvbW1vbmx5IHVzZWQgdG8gcmVwcmVzZW50IGEgc3VjY2Vzcy5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGFub3RoZXJcbiAqIGBNYXliZVvOsV1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLkp1c3QgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBuZXcgSnVzdChhKVxufVxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBNYXliZS5KdXN0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgZnJvbSBhIG51bGxhYmxlIHR5cGUuXG4gKlxuICogSWYgdGhlIHZhbHVlIGlzIGVpdGhlciBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhXG4gKiBgTm90aGluZ2AsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6xKWAuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIE1heWJlW86xXVxuICovXG5NYXliZS5mcm9tTnVsbGFibGUgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhICE9IG51bGw/ICAgICAgIG5ldyBKdXN0KGEpXG4gIDogICAgICAvKiBvdGhlcndpc2UgKi8gIG5ldyBOb3RoaW5nXG59XG5NYXliZS5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gTWF5YmUuZnJvbU51bGxhYmxlXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhbiBgRWl0aGVyW86xLCDOsl1gIHR5cGUuXG4gKlxuICogVGhlIGxlZnQgc2lkZSBvZiB0aGUgYEVpdGhlcmAgYmVjb21lcyBgTm90aGluZ2AsIGFuZCB0aGUgcmlnaHQgc2lkZVxuICogaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6yKWAuXG4gKlxuICogQHN1bW1hcnkgRWl0aGVyW86xLCDOsl0g4oaSIE1heWJlW86yXVxuICovXG5NYXliZS5mcm9tRWl0aGVyID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYS5mb2xkKE1heWJlLk5vdGhpbmcsIE1heWJlLkp1c3QpXG59XG5NYXliZS5wcm90b3R5cGUuZnJvbUVpdGhlciA9IE1heWJlLmZyb21FaXRoZXJcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsl1gIHN0cnVjdHVyZSBmcm9tIGEgYFZhbGlkYXRpb25bzrEsIM6yXWAgdHlwZS5cbiAqXG4gKiBUaGUgZmFpbHVyZSBzaWRlIG9mIHRoZSBgVmFsaWRhdGlvbmAgYmVjb21lcyBgTm90aGluZ2AsIGFuZCB0aGUgcmlnaHRcbiAqIHNpZGUgaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6yKWAuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBNYXliZVvOsl1cbiAqL1xuTWF5YmUuZnJvbVZhbGlkYXRpb24gICAgICAgICAgID0gTWF5YmUuZnJvbUVpdGhlclxuTWF5YmUucHJvdG90eXBlLmZyb21WYWxpZGF0aW9uID0gTWF5YmUuZnJvbUVpdGhlclxuXG5cbi8vIC0tIFByZWRpY2F0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZSBjb250YWlucyBhIGZhaWx1cmUgKGkuZS46IGBOb3RoaW5nYCkuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5NYXliZS5wcm90b3R5cGUuaXNOb3RoaW5nICAgPSBmYWxzZVxuTm90aGluZy5wcm90b3R5cGUuaXNOb3RoaW5nID0gdHJ1ZVxuXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlIChpLmUuOiBgSnVzdCjOsSlgKS5cbiAqXG4gKiBAc3VtbWFyeSBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmYWxzZVxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ICA9IHRydWVcblxuXG4vLyAtLSBBcHBsaWNhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6xYC5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIE1heWJlW86xXVxuICovXG5NYXliZS5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KGEpXG59XG5NYXliZS5wcm90b3R5cGUub2YgPSBNYXliZS5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdG8gYW5vdGhlclxuICogYXBwbGljYXRpdmUgdHlwZS5cbiAqXG4gKiBUaGUgYE1heWJlW86xXWAgc3RydWN0dXJlIHNob3VsZCBjb250YWluIGEgZnVuY3Rpb24gdmFsdWUsIG90aGVyd2lzZSBhXG4gKiBgVHlwZUVycm9yYCBpcyB0aHJvd24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBNYXliZVvOsSDihpIgzrJdLCBmOkFwcGxpY2F0aXZlW19dKSA9PiBmW86xXSDihpIgZlvOsl1cbiAqL1xuTWF5YmUucHJvdG90eXBlLmFwID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5hcCA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cblxuXG4vLyAtLSBGdW5jdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2YWx1ZSBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhciB1bmFyeVxuICogZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiAozrEg4oaSIM6yKSDihpIgTWF5YmVbzrJdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5tYXAgICA9IHVuaW1wbGVtZW50ZWRcbk5vdGhpbmcucHJvdG90eXBlLm1hcCA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gdGhpcy5vZihmKHRoaXMudmFsdWUpKVxufVxuXG5cbi8vIC0tIENoYWluIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZhbHVlIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnkgZnVuY3Rpb25cbiAqIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQE1heWJlW86xXSwgbTpNb25hZFtfXSkgPT4gKM6xIOKGkiBtW86yXSkg4oaSIG1bzrJdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5jaGFpbiAgID0gdW5pbXBsZW1lbnRlZFxuTm90aGluZy5wcm90b3R5cGUuY2hhaW4gPSBub29wXG5cbkp1c3QucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuTWF5YmUucHJvdG90eXBlLnRvU3RyaW5nID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ01heWJlLk5vdGhpbmcnXG59XG5cbkp1c3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnTWF5YmUuSnVzdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5cbi8vIC0tIEVxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRlc3RzIGlmIGEgYE1heWJlW86xXWAgc3RydWN0dXJlIGlzIGVxdWFsIHRvIGFub3RoZXIgYE1heWJlW86xXWAgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gTWF5YmVbzrFdIOKGkiBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc0VxdWFsID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gYi5pc05vdGhpbmdcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNFcXVhbCA9IGZ1bmN0aW9uKGIpIHtcbiAgcmV0dXJuIGIuaXNKdXN0XG4gICYmICAgICBiLnZhbHVlID09PSB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhbHVlIG91dCBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlLCBpZiBpdFxuICogZXhpc3RzLiBPdGhlcndpc2UgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBhLCAgICAgIDo6IHBhcnRpYWwsIHRocm93c1xuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9tYXliZX5NYXliZSNnZXRPckVsc2V9IOKAlCBBIGdldHRlciB0aGF0IGNhbiBoYW5kbGUgZmFpbHVyZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gaWYgdGhlIHN0cnVjdHVyZSBoYXMgbm8gdmFsdWUgKGBOb3RoaW5nYCkuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5nZXQgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuJ3QgZXh0cmFjdCB0aGUgdmFsdWUgb2YgYSBOb3RoaW5nLlwiKVxufVxuXG5KdXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YWx1ZSBvdXQgb2YgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZS4gSWYgdGhlcmUgaXMgbm8gdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0LlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gzrEg4oaSIM6xXG4gKi9cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmdldE9yRWxzZSA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIGFcbn1cblxuSnVzdC5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24oXykge1xuICByZXR1cm4gdGhpcy52YWx1ZVxufVxuXG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIGZhaWx1cmUgaW50byBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZyBpZiB0aGVcbiAqIHN0cnVjdHVyZSBhbHJlYWR5IGNvbnRhaW5zIGEgdmFsdWUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiAoVm9pZCDihpIgTWF5YmVbzrFdKSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYoKVxufVxuXG5KdXN0LnByb3RvdHlwZS5vckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzXG59XG5cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4geyBOb3RoaW5nOiBWb2lkIOKGkiDOsiwgSnVzdDogzrEg4oaSIM6yIH0g4oaSIM6yXG4gKi9cbk1heWJlLnByb3RvdHlwZS5jYXRhID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5jYXRhID0gZnVuY3Rpb24ocGF0dGVybikge1xuICByZXR1cm4gcGF0dGVybi5Ob3RoaW5nKClcbn1cblxuSnVzdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uSnVzdCh0aGlzLnZhbHVlKTtcbn1cblxuXG4vKipcbiAqIEpTT04gc2VyaWFsaXNhdGlvblxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gVm9pZCDihpIgT2JqZWN0XG4gKi9cbk1heWJlLnByb3RvdHlwZS50b0pTT04gPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4geyAnI3R5cGUnOiAnZm9sa3RhbGU6TWF5YmUuTm90aGluZycgfVxufVxuXG5KdXN0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHsgJyN0eXBlJzogJ2ZvbGt0YWxlOk1heWJlLkp1c3QnXG4gICAgICAgICAsIHZhbHVlOiB0aGlzLnZhbHVlIH1cbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21heWJlJykiLCJpbXBvcnQgeyBjdXJyeSwgcGlwZSwgcHJvcCwgb3ZlciwgYXBwZW5kIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBoaWRlQ29uZmlncywgU3RhdGVMZW5zZXMsIHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkID0gY3VycnkoKHN0YXRlLCBuZXdGaWVsZCkgPT4gcGlwZShcbiAgaGlkZUNvbmZpZ3MsXG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGFwcGVuZChuZXdGaWVsZCkpXG4pKHN0YXRlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBjcmVhdGVkRmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoY3JlYXRlZEZpZWxkU3RhdGUpXG4gIC5tYXAoaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBNYXliZSBmcm9tIFwiZGF0YS5tYXliZVwiO1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tIFwic2VhbWxlc3MtaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBwdXNoSGlzdG9yeVN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgdG9nZ2xlQ29uZmlnID0gZmllbGRTdGF0ZSA9PlxuICBJbW11dGFibGUoZmllbGRTdGF0ZSkuc2V0KFwiY29uZmlnU2hvd2luZ1wiLCAhZmllbGRTdGF0ZS5jb25maWdTaG93aW5nKTtcblxuY29uc3QgcmVwbGFjZUZpZWxkU3RhdGUgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIHN0YXRlXG4gICAgLmZpZWxkc1N0YXRlXG4gICAgLm1hcChhRmllbGQgPT4gYUZpZWxkLmlkID09PSBmaWVsZFN0YXRlLmlkXG4gICAgICA/IGZpZWxkU3RhdGVcbiAgICAgIDogYUZpZWxkXG4gICAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkU3RhdGUgfSkgPT5cbiAgTWF5YmUuZnJvbU51bGxhYmxlKGZpZWxkU3RhdGUpXG4gIC5tYXAodG9nZ2xlQ29uZmlnKVxuICAubWFwKHJlcGxhY2VGaWVsZFN0YXRlKHN0YXRlKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCB0b2dnbGVSZXF1aXJlZCA9IGZpZWxkU3RhdGUgPT5cbiAgSW1tdXRhYmxlKGZpZWxkU3RhdGUpLnNldChcInJlcXVpcmVkXCIsICFmaWVsZFN0YXRlLnJlcXVpcmVkKTtcblxuY29uc3QgcmVwbGFjZUZpZWxkU3RhdGUgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIHN0YXRlXG4gICAgLmZpZWxkc1N0YXRlXG4gICAgLm1hcChhRmllbGQgPT4gYUZpZWxkLmlkID09PSBmaWVsZFN0YXRlLmlkXG4gICAgICA/IGZpZWxkU3RhdGVcbiAgICAgIDogYUZpZWxkXG4gICAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkU3RhdGUgfSkgPT5cbiAgTWF5YmUuZnJvbU51bGxhYmxlKGZpZWxkU3RhdGUpXG4gIC5tYXAodG9nZ2xlUmVxdWlyZWQpXG4gIC5tYXAocmVwbGFjZUZpZWxkU3RhdGUoc3RhdGUpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNPYmplY3QoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBPYmplY3RdJztcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWEZpbHRlcihmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeGZpbHRlcihmLCB4ZikgeyByZXR1cm4gbmV3IFhGaWx0ZXIoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfZmlsdGVyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZmlsdGVyJyk7XG52YXIgX2lzT2JqZWN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNPYmplY3QnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3hmaWx0ZXIgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmlsdGVyJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgXCJmaWx0ZXJhYmxlXCIsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmaWx0ZXJgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKCdmaWx0ZXInLCBfeGZpbHRlciwgZnVuY3Rpb24ocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gKFxuICAgIF9pc09iamVjdChmaWx0ZXJhYmxlKSA/XG4gICAgICBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IGZpbHRlcmFibGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZmlsdGVyYWJsZSkpIDpcbiAgICAvLyBlbHNlXG4gICAgICBfZmlsdGVyKHByZWQsIGZpbHRlcmFibGUpXG4gICk7XG59KSk7XG4iLCJpbXBvcnQgeyBjdXJyeSwgcHJvcCwgb3ZlciwgZmlsdGVyIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgTWF5YmUgZnJvbSBcImRhdGEubWF5YmVcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIG92ZXIoXG4gICAgU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsXG4gICAgZmlsdGVyKGZzID0+IGZzLmlkICE9PSBmaWVsZFN0YXRlLmlkKSxcbiAgICBzdGF0ZVxuICApXG4pO1xuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgZmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgLm1hcChoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQoc3RhdGUpKVxuICAubWFwKHByb3AoXCJmaWVsZHNTdGF0ZVwiKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCJpbXBvcnQgeyBjdXJyeSwgcHJvcCwgb3ZlciwgbWFwIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSwgdmFsaWRhdGVGaWVsZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgdXBkYXRlRmllbGRTdGF0ZSA9IGN1cnJ5KChzdGF0ZSwgbmV3RmllbGRTdGF0ZSkgPT5cbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBtYXAoZnMgPT4gZnMuaWQgPT09IG5ld0ZpZWxkU3RhdGUuaWQgPyBuZXdGaWVsZFN0YXRlIDogZnMpLFxuICAgIHN0YXRlXG4gIClcbik7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBuZXdGaWVsZFN0YXRlIH0pID0+XG4gIHZhbGlkYXRlRmllbGQobmV3RmllbGRTdGF0ZSkgLy8gRWl0aGVyXG4gIC5tYXAodXBkYXRlRmllbGRTdGF0ZShzdGF0ZSkpXG4gIC5tYXAocHJvcChcImZpZWxkc1N0YXRlXCIpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAubGVmdE1hcChjb25zb2xlLmVycm9yKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3NsaWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fc2xpY2UnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0LCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLFxuICogd2hpY2ggc2hvdWxkIGFjY2VwdCB0d28gdmFsdWVzIGF0IGEgdGltZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZVxuICogZmlyc3QgdmFsdWUgaXMgc21hbGxlciwgYSBwb3NpdGl2ZSBudW1iZXIgaWYgaXQncyBsYXJnZXIsIGFuZCB6ZXJvIGlmIHRoZXlcbiAqIGFyZSBlcXVhbC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGEgKipjb3B5Kiogb2YgdGhlIGxpc3QuIEl0IGRvZXMgbm90XG4gKiBtb2RpZnkgdGhlIG9yaWdpbmFsLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsYSAtPiBOdW1iZXIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgQSBzb3J0aW5nIGZ1bmN0aW9uIDo6IGEgLT4gYiAtPiBJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gc29ydFxuICogQHJldHVybiB7QXJyYXl9IGEgbmV3IGFycmF5IHdpdGggaXRzIGVsZW1lbnRzIHNvcnRlZCBieSB0aGUgY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZGlmZiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9O1xuICogICAgICBSLnNvcnQoZGlmZiwgWzQsMiw3LDVdKTsgLy89PiBbMiwgNCwgNSwgN11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvciwgbGlzdCkge1xuICByZXR1cm4gX3NsaWNlKGxpc3QpLnNvcnQoY29tcGFyYXRvcik7XG59KTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbmltcG9ydCB7IGN1cnJ5LCBwaXBlLCBwcm9wLCBvdmVyLCBzb3J0IH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBoaWRlQ29uZmlncywgU3RhdGVMZW5zZXMsIHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRoTmV3T3JkZXIgPSBjdXJyeSgoc3RhdGUsIG5ld09yZGVyKSA9PiBwaXBlKFxuICBoaWRlQ29uZmlncyxcbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBzb3J0KChmMSwgZjIpID0+IG5ld09yZGVyLmluZGV4T2YoZjEuaWQpIC0gbmV3T3JkZXIuaW5kZXhPZihmMi5pZCkpXG4gIClcbikoc3RhdGUpKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkc09yZGVyIH0pID0+XG4gIChuZXdGaWVsZHNPcmRlciAmJiBBcnJheS5pc0FycmF5KG5ld0ZpZWxkc09yZGVyKVxuICAgID8gRWl0aGVyLlJpZ2h0KG5ld0ZpZWxkc09yZGVyKVxuICAgIDogRWl0aGVyLkxlZnQoYG5ld0ZpZWxkc09yZGVyIG11c3QgYmUgYW4gYXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIG5ld0ZpZWxkc09yZGVyfWApXG4gIClcbiAgLmNoYWluKG8gPT5cbiAgICBvLmxlbmd0aCA9PT0gc3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoXG4gICAgICA/IEVpdGhlci5SaWdodChvKVxuICAgICAgOiBFaXRoZXIuTGVmdChgbmV3RmllbGRzT3JkZXIgaGFzICR7by5sZW5ndGh9IGVsZW1lbnRzLCBidXQgdGhlIGN1cnJlbnQgc3RhdGUgaGFzICR7c3RhdGUuZmllbGRzU3RhdGUubGVuZ3RofSBlbGVtZW50c2ApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICApXG4gIC5jaGFpbihvID0+IHtcbiAgICBjb25zdCBzdGF0ZUlkcyA9IHN0YXRlLmZpZWxkc1N0YXRlLm1hcChwcm9wKFwiaWRcIikpO1xuICAgIGNvbnN0IG5vTWlzc2luZ0lkID0gc3RhdGVJZHMucmVkdWNlKChhY2MsIGZJZCkgPT4gYWNjICYmIG8uaW5jbHVkZXMoZklkKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vTWlzc2luZ0lkXG4gICAgICA/IEVpdGhlci5SaWdodChvKVxuICAgICAgOiBFaXRoZXIuTGVmdChcIk5vdCBhbGwgaWRzIGluIHRoZSBuZXcgb3JkZXIgYXJlIG1hdGNoZWQgaW4gdGhlIGV4aXN0aW5nIHN0YXRlIGlkcy5cIik7XG4gIH0pXG4gIC5tYXAoaGlzdG9yeVN0YXRlV2l0aE5ld09yZGVyKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5sZWZ0TWFwKGVyciA9PiBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gcmVvcmRlcjogJHtlcnJ9YCkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiLyogQGZsb3cgd2VhayAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgU3RhdGVMZW5zZXMsIHByb3BlcnR5VHlwZUNoZWNrIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG92ZXIsIHRyYXZlcnNlLCBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcblxuLy8gW2FdID0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCBpc0FycmF5ID0gYXJyID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyKVxuICAgID8gRWl0aGVyLlJpZ2h0KGFycilcbiAgICA6IEVpdGhlci5MZWZ0KGBFeHBlY3RlZCBBcnJheSBidXQgcmVjZWl2ZWQgJHt0eXBlb2YgYXJyfWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cblxuLy8gT2JqZWN0IC0+IEVpdGhlciBTdHJpbmcgT2JqZWN0XG5jb25zdCBoYXNSZXF1aXJlZEluZm8gPSBjb21wb25lbnQgPT5cbiAgcHJvcGVydHlUeXBlQ2hlY2soXCJpbml0aWFsU3RhdGVcIiwgXCJmdW5jdGlvblwiLCBjb21wb25lbnQpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcIlJlbmRlckVkaXRvclwiLCBcImZ1bmN0aW9uXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJpbmZvXCIsIFwib2JqZWN0XCIpKVxuICAuY2hhaW4oYyA9PiBFaXRoZXIuZnJvbU51bGxhYmxlKGMuaW5mbykpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcInR5cGVcIiwgXCJzdHJpbmdcIikpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcImRpc3BsYXlOYW1lXCIsIFwic3RyaW5nXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJncm91cFwiLCBcInN0cmluZ1wiKSlcbiAgLmNoYWluKF8gPT4gRWl0aGVyLlJpZ2h0KGNvbXBvbmVudCkpO1xuXG5jb25zdCBpc0NvbXBvbmVudFZhbGlkID0gY3VzdG9tQ29tcG9uZW50cyA9PlxuICB0cmF2ZXJzZShFaXRoZXIub2YsIGhhc1JlcXVpcmVkSW5mbywgY3VzdG9tQ29tcG9uZW50cyk7XG5cbi8vIFthXSAtPiBbYV0gLT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IHZhbGlkYXRlQ29tcG9uZW50cyA9IGN1c3RvbUNvbXBvbmVudHMgPT5cbiAgRWl0aGVyLlJpZ2h0KGN1c3RvbUNvbXBvbmVudHMpXG4gICAgLmNoYWluKGlzQXJyYXkpXG4gICAgLmNoYWluKGlzQ29tcG9uZW50VmFsaWQpO1xuXG5jb25zdCBhZGRUb0ZpZWxkVHlwZXMgPSBjdXJyeSgoc3RhdGUsIGN1c3RvbUNvbXBvbmVudHMpID0+XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRUeXBlcywgcyA9PiBzLmNvbmNhdChjdXN0b21Db21wb25lbnRzKSwgc3RhdGUpXG4pO1xuXG4vLyBJZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIHdpdGggdGhlIGltcG9ydCwgdGhlIHNhbWUgc3RhdGVcbi8vIHdpbGwgYmUgcmV0dXJuZWRcbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBjdXN0b21Db21wb25lbnRzIH0pID0+XG4gIChjdXN0b21Db21wb25lbnRzXG4gICAgPyBFaXRoZXIuUmlnaHQoY3VzdG9tQ29tcG9uZW50cylcbiAgICA6IEVpdGhlci5MZWZ0KFwiRW1wdHkgY3VzdG9tIGNvbXBvbmVudHNcIilcbiAgKVxuICAgIC5jaGFpbih2YWxpZGF0ZUNvbXBvbmVudHMpXG4gICAgLmxlZnRNYXAoZXJyID0+IGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIGN1c3RvbSBjb21wb25lbnRzOlwiLCBlcnIpKVxuICAgIC5tYXAoYWRkVG9GaWVsZFR5cGVzKHN0YXRlKSlcbiAgICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJmbC1hc3NlcnRcIjtcbmltcG9ydCB1bmRvIGZyb20gXCIuL3VuZG9cIjtcbmltcG9ydCBpbXBvcnRTdGF0ZSBmcm9tIFwiLi9pbXBvcnRTdGF0ZVwiO1xuaW1wb3J0IGNyZWF0ZUZpZWxkIGZyb20gXCIuL2NyZWF0ZUZpZWxkXCI7XG5pbXBvcnQgZmllbGRDcmVhdGVkIGZyb20gXCIuL2ZpZWxkQ3JlYXRlZFwiO1xuaW1wb3J0IHRvZ2dsZUNvbmZpZyBmcm9tIFwiLi9maWVsZC50b2dnbGVDb25maWdcIjtcbmltcG9ydCB0b2dnbGVSZXF1aXJlZCBmcm9tIFwiLi9maWVsZC50b2dnbGVSZXF1aXJlZFwiO1xuaW1wb3J0IGRlbGV0ZUZpZWxkIGZyb20gXCIuL2ZpZWxkLmRlbGV0ZUZpZWxkXCI7XG5pbXBvcnQgdXBkYXRlRmllbGQgZnJvbSBcIi4vZmllbGQudXBkYXRlRmllbGRcIjtcbmltcG9ydCByZW9yZGVyRmllbGRzIGZyb20gXCIuL3Jlb3JkZXJGaWVsZHNcIjtcbmltcG9ydCBpbXBvcnRDdXN0b21Db21wb25lbnRzIGZyb20gXCIuL2ltcG9ydEN1c3RvbUNvbXBvbmVudHNcIjtcblxuY29uc3QgYWN0aW9uSGFuZGxlcnMgPSB7XG4gIHVuZG8sXG4gIGltcG9ydFN0YXRlLFxuICBjcmVhdGVGaWVsZCxcbiAgZmllbGRDcmVhdGVkLFxuICB0b2dnbGVDb25maWcsXG4gIHRvZ2dsZVJlcXVpcmVkLFxuICBkZWxldGVGaWVsZCxcbiAgdXBkYXRlRmllbGQsXG4gIHJlb3JkZXJGaWVsZHMsXG4gIGltcG9ydEN1c3RvbUNvbXBvbmVudHMsXG59O1xuXG5jb25zdCBpc0V4cGVjdGVkQWN0aW9uID0gYSA9PiBhICYmIGEudHlwZSAmJiBhY3Rpb25IYW5kbGVyc1thLnR5cGVdO1xuY29uc3QgaXNSZWR1eEFjdGlvbiA9IGEgPT4gYSAmJiBhLnR5cGUgJiYgYS50eXBlLmluY2x1ZGVzKFwiQEByZWR1eFwiKTtcblxuXG5jb25zdCB1cGRhdGUgPSAoc3RhdGUsIGFjdGlvbikgPT5cbiAgaXNFeHBlY3RlZEFjdGlvbihhY3Rpb24pXG4gICAgPyBhY3Rpb25IYW5kbGVyc1thY3Rpb24udHlwZV0oc3RhdGUsIGFjdGlvbilcbiAgOiBpc1JlZHV4QWN0aW9uKGFjdGlvbilcbiAgICA/IHN0YXRlXG4gIDogYXNzZXJ0KGZhbHNlLCBgSW52YWxpZCBhY3Rpb24gdHlwZTogJHthY3Rpb24udHlwZX1gKTtcblxuZXhwb3J0IGRlZmF1bHQgdXBkYXRlO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG5cbmltcG9ydCB7IHVuZG8gYXMgdW5kb0FjdGlvbiB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgY3VycmVudEZpZWxkc1N0YXRlID0gW1wiY3VycmVudFwiXTtcbmNvbnN0IG9sZEZpZWxkc1N0YXRlID0gW1wib2xkXCJdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IGN1cnJlbnRGaWVsZHNTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbb2xkRmllbGRzU3RhdGVdLFxufTtcblxuY29uc3QgZW1wdHlNb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtdLFxuICBmaWVsZHNTdGF0ZTogW10sXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogW10sXG59O1xuXG5jb25zdCBlbXB0eUhpc3RvcnlNb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtdLFxuICBmaWVsZHNTdGF0ZTogY3VycmVudEZpZWxkc1N0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudW5kb1wiLCAoKSA9PiB7XG4gIGl0KFwicmVtb3ZlcyBmaXJzdCBvbGQgc3RhdGUgZnJvbSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDApO1xuICB9KTtcblxuICBpdChcInNldHMgZmlyc3Qgb2xkIHN0YXRlIGFzIGN1cnJlbnQgc3RhdGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB1bmRvQWN0aW9uKCkpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlKS50b0VxdWFsKG9sZEZpZWxkc1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2Vzbid0IG1vZGlmeSB0aGUgc3RhdGUgaWYgdGhlcmUgYXJlbid0IG1vcmUgaGlzdG9yeSBzdGF0ZXMgdG8gdW5kb1wiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShlbXB0eU1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZSkudG9FcXVhbChlbXB0eU1vY2tTdGF0ZSk7XG4gIH0pO1xuXG4gIGl0KFwic2V0J3MgdGhlIGN1cnJlbnQgc3RhdGUgdG8gZW1wdHkgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaGlzdG9yeSBzdGF0ZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUoZW1wdHlIaXN0b3J5TW9ja1N0YXRlLCB1bmRvQWN0aW9uKCkpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgaW1wb3J0U3RhdGUgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IHR5cGVzQXJyYXkgPSBbe1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlJhZGlvQnV0dG9uc1wiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIkNoZWNrYm94ZXNcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJEcm9wZG93blwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRleHRCb3hcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJFbWFpbEJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRlbGVwaG9uZUJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIk51bWJlckJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRleHRBcmVhXCIsXG4gIH0sXG59LCB7XG4gIFwiaW5mb1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiRGF0ZUZpZWxkXCIsXG4gIH0sXG59XTtcblxuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogdHlwZXNBcnJheSxcbiAgZmllbGRzU3RhdGU6IG1vY2tDdXJyZW50U3RhdGUsXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbW9ja0hpc3RvcnksXG59O1xuXG5jb25zdCBuZXdWYWxpZFN0YXRlID0gW3tcbiAgXCJ0eXBlXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImRpc3BsYXlOYW1lXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImdyb3VwXCI6IFwiT3B0aW9ucyBDb21wb25lbnRzXCIsXG4gIFwiaHRtbElucHV0VHlwZVwiOiBcImNoZWNrYm94XCIsXG4gIFwidGl0bGVcIjogXCJBZGQgYSB0aXRsZVwiLFxuICBcImlkXCI6IDIsXG4gIFwib3B0aW9uc1wiOiBbe1xuICAgIFwiY2FwdGlvblwiOiBcIkluc2VydCBhbiBvcHRpb25cIixcbiAgfV0sXG4gIFwibmV3T3B0aW9uQ2FwdGlvblwiOiBcIlwiLFxufV07XG5cbmNvbnN0IG5ld0ludmFsaWRTdGF0ZSA9IFt7XG4gIFwidHlwZVwiOiBcIkludmFsaWQgdHlwZVwiLFxuICBcImRpc3BsYXlOYW1lXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImdyb3VwXCI6IFwiT3B0aW9ucyBDb21wb25lbnRzXCIsXG4gIFwiaHRtbElucHV0VHlwZVwiOiBcImNoZWNrYm94XCIsXG4gIFwidGl0bGVcIjogXCJBZGQgYSB0aXRsZVwiLFxuICBcIm9wdGlvbnNcIjogW3tcbiAgICBcImNhcHRpb25cIjogXCJJbnNlcnQgYW4gb3B0aW9uXCIsXG4gIH1dLFxuICBcIm5ld09wdGlvbkNhcHRpb25cIjogXCJcIixcbn1dO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5pbXBvcnRTdGF0ZVwiLCAoKSA9PiB7XG4gIGl0KFwiUmV0dXJucyBhbiB1bmNoYW5nZWQgYXJyYXkgaWYgdGhlIG5ldyBzdGF0ZSBpcyBpbnZhbGlkXCIsICgpID0+IHtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUoe30pKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShudWxsKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIGFuIHVuY2hhbmdlZCBhcnJheSBpZiB0aGUgYSBmaWVsZCdzIHR5cGUgaXMgbm90IGluIGZpZWxkVHlwZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShuZXdJbnZhbGlkU3RhdGUpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICB9KTtcblxuICBpdChcIlNlbmRzIHRoZSBsYXN0IGN1cnJlbnQgc3RhdGUgdG8gdGhlIGhpc3RvcnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShuZXdWYWxpZFN0YXRlKSk7XG4gICAgZXhwZWN0KHVwZGF0ZWQuZmllbGRzU3RhdGVIaXN0b3J5WzBdLnRvU3RyaW5nKCkpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS50b1N0cmluZygpKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKG1vY2tIaXN0b3J5Lmxlbmd0aCArIDEpO1xuICB9KTtcblxuICBpdChcIlNldHMgdGhlIG5ldyBzdGF0ZSBhcyBjdXJyZW50XCIsICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUobmV3VmFsaWRTdGF0ZSkpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLnR5cGUpLnRvRXF1YWwobmV3VmFsaWRTdGF0ZVswXS50eXBlKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS50eXBlKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmRpc3BsYXlOYW1lKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0uZGlzcGxheU5hbWUpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmRpc3BsYXlOYW1lKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmdyb3VwKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0uZ3JvdXApO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmdyb3VwKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcIk1ha2VzIHN1cmUgYWxsIGlkcyBhcmUgc3RyaW5nc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRTdGF0ZTIgPSBuZXdWYWxpZFN0YXRlXG4gICAgICAubWFwKCh2LCBpZHgpID0+IGlkeCAhPT0gMCA/IHYgOiBPYmplY3QuYXNzaWduKHt9LCB2LCB7IGlkOiAyIH0pKTtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUodmFsaWRTdGF0ZTIpKTtcbiAgICBleHBlY3QodHlwZW9mIHVwZGF0ZWQuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoXCJzdHJpbmdcIik7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5cbmltcG9ydCB7IGNyZWF0ZUZpZWxkIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCBwcm9taXNlVHlwZUluc3RhbmNlID0geyB0eXBlOiBcInByb21pc2UtaW5zdGFuY2VcIiB9O1xuY29uc3QgcHJvbWlzZVR5cGUgPSB7XG4gIGluZm86IHsgdHlwZTogXCJQcm9taXNlVHlwZVwiIH0sXG4gIGluaXRpYWxTdGF0ZTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHByb21pc2VUeXBlSW5zdGFuY2UpLFxufTtcblxuY29uc3Qgc3luY1R5cGVJbnN0YW5jZSA9IHsgdHlwZTogXCJzeW5jLWluc3RhbmNlXCIgfTtcbmNvbnN0IHN5bmNUeXBlID0ge1xuICBpbmZvOiB7IHR5cGU6IFwiU3luY1R5cGVcIiB9LFxuICBpbml0aWFsU3RhdGU6ICgpID0+IHN5bmNUeXBlSW5zdGFuY2UsXG59O1xuXG5jb25zdCB0eXBlc0FycmF5ID0gW3Byb21pc2VUeXBlLCBzeW5jVHlwZV07XG5jb25zdCBtb2NrQ3VycmVudFN0YXRlID0gW1wiYVwiLCBcImJcIl07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiB0eXBlc0FycmF5LFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmNyZWF0ZUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJjcmVhdGVzIGZpZWxkcyBhc3luY2hyb25vdXNseVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gdiA9PiB7XG4gICAgICBleHBlY3Qodikubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHN5bmNUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhICdmaWVsZENyZWF0ZWQnIGFjdGlvbiB3aGVuIGZpZWxkIGlzIGNyZWF0ZWRcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJmaWVsZENyZWF0ZWRcIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImNyZWF0ZXMgdHlwZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhhdCByZXR1cm4gYSBwbGFpbiBvYmplY3RcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLmNyZWF0ZWRGaWVsZFN0YXRlKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZS50eXBlKS50b0VxdWFsKHN5bmNUeXBlSW5zdGFuY2UudHlwZSk7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImNyZWF0ZXMgdHlwZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhhdCByZXR1cm4gYSBwcm9taXNlXCIsIGRvbmUgPT4ge1xuICAgIGNvbnN0IGFzeW5jRGlzcGF0Y2ggPSBhY3Rpb24gPT4ge1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUudHlwZSkudG9FcXVhbChwcm9taXNlVHlwZUluc3RhbmNlLnR5cGUpO1xuICAgICAgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3luY0FjaW9uID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgYXN5bmNEaXNwYXRjaCB9LFxuICAgICAgY3JlYXRlRmllbGQocHJvbWlzZVR5cGUuaW5mby50eXBlKVxuICAgICk7XG5cbiAgICB1cGRhdGUobW9ja1N0YXRlLCBhc3luY0FjaW9uKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHJlcXVpcmVkIGZpZWxkcyB0byBpbnN0YW5jZVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gYWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUuaWQpLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QodHlwZW9mIGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZS5jb25maWdTaG93aW5nKS50b0VxdWFsKFwiYm9vbGVhblwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHByb21pc2VUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY3JlYXRlIGEgZmllbGQgaWYgdHlwZSBpcyBub3QgaW4gbW9kZWwuZmllbGRUeXBlc1wiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gamFzbWluZS5jcmVhdGVTcHkoXCJhc3luY0Rpc3BhdGNoXCIpO1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKFwibm9uLWV4aXN0aW5nLXR5cGVcIilcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG5cbiAgICBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4geyBleHBlY3QoYXN5bmNEaXNwYXRjaCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTsgZG9uZSgpOyB9LFxuICAgICAgNTBcbiAgICApO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBmaWVsZENyZWF0ZWQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IGNyZWF0ZWRGaWVsZFN0YXRlID0geyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9O1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW3sgaW5mbzogeyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9IH1dLFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmNvbnN0IGZpZWxkQ3JlYXRlZEFjdGlvbiA9IGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZEFjdGlvbik7XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmZpZWxkQ3JlYXRlZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHdpdGggdGhlIG5ldyBmaWVsZCBpbmNsdWRlZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoICsgMSk7XG4gICAgZXhwZWN0KFxuICAgICAgbmV3U3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKHYgPT4gdi50eXBlID09PSBjcmVhdGVkRmllbGRTdGF0ZS50eXBlKVxuICAgICkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0pLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXSk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiBubyBuZXcgZmllbGQgaXMgZ2l2ZW4gdG8gaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNhbWVTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZChudWxsKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgYnJlYWsgdGhlIHN0YXRlIGFmdGVyIGNyZWF0aW5nIG9uZSBvYmplY3RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGRDcmVhdGVkKGNyZWF0ZWRGaWVsZFN0YXRlKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSkpO1xuICAgIGNvbnN0IGNoYW5nZWQzID0gdXBkYXRlKGNoYW5nZWQyLCBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoICsgMyk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHsgdG9nZ2xlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5cbmNvbnN0IGZpZWxkU3RhdGVDb25maWdTaG93aW5nID0ge1xuICBpZDogMTIzLFxuICBjb25maWdTaG93aW5nOiB0cnVlLFxufTtcblxuY29uc3QgZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmcgPSB7XG4gIGlkOiAzMjEsXG4gIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxufTtcblxuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtmaWVsZFN0YXRlQ29uZmlnU2hvd2luZywgZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmddLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudG9nZ2xlQ29uZmlnXCIsICgpID0+IHtcbiAgaXQoXCJ0dXJucyB0aGUgY29uZmlnIG9wdGlvbiB0byBmYWxzZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnU2hvd2luZykpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcuaWQpXG4gICAgICAuY29uZmlnU2hvd2luZ1xuICAgICkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwidHVybnMgdGhlIGNvbmZpZyBvcHRpb24gdG8gdHJ1ZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnTm90U2hvd2luZykpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcuaWQpXG4gICAgICAuY29uZmlnU2hvd2luZ1xuICAgICkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHRoZSBsYXN0IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlQ29uZmlnKGZpZWxkU3RhdGVDb25maWdTaG93aW5nKSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuXG5pbXBvcnQgeyB0b2dnbGVSZXF1aXJlZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuXG5jb25zdCBmaWVsZFN0YXRlSXNSZXF1aXJlZCA9IHtcbiAgaWQ6IDEyMyxcbiAgcmVxdWlyZWQ6IHRydWUsXG59O1xuXG5jb25zdCBmaWVsZFN0YXRlSXNOb3RSZXF1aXJlZCA9IHtcbiAgaWQ6IDMyMSxcbiAgcmVxdWlyZWQ6IGZhbHNlLFxufTtcblxuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtmaWVsZFN0YXRlSXNSZXF1aXJlZCwgZmllbGRTdGF0ZUlzTm90UmVxdWlyZWRdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudG9nZ2xlUmVxdWlyZWRcIiwgKCkgPT4ge1xuICBpdChcInR1cm5zIHRoZSByZXF1aXJlZCBvcHRpb24gdG8gZmFsc2Ugd2hlbiBuZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlSXNSZXF1aXJlZCkpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUlzUmVxdWlyZWQuaWQpXG4gICAgICAucmVxdWlyZWRcbiAgICApLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdChcInR1cm5zIHRoZSByZXF1aXJlZCBvcHRpb24gdG8gdHJ1ZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZVJlcXVpcmVkKGZpZWxkU3RhdGVJc05vdFJlcXVpcmVkKSk7XG4gICAgZXhwZWN0KFxuICAgICAgbW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZVxuICAgICAgLmZpbmQoZiA9PiBmLmlkID09PSBmaWVsZFN0YXRlSXNSZXF1aXJlZC5pZClcbiAgICAgIC5yZXF1aXJlZFxuICAgICkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHRoZSBsYXN0IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlUmVxdWlyZWQoZmllbGRTdGF0ZUlzUmVxdWlyZWQpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVswXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVsxXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMV0uaWQpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBkZWxldGVGaWVsZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgdG9CZURlbGV0ZWRGaWVsZFN0YXRlID0geyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiwgaWQ6IDAgfTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgZmllbGREZWxldGVBY3Rpb24gPSBkZWxldGVGaWVsZCh0b0JlRGVsZXRlZEZpZWxkU3RhdGUpO1xuY29uc3QgbmV3U3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCBmaWVsZERlbGV0ZUFjdGlvbik7XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmRlbGV0ZUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgd2l0aG91dCB0aGUgZmllbGQgaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCAtIDEpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYuaWQgPT09IHRvQmVEZWxldGVkRmllbGRTdGF0ZS5pZClcbiAgICApLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCByZWNlbnRIaXN0b3J5U3RhdGUgPSBuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF07XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChyZWNlbnRIaXN0b3J5U3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVsxXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzFdLmlkKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIG5vIG5ldyBmaWVsZCBpcyBnaXZlbiB0byBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZGVsZXRlRmllbGQobnVsbCkpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciBkZWxldGluZyBhIGZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmllbGQxID0gT2JqZWN0LmFzc2lnbih7fSwgdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiA1IH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDIgPSBPYmplY3QuYXNzaWduKHt9LCB0b0JlRGVsZXRlZEZpZWxkU3RhdGUsIHsgaWQ6IDYgfSk7XG4gICAgY29uc3QgbW9ja0ZpZWxkMyA9IE9iamVjdC5hc3NpZ24oe30sIHRvQmVEZWxldGVkRmllbGRTdGF0ZSwgeyBpZDogNyB9KTtcblxuICAgIGNvbnN0IG1vY2tTdGF0ZTIgPSBPYmplY3QuYXNzaWduKHt9LCBtb2NrU3RhdGUsIHtcbiAgICAgIGZpZWxkc1N0YXRlOiBbXG4gICAgICAgIG1vY2tGaWVsZDEsXG4gICAgICAgIG1vY2tGaWVsZDIsXG4gICAgICAgIG1vY2tGaWVsZDMsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZTIsIGRlbGV0ZUZpZWxkKG1vY2tGaWVsZDEpKTtcbiAgICBjb25zdCBjaGFuZ2VkMiA9IHVwZGF0ZShjaGFuZ2VkMSwgZGVsZXRlRmllbGQobW9ja0ZpZWxkMikpO1xuICAgIGNvbnN0IGNoYW5nZWQzID0gdXBkYXRlKGNoYW5nZWQyLCBkZWxldGVGaWVsZChtb2NrRmllbGQzKSk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZTIuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlMi5maWVsZHNTdGF0ZS5sZW5ndGggLSAzKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgdXBkYXRlRmllbGQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IG9sZEZpZWxkU3RhdGUgPSB7XG4gIHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiLFxuICBpZDogXCIwXCIsXG4gIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxuICByZXF1aXJlZDogZmFsc2UsXG4gIGNvbG9yOiBcImJsdWVcIixcbn07XG5jb25zdCBuZXdGaWVsZFN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgb2xkRmllbGRTdGF0ZSwgeyBjb2xvcjogXCJncmVlblwiIH0pO1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtvbGRGaWVsZFN0YXRlLCB7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgZmllbGRVcGRhdGVBY3Rpb24gPSB1cGRhdGVGaWVsZChuZXdGaWVsZFN0YXRlKTtcbmNvbnN0IG5ld1N0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGRVcGRhdGVBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS51cGRhdGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHRoZSBmaWVsZCB1cGRhdGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYuY29sb3IgPT09IG5ld0ZpZWxkU3RhdGUuY29sb3IpXG4gICAgKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcIm91dHB1dHMgYSBzdGF0ZSB0aGUgdXBkYXRlZCBmaWVsZCBpbiB0aGUgY29ycmVjdCBvcmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG5ld0ZpZWxkU3RhdGUuY29sb3IpO1xuICB9KTtcblxuICBpdChcInNlbmRzIHRoZSBjdXJyZW50IHN0YXRlIHRvIGhpc3RvcnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlY2VudEhpc3RvcnlTdGF0ZSA9IG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVswXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uY29sb3IpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgaWYgYW4gaW52YWxpZCBmaWVsZCBzdGF0ZSBpcyBnaXZlbiB0byBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3QgaXNTYW1lID0gKHN0YXRlMSwgc3RhdGUyKSA9PiB7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKHN0YXRlMi5maWVsZFR5cGVzLmxlbmd0aCk7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVbMF0uY29sb3IpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlWzBdLmNvbG9yKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNhbWVTdGF0ZTEgPSB1cGRhdGUobW9ja1N0YXRlLCB1cGRhdGVGaWVsZChudWxsKSk7XG4gICAgaXNTYW1lKG1vY2tTdGF0ZSwgc2FtZVN0YXRlMSk7XG5cbiAgICBjb25zdCBzYW1lU3RhdGUyID0gdXBkYXRlKFxuICAgICAgbW9ja1N0YXRlLFxuICAgICAgdXBkYXRlRmllbGQoT2JqZWN0LmFzc2lnbih7fSwgbmV3RmllbGRTdGF0ZSwgeyBpZDogbnVsbCB9KSlcbiAgICApO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTIpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlMyA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgY29uZmlnU2hvd2luZzogbnVsbCB9KSlcbiAgICApO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTMpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlNCA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgcmVxdWlyZWQ6IG51bGwgfSkpXG4gICAgKTtcblxuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTQpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciB1cGRhdGluZyBhIGZpZWxkIG11bHRpcGxlIHRpbWVzIGEgZmllbGRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGaWVsZDEgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcInllbGxvd1wiIH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDIgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcIm9yYW5nZVwiIH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcInB1cnBsZVwiIH0pO1xuXG4gICAgY29uc3QgY2hhbmdlZDEgPSB1cGRhdGUobW9ja1N0YXRlLCB1cGRhdGVGaWVsZChtb2NrRmllbGQxKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIHVwZGF0ZUZpZWxkKG1vY2tGaWVsZDIpKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgdXBkYXRlRmllbGQobW9ja0ZpZWxkMykpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG1vY2tGaWVsZDMuY29sb3IpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyByZW9yZGVyRmllbGRzIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZUZpZWxkID0ge1xuICB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIixcbiAgcmVxdWlyZWQ6IGZhbHNlLFxuICBjb25maWdTaG93aW5nOiBmYWxzZSxcbiAgaWQ6IFwiMFwiLFxufTtcbmNvbnN0IGZpZWxkMSA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXBsYXRlRmllbGQsIHsgaWQ6IFwiMVwiIH0pO1xuY29uc3QgZmllbGQyID0gT2JqZWN0LmFzc2lnbih7fSwgdGVtcGxhdGVGaWVsZCwgeyBpZDogXCIyXCIgfSk7XG5jb25zdCBmaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZUZpZWxkLCB7IGlkOiBcIjNcIiB9KTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbZmllbGQxLCBmaWVsZDIsIGZpZWxkM107XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgbmV3T3JkZXIgPSBbXCIyXCIsIFwiM1wiLCBcIjFcIl07XG5jb25zdCByZW9yZGVyRmllbGRzQWN0aW9uID0gcmVvcmRlckZpZWxkcyhuZXdPcmRlcik7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHJlb3JkZXJGaWVsZHNBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5yZW9yZGVyRmllbGRzXCIsICgpID0+IHtcbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgd2l0aCBmaWVsZHMgaW4gdGhlIG5ldyBvcmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobmV3T3JkZXJbMF0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChuZXdPcmRlclsxXSk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzJdLmlkKS50b0VxdWFsKG5ld09yZGVyWzJdKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdLmlkKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVsyXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzJdLmlkKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIGFueSBmaWVsZCBpZCBpcyBtaXNzaW5nXCIsICgpID0+IHtcbiAgICBjb25zdCBzYW1lU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCByZW9yZGVyRmllbGRzKFtcIjFcIiwgXCIyXCJdKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiB0aGUgcmVvcmRlciBhcnJheSBoYXMgbW9yZSBlbGVtZW50cyB0aGFuIGl0IHNob3VsZFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgYnJlYWsgdGhlIHN0YXRlIGFmdGVyIGNyZWF0aW5nIG9uZSBvYmplY3RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiLCBcIjNcIl0pKTtcbiAgICBjb25zdCBjaGFuZ2VkMiA9IHVwZGF0ZShjaGFuZ2VkMSwgcmVvcmRlckZpZWxkcyhbXCIzXCIsIFwiMVwiLCBcIjJcIl0pKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgcmVvcmRlckZpZWxkcyhbXCIzXCIsIFwiMlwiLCBcIjFcIl0pKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoXCIzXCIpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChcIjJcIik7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzJdLmlkKS50b0VxdWFsKFwiMVwiKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgY3JlYXRlVHlwZSA9IG5hbWUgPT4gKHtcbiAgaW5pdGlhbFN0YXRlOiBfID0+IF8sXG4gIFJlbmRlckVkaXRvcjogXyA9PiBfLFxuICBpbmZvOiB7IHR5cGU6IG5hbWUsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogbmFtZSB9LFxufSk7XG5cbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW2NyZWF0ZVR5cGUoXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIpXSxcbiAgZmllbGRzU3RhdGU6IFtdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuY29uc3QgY3VzdG9tVHlwZXMgPSBbXG4gIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgY3JlYXRlVHlwZShcImN1c3RvbS0yXCIpLFxuICBjcmVhdGVUeXBlKFwiY3VzdG9tLTNcIiksXG5dO1xuXG5jb25zdCBpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uID0gaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhjdXN0b21UeXBlcyk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHNBY3Rpb24pO1xuXG5cbmRlc2NyaWJlKFwiVXBkYXRlLmltcG9ydEN1c3RvbUNvbXBvbmVudHNcIiwgKCkgPT4ge1xuICBpdChcIkFwcGVuZHMgdGhlIG5ldyB2YWxpZCBjdXN0b20gdHlwZXMgdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgdHlwZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGggKyBjdXN0b21UeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzFdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1swXS5pbmZvLnR5cGUpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzJdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1sxXS5pbmZvLnR5cGUpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzNdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1syXS5pbmZvLnR5cGUpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgYW4gdW5jaGFuZ2VkIGFycmF5IGlmIGN1c3RvbVR5cGVzIGlzIGludmFsaWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKG51bGwpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDEgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBjcmVhdGVUeXBlKFwiY3VzdG9tLTFcIiksIHsgaW5mbzogbnVsbCB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQxKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQyID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IG51bGwsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogXCJjdXN0b21cIiB9IH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDIpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDMgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IGluZm86IHsgdHlwZTogXCJjdXN0b21cIiwgZ3JvdXA6IG51bGwsIGRpc3BsYXlOYW1lOiBcImN1c3RvbVwiIH0gfVxuICAgICAgKSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQzKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQ0ID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IFwiY3VzdG9tXCIsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogbnVsbCB9IH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDQpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDUgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IFJlbmRlckVkaXRvcjogXCJub3QgYSBmdW5jdGlvblwiIH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDUpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDYgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IGluaXRpYWxTdGF0ZTogXCJub3QgYSBmdW5jdGlvblwiIH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDYpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICB9KTtcbn0pO1xuIl0sIm5hbWVzIjpbInVuZG8iLCJpbXBvcnRDdXN0b21Db21wb25lbnRzIiwiaW1wb3J0U3RhdGUiLCJjcmVhdGVGaWVsZCIsImZpZWxkQ3JlYXRlZCIsInRvZ2dsZUNvbmZpZyIsInRvZ2dsZVJlcXVpcmVkIiwiZGVsZXRlRmllbGQiLCJ1cGRhdGVGaWVsZCIsInJlb3JkZXJGaWVsZHMiLCJkZXNjcmliZSIsImFjdGlvbiIsInR5cGUiLCJ0b0VxdWFsIiwibW9ja1N0YXRlVG9JbXBvcnQiLCJuZXdGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZSIsImNyZWF0ZWRGaWVsZFN0YXRlIiwiZmllbGRTdGF0ZSIsIm5ld0ZpZWxkU3RhdGUiLCJuZXdGaWVsZHNPcmRlciIsImN1c3RvbUNvbXBvbmVudHMiLCJkZWZpbmUiLCJhc3luY0Rpc3BhdGNoTWlkZGxld2FyZSIsInN5bmNBY3Rpdml0eUZpbmlzaGVkIiwiYWN0aW9uUXVldWUiLCJmbHVzaFF1ZXVlIiwiZm9yRWFjaCIsInN0b3JlIiwiZGlzcGF0Y2giLCJhIiwiYXN5bmNEaXNwYXRjaCIsImFzeW5jQWN0aW9uIiwiY29uY2F0IiwiYWN0aW9uV2l0aEFzeW5jRGlzcGF0Y2giLCJJbW11dGFibGUiLCJtZXJnZSIsImZha2VBY3Rpb24iLCJkb25lIiwibmV4dCIsInJldHVybmVkQWN0aW9uIiwibm90IiwidW5kZWZpbmVkIiwiZmFrZUFzeW5jQWN0aW9uIiwiZmFrZVN0b3JlIiwiRWl0aGVyIiwicmVxdWlyZSQkMCIsInVwZGF0ZUF0IiwiX2RlZmF1bHQiLCJrZXlBcnJheSIsIm5ld1ZhbCIsIm9iaiIsImRlZXBOZXdWYWwiLCJyZWR1Y2VSaWdodCIsInJlc3VsdCIsImtleSIsImRlZXAiLCJTdGF0ZUxlbnNlcyIsIl9kZWZhdWx0MiIsIl9kZWZhdWx0MyIsImNyZWF0ZUlkIiwiRGF0ZSIsIm5vdyIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInB1c2hIaXN0b3J5U3RhdGUiLCJzdGF0ZSIsIm5ld0hpc3RvcnlTdGF0ZSIsIl9kZWZhdWx0NCIsImZpZWxkc1N0YXRlSGlzdG9yeSIsIl9kZWZhdWx0NiIsImZpZWxkc1N0YXRlIiwiaGlkZUNvbmZpZ3MiLCJfZGVmYXVsdDciLCJtYXAiLCJPYmplY3QiLCJhc3NpZ24iLCJzIiwiY29uZmlnU2hvd2luZyIsInByb3BlcnR5VHlwZUNoZWNrIiwicHJvcGVydHlOYW1lIiwiYmFiZWxIZWxwZXJzLnR5cGVvZiIsIlJpZ2h0IiwiTGVmdCIsInZhbGlkYXRlRmllbGQiLCJmcm9tTnVsbGFibGUiLCJsZWZ0TWFwIiwiZnMiLCJjaGFpbiIsImxhc3RIaXN0b3J5U3RhdGUiLCJfIiwiSW5maW5pdHkiLCJpc0FycmF5IiwiQXJyYXkiLCJhcnIiLCJmaWVsZFR5cGVJc1ZhbGlkIiwidmFsaWRUeXBlcyIsImZpZWxkIiwiZmluZCIsInZhbGlkRmllbGRUeXBlcyIsIm9mIiwidmFsaWRhdGVGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZXMiLCJhZGRSZXF1aXJlZFByb3BlcnRpZXMiLCJmaWVsZFN0YXRlcyIsImlkIiwiYmltYXAiLCJjb25zb2xlIiwiZXJyb3IiLCJnZXRPckVsc2UiLCJUYXNrIiwidHlwZUNvbnN0cnVjdG9yIiwidiIsImluZm8iLCJyZWplY3QiLCJyZXNvbHZlIiwiY2FsbGVkIiwiY29uc3RyIiwiaW5pdGlhbFN0YXRlIiwiUHJvbWlzZSIsInRoZW4iLCJjYXRjaCIsImluc2VydFJlcXVpcmVkUHJvcHMiLCJjcmVhdGVGaWVsZEFzeW5jaHJvbm91c2x5IiwicmVqZWN0ZWQiLCJmb3JrIiwiZXJyIiwiTWF5YmUiLCJjbG9uZSIsInVuaW1wbGVtZW50ZWQiLCJub29wIiwiaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkIiwibmV3RmllbGQiLCJfZGVmYXVsdDUiLCJzZXQiLCJyZXBsYWNlRmllbGRTdGF0ZSIsImFGaWVsZCIsInJlcXVpcmVkIiwiaGlzdG9yeVN0YXRlV2l0aG91dEZpZWxkIiwidXBkYXRlRmllbGRTdGF0ZSIsImhpc3RvcnlTdGF0ZVdpdGhOZXdPcmRlciIsIm5ld09yZGVyIiwiZjEiLCJmMiIsImluZGV4T2YiLCJvIiwibGVuZ3RoIiwic3RhdGVJZHMiLCJub01pc3NpbmdJZCIsInJlZHVjZSIsImFjYyIsImZJZCIsImluY2x1ZGVzIiwiaGFzUmVxdWlyZWRJbmZvIiwiY29tcG9uZW50IiwiYyIsImlzQ29tcG9uZW50VmFsaWQiLCJ2YWxpZGF0ZUNvbXBvbmVudHMiLCJhZGRUb0ZpZWxkVHlwZXMiLCJhY3Rpb25IYW5kbGVycyIsImlzRXhwZWN0ZWRBY3Rpb24iLCJpc1JlZHV4QWN0aW9uIiwidXBkYXRlIiwiYXNzZXJ0IiwiY3VycmVudEZpZWxkc1N0YXRlIiwib2xkRmllbGRzU3RhdGUiLCJtb2NrU3RhdGUiLCJlbXB0eU1vY2tTdGF0ZSIsImVtcHR5SGlzdG9yeU1vY2tTdGF0ZSIsIm1vZGlmaWVkU3RhdGUiLCJ1bmRvQWN0aW9uIiwidHlwZXNBcnJheSIsIm1vY2tDdXJyZW50U3RhdGUiLCJtb2NrSGlzdG9yeSIsIm5ld1ZhbGlkU3RhdGUiLCJuZXdJbnZhbGlkU3RhdGUiLCJ1cGRhdGVkIiwiZGlzcGxheU5hbWUiLCJncm91cCIsInZhbGlkU3RhdGUyIiwiaWR4IiwicHJvbWlzZVR5cGVJbnN0YW5jZSIsInByb21pc2VUeXBlIiwic3luY1R5cGVJbnN0YW5jZSIsInN5bmNUeXBlIiwiYXN5bmNBY2lvbiIsImphc21pbmUiLCJjcmVhdGVTcHkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiZmllbGRDcmVhdGVkQWN0aW9uIiwibmV3U3RhdGUiLCJzYW1lU3RhdGUiLCJjaGFuZ2VkMSIsImNoYW5nZWQyIiwiY2hhbmdlZDMiLCJmaWVsZFN0YXRlQ29uZmlnU2hvd2luZyIsImZpZWxkU3RhdGVDb25maWdOb3RTaG93aW5nIiwiZiIsImZpZWxkU3RhdGVJc1JlcXVpcmVkIiwiZmllbGRTdGF0ZUlzTm90UmVxdWlyZWQiLCJ0b0JlRGVsZXRlZEZpZWxkU3RhdGUiLCJmaWVsZERlbGV0ZUFjdGlvbiIsInJlY2VudEhpc3RvcnlTdGF0ZSIsIm1vY2tGaWVsZDEiLCJtb2NrRmllbGQyIiwibW9ja0ZpZWxkMyIsIm1vY2tTdGF0ZTIiLCJvbGRGaWVsZFN0YXRlIiwiY29sb3IiLCJmaWVsZFVwZGF0ZUFjdGlvbiIsImlzU2FtZSIsInN0YXRlMSIsInN0YXRlMiIsInNhbWVTdGF0ZTEiLCJzYW1lU3RhdGUyIiwic2FtZVN0YXRlMyIsInNhbWVTdGF0ZTQiLCJ0ZW1wbGF0ZUZpZWxkIiwiZmllbGQxIiwiZmllbGQyIiwiZmllbGQzIiwicmVvcmRlckZpZWxkc0FjdGlvbiIsImNyZWF0ZVR5cGUiLCJuYW1lIiwiY3VzdG9tVHlwZXMiLCJpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uIiwiaW52YWxpZDEiLCJpbnZhbGlkMiIsImludmFsaWQzIiwiaW52YWxpZDQiLCJpbnZhbGlkNSIsIlJlbmRlckVkaXRvciIsImludmFsaWQ2Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUlBLEFBQU8sSUFBTUEsT0FBTyxTQUFQQSxJQUFPO1NBQ25CO1VBQ087R0FGWTtDQUFiOztBQUtQLEFBQU8sSUFBTUMseUJBQXlCLFNBQXpCQSxzQkFBeUI7U0FDckM7VUFDTyx3QkFEUDs7R0FEcUM7Q0FBL0I7O0FBT1AsQUFBTyxJQUFNQyxjQUFjLFNBQWRBLFdBQWM7U0FDMUI7VUFDTyxhQURQOztHQUQwQjtDQUFwQjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsZUFBZSxTQUFmQSxZQUFlO1NBQzNCO1VBQ08sY0FEUDs7R0FEMkI7Q0FBckI7O0FBTVAsQUFBTyxJQUFNQyxlQUFlLFNBQWZBLFlBQWU7U0FDM0I7VUFDTyxjQURQOztHQUQyQjtDQUFyQjs7QUFNUCxBQUFPLElBQU1DLGlCQUFpQixTQUFqQkEsY0FBaUI7U0FDN0I7VUFDTyxnQkFEUDs7R0FENkI7Q0FBdkI7O0FBTVAsQUFBTyxJQUFNQyxjQUFjLFNBQWRBLFdBQWM7U0FDMUI7VUFDTyxhQURQOztHQUQwQjtDQUFwQjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQjtTQUM1QjtVQUNPLGVBRFA7O0dBRDRCO0NBQXRCOztBQzFEUDs7QUFFQSxB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QUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztlQUN2RSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3hEO1FBQ0UsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO2VBQ2hFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztlQUNsRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFF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QUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlFLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFGLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxT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QUFhOztBQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7QUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7Ozs7Ozs7QUFRREEsUUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsY0FBYTs7QUFFckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxPQUFPLEVBQUU7RUFDdEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDaEM7O0FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxPQUFPLEVBQUU7RUFDdkMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDakM7Ozs7Ozs7OztBQVNEQSxRQUFNLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxjQUFhOztBQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXO0VBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0VBQzlCOztBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVc7RUFDaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDN0I7Ozs7Ozs7OztBQVNEQSxRQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxjQUFhOztBQUV0QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxD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"} \ No newline at end of file +{"version":3,"file":"fl-form-builder-tests.js","sources":["src/js/Actions.js","src/tests/actions.js","node_modules/seamless-immutable/src/seamless-immutable.js","src/js/utils/asyncDispatchMiddleware.js","src/tests/utils.asyncDispatchMiddleware.js","node_modules/fl-assert/dist/assert.js","node_modules/ramda/src/internal/_isArray.js","node_modules/ramda/src/internal/_checkForMethod.js","node_modules/ramda/src/internal/_isPlaceholder.js","node_modules/ramda/src/internal/_curry1.js","node_modules/ramda/src/internal/_curry2.js","node_modules/ramda/src/internal/_curry3.js","node_modules/ramda/src/slice.js","node_modules/ramda/src/over.js","node_modules/ramda/src/always.js","node_modules/ramda/src/set.js","node_modules/ramda/src/internal/_arity.js","node_modules/ramda/src/internal/_pipe.js","node_modules/ramda/src/internal/_isString.js","node_modules/ramda/src/internal/_isArrayLike.js","node_modules/ramda/src/internal/_xwrap.js","node_modules/ramda/src/bind.js","node_modules/ramda/src/internal/_reduce.js","node_modules/ramda/src/reduce.js","node_modules/ramda/src/tail.js","node_modules/ramda/src/pipe.js","node_modules/ramda/src/internal/_concat.js","node_modules/ramda/src/prepend.js","node_modules/ramda/src/path.js","node_modules/ramda/src/prop.js","node_modules/ramda/src/internal/_isTransformer.js","node_modules/ramda/src/internal/_dispatchable.js","node_modules/ramda/src/internal/_map.js","node_modules/ramda/src/internal/_xfBase.js","node_modules/ramda/src/internal/_xmap.js","node_modules/ramda/src/internal/_curryN.js","node_modules/ramda/src/curryN.js","node_modules/ramda/src/internal/_has.js","node_modules/ramda/src/internal/_isArguments.js","node_modules/ramda/src/keys.js","node_modules/ramda/src/map.js","node_modules/ramda/src/lens.js","node_modules/ramda/src/curry.js","node_modules/data.either/lib/either.js","node_modules/data.either/lib/index.js","src/js/Update/utils.js","src/js/Update/undo.js","node_modules/ramda/src/internal/_identity.js","node_modules/ramda/src/identity.js","node_modules/ramda/src/ap.js","node_modules/ramda/src/reduceRight.js","node_modules/ramda/src/sequence.js","node_modules/ramda/src/traverse.js","node_modules/ramda/src/internal/_arrayFromIterator.js","node_modules/ramda/src/internal/_containsWith.js","node_modules/ramda/src/internal/_functionName.js","node_modules/ramda/src/identical.js","node_modules/ramda/src/type.js","node_modules/ramda/src/internal/_equals.js","node_modules/ramda/src/equals.js","src/js/Update/importState.js","node_modules/ramda/src/internal/_reduced.js","node_modules/ramda/src/internal/_xfind.js","node_modules/ramda/src/find.js","node_modules/data.task/lib/task.js","node_modules/data.task/lib/index.js","src/js/Update/createField.js","node_modules/ramda/src/append.js","node_modules/data.maybe/lib/maybe.js","node_modules/data.maybe/lib/index.js","src/js/Update/fieldCreated.js","src/js/Update/field.toggleConfig.js","src/js/Update/field.toggleRequired.js","node_modules/ramda/src/internal/_filter.js","node_modules/ramda/src/internal/_isObject.js","node_modules/ramda/src/internal/_xfilter.js","node_modules/ramda/src/filter.js","src/js/Update/field.deleteField.js","src/js/Update/field.updateField.js","node_modules/ramda/src/sort.js","src/js/Update/reorderFields.js","src/js/Update/importCustomComponents.js","src/js/Update/index.js","src/tests/update/undo.js","src/tests/update/importState.js","src/tests/update/createField.js","src/tests/update/fieldCreated.js","src/tests/update/field.toggleConfig.js","src/tests/update/field.toggleRequired.js","src/tests/update/field.deleteField.js","src/tests/update/field.updateField.js","src/tests/update/reorderFields.js","src/tests/update/importCustomComponents.js"],"sourcesContent":["//\n// ACTION CREATORS\n//\n\nexport const undo = _ =>\n({\n type: \"undo\",\n});\n\nexport const importCustomComponents = customComponents =>\n({\n type: \"importCustomComponents\",\n customComponents,\n});\n\n\nexport const importState = newFieldsState =>\n({\n type: \"importState\",\n newFieldsState,\n});\n\nexport const createField = fieldType =>\n({\n type: \"createField\",\n fieldType,\n});\n\nexport const fieldCreated = createdFieldState =>\n({\n type: \"fieldCreated\",\n createdFieldState,\n});\n\nexport const toggleConfig = fieldState =>\n({\n type: \"toggleConfig\",\n fieldState,\n});\n\nexport const toggleRequired = fieldState =>\n({\n type: \"toggleRequired\",\n fieldState,\n});\n\nexport const deleteField = fieldState =>\n({\n type: \"deleteField\",\n fieldState,\n});\n\nexport const updateField = newFieldState =>\n({\n type: \"updateField\",\n newFieldState,\n});\n\nexport const reorderFields = newFieldsOrder =>\n({\n type: \"reorderFields\",\n newFieldsOrder,\n});\n","/* eslint-env jasmine */\n\nimport {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n} from \"../js/Actions\";\n\ndescribe(\"Action\", () => {\n describe(\"undo\", () => {\n it(\"returns the correct action type\", () => {\n const action = undo();\n expect(action.type).toEqual(\"undo\");\n });\n });\n\n describe(\"importState\", () => {\n const mockStateToImport = [\"a\", \"b\"];\n\n it(\"returns the correct action type\", () => {\n const action = importState(mockStateToImport);\n expect(action.type).toEqual(\"importState\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importState(mockStateToImport);\n expect(action.newFieldsState).toEqual(mockStateToImport);\n });\n });\n\n describe(\"createField\", () => {\n const fieldType = \"testField\";\n\n it(\"returns the correct action type\", () => {\n const action = createField(fieldType);\n expect(action.type).toEqual(\"createField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = createField(fieldType);\n expect(action.fieldType).toEqual(fieldType);\n });\n });\n\n describe(\"fieldCreated\", () => {\n const createdFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.type).toEqual(\"fieldCreated\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.createdFieldState).toEqual(createdFieldState);\n });\n });\n\n describe(\"toggleConfig\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleConfig(fieldState);\n expect(action.type).toEqual(\"toggleConfig\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleConfig(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"toggleRequired\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleRequired(fieldState);\n expect(action.type).toEqual(\"toggleRequired\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleRequired(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"deleteField\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = deleteField(fieldState);\n expect(action.type).toEqual(\"deleteField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = deleteField(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"updateField\", () => {\n const newFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = updateField(newFieldState);\n expect(action.type).toEqual(\"updateField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = updateField(newFieldState);\n expect(action.newFieldState).toEqual(newFieldState);\n });\n });\n\n describe(\"reorderFields\", () => {\n const newFieldsOrder = {};\n\n it(\"returns the correct action type\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.type).toEqual(\"reorderFields\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.newFieldsOrder).toEqual(newFieldsOrder);\n });\n });\n\n describe(\"importCustomComponents\", () => {\n const customComponents = [];\n\n it(\"returns the correct action type\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.type).toEqual(\"importCustomComponents\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.customComponents).toEqual(customComponents);\n });\n });\n});\n","(function() {\n \"use strict\";\n\nfunction immutableInit(config) {\n\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L21\n var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element');\n var REACT_ELEMENT_TYPE_FALLBACK = 0xeac7;\n\n var globalConfig = {\n use_static: false\n };\n if (isObject(config)) {\n if (config.use_static !== undefined) {\n globalConfig.use_static = Boolean(config.use_static);\n }\n }\n\n function isObject(data) {\n return (\n typeof data === 'object' &&\n !Array.isArray(data) &&\n data !== null\n );\n }\n\n function instantiateEmptyObject(obj) {\n var prototype = Object.getPrototypeOf(obj);\n if (!prototype) {\n return {};\n } else {\n return Object.create(prototype);\n }\n }\n\n function addPropertyTo(target, methodName, value) {\n Object.defineProperty(target, methodName, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: value\n });\n }\n\n function banProperty(target, methodName) {\n addPropertyTo(target, methodName, function() {\n throw new ImmutableError(\"The \" + methodName +\n \" method cannot be invoked on an Immutable data structure.\");\n });\n }\n\n var immutabilityTag = \"__immutable_invariants_hold\";\n\n function addImmutabilityTag(target) {\n addPropertyTo(target, immutabilityTag, true);\n }\n\n function isImmutable(target) {\n if (typeof target === \"object\") {\n return target === null || Boolean(\n Object.getOwnPropertyDescriptor(target, immutabilityTag)\n );\n } else {\n // In JavaScript, only objects are even potentially mutable.\n // strings, numbers, null, and undefined are all naturally immutable.\n return true;\n }\n }\n\n function isEqual(a, b) {\n // Avoid false positives due to (NaN !== NaN) evaluating to true\n return (a === b || (a !== a && b !== b));\n }\n\n function isMergableObject(target) {\n return target !== null && typeof target === \"object\" && !(Array.isArray(target)) && !(target instanceof Date);\n }\n\n var mutatingObjectMethods = [\n \"setPrototypeOf\"\n ];\n\n var nonMutatingObjectMethods = [\n \"keys\"\n ];\n\n var mutatingArrayMethods = mutatingObjectMethods.concat([\n \"push\", \"pop\", \"sort\", \"splice\", \"shift\", \"unshift\", \"reverse\"\n ]);\n\n var nonMutatingArrayMethods = nonMutatingObjectMethods.concat([\n \"map\", \"filter\", \"slice\", \"concat\", \"reduce\", \"reduceRight\"\n ]);\n\n var mutatingDateMethods = mutatingObjectMethods.concat([\n \"setDate\", \"setFullYear\", \"setHours\", \"setMilliseconds\", \"setMinutes\", \"setMonth\", \"setSeconds\",\n \"setTime\", \"setUTCDate\", \"setUTCFullYear\", \"setUTCHours\", \"setUTCMilliseconds\", \"setUTCMinutes\",\n \"setUTCMonth\", \"setUTCSeconds\", \"setYear\"\n ]);\n\n function ImmutableError(message) {\n this.name = 'MyError';\n this.message = message;\n this.stack = (new Error()).stack;\n }\n ImmutableError.prototype = new Error();\n ImmutableError.prototype.constructor = Error;\n\n function makeImmutable(obj, bannedMethods) {\n // Tag it so we can quickly tell it's immutable later.\n addImmutabilityTag(obj);\n\n if (process.env.NODE_ENV !== \"production\") {\n // Make all mutating methods throw exceptions.\n for (var index in bannedMethods) {\n if (bannedMethods.hasOwnProperty(index)) {\n banProperty(obj, bannedMethods[index]);\n }\n }\n\n // Freeze it and return it.\n Object.freeze(obj);\n }\n\n return obj;\n }\n\n function makeMethodReturnImmutable(obj, methodName) {\n var currentMethod = obj[methodName];\n\n addPropertyTo(obj, methodName, function() {\n return Immutable(currentMethod.apply(obj, arguments));\n });\n }\n\n function arraySet(idx, value, config) {\n var deep = config && config.deep;\n\n if (idx in this) {\n if (deep && this[idx] !== value && isMergableObject(value) && isMergableObject(this[idx])) {\n value = Immutable.merge(this[idx], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[idx], value)) {\n return this;\n }\n }\n\n var mutable = asMutableArray.call(this);\n mutable[idx] = Immutable(value);\n return makeImmutableArray(mutable);\n }\n\n var immutableEmptyArray = Immutable([]);\n\n function arraySetIn(pth, value, config) {\n var head = pth[0];\n\n if (pth.length === 1) {\n return arraySet.call(this, head, value, config);\n } else {\n var tail = pth.slice(1);\n var thisHead = this[head];\n var newValue;\n\n if (typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n var nextHead = tail[0];\n // If the next path part is a number, then we are setting into an array, else an object.\n if (nextHead !== '' && isFinite(nextHead)) {\n newValue = arraySetIn.call(immutableEmptyArray, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n }\n\n if (head in this && thisHead === newValue) {\n return this;\n }\n\n var mutable = asMutableArray.call(this);\n mutable[head] = newValue;\n return makeImmutableArray(mutable);\n }\n }\n\n function makeImmutableArray(array) {\n // Don't change their implementations, but wrap these functions to make sure\n // they always return an immutable value.\n for (var index in nonMutatingArrayMethods) {\n if (nonMutatingArrayMethods.hasOwnProperty(index)) {\n var methodName = nonMutatingArrayMethods[index];\n makeMethodReturnImmutable(array, methodName);\n }\n }\n\n if (!globalConfig.use_static) {\n addPropertyTo(array, \"flatMap\", flatMap);\n addPropertyTo(array, \"asObject\", asObject);\n addPropertyTo(array, \"asMutable\", asMutableArray);\n addPropertyTo(array, \"set\", arraySet);\n addPropertyTo(array, \"setIn\", arraySetIn);\n addPropertyTo(array, \"update\", update);\n addPropertyTo(array, \"updateIn\", updateIn);\n addPropertyTo(array, \"getIn\", getIn);\n }\n\n for(var i = 0, length = array.length; i < length; i++) {\n array[i] = Immutable(array[i]);\n }\n\n return makeImmutable(array, mutatingArrayMethods);\n }\n\n function makeImmutableDate(date) {\n if (!globalConfig.use_static) {\n addPropertyTo(date, \"asMutable\", asMutableDate);\n }\n\n return makeImmutable(date, mutatingDateMethods);\n }\n\n function asMutableDate() {\n return new Date(this.getTime());\n }\n\n /**\n * Effectively performs a map() over the elements in the array, using the\n * provided iterator, except that whenever the iterator returns an array, that\n * array's elements are added to the final result instead of the array itself.\n *\n * @param {function} iterator - The iterator function that will be invoked on each element in the array. It will receive three arguments: the current value, the current index, and the current object.\n */\n function flatMap(iterator) {\n // Calling .flatMap() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n var result = [],\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var iteratorResult = iterator(this[index], index, this);\n\n if (Array.isArray(iteratorResult)) {\n // Concatenate Array results into the return value we're building up.\n result.push.apply(result, iteratorResult);\n } else {\n // Handle non-Array results the same way map() does.\n result.push(iteratorResult);\n }\n }\n\n return makeImmutableArray(result);\n }\n\n /**\n * Returns an Immutable copy of the object without the given keys included.\n *\n * @param {array} keysToRemove - A list of strings representing the keys to exclude in the return value. Instead of providing a single array, this method can also be called by passing multiple strings as separate arguments.\n */\n function without(remove) {\n // Calling .without() with no arguments is a no-op. Don't bother cloning.\n if (typeof remove === \"undefined\" && arguments.length === 0) {\n return this;\n }\n\n if (typeof remove !== \"function\") {\n // If we weren't given an array, use the arguments list.\n var keysToRemoveArray = (Array.isArray(remove)) ?\n remove.slice() : Array.prototype.slice.call(arguments);\n\n // Convert numeric keys to strings since that's how they'll\n // come from the enumeration of the object.\n keysToRemoveArray.forEach(function(el, idx, arr) {\n if(typeof(el) === \"number\") {\n arr[idx] = el.toString();\n }\n });\n\n remove = function(val, key) {\n return keysToRemoveArray.indexOf(key) !== -1;\n };\n }\n\n var result = instantiateEmptyObject(this);\n\n for (var key in this) {\n if (this.hasOwnProperty(key) && remove(this[key], key) === false) {\n result[key] = this[key];\n }\n }\n\n return makeImmutableObject(result);\n }\n\n function asMutableArray(opts) {\n var result = [], i, length;\n\n if(opts && opts.deep) {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(asDeepMutable(this[i]));\n }\n } else {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(this[i]);\n }\n }\n\n return result;\n }\n\n /**\n * Effectively performs a [map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) over the elements in the array, expecting that the iterator function\n * will return an array of two elements - the first representing a key, the other\n * a value. Then returns an Immutable Object constructed of those keys and values.\n *\n * @param {function} iterator - A function which should return an array of two elements - the first representing the desired key, the other the desired value.\n */\n function asObject(iterator) {\n // If no iterator was provided, assume the identity function\n // (suggesting this array is already a list of key/value pairs.)\n if (typeof iterator !== \"function\") {\n iterator = function(value) { return value; };\n }\n\n var result = {},\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var pair = iterator(this[index], index, this),\n key = pair[0],\n value = pair[1];\n\n result[key] = value;\n }\n\n return makeImmutableObject(result);\n }\n\n function asDeepMutable(obj) {\n if (\n (!obj) ||\n (typeof obj !== 'object') ||\n (!Object.getOwnPropertyDescriptor(obj, immutabilityTag)) ||\n (obj instanceof Date)\n ) { return obj; }\n return Immutable.asMutable(obj, {deep: true});\n }\n\n function quickCopy(src, dest) {\n for (var key in src) {\n if (Object.getOwnPropertyDescriptor(src, key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n }\n\n /**\n * Returns an Immutable Object containing the properties and values of both\n * this object and the provided object, prioritizing the provided object's\n * values whenever the same key is present in both objects.\n *\n * @param {object} other - The other object to merge. Multiple objects can be passed as an array. In such a case, the later an object appears in that list, the higher its priority.\n * @param {object} config - Optional config object that contains settings. Supported settings are: {deep: true} for deep merge and {merger: mergerFunc} where mergerFunc is a function\n * that takes a property from both objects. If anything is returned it overrides the normal merge behaviour.\n */\n function merge(other, config) {\n // Calling .merge() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (other === null || (typeof other !== \"object\")) {\n throw new TypeError(\"Immutable#merge can only be invoked with objects or arrays, not \" + JSON.stringify(other));\n }\n\n var receivedArray = (Array.isArray(other)),\n deep = config && config.deep,\n mode = config && config.mode || 'merge',\n merger = config && config.merger,\n result;\n\n // Use the given key to extract a value from the given object, then place\n // that value in the result object under the same key. If that resulted\n // in a change from this object's value at that key, set anyChanges = true.\n function addToResult(currentObj, otherObj, key) {\n var immutableValue = Immutable(otherObj[key]);\n var mergerResult = merger && merger(currentObj[key], immutableValue, config);\n var currentValue = currentObj[key];\n\n if ((result !== undefined) ||\n (mergerResult !== undefined) ||\n (!currentObj.hasOwnProperty(key)) ||\n !isEqual(immutableValue, currentValue)) {\n\n var newValue;\n\n if (mergerResult) {\n newValue = mergerResult;\n } else if (deep && isMergableObject(currentValue) && isMergableObject(immutableValue)) {\n newValue = Immutable.merge(currentValue, immutableValue, config);\n } else {\n newValue = immutableValue;\n }\n\n if (!isEqual(currentValue, newValue) || !currentObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n\n result[key] = newValue;\n }\n }\n }\n\n function clearDroppedKeys(currentObj, otherObj) {\n for (var key in currentObj) {\n if (!otherObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n delete result[key];\n }\n }\n }\n\n var key;\n\n // Achieve prioritization by overriding previous values that get in the way.\n if (!receivedArray) {\n // The most common use case: just merge one object into the existing one.\n for (key in other) {\n if (Object.getOwnPropertyDescriptor(other, key)) {\n addToResult(this, other, key);\n }\n }\n if (mode === 'replace') {\n clearDroppedKeys(this, other);\n }\n } else {\n // We also accept an Array\n for (var index = 0, length = other.length; index < length; index++) {\n var otherFromArray = other[index];\n\n for (key in otherFromArray) {\n if (otherFromArray.hasOwnProperty(key)) {\n addToResult(result !== undefined ? result : this, otherFromArray, key);\n }\n }\n }\n }\n\n if (result === undefined) {\n return this;\n } else {\n return makeImmutableObject(result);\n }\n }\n\n function objectReplace(value, config) {\n var deep = config && config.deep;\n\n // Calling .replace() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (value === null || typeof value !== \"object\") {\n throw new TypeError(\"Immutable#replace can only be invoked with objects or arrays, not \" + JSON.stringify(value));\n }\n\n return Immutable.merge(this, value, {deep: deep, mode: 'replace'});\n }\n\n var immutableEmptyObject = Immutable({});\n\n function objectSetIn(path, value, config) {\n if (!(path instanceof Array) || path.length === 0) {\n throw new TypeError(\"The first argument to Immutable#setIn must be an array containing at least one \\\"key\\\" string.\");\n }\n\n var head = path[0];\n if (path.length === 1) {\n return objectSet.call(this, head, value, config);\n }\n\n var tail = path.slice(1);\n var newValue;\n var thisHead = this[head];\n\n if (this.hasOwnProperty(head) && typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n\n if (this.hasOwnProperty(head) && thisHead === newValue) {\n return this;\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[head] = newValue;\n return makeImmutableObject(mutable);\n }\n\n function objectSet(property, value, config) {\n var deep = config && config.deep;\n\n if (this.hasOwnProperty(property)) {\n if (deep && this[property] !== value && isMergableObject(value) && isMergableObject(this[property])) {\n value = Immutable.merge(this[property], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[property], value)) {\n return this;\n }\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[property] = Immutable(value);\n return makeImmutableObject(mutable);\n }\n\n function update(property, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = this[property];\n return Immutable.set(this, property, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getInPath(obj, path) {\n /*jshint eqnull:true */\n for (var i = 0, l = path.length; obj != null && i < l; i++) {\n obj = obj[path[i]];\n }\n\n return (i && i == l) ? obj : undefined;\n }\n\n function updateIn(path, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = getInPath(this, path);\n\n return Immutable.setIn(this, path, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getIn(path, defaultValue) {\n var value = getInPath(this, path);\n return value === undefined ? defaultValue : value;\n }\n\n function asMutableObject(opts) {\n var result = instantiateEmptyObject(this), key;\n\n if(opts && opts.deep) {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = asDeepMutable(this[key]);\n }\n }\n } else {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = this[key];\n }\n }\n }\n\n return result;\n }\n\n // Creates plain object to be used for cloning\n function instantiatePlainObject() {\n return {};\n }\n\n // Finalizes an object with immutable methods, freezes it, and returns it.\n function makeImmutableObject(obj) {\n if (!globalConfig.use_static) {\n addPropertyTo(obj, \"merge\", merge);\n addPropertyTo(obj, \"replace\", objectReplace);\n addPropertyTo(obj, \"without\", without);\n addPropertyTo(obj, \"asMutable\", asMutableObject);\n addPropertyTo(obj, \"set\", objectSet);\n addPropertyTo(obj, \"setIn\", objectSetIn);\n addPropertyTo(obj, \"update\", update);\n addPropertyTo(obj, \"updateIn\", updateIn);\n addPropertyTo(obj, \"getIn\", getIn);\n }\n\n return makeImmutable(obj, mutatingObjectMethods);\n }\n\n // Returns true if object is a valid react element\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L326\n function isReactElement(obj) {\n return typeof obj === 'object' &&\n obj !== null &&\n (obj.$$typeof === REACT_ELEMENT_TYPE_FALLBACK || obj.$$typeof === REACT_ELEMENT_TYPE);\n }\n\n function isFileObject(obj) {\n return typeof File !== 'undefined' &&\n obj instanceof File;\n }\n\n function isPromise(obj) {\n return typeof obj === 'object' &&\n typeof obj.then === 'function';\n }\n\n function isError(obj) {\n return obj instanceof Error;\n }\n\n function Immutable(obj, options, stackRemaining) {\n if (isImmutable(obj) || isReactElement(obj) || isFileObject(obj) || isError(obj)) {\n return obj;\n } else if (isPromise(obj)) {\n return obj.then(Immutable);\n } else if (Array.isArray(obj)) {\n return makeImmutableArray(obj.slice());\n } else if (obj instanceof Date) {\n return makeImmutableDate(new Date(obj.getTime()));\n } else {\n // Don't freeze the object we were given; make a clone and use that.\n var prototype = options && options.prototype;\n var instantiateEmptyObject =\n (!prototype || prototype === Object.prototype) ?\n instantiatePlainObject : (function() { return Object.create(prototype); });\n var clone = instantiateEmptyObject();\n\n if (process.env.NODE_ENV !== \"production\") {\n /*jshint eqnull:true */\n if (stackRemaining == null) {\n stackRemaining = 64;\n }\n if (stackRemaining <= 0) {\n throw new ImmutableError(\"Attempt to construct Immutable from a deeply nested object was detected.\" +\n \" Have you tried to wrap an object with circular references (e.g. React element)?\" +\n \" See https://github.com/rtfeldman/seamless-immutable/wiki/Deeply-nested-object-was-detected for details.\");\n }\n stackRemaining -= 1;\n }\n\n for (var key in obj) {\n if (Object.getOwnPropertyDescriptor(obj, key)) {\n clone[key] = Immutable(obj[key], undefined, stackRemaining);\n }\n }\n\n return makeImmutableObject(clone);\n }\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n function toStatic(fn) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n return fn.apply(self, args);\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object.\n function toStaticObjectOrArray(fnObject, fnArray) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object or a date.\n function toStaticObjectOrDateOrArray(fnObject, fnArray, fnDate) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else if (self instanceof Date) {\n return fnDate.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Export the library\n Immutable.from = Immutable;\n Immutable.isImmutable = isImmutable;\n Immutable.ImmutableError = ImmutableError;\n Immutable.merge = toStatic(merge);\n Immutable.replace = toStatic(objectReplace);\n Immutable.without = toStatic(without);\n Immutable.asMutable = toStaticObjectOrDateOrArray(asMutableObject, asMutableArray, asMutableDate);\n Immutable.set = toStaticObjectOrArray(objectSet, arraySet);\n Immutable.setIn = toStaticObjectOrArray(objectSetIn, arraySetIn);\n Immutable.update = toStatic(update);\n Immutable.updateIn = toStatic(updateIn);\n Immutable.getIn = toStatic(getIn);\n Immutable.flatMap = toStatic(flatMap);\n Immutable.asObject = toStatic(asObject);\n if (!globalConfig.use_static) {\n Immutable.static = immutableInit({\n use_static: true\n });\n }\n\n Object.freeze(Immutable);\n\n return Immutable;\n}\n\n var Immutable = immutableInit();\n /* istanbul ignore if */\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Immutable;\n });\n } else if (typeof module === \"object\") {\n module.exports = Immutable;\n } else if (typeof exports === \"object\") {\n exports.Immutable = Immutable;\n } else if (typeof window === \"object\") {\n window.Immutable = Immutable;\n } else if (typeof global === \"object\") {\n global.Immutable = Immutable;\n }\n})();\n","/* eslint-disable new-cap */\nimport Immutable from \"seamless-immutable\";\n\n// This middleware will just add the property \"async dispatch\"\n// to actions with the \"async\" propperty set to true\nconst asyncDispatchMiddleware = store => next => action => {\n let syncActivityFinished = false;\n let actionQueue = [];\n\n function flushQueue() {\n actionQueue.forEach(a => store.dispatch(a)); // flush queue\n actionQueue = [];\n }\n\n function asyncDispatch(asyncAction) {\n actionQueue = actionQueue.concat([asyncAction]);\n\n if (syncActivityFinished) {\n flushQueue();\n }\n }\n\n const actionWithAsyncDispatch =\n Immutable(action).merge({ asyncDispatch });\n\n next(actionWithAsyncDispatch);\n syncActivityFinished = true;\n flushQueue();\n};\n\nexport default asyncDispatchMiddleware;\n","/* eslint-env jasmine */\nimport asyncDispatchMiddleware from \"../js/utils/asyncDispatchMiddleware\";\n\nconst fakeAction = { type: \"fake action\" };\n\ndescribe(\"The asyncDispatchMiddleware\", () => {\n it(\"calls next with asyncDispatch property\", (done) => {\n const next = returnedAction => {\n expect(returnedAction.asyncDispatch).not.toEqual(undefined);\n expect(typeof returnedAction.asyncDispatch).toEqual(\"function\");\n done();\n };\n\n asyncDispatchMiddleware(\"fakeStore\")(next)(fakeAction);\n });\n\n\n it(\"asyncDispatch triggers a store dispatch\", (done) => {\n const fakeAsyncAction = { type: \"fakeAsyncAction\" };\n\n const fakeStore = {\n dispatch: action => {\n expect(action.type).toEqual(fakeAsyncAction.type);\n done();\n },\n };\n\n const next = returnedAction =>\n returnedAction.asyncDispatch(fakeAsyncAction);\n\n asyncDispatchMiddleware(fakeStore)(next)(fakeAction);\n });\n});\n","// Bug checking function that will throw an error whenever\n// the condition sent to it is evaluated to false\n/**\n * Processes the message and outputs the correct message if the condition\n * is false. Otherwise it outputs null.\n * @api private\n * @method processCondition\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return {String | null} - Error message if there is an error, nul otherwise.\n */\nfunction processCondition(condition, errorMessage) {\n if (!condition) {\n var completeErrorMessage = '';\n var re = /at ([^\\s]+)\\s\\(/g;\n var stackTrace = new Error().stack;\n var stackFunctions = [];\n\n var funcName = re.exec(stackTrace);\n while (funcName && funcName[1]) {\n stackFunctions.push(funcName[1]);\n funcName = re.exec(stackTrace);\n }\n\n // Number 0 is processCondition itself,\n // Number 1 is assert,\n // Number 2 is the caller function.\n if (stackFunctions[2]) {\n completeErrorMessage = stackFunctions[2] + ': ' + completeErrorMessage;\n }\n\n completeErrorMessage += errorMessage;\n return completeErrorMessage;\n }\n\n return null;\n}\n\n/**\n * Throws an error if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert(myDate !== undefined, \"Date cannot be undefined.\");\n * @api public\n * @method assert\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nfunction assert(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n throw new Error(error);\n }\n}\n\n/**\n * Logs a warning if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert.warn(myDate !== undefined, \"No date provided.\");\n * @api public\n * @method warn\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nassert.warn = function warn(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n console.warn(error);\n }\n};\n\nexport default assert;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJhc3NlcnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgbGV0IGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3QgcmUgPSAvYXQgKFteXFxzXSspXFxzXFwoL2c7XG4gICAgY29uc3Qgc3RhY2tUcmFjZSA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICAgIGNvbnN0IHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICBsZXQgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IGAke3N0YWNrRnVuY3Rpb25zWzJdfTogJHtjb21wbGV0ZUVycm9yTWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGNvbnN0IGVycm9yID0gcHJvY2Vzc0NvbmRpdGlvbihjb25kaXRpb24sIGVycm9yTWVzc2FnZSk7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgYSB3YXJuaW5nIGlmIHRoZSBib29sZWFuIHBhc3NlZCB0byBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuXG4gKiBUbyBiZSB1c2VkIGxpa2UgdGhpczpcbiAqIFx0XHRhc3NlcnQud2FybihteURhdGUgIT09IHVuZGVmaW5lZCwgXCJObyBkYXRlIHByb3ZpZGVkLlwiKTtcbiAqIEBhcGkgcHVibGljXG4gKiBAbWV0aG9kIHdhcm5cbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4gdm9pZFxuICovXG5hc3NlcnQud2FybiA9IGZ1bmN0aW9uIHdhcm4oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgY29uc3QgZXJyb3IgPSBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKTtcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3NlcnQ7XG4iXSwiZmlsZSI6ImFzc2VydC5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9\n","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nmodule.exports = Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","var _isArray = /*#__PURE__*/require('./_isArray');\n\n/**\n * This checks whether a function has a [methodname] function. If it isn't an\n * array it will execute that function otherwise it will default to the ramda\n * implementation.\n *\n * @private\n * @param {Function} fn ramda implemtation\n * @param {String} methodname property to check for a custom implementation\n * @return {Object} Whatever the return value of the method is.\n */\n\n\nfunction _checkForMethod(methodname, fn) {\n return function () {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));\n };\n}\nmodule.exports = _checkForMethod;","function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}\nmodule.exports = _isPlaceholder;","var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}\nmodule.exports = _curry1;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}\nmodule.exports = _curry2;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _curry2 = /*#__PURE__*/require('./_curry2');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}\nmodule.exports = _curry3;","var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');\n\nvar _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\n/**\n * Returns the elements of the given list or string (or object with a `slice`\n * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).\n *\n * Dispatches to the `slice` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.4\n * @category List\n * @sig Number -> Number -> [a] -> [a]\n * @sig Number -> Number -> String -> String\n * @param {Number} fromIndex The start index (inclusive).\n * @param {Number} toIndex The end index (exclusive).\n * @param {*} list\n * @return {*}\n * @example\n *\n * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']\n * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c']\n * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(0, 3, 'ramda'); //=> 'ram'\n */\n\n\nvar slice = /*#__PURE__*/_curry3( /*#__PURE__*/_checkForMethod('slice', function slice(fromIndex, toIndex, list) {\n return Array.prototype.slice.call(list, fromIndex, toIndex);\n}));\nmodule.exports = slice;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\n// `Identity` is a functor that holds a single value, where `map` simply\n// transforms the held value with the provided function.\n\n\nvar Identity = function (x) {\n return { value: x, map: function (f) {\n return Identity(f(x));\n } };\n};\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the result of applying the given function to\n * the focused value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> (a -> a) -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var headLens = R.lensIndex(0);\n *\n * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']\n */\nvar over = /*#__PURE__*/_curry3(function over(lens, f, x) {\n // The value returned by the getter function is first transformed with `f`,\n // then set as the value of an `Identity`. This is then mapped over with the\n // setter function of the lens.\n return lens(function (y) {\n return Identity(f(y));\n })(x).value;\n});\nmodule.exports = over;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\n/**\n * Returns a function that always returns the given value. Note that for\n * non-primitives the value returned is a reference to the original value.\n *\n * This function is known as `const`, `constant`, or `K` (for K combinator) in\n * other languages and libraries.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> (* -> a)\n * @param {*} val The value to wrap in a function\n * @return {Function} A Function :: * -> val.\n * @example\n *\n * var t = R.always('Tee');\n * t(); //=> 'Tee'\n */\n\n\nvar always = /*#__PURE__*/_curry1(function always(val) {\n return function () {\n return val;\n };\n});\nmodule.exports = always;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar always = /*#__PURE__*/require('./always');\n\nvar over = /*#__PURE__*/require('./over');\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the given value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> a -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lensProp('x');\n *\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2}\n */\n\n\nvar set = /*#__PURE__*/_curry3(function set(lens, v, x) {\n return over(lens, always(v), x);\n});\nmodule.exports = set;","function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}\nmodule.exports = _arity;","function _pipe(f, g) {\n return function () {\n return g.call(this, f.apply(this, arguments));\n };\n}\nmodule.exports = _pipe;","function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n}\nmodule.exports = _isString;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _isArray = /*#__PURE__*/require('./_isArray');\n\nvar _isString = /*#__PURE__*/require('./_isString');\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @private\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * _isArrayLike([]); //=> true\n * _isArrayLike(true); //=> false\n * _isArrayLike({}); //=> false\n * _isArrayLike({length: 10}); //=> false\n * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\n\n\nvar _isArrayLike = /*#__PURE__*/_curry1(function isArrayLike(x) {\n if (_isArray(x)) {\n return true;\n }\n if (!x) {\n return false;\n }\n if (typeof x !== 'object') {\n return false;\n }\n if (_isString(x)) {\n return false;\n }\n if (x.nodeType === 1) {\n return !!x.length;\n }\n if (x.length === 0) {\n return true;\n }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\nmodule.exports = _isArrayLike;","var XWrap = /*#__PURE__*/function () {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function () {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function (acc) {\n return acc;\n };\n XWrap.prototype['@@transducer/step'] = function (acc, x) {\n return this.f(acc, x);\n };\n\n return XWrap;\n}();\n\nfunction _xwrap(fn) {\n return new XWrap(fn);\n}\nmodule.exports = _xwrap;","var _arity = /*#__PURE__*/require('./internal/_arity');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * var log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n * @symb R.bind(f, o)(a, b) = f.call(o, a, b)\n */\n\n\nvar bind = /*#__PURE__*/_curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function () {\n return fn.apply(thisObj, arguments);\n });\n});\nmodule.exports = bind;","var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');\n\nvar _xwrap = /*#__PURE__*/require('./_xwrap');\n\nvar bind = /*#__PURE__*/require('../bind');\n\nfunction _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _methodReduce(xf, acc, obj, methodName) {\n return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));\n}\n\nvar symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';\n\nfunction _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (_isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list['fantasy-land/reduce'] === 'function') {\n return _methodReduce(fn, acc, list, 'fantasy-land/reduce');\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list, 'reduce');\n }\n\n throw new TypeError('reduce: list must be array or iterable');\n}\nmodule.exports = _reduce;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _reduce = /*#__PURE__*/require('./internal/_reduce');\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * The iterator function receives two values: *(acc, value)*. It may use\n * [`R.reduced`](#reduced) to shortcut the iteration.\n *\n * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function\n * is *(value, acc)*.\n *\n * Note: `R.reduce` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description\n *\n * Dispatches to the `reduce` method of the third argument, if present. When\n * doing so, it is up to the user to handle the [`R.reduced`](#reduced)\n * shortcuting, as this is not implemented by `reduce`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduced, R.addIndex, R.reduceRight\n * @example\n *\n * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10\n * // - -10\n * // / \\ / \\\n * // - 4 -6 4\n * // / \\ / \\\n * // - 3 ==> -3 3\n * // / \\ / \\\n * // - 2 -1 2\n * // / \\ / \\\n * // 0 1 0 1\n *\n * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)\n */\n\n\nvar reduce = /*#__PURE__*/_curry3(_reduce);\nmodule.exports = reduce;","var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');\n\nvar _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\nvar slice = /*#__PURE__*/require('./slice');\n\n/**\n * Returns all but the first element of the given list or string (or object\n * with a `tail` method).\n *\n * Dispatches to the `slice` method of the first argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a]\n * @sig String -> String\n * @param {*} list\n * @return {*}\n * @see R.head, R.init, R.last\n * @example\n *\n * R.tail([1, 2, 3]); //=> [2, 3]\n * R.tail([1, 2]); //=> [2]\n * R.tail([1]); //=> []\n * R.tail([]); //=> []\n *\n * R.tail('abc'); //=> 'bc'\n * R.tail('ab'); //=> 'b'\n * R.tail('a'); //=> ''\n * R.tail(''); //=> ''\n */\n\n\nvar tail = /*#__PURE__*/_curry1( /*#__PURE__*/_checkForMethod('tail', /*#__PURE__*/slice(1, Infinity)));\nmodule.exports = tail;","var _arity = /*#__PURE__*/require('./internal/_arity');\n\nvar _pipe = /*#__PURE__*/require('./internal/_pipe');\n\nvar reduce = /*#__PURE__*/require('./reduce');\n\nvar tail = /*#__PURE__*/require('./tail');\n\n/**\n * Performs left-to-right function composition. The leftmost function may have\n * any arity; the remaining functions must be unary.\n *\n * In some libraries this function is named `sequence`.\n *\n * **Note:** The result of pipe is not automatically curried.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)\n * @param {...Function} functions\n * @return {Function}\n * @see R.compose\n * @example\n *\n * var f = R.pipe(Math.pow, R.negate, R.inc);\n *\n * f(3, 4); // -(3^4) + 1\n * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b)))\n */\n\n\nfunction pipe() {\n if (arguments.length === 0) {\n throw new Error('pipe requires at least one argument');\n }\n return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments)));\n}\nmodule.exports = pipe;","/**\n * Private `concat` function to merge two array-like objects.\n *\n * @private\n * @param {Array|Arguments} [set1=[]] An array-like object.\n * @param {Array|Arguments} [set2=[]] An array-like object.\n * @return {Array} A new, merged array.\n * @example\n *\n * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n */\nfunction _concat(set1, set2) {\n set1 = set1 || [];\n set2 = set2 || [];\n var idx;\n var len1 = set1.length;\n var len2 = set2.length;\n var result = [];\n\n idx = 0;\n while (idx < len1) {\n result[result.length] = set1[idx];\n idx += 1;\n }\n idx = 0;\n while (idx < len2) {\n result[result.length] = set2[idx];\n idx += 1;\n }\n return result;\n}\nmodule.exports = _concat;","var _concat = /*#__PURE__*/require('./internal/_concat');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Returns a new list with the given element at the front, followed by the\n * contents of the list.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The item to add to the head of the output list.\n * @param {Array} list The array to add to the tail of the output list.\n * @return {Array} A new array.\n * @see R.append\n * @example\n *\n * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']\n */\n\n\nvar prepend = /*#__PURE__*/_curry2(function prepend(el, list) {\n return _concat([el], list);\n});\nmodule.exports = prepend;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Retrieve the value at a given path.\n *\n * @func\n * @memberOf R\n * @since v0.2.0\n * @category Object\n * @typedefn Idx = String | Int\n * @sig [Idx] -> {a} -> a | Undefined\n * @param {Array} path The path to use.\n * @param {Object} obj The object to retrieve the nested property from.\n * @return {*} The data at `path`.\n * @see R.prop\n * @example\n *\n * R.path(['a', 'b'], {a: {b: 2}}); //=> 2\n * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined\n */\n\n\nvar path = /*#__PURE__*/_curry2(function path(paths, obj) {\n var val = obj;\n var idx = 0;\n while (idx < paths.length) {\n if (val == null) {\n return;\n }\n val = val[paths[idx]];\n idx += 1;\n }\n return val;\n});\nmodule.exports = path;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar path = /*#__PURE__*/require('./path');\n\n/**\n * Returns a function that when supplied an object returns the indicated\n * property of that object, if it exists.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig s -> {s: a} -> a | Undefined\n * @param {String} p The property name\n * @param {Object} obj The object to query\n * @return {*} The value at `obj.p`.\n * @see R.path\n * @example\n *\n * R.prop('x', {x: 100}); //=> 100\n * R.prop('x', {}); //=> undefined\n */\n\nvar prop = /*#__PURE__*/_curry2(function prop(p, obj) {\n return path([p], obj);\n});\nmodule.exports = prop;","function _isTransformer(obj) {\n return typeof obj['@@transducer/step'] === 'function';\n}\nmodule.exports = _isTransformer;","var _isArray = /*#__PURE__*/require('./_isArray');\n\nvar _isTransformer = /*#__PURE__*/require('./_isTransformer');\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with one of the given method names, it will\n * execute that function (functor case). Otherwise, if it is a transformer,\n * uses transducer [xf] to return a new transformer (transducer case).\n * Otherwise, it will default to executing [fn].\n *\n * @private\n * @param {Array} methodNames properties to check for a custom implementation\n * @param {Function} xf transducer to initialize if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\n\n\nfunction _dispatchable(methodNames, xf, fn) {\n return function () {\n if (arguments.length === 0) {\n return fn();\n }\n var args = Array.prototype.slice.call(arguments, 0);\n var obj = args.pop();\n if (!_isArray(obj)) {\n var idx = 0;\n while (idx < methodNames.length) {\n if (typeof obj[methodNames[idx]] === 'function') {\n return obj[methodNames[idx]].apply(obj, args);\n }\n idx += 1;\n }\n if (_isTransformer(obj)) {\n var transducer = xf.apply(null, args);\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n}\nmodule.exports = _dispatchable;","function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n}\nmodule.exports = _map;","module.exports = {\n init: function () {\n return this.xf['@@transducer/init']();\n },\n result: function (result) {\n return this.xf['@@transducer/result'](result);\n }\n};","var _curry2 = /*#__PURE__*/require('./_curry2');\n\nvar _xfBase = /*#__PURE__*/require('./_xfBase');\n\nvar XMap = /*#__PURE__*/function () {\n\n function XMap(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XMap.prototype['@@transducer/init'] = _xfBase.init;\n XMap.prototype['@@transducer/result'] = _xfBase.result;\n XMap.prototype['@@transducer/step'] = function (result, input) {\n return this.xf['@@transducer/step'](result, this.f(input));\n };\n\n return XMap;\n}();\n\nvar _xmap = /*#__PURE__*/_curry2(function _xmap(f, xf) {\n return new XMap(f, xf);\n});\nmodule.exports = _xmap;","var _arity = /*#__PURE__*/require('./_arity');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curryN(length, received, fn) {\n return function () {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));\n };\n}\nmodule.exports = _curryN;","var _arity = /*#__PURE__*/require('./internal/_arity');\n\nvar _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar _curryN = /*#__PURE__*/require('./internal/_curryN');\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * var sumArgs = (...args) => R.sum(args);\n *\n * var curriedAddFourNumbers = R.curryN(4, sumArgs);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\n\n\nvar curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\nmodule.exports = curryN;","function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nmodule.exports = _has;","var _has = /*#__PURE__*/require('./_has');\n\nvar toString = Object.prototype.toString;\nvar _isArguments = function () {\n return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {\n return toString.call(x) === '[object Arguments]';\n } : function _isArguments(x) {\n return _has('callee', x);\n };\n};\n\nmodule.exports = _isArguments;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\nvar _has = /*#__PURE__*/require('./internal/_has');\n\nvar _isArguments = /*#__PURE__*/require('./internal/_isArguments');\n\n// cover IE < 9 keys issues\n\n\nvar hasEnumBug = ! /*#__PURE__*/{ toString: null }.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n// Safari bug\nvar hasArgsEnumBug = /*#__PURE__*/function () {\n 'use strict';\n\n return arguments.propertyIsEnumerable('length');\n}();\n\nvar contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n};\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @see R.keysIn, R.values\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nvar _keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n} : function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n};\nvar keys = /*#__PURE__*/_curry1(_keys);\nmodule.exports = keys;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');\n\nvar _map = /*#__PURE__*/require('./internal/_map');\n\nvar _reduce = /*#__PURE__*/require('./internal/_reduce');\n\nvar _xmap = /*#__PURE__*/require('./internal/_xmap');\n\nvar curryN = /*#__PURE__*/require('./curryN');\n\nvar keys = /*#__PURE__*/require('./keys');\n\n/**\n * Takes a function and\n * a [functor](https://github.com/fantasyland/fantasy-land#functor),\n * applies the function to each of the functor's values, and returns\n * a functor of the same shape.\n *\n * Ramda provides suitable `map` implementations for `Array` and `Object`,\n * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.\n *\n * Dispatches to the `map` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * Also treats functions as functors and will compose them together.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => (a -> b) -> f a -> f b\n * @param {Function} fn The function to be called on every element of the input `list`.\n * @param {Array} list The list to be iterated over.\n * @return {Array} The new list.\n * @see R.transduce, R.addIndex\n * @example\n *\n * var double = x => x * 2;\n *\n * R.map(double, [1, 2, 3]); //=> [2, 4, 6]\n *\n * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}\n * @symb R.map(f, [a, b]) = [f(a), f(b)]\n * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }\n * @symb R.map(f, functor_o) = functor_o.map(f)\n */\n\n\nvar map = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {\n switch (Object.prototype.toString.call(functor)) {\n case '[object Function]':\n return curryN(functor.length, function () {\n return fn.call(this, functor.apply(this, arguments));\n });\n case '[object Object]':\n return _reduce(function (acc, key) {\n acc[key] = fn(functor[key]);\n return acc;\n }, {}, keys(functor));\n default:\n return _map(fn, functor);\n }\n}));\nmodule.exports = map;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar map = /*#__PURE__*/require('./map');\n\n/**\n * Returns a lens for the given getter and setter functions. The getter \"gets\"\n * the value of the focus; the setter \"sets\" the value of the focus. The setter\n * should not mutate the data structure.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig (s -> a) -> ((a, s) -> s) -> Lens s a\n * @param {Function} getter\n * @param {Function} setter\n * @return {Lens}\n * @see R.view, R.set, R.over, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lens(R.prop('x'), R.assoc('x'));\n *\n * R.view(xLens, {x: 1, y: 2}); //=> 1\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2}\n */\n\n\nvar lens = /*#__PURE__*/_curry2(function lens(getter, setter) {\n return function (toFunctorFn) {\n return function (target) {\n return map(function (focus) {\n return setter(focus, target);\n }, toFunctorFn(getter(target)));\n };\n };\n});\nmodule.exports = lens;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\nvar curryN = /*#__PURE__*/require('./curryN');\n\n/**\n * Returns a curried equivalent of the provided function. The curried function\n * has two unusual capabilities. First, its arguments needn't be provided one\n * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (* -> a) -> (* -> a)\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curryN\n * @example\n *\n * var addFourNumbers = (a, b, c, d) => a + b + c + d;\n *\n * var curriedAddFourNumbers = R.curry(addFourNumbers);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\n\n\nvar curry = /*#__PURE__*/_curry1(function curry(fn) {\n return curryN(fn.length, fn);\n});\nmodule.exports = curry;","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/either\n */\nmodule.exports = Either\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Either(a, b)` structure represents the logical disjunction between `a`\n * and `b`. In other words, `Either` may contain either a value of type `a` or\n * a value of type `b`, at any given time. This particular implementation is\n * biased on the right value (`b`), thus projections will take the right value\n * over the left one.\n *\n * This class models two different cases: `Left a` and `Right b`, and can hold\n * one of the cases at any given time. The projections are, none the less,\n * biased for the `Right` case, thus a common use case for this structure is to\n * hold the results of computations that may fail, when you want to store\n * additional information on the failure (instead of throwing an exception).\n *\n * Furthermore, the values of `Either(a, b)` can be combined and manipulated by\n * using the expressive monadic operations. This allows safely sequencing\n * operations that may fail, and safely composing values that you don't know\n * whether they're present or not, failing early (returning a `Left a`) if any\n * of the operations fail.\n *\n * While this class can certainly model input validations, the [Validation][]\n * structure lends itself better to that use case, since it can naturally\n * aggregate failures — monads shortcut on the first failure.\n *\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n * @summary\n * Either[α, β] <: Applicative[β]\n * , Functor[β]\n * , Chain[β]\n * , Show\n * , Eq\n */\nfunction Either() { }\n\nLeft.prototype = clone(Either.prototype)\nfunction Left(a) {\n this.value = a\n}\n\nRight.prototype = clone(Either.prototype)\nfunction Right(a) {\n this.value = a\n}\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Left` value. This\n * usually represents a failure due to the right-bias of this structure.\n *\n * @summary a → Either[α, β]\n */\nEither.Left = function(a) {\n return new Left(a)\n}\nEither.prototype.Left = Either.Left\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Right` value. This\n * usually represents a successful value due to the right bias of this\n * structure.\n *\n * @summary β → Either[α, β]\n */\nEither.Right = function(a) {\n return new Right(a)\n}\nEither.prototype.Right = Either.Right\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure from a nullable type.\n *\n * Takes the `Left` case if the value is `null` or `undefined`. Takes the\n * `Right` case otherwise.\n *\n * @summary α → Either[α, α]\n */\nEither.fromNullable = function(a) {\n return a != null? new Right(a)\n : /* otherwise */ new Left(a)\n}\nEither.prototype.fromNullable = Either.fromNullable\n\n/**\n * Constructs a new `Either[α, β]` structure from a `Validation[α, β]` type.\n *\n * @summary Validation[α, β] → Either[α, β]\n */\nEither.fromValidation = function(a) {\n return a.fold(Either.Left, Either.Right)\n}\n\n/**\n * Executes a synchronous computation that may throw and converts it to an\n * Either type.\n *\n * @summary (α₁, α₂, ..., αₙ -> β :: throws γ) -> (α₁, α₂, ..., αₙ -> Either[γ, β])\n */\nEither.try = function(f) {\n return function() {\n try {\n return new Right(f.apply(null, arguments))\n } catch(e) {\n return new Left(e)\n }\n }\n}\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Either[α, β]` contains a `Left` value.\n *\n * @summary Boolean\n */\nEither.prototype.isLeft = false\nLeft.prototype.isLeft = true\n\n/**\n * True if the `Either[α, β]` contains a `Right` value.\n *\n * @summary Boolean\n */\nEither.prototype.isRight = false\nRight.prototype.isRight = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Either[α, β]` instance holding the `Right` value `b`.\n *\n * `b` can be any value, including `null`, `undefined` or another\n * `Either[α, β]` structure.\n *\n * @summary β → Either[α, β]\n */\nEither.of = function(a) {\n return new Right(a)\n}\nEither.prototype.of = Either.of\n\n\n/**\n * Applies the function inside the `Right` case of the `Either[α, β]` structure\n * to another applicative type.\n *\n * The `Either[α, β]` should contain a function value, otherwise a `TypeError`\n * is thrown.\n *\n * @method\n * @summary (@Either[α, β → γ], f:Applicative[_]) => f[β] → f[γ]\n */\nEither.prototype.ap = unimplemented\n\nLeft.prototype.ap = function(b) {\n return this\n}\n\nRight.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using a regular\n * unary function.\n *\n * @method\n * @summary (@Either[α, β]) => (β → γ) → Either[α, γ]\n */\nEither.prototype.map = unimplemented\nLeft.prototype.map = noop\n\nRight.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using an unary\n * function to monads.\n *\n * @method\n * @summary (@Either[α, β], m:Monad[_]) => (β → m[γ]) → m[γ]\n */\nEither.prototype.chain = unimplemented\nLeft.prototype.chain = noop\n\nRight.prototype.chain = function(f) {\n return f(this.value)\n}\n\n// -- Semigroup ----------------------------------------------------------\n\n/**\n * Concats the `Right` value of the `Either[α, β]` structure with another `Right` or keeps the `Left` on either side\n *\n * @method\n * @summary (@Either[α, m:Monoid]) => Either[β, m] → Either[α, m]\n */\nEither.prototype.concat = unimplemented\n\nLeft.prototype.concat = function(other) {\n return this\n}\n\nRight.prototype.concat = function(other) {\n var that = this\n return other.fold(function(_){\n return other\n },\n function(y) {\n return that.Right(that.value.concat(y))\n })\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Either[α, β]` structure.\n *\n * @method\n * @summary (@Either[α, β]) => Void → String\n */\nEither.prototype.toString = unimplemented\n\nLeft.prototype.toString = function() {\n return 'Either.Left(' + this.value + ')'\n}\n\nRight.prototype.toString = function() {\n return 'Either.Right(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if an `Either[α, β]` structure is equal to another `Either[α, β]`\n * structure.\n *\n * @method\n * @summary (@Either[α, β]) => Either[α, β] → Boolean\n */\nEither.prototype.isEqual = unimplemented\n\nLeft.prototype.isEqual = function(a) {\n return a.isLeft && (a.value === this.value)\n}\n\nRight.prototype.isEqual = function(a) {\n return a.isRight && (a.value === this.value)\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary (@Either[α, β]) => Void → β :: partial, throws\n * @see {@link module:lib/either~Either#getOrElse} — A getter that can handle failures.\n * @see {@link module:lib/either~Either#merge} — The convergence of both values.\n * @throws {TypeError} if the structure has no `Right` value.\n */\nEither.prototype.get = unimplemented\n\nLeft.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Left(a).\")\n}\n\nRight.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure. If the\n * structure doesn't have a `Right` value, returns the given default.\n *\n * @method\n * @summary (@Either[α, β]) => β → β\n */\nEither.prototype.getOrElse = unimplemented\n\nLeft.prototype.getOrElse = function(a) {\n return a\n}\n\nRight.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a `Left` value into a new `Either[α, β]` structure. Does nothing\n * if the structure contain a `Right` value.\n *\n * @method\n * @summary (@Either[α, β]) => (α → Either[γ, β]) → Either[γ, β]\n */\nEither.prototype.orElse = unimplemented\nRight.prototype.orElse = noop\n\nLeft.prototype.orElse = function(f) {\n return f(this.value)\n}\n\n\n/**\n * Returns the value of whichever side of the disjunction that is present.\n *\n * @summary (@Either[α, α]) => Void → α\n */\nEither.prototype.merge = function() {\n return this.value\n}\n\n\n// -- Folds and Extended Transformations -------------------------------\n\n/**\n * Applies a function to each case in this data structure.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → γ) → γ\n */\nEither.prototype.fold = unimplemented\n\nLeft.prototype.fold = function(f, _) {\n return f(this.value)\n}\n\nRight.prototype.fold = function(_, g) {\n return g(this.value)\n}\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary (@Either[α, β]) => { Left: α → γ, Right: β → γ } → γ\n */\nEither.prototype.cata = unimplemented\n\nLeft.prototype.cata = function(pattern) {\n return pattern.Left(this.value)\n}\n\nRight.prototype.cata = function(pattern) {\n return pattern.Right(this.value)\n}\n\n\n/**\n * Swaps the disjunction values.\n *\n * @method\n * @summary (@Either[α, β]) => Void → Either[β, α]\n */\nEither.prototype.swap = unimplemented\n\nLeft.prototype.swap = function() {\n return this.Right(this.value)\n}\n\nRight.prototype.swap = function() {\n return this.Left(this.value)\n}\n\n\n/**\n * Maps both sides of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → δ) → Either[γ, δ]\n */\nEither.prototype.bimap = unimplemented\n\nLeft.prototype.bimap = function(f, _) {\n return this.Left(f(this.value))\n}\n\nRight.prototype.bimap = function(_, g) {\n return this.Right(g(this.value))\n}\n\n\n/**\n * Maps the left side of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ) → Either[γ, β]\n */\nEither.prototype.leftMap = unimplemented\nRight.prototype.leftMap = noop\n\nLeft.prototype.leftMap = function(f) {\n return this.Left(f(this.value))\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./either')","/* eslint-disable new-cap */\n\nimport Immutable from \"seamless-immutable\";\nimport { curry, lens, prop, prepend, over, set, pipe } from \"ramda\";\nimport Either from \"data.either\";\n\nexport const updateAt = curry((keyArray, newVal, obj) => {\n const deepNewVal = keyArray.reduceRight(\n (result, key) => ({ [key]: result })\n , newVal\n );\n\n return Immutable(obj).merge(deepNewVal, { deep: true });\n});\n\n// State lenses\nexport const StateLenses = {\n fieldTypes: lens(prop(\"fieldTypes\"), updateAt([\"fieldTypes\"])),\n fieldsState: lens(prop(\"fieldsState\"), updateAt([\"fieldsState\"])),\n fieldsStateHistory: lens(prop(\"fieldsStateHistory\"), updateAt([\"fieldsStateHistory\"])),\n};\n\n// _ => String\nexport const createId = _ =>\n (Date.now() + Math.random()).toString();\n\n// State -> [fieldsState] -> State\nexport const pushHistoryState = curry((state, newHistoryState) => pipe(\n // Add current state to history\n over(StateLenses.fieldsStateHistory, prepend(state.fieldsState)),\n // Make new State the current\n set(StateLenses.fieldsState, newHistoryState)\n)(state));\n\n\n// State -> State\nexport const hideConfigs = state =>\n set(\n StateLenses.fieldsState,\n state.fieldsState.map(s => Object.assign({}, s, { configShowing: false })),\n state\n );\n\n\n// String -> String -> Object -> Either String Object\nexport const propertyTypeCheck = curry((propertyName, type, obj) =>\n typeof obj[propertyName] === type\n ? Either.Right(obj)\n : Either.Left(`Property '${propertyName}' cannot be of type ${typeof obj[propertyName]}`)\n);\n\n// Checks that a field has its essential properties\n// Object -> Either String Object\nexport const validateField = fieldState =>\n Either.fromNullable(fieldState)\n .leftMap(fs => `A field State cannot be empty ${typeof fs}`)\n .chain(propertyTypeCheck(\"required\", \"boolean\"))\n .chain(propertyTypeCheck(\"configShowing\", \"boolean\"))\n .chain(propertyTypeCheck(\"id\", \"string\"));\n","import { StateLenses } from \"./utils\";\nimport { set, over, slice, pipe } from \"ramda\";\n\nconst lastHistoryState = state =>\n state.fieldsStateHistory[0] || [];\n\nconst undo = (state, _) => pipe(\n // Make last history last state the current one\n set(StateLenses.fieldsState, lastHistoryState(state)),\n // Remove last history state from the history array\n over(StateLenses.fieldsStateHistory, slice(1, Infinity))\n)(state);\n\nexport default undo;\n","function _identity(x) {\n return x;\n}\nmodule.exports = _identity;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\nvar _identity = /*#__PURE__*/require('./internal/_identity');\n\n/**\n * A function that does nothing but return the parameter supplied to it. Good\n * as a default or placeholder function.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> a\n * @param {*} x The value to return.\n * @return {*} The input value, `x`.\n * @example\n *\n * R.identity(1); //=> 1\n *\n * var obj = {};\n * R.identity(obj) === obj; //=> true\n * @symb R.identity(a) = a\n */\n\n\nvar identity = /*#__PURE__*/_curry1(_identity);\nmodule.exports = identity;","var _concat = /*#__PURE__*/require('./internal/_concat');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar _reduce = /*#__PURE__*/require('./internal/_reduce');\n\nvar map = /*#__PURE__*/require('./map');\n\n/**\n * ap applies a list of functions to a list of values.\n *\n * Dispatches to the `ap` method of the second argument, if present. Also\n * treats curried functions as applicatives.\n *\n * @func\n * @memberOf R\n * @since v0.3.0\n * @category Function\n * @sig [a -> b] -> [a] -> [b]\n * @sig Apply f => f (a -> b) -> f a -> f b\n * @sig (a -> b -> c) -> (a -> b) -> (a -> c)\n * @param {*} applyF\n * @param {*} applyX\n * @return {*}\n * @example\n *\n * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]\n * R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> [\"tasty pizza\", \"tasty salad\", \"PIZZA\", \"SALAD\"]\n *\n * // R.ap can also be used as S combinator\n * // when only two functions are passed\n * R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA'\n * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)]\n */\n\n\nvar ap = /*#__PURE__*/_curry2(function ap(applyF, applyX) {\n return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) {\n return applyF(x)(applyX(x));\n } :\n // else\n _reduce(function (acc, f) {\n return _concat(acc, map(f, applyX));\n }, [], applyF);\n});\nmodule.exports = ap;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * Similar to [`reduce`](#reduce), except moves through the input list from the\n * right to the left.\n *\n * The iterator function receives two values: *(value, acc)*, while the arguments'\n * order of `reduce`'s iterator function is *(acc, value)*.\n *\n * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduceRight` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> b) -> b -> [a] -> b\n * @param {Function} fn The iterator function. Receives two values, the current element from the array\n * and the accumulator.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduce, R.addIndex\n * @example\n *\n * R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2\n * // - -2\n * // / \\ / \\\n * // 1 - 1 3\n * // / \\ / \\\n * // 2 - ==> 2 -1\n * // / \\ / \\\n * // 3 - 3 4\n * // / \\ / \\\n * // 4 0 4 0\n *\n * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a)))\n */\n\n\nvar reduceRight = /*#__PURE__*/_curry3(function reduceRight(fn, acc, list) {\n var idx = list.length - 1;\n while (idx >= 0) {\n acc = fn(list[idx], acc);\n idx -= 1;\n }\n return acc;\n});\nmodule.exports = reduceRight;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar ap = /*#__PURE__*/require('./ap');\n\nvar map = /*#__PURE__*/require('./map');\n\nvar prepend = /*#__PURE__*/require('./prepend');\n\nvar reduceRight = /*#__PURE__*/require('./reduceRight');\n\n/**\n * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)\n * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an\n * Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the second argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)\n * @param {Function} of\n * @param {*} traversable\n * @return {*}\n * @see R.traverse\n * @example\n *\n * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3])\n * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()\n *\n * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]\n * R.sequence(R.of, Nothing()); //=> [Nothing()]\n */\n\n\nvar sequence = /*#__PURE__*/_curry2(function sequence(of, traversable) {\n return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (x, acc) {\n return ap(map(prepend, x), acc);\n }, of([]), traversable);\n});\nmodule.exports = sequence;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar map = /*#__PURE__*/require('./map');\n\nvar sequence = /*#__PURE__*/require('./sequence');\n\n/**\n * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning\n * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),\n * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative\n * into an Applicative of Traversable.\n *\n * Dispatches to the `traverse` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)\n * @param {Function} of\n * @param {Function} f\n * @param {*} traversable\n * @return {*}\n * @see R.sequence\n * @example\n *\n * // Returns `Nothing` if the given divisor is `0`\n * safeDiv = n => d => d === 0 ? Nothing() : Just(n / d)\n *\n * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Just([5, 2.5, 2])\n * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Nothing\n */\n\n\nvar traverse = /*#__PURE__*/_curry3(function traverse(of, f, traversable) {\n return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](f, of) : sequence(of, map(f, traversable));\n});\nmodule.exports = traverse;","function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n}\nmodule.exports = _arrayFromIterator;","function _containsWith(pred, x, list) {\n var idx = 0;\n var len = list.length;\n\n while (idx < len) {\n if (pred(x, list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}\nmodule.exports = _containsWith;","function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n}\nmodule.exports = _functionName;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Returns true if its arguments are identical, false otherwise. Values are\n * identical if they reference the same memory. `NaN` is identical to `NaN`;\n * `0` and `-0` are not identical.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> a -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * var o = {};\n * R.identical(o, o); //=> true\n * R.identical(1, 1); //=> true\n * R.identical(1, '1'); //=> false\n * R.identical([], []); //=> false\n * R.identical(0, -0); //=> false\n * R.identical(NaN, NaN); //=> true\n */\n\n\nvar identical = /*#__PURE__*/_curry2(function identical(a, b) {\n // SameValue algorithm\n if (a === b) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n});\nmodule.exports = identical;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(undefined); //=> \"Undefined\"\n */\n\n\nvar type = /*#__PURE__*/_curry1(function type(val) {\n return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);\n});\nmodule.exports = type;","var _arrayFromIterator = /*#__PURE__*/require('./_arrayFromIterator');\n\nvar _containsWith = /*#__PURE__*/require('./_containsWith');\n\nvar _functionName = /*#__PURE__*/require('./_functionName');\n\nvar _has = /*#__PURE__*/require('./_has');\n\nvar identical = /*#__PURE__*/require('../identical');\n\nvar keys = /*#__PURE__*/require('../keys');\n\nvar type = /*#__PURE__*/require('../type');\n\n/**\n * private _uniqContentEquals function.\n * That function is checking equality of 2 iterator contents with 2 assumptions\n * - iterators lengths are the same\n * - iterators values are unique\n *\n * false-positive result will be returned for comparision of, e.g.\n * - [1,2,3] and [1,2,3,4]\n * - [1,1,1] and [1,2,3]\n * */\n\nfunction _uniqContentEquals(aIterator, bIterator, stackA, stackB) {\n var a = _arrayFromIterator(aIterator);\n var b = _arrayFromIterator(bIterator);\n\n function eq(_a, _b) {\n return _equals(_a, _b, stackA.slice(), stackB.slice());\n }\n\n // if *a* array contains any element that is not included in *b*\n return !_containsWith(function (b, aItem) {\n return !_containsWith(eq, aItem, b);\n }, b, a);\n}\n\nfunction _equals(a, b, stackA, stackB) {\n if (identical(a, b)) {\n return true;\n }\n\n var typeA = type(a);\n\n if (typeA !== type(b)) {\n return false;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {\n return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);\n }\n\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);\n }\n\n switch (typeA) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!identical(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {\n return false;\n }\n break;\n }\n\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n\n switch (typeA) {\n case 'Map':\n if (a.size !== b.size) {\n return false;\n }\n\n return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));\n case 'Set':\n if (a.size !== b.size) {\n return false;\n }\n\n return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));\n case 'Arguments':\n case 'Array':\n case 'Object':\n case 'Boolean':\n case 'Number':\n case 'String':\n case 'Date':\n case 'Error':\n case 'RegExp':\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n\n var extendedStackA = stackA.concat([a]);\n var extendedStackB = stackB.concat([b]);\n\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {\n return false;\n }\n idx -= 1;\n }\n return true;\n}\nmodule.exports = _equals;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar _equals = /*#__PURE__*/require('./internal/_equals');\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * var a = {}; a.v = a;\n * var b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\n\n\nvar equals = /*#__PURE__*/_curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\nmodule.exports = equals;","/* @flow weak */\n/* eslint-disable new-cap */\nimport { pushHistoryState, createId } from \"./utils\";\nimport { curry, equals, traverse, identity, path } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Invalid states sent with importState. Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\nconst fieldTypeIsValid = curry((validTypes, field) =>\n validTypes.find(equals(field.type))\n ? Either.Right(field)\n : Either.Left(`Invalid field type ${field.type}`)\n);\n\nconst validFieldTypes = curry((validTypes, fieldsState) =>\n traverse(Either.of, fieldTypeIsValid(validTypes), fieldsState)\n);\n\n\n// [a] -> [a] -> Either String [a]\nconst validateFieldsState = curry((fieldsState, state) =>\n Either.of(fieldsState)\n .chain(isArray)\n .chain(validFieldTypes(state.fieldTypes.map(path([\"info\", \"type\"]))))\n);\n\n\n// Add required properties that are not managed by the field\n// component but by the FormBuilder component itself, so may\n// not be there.\n// [a] => [a]\nconst addRequiredProperties = fieldStates =>\n fieldStates\n .map(s => Object.assign(\n {\n configShowing: false,\n required: false,\n },\n s,\n { id: createId() }\n ));\n\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { newFieldsState }) =>\n validateFieldsState(newFieldsState, state)\n .map(addRequiredProperties)\n .map(pushHistoryState(state))\n .bimap(console.error, identity)\n .getOrElse(state);\n","function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x : {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n}\nmodule.exports = _reduced;","var _curry2 = /*#__PURE__*/require('./_curry2');\n\nvar _reduced = /*#__PURE__*/require('./_reduced');\n\nvar _xfBase = /*#__PURE__*/require('./_xfBase');\n\nvar XFind = /*#__PURE__*/function () {\n\n function XFind(f, xf) {\n this.xf = xf;\n this.f = f;\n this.found = false;\n }\n XFind.prototype['@@transducer/init'] = _xfBase.init;\n XFind.prototype['@@transducer/result'] = function (result) {\n if (!this.found) {\n result = this.xf['@@transducer/step'](result, void 0);\n }\n return this.xf['@@transducer/result'](result);\n };\n XFind.prototype['@@transducer/step'] = function (result, input) {\n if (this.f(input)) {\n this.found = true;\n result = _reduced(this.xf['@@transducer/step'](result, input));\n }\n return result;\n };\n\n return XFind;\n}();\n\nvar _xfind = /*#__PURE__*/_curry2(function _xfind(f, xf) {\n return new XFind(f, xf);\n});\nmodule.exports = _xfind;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');\n\nvar _xfind = /*#__PURE__*/require('./internal/_xfind');\n\n/**\n * Returns the first element of the list which matches the predicate, or\n * `undefined` if no element matches.\n *\n * Dispatches to the `find` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> a | undefined\n * @param {Function} fn The predicate function used to determine if the element is the\n * desired one.\n * @param {Array} list The array to consider.\n * @return {Object} The element found, or `undefined`.\n * @see R.transduce\n * @example\n *\n * var xs = [{a: 1}, {a: 2}, {a: 3}];\n * R.find(R.propEq('a', 2))(xs); //=> {a: 2}\n * R.find(R.propEq('a', 4))(xs); //=> undefined\n */\n\n\nvar find = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['find'], _xfind, function find(fn, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n if (fn(list[idx])) {\n return list[idx];\n }\n idx += 1;\n }\n}));\nmodule.exports = find;","'use strict';\n\n\n/**\n * A helper for delaying the execution of a function.\n * @private\n * @summary (Any... -> Any) -> Void\n */\nvar delayed = typeof setImmediate !== 'undefined'? setImmediate\n : typeof process !== 'undefined'? process.nextTick\n : /* otherwise */ setTimeout\n\n/**\n * @module lib/task\n */\nmodule.exports = Task;\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Task[α, β]` structure represents values that depend on time. This\n * allows one to model time-based effects explicitly, such that one can have\n * full knowledge of when they're dealing with delayed computations, latency,\n * or anything that can not be computed immediately.\n *\n * A common use for this structure is to replace the usual Continuation-Passing\n * Style form of programming, in order to be able to compose and sequence\n * time-dependent effects using the generic and powerful monadic operations.\n *\n * @class\n * @summary\n * ((α → Void), (β → Void) → Void), (Void → Void) → Task[α, β]\n *\n * Task[α, β] <: Chain[β]\n * , Monad[β]\n * , Functor[β]\n * , Applicative[β]\n * , Semigroup[β]\n * , Monoid[β]\n * , Show\n */\nfunction Task(computation, cleanup) {\n this.fork = computation;\n\n this.cleanup = cleanup || function() {};\n}\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `β`.\n *\n * `β` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary β → Task[α, β]\n */\nTask.prototype.of = function _of(b) {\n return new Task(function(_, resolve) {\n return resolve(b);\n });\n};\n\nTask.of = Task.prototype.of;\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary α → Task[α, β]\n */\nTask.prototype.rejected = function _rejected(a) {\n return new Task(function(reject) {\n return reject(a);\n });\n};\n\nTask.rejected = Task.prototype.rejected;\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the successful value of the `Task[α, β]` using a regular unary\n * function.\n *\n * @summary @Task[α, β] => (β → γ) → Task[α, γ]\n */\nTask.prototype.map = function _map(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return resolve(f(b));\n });\n }, cleanup);\n};\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the succesful value of the `Task[α, β]` using a function to a\n * monad.\n *\n * @summary @Task[α, β] => (β → Task[α, γ]) → Task[α, γ]\n */\nTask.prototype.chain = function _chain(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return f(b).fork(reject, resolve);\n });\n }, cleanup);\n};\n\n// -- Apply ------------------------------------------------------------\n\n/**\n * Applys the successful value of the `Task[α, (β → γ)]` to the successful\n * value of the `Task[α, β]`\n *\n * @summary @Task[α, (β → γ)] => Task[α, β] → Task[α, γ]\n */\n\nTask.prototype.ap = function _ap(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var func, funcLoaded = false;\n var val, valLoaded = false;\n var rejected = false;\n var allState;\n\n var thisState = forkThis(guardReject, guardResolve(function(x) {\n funcLoaded = true;\n func = x;\n }));\n\n var thatState = forkThat(guardReject, guardResolve(function(x) {\n valLoaded = true;\n val = x;\n }));\n\n function guardResolve(setter) {\n return function(x) {\n if (rejected) {\n return;\n }\n\n setter(x);\n if (funcLoaded && valLoaded) {\n delayed(function(){ cleanupBoth(allState) });\n return resolve(func(val));\n } else {\n return x;\n }\n }\n }\n\n function guardReject(x) {\n if (!rejected) {\n rejected = true;\n return reject(x);\n }\n }\n\n return allState = [thisState, thatState];\n }, cleanupBoth);\n};\n\n// -- Semigroup ------------------------------------------------------------\n\n/**\n * Selects the earlier of the two tasks `Task[α, β]`\n *\n * @summary @Task[α, β] => Task[α, β] → Task[α, β]\n */\n\nTask.prototype.concat = function _concat(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var done = false;\n var allState;\n var thisState = forkThis(guard(reject), guard(resolve));\n var thatState = forkThat(guard(reject), guard(resolve));\n\n return allState = [thisState, thatState];\n\n function guard(f) {\n return function(x) {\n if (!done) {\n done = true;\n delayed(function(){ cleanupBoth(allState) })\n return f(x);\n }\n };\n }\n }, cleanupBoth);\n\n};\n\n// -- Monoid ------------------------------------------------------------\n\n/**\n * Returns a Task that will never resolve\n *\n * @summary Void → Task[α, _]\n */\nTask.empty = function _empty() {\n return new Task(function() {});\n};\n\nTask.prototype.empty = Task.empty;\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Task[α, β]`\n *\n * @summary @Task[α, β] => Void → String\n */\nTask.prototype.toString = function _toString() {\n return 'Task';\n};\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Transforms a failure value into a new `Task[α, β]`. Does nothing if the\n * structure already contains a successful value.\n *\n * @summary @Task[α, β] => (α → Task[γ, β]) → Task[γ, β]\n */\nTask.prototype.orElse = function _orElse(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return f(a).fork(reject, resolve);\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n\n// -- Folds and extended transformations -------------------------------\n\n/**\n * Catamorphism. Takes two functions, applies the leftmost one to the failure\n * value, and the rightmost one to the successful value, depending on which one\n * is present.\n *\n * @summary @Task[α, β] => (α → γ), (β → γ) → Task[δ, γ]\n */\nTask.prototype.fold = function _fold(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Catamorphism.\n *\n * @summary @Task[α, β] => { Rejected: α → γ, Resolved: β → γ } → Task[δ, γ]\n */\nTask.prototype.cata = function _cata(pattern) {\n return this.fold(pattern.Rejected, pattern.Resolved);\n};\n\n/**\n * Swaps the disjunction values.\n *\n * @summary @Task[α, β] => Void → Task[β, α]\n */\nTask.prototype.swap = function _swap() {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(a);\n }, function(b) {\n return reject(b);\n });\n }, cleanup);\n};\n\n/**\n * Maps both sides of the disjunction.\n *\n * @summary @Task[α, β] => (α → γ), (β → δ) → Task[γ, δ]\n */\nTask.prototype.bimap = function _bimap(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Maps the left side of the disjunction (failure).\n *\n * @summary @Task[α, β] => (α → γ) → Task[γ, β]\n */\nTask.prototype.rejectedMap = function _rejectedMap(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n","module.exports = require('./task');\n","/* eslint-disable new-cap */\nimport { prop, find, identity, pipe } from \"ramda\";\nimport { createId } from \"./utils\";\nimport Either from \"data.either\";\nimport Task from \"data.task\";\nimport Immutable from \"seamless-immutable\";\nimport { fieldCreated } from \"../Actions\";\n\n// State -> String -> Either String Function\nconst typeConstructor = (state, fieldType) => {\n return Either.of(state)\n .map(prop(\"fieldTypes\"))\n .map(find(v => v.info.type === fieldType))\n .chain(Either.fromNullable)\n .bimap(_ => `Field \"${fieldType}\" does not exist.`, identity);\n};\n\n// { initialState: Function } -> Task String Object\nconst createField = constr =>\n new Task((reject, resolve) => {\n // Make sure the promise is only resolved once\n let called = false;\n const fieldState = constr.initialState();\n\n if (!(fieldState instanceof Promise)) {\n resolve(fieldState);\n } else {\n fieldState\n .then(v => {\n if (called) { return; }\n called = true;\n resolve(v);\n })\n .catch(v => {\n if (called) { throw v; }\n called = true;\n reject(v);\n });\n }\n });\n\n// Object -> Object\nconst insertRequiredProps = field =>\n Immutable(field).merge({\n id: createId(),\n configShowing: true,\n }, {\n deep: true,\n });\n\nconst createFieldAsynchronously = (state, fieldType, asyncDispatch) =>\n typeConstructor(state, fieldType)\n .map(createField) // Either String (Task String Object)\n .leftMap(Task.rejected)\n .merge() // Task String Object\n .map(insertRequiredProps)\n .fork( // execute task\n err => console.error(\"Task rejected\", err),\n pipe(fieldCreated, asyncDispatch)\n );\n\n// This is an async action. When it is finished it will trigger the\n// field created action\nexport default (state, { fieldType, asyncDispatch }) => {\n createFieldAsynchronously(state, fieldType, asyncDispatch);\n return state;\n};\n","var _concat = /*#__PURE__*/require('./internal/_concat');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Returns a new list containing the contents of the given list, followed by\n * the given element.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The element to add to the end of the new list.\n * @param {Array} list The list of elements to add a new item to.\n * list.\n * @return {Array} A new list containing the elements of the old list followed by `el`.\n * @see R.prepend\n * @example\n *\n * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']\n * R.append('tests', []); //=> ['tests']\n * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]\n */\n\n\nvar append = /*#__PURE__*/_curry2(function append(el, list) {\n return _concat(list, [el]);\n});\nmodule.exports = append;","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/maybe\n */\nmodule.exports = Maybe\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * A structure for values that may not be present, or computations that may\n * fail. `Maybe(a)` explicitly models the effects that are implicit in\n * `Nullable` types, thus has none of the problems associated with\n * `null` or `undefined` — like `NullPointerExceptions`.\n *\n * The class models two different cases:\n *\n * + `Just a` — represents a `Maybe(a)` that contains a value. `a` may\n * be any value, including `null` or `undefined`.\n *\n * + `Nothing` — represents a `Maybe(a)` that has no values. Or a\n * failure that needs no additional information.\n *\n * Common uses of this structure includes modelling values that may or may\n * not be present in a collection, thus instead of needing a\n * `collection.has(a)`, the `collection.get(a)` operation gives you all\n * the information you need — `collection.get(a).is-nothing` being\n * equivalent to `collection.has(a)`; Similarly the same reasoning may\n * be applied to computations that may fail to provide a value, e.g.:\n * `collection.find(predicate)` can safely return a `Maybe(a)` instance,\n * even if the collection contains nullable values.\n *\n * Furthermore, the values of `Maybe(a)` can be combined and manipulated\n * by using the expressive monadic operations. This allows safely\n * sequencing operations that may fail, and safely composing values that\n * you don't know whether they're present or not, failing early\n * (returning a `Nothing`) if any of the operations fail.\n *\n * If one wants to store additional information about failures, the\n * [Either][] and [Validation][] structures provide such a capability, and\n * should be used instead of the `Maybe(a)` structure.\n *\n * [Either]: https://github.com/folktale/data.either\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n */\nfunction Maybe() {}\n\n// The case for successful values\nJust.prototype = clone(Maybe.prototype)\nfunction Just(a){\n this.value = a\n}\n\n// The case for failure values\nNothing.prototype = clone(Maybe.prototype)\nfunction Nothing(){}\n\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure with an absent value. Commonly used\n * to represent a failure.\n *\n * @summary Void → Maybe[α]\n */\nMaybe.Nothing = function() {\n return new Nothing\n}\nMaybe.prototype.Nothing = Maybe.Nothing\n\n/**\n * Constructs a new `Maybe[α]` structure that holds the single value\n * `α`. Commonly used to represent a success.\n *\n * `α` can be any value, including `null`, `undefined` or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.Just = function(a) {\n return new Just(a)\n}\nMaybe.prototype.Just = Maybe.Just\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure from a nullable type.\n *\n * If the value is either `null` or `undefined`, this function returns a\n * `Nothing`, otherwise the value is wrapped in a `Just(α)`.\n *\n * @summary α → Maybe[α]\n */\nMaybe.fromNullable = function(a) {\n return a != null? new Just(a)\n : /* otherwise */ new Nothing\n}\nMaybe.prototype.fromNullable = Maybe.fromNullable\n\n/**\n * Constructs a new `Maybe[β]` structure from an `Either[α, β]` type.\n *\n * The left side of the `Either` becomes `Nothing`, and the right side\n * is wrapped in a `Just(β)`.\n *\n * @summary Either[α, β] → Maybe[β]\n */\nMaybe.fromEither = function(a) {\n return a.fold(Maybe.Nothing, Maybe.Just)\n}\nMaybe.prototype.fromEither = Maybe.fromEither\n\n/**\n * Constructs a new `Maybe[β]` structure from a `Validation[α, β]` type.\n *\n * The failure side of the `Validation` becomes `Nothing`, and the right\n * side is wrapped in a `Just(β)`.\n *\n * @method\n * @summary Validation[α, β] → Maybe[β]\n */\nMaybe.fromValidation = Maybe.fromEither\nMaybe.prototype.fromValidation = Maybe.fromEither\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Maybe[α]` structure contains a failure (i.e.: `Nothing`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isNothing = false\nNothing.prototype.isNothing = true\n\n\n/**\n * True if the `Maybe[α]` structure contains a single value (i.e.: `Just(α)`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isJust = false\nJust.prototype.isJust = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Maybe[α]` structure holding the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.of = function(a) {\n return new Just(a)\n}\nMaybe.prototype.of = Maybe.of\n\n\n/**\n * Applies the function inside the `Maybe[α]` structure to another\n * applicative type.\n *\n * The `Maybe[α]` structure should contain a function value, otherwise a\n * `TypeError` is thrown.\n *\n * @method\n * @summary (@Maybe[α → β], f:Applicative[_]) => f[α] → f[β]\n */\nMaybe.prototype.ap = unimplemented\n\nNothing.prototype.ap = noop\n\nJust.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using a regular unary\n * function.\n *\n * @method\n * @summary @Maybe[α] => (α → β) → Maybe[β]\n */\nMaybe.prototype.map = unimplemented\nNothing.prototype.map = noop\n\nJust.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using an unary function\n * to monads.\n *\n * @method\n * @summary (@Maybe[α], m:Monad[_]) => (α → m[β]) → m[β]\n */\nMaybe.prototype.chain = unimplemented\nNothing.prototype.chain = noop\n\nJust.prototype.chain = function(f) {\n return f(this.value)\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Void → String\n */\nMaybe.prototype.toString = unimplemented\n\nNothing.prototype.toString = function() {\n return 'Maybe.Nothing'\n}\n\nJust.prototype.toString = function() {\n return 'Maybe.Just(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if a `Maybe[α]` structure is equal to another `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Maybe[α] → Boolean\n */\nMaybe.prototype.isEqual = unimplemented\n\nNothing.prototype.isEqual = function(b) {\n return b.isNothing\n}\n\nJust.prototype.isEqual = function(b) {\n return b.isJust\n && b.value === this.value\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the value out of the `Maybe[α]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary @Maybe[α] => Void → a, :: partial, throws\n * @see {@link module:lib/maybe~Maybe#getOrElse} — A getter that can handle failures\n * @throws {TypeError} if the structure has no value (`Nothing`).\n */\nMaybe.prototype.get = unimplemented\n\nNothing.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Nothing.\")\n}\n\nJust.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the value out of the `Maybe[α]` structure. If there is no value,\n * returns the given default.\n *\n * @method\n * @summary @Maybe[α] => α → α\n */\nMaybe.prototype.getOrElse = unimplemented\n\nNothing.prototype.getOrElse = function(a) {\n return a\n}\n\nJust.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a failure into a new `Maybe[α]` structure. Does nothing if the\n * structure already contains a value.\n *\n * @method\n * @summary @Maybe[α] => (Void → Maybe[α]) → Maybe[α]\n */\nMaybe.prototype.orElse = unimplemented\n\nNothing.prototype.orElse = function(f) {\n return f()\n}\n\nJust.prototype.orElse = function(_) {\n return this\n}\n\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary @Maybe[α] => { Nothing: Void → β, Just: α → β } → β\n */\nMaybe.prototype.cata = unimplemented\n\nNothing.prototype.cata = function(pattern) {\n return pattern.Nothing()\n}\n\nJust.prototype.cata = function(pattern) {\n return pattern.Just(this.value);\n}\n\n\n/**\n * JSON serialisation\n *\n * @method\n * @summary @Maybe[α] => Void → Object\n */\nMaybe.prototype.toJSON = unimplemented\n\nNothing.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Nothing' }\n}\n\nJust.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Just'\n , value: this.value }\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./maybe')","import { curry, pipe, prop, over, append } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithNewField = curry((state, newField) => pipe(\n hideConfigs,\n over(StateLenses.fieldsState, append(newField))\n)(state));\n\nexport default (state, { createdFieldState }) =>\n Maybe.fromNullable(createdFieldState)\n .map(historyStateWithNewField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleConfig = fieldState =>\n Immutable(fieldState).set(\"configShowing\", !fieldState.configShowing);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleConfig)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleRequired = fieldState =>\n Immutable(fieldState).set(\"required\", !fieldState.required);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleRequired)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n}\nmodule.exports = _filter;","function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}\nmodule.exports = _isObject;","var _curry2 = /*#__PURE__*/require('./_curry2');\n\nvar _xfBase = /*#__PURE__*/require('./_xfBase');\n\nvar XFilter = /*#__PURE__*/function () {\n\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function (result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n\n return XFilter;\n}();\n\nvar _xfilter = /*#__PURE__*/_curry2(function _xfilter(f, xf) {\n return new XFilter(f, xf);\n});\nmodule.exports = _xfilter;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');\n\nvar _filter = /*#__PURE__*/require('./internal/_filter');\n\nvar _isObject = /*#__PURE__*/require('./internal/_isObject');\n\nvar _reduce = /*#__PURE__*/require('./internal/_reduce');\n\nvar _xfilter = /*#__PURE__*/require('./internal/_xfilter');\n\nvar keys = /*#__PURE__*/require('./keys');\n\n/**\n * Takes a predicate and a `Filterable`, and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate. Filterable objects include plain objects or any object\n * that has a filter method such as `Array`.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array} Filterable\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * var isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\n\n\nvar filter = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['filter'], _xfilter, function (pred, filterable) {\n return _isObject(filterable) ? _reduce(function (acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) :\n // else\n _filter(pred, filterable);\n}));\nmodule.exports = filter;","import { curry, prop, over, filter } from \"ramda\";\nimport { StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithoutField = curry((state, fieldState) =>\n over(\n StateLenses.fieldsState,\n filter(fs => fs.id !== fieldState.id),\n state\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(historyStateWithoutField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","import { curry, prop, over, map } from \"ramda\";\nimport { StateLenses, pushHistoryState, validateField } from \"./utils\";\n\n// State -> Object -> State\nconst updateFieldState = curry((state, newFieldState) =>\n over(\n StateLenses.fieldsState,\n map(fs => fs.id === newFieldState.id ? newFieldState : fs),\n state\n )\n);\n\nexport default (state, { newFieldState }) =>\n validateField(newFieldState) // Either\n .map(updateFieldState(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(console.error)\n .getOrElse(state);\n","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Returns a copy of the list, sorted according to the comparator function,\n * which should accept two values at a time and return a negative number if the\n * first value is smaller, a positive number if it's larger, and zero if they\n * are equal. Please note that this is a **copy** of the list. It does not\n * modify the original.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, a) -> Number) -> [a] -> [a]\n * @param {Function} comparator A sorting function :: a -> b -> Int\n * @param {Array} list The list to sort\n * @return {Array} a new array with its elements sorted by the comparator function.\n * @example\n *\n * var diff = function(a, b) { return a - b; };\n * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]\n */\n\n\nvar sort = /*#__PURE__*/_curry2(function sort(comparator, list) {\n return Array.prototype.slice.call(list, 0).sort(comparator);\n});\nmodule.exports = sort;","/* eslint-disable new-cap */\nimport { curry, pipe, prop, over, sort } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Either from \"data.either\";\n\n// State -> Object -> State\nconst historyStateWithNewOrder = curry((state, newOrder) => pipe(\n hideConfigs,\n over(\n StateLenses.fieldsState,\n sort((f1, f2) => newOrder.indexOf(f1.id) - newOrder.indexOf(f2.id))\n )\n)(state));\n\nexport default (state, { newFieldsOrder }) =>\n (newFieldsOrder && Array.isArray(newFieldsOrder)\n ? Either.Right(newFieldsOrder)\n : Either.Left(`newFieldsOrder must be an array but received ${typeof newFieldsOrder}`)\n )\n .chain(o =>\n o.length === state.fieldsState.length\n ? Either.Right(o)\n : Either.Left(`newFieldsOrder has ${o.length} elements, but the current state has ${state.fieldsState.length} elements`) // eslint-disable-line max-len\n )\n .chain(o => {\n const stateIds = state.fieldsState.map(prop(\"id\"));\n const noMissingId = stateIds.reduce((acc, fId) => acc && o.includes(fId), true);\n return noMissingId\n ? Either.Right(o)\n : Either.Left(\"Not all ids in the new order are matched in the existing state ids.\");\n })\n .map(historyStateWithNewOrder(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(err => console.error(`Unable to reorder: ${err}`))\n .getOrElse(state);\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { StateLenses, propertyTypeCheck } from \"./utils\";\nimport { over, traverse, curry } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\n// Object -> Either String Object\nconst hasRequiredInfo = component =>\n propertyTypeCheck(\"initialState\", \"function\", component)\n .chain(propertyTypeCheck(\"RenderEditor\", \"function\"))\n .chain(propertyTypeCheck(\"info\", \"object\"))\n .chain(c => Either.fromNullable(c.info))\n .chain(propertyTypeCheck(\"type\", \"string\"))\n .chain(propertyTypeCheck(\"displayName\", \"string\"))\n .chain(propertyTypeCheck(\"group\", \"string\"))\n .chain(_ => Either.Right(component));\n\nconst isComponentValid = customComponents =>\n traverse(Either.of, hasRequiredInfo, customComponents);\n\n// [a] -> [a] -> Either String [a]\nconst validateComponents = customComponents =>\n Either.Right(customComponents)\n .chain(isArray)\n .chain(isComponentValid);\n\nconst addToFieldTypes = curry((state, customComponents) =>\n over(StateLenses.fieldTypes, s => s.concat(customComponents), state)\n);\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { customComponents }) =>\n (customComponents\n ? Either.Right(customComponents)\n : Either.Left(\"Empty custom components\")\n )\n .chain(validateComponents)\n .leftMap(err => console.error(\"Invalid custom components:\", err))\n .map(addToFieldTypes(state))\n .getOrElse(state);\n","/* eslint-disable no-nested-ternary */\nimport assert from \"fl-assert\";\nimport undo from \"./undo\";\nimport importState from \"./importState\";\nimport createField from \"./createField\";\nimport fieldCreated from \"./fieldCreated\";\nimport toggleConfig from \"./field.toggleConfig\";\nimport toggleRequired from \"./field.toggleRequired\";\nimport deleteField from \"./field.deleteField\";\nimport updateField from \"./field.updateField\";\nimport reorderFields from \"./reorderFields\";\nimport importCustomComponents from \"./importCustomComponents\";\n\nconst actionHandlers = {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n};\n\nconst isExpectedAction = a => a && a.type && actionHandlers[a.type];\nconst isReduxAction = a => a && a.type && a.type.includes(\"@@redux\");\n\n\nconst update = (state, action) =>\n isExpectedAction(action)\n ? actionHandlers[action.type](state, action)\n : isReduxAction(action)\n ? state\n : assert(false, `Invalid action type: ${action.type}`);\n\nexport default update;\n","/* eslint-env jasmine */\n\nimport { undo as undoAction } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst currentFieldsState = [\"current\"];\nconst oldFieldsState = [\"old\"];\nconst mockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [oldFieldsState],\n};\n\nconst emptyMockState = {\n fieldTypes: [],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst emptyHistoryMockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.undo\", () => {\n it(\"removes first old state from history\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsStateHistory.length).toEqual(0);\n });\n\n it(\"sets first old state as current state\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsState).toEqual(oldFieldsState);\n });\n\n it(\"doesn't modify the state if there aren't more history states to undo\", () => {\n const modifiedState = update(emptyMockState, undoAction());\n expect(modifiedState).toEqual(emptyMockState);\n });\n\n it(\"set's the current state to empty if there are no more history states\", () => {\n const modifiedState = update(emptyHistoryMockState, undoAction());\n expect(modifiedState.fieldsState.length).toEqual(0);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importState } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst typesArray = [{\n \"info\": {\n \"type\": \"RadioButtons\",\n },\n}, {\n \"info\": {\n \"type\": \"Checkboxes\",\n },\n}, {\n \"info\": {\n \"type\": \"Dropdown\",\n },\n}, {\n \"info\": {\n \"type\": \"TextBox\",\n },\n}, {\n \"info\": {\n \"type\": \"EmailBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TelephoneBox\",\n },\n}, {\n \"info\": {\n \"type\": \"NumberBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TextArea\",\n },\n}, {\n \"info\": {\n \"type\": \"DateField\",\n },\n}];\n\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newValidState = [{\n \"type\": \"Checkboxes\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"id\": 2,\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\nconst newInvalidState = [{\n \"type\": \"Invalid type\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\ndescribe(\"Update.importState\", () => {\n it(\"Returns an unchanged array if the new state is invalid\", () => {\n expect(update(mockState, importState({}))).toEqual(mockState);\n expect(update(mockState, importState(null))).toEqual(mockState);\n });\n\n it(\"Returns an unchanged array if the a field's type is not in fieldTypes\", () => {\n expect(update(mockState, importState(newInvalidState))).toEqual(mockState);\n });\n\n it(\"Sends the last current state to the history\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsStateHistory[0].toString()).toEqual(mockCurrentState.toString());\n expect(updated.fieldsStateHistory.length).toEqual(mockHistory.length + 1);\n });\n\n it(\"Sets the new state as current\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsState[0].type).toEqual(newValidState[0].type);\n expect(updated.fieldsState[0].type).not.toEqual(undefined);\n expect(updated.fieldsState[0].displayName).toEqual(newValidState[0].displayName);\n expect(updated.fieldsState[0].displayName).not.toEqual(undefined);\n expect(updated.fieldsState[0].group).toEqual(newValidState[0].group);\n expect(updated.fieldsState[0].group).not.toEqual(undefined);\n });\n\n it(\"Makes sure all ids are strings\", () => {\n const validState2 = newValidState\n .map((v, idx) => idx !== 0 ? v : Object.assign({}, v, { id: 2 }));\n const updated = update(mockState, importState(validState2));\n expect(typeof updated.fieldsState[0].id).toEqual(\"string\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { createField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst promiseTypeInstance = { type: \"promise-instance\" };\nconst promiseType = {\n info: { type: \"PromiseType\" },\n initialState: () => Promise.resolve(promiseTypeInstance),\n};\n\nconst syncTypeInstance = { type: \"sync-instance\" };\nconst syncType = {\n info: { type: \"SyncType\" },\n initialState: () => syncTypeInstance,\n};\n\nconst typesArray = [promiseType, syncType];\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\ndescribe(\"Update.createField\", () => {\n it(\"creates fields asynchronously\", done => {\n const asyncDispatch = v => {\n expect(v).not.toEqual(undefined);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"returns a 'fieldCreated' action when field is created\", done => {\n const asyncDispatch = action => {\n expect(action.type).toEqual(\"fieldCreated\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a plain object\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(syncTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a promise\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(promiseTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"adds required fields to instance\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState.id).not.toEqual(undefined);\n expect(typeof action.createdFieldState.configShowing).toEqual(\"boolean\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"does not create a field if type is not in model.fieldTypes\", done => {\n const asyncDispatch = jasmine.createSpy(\"asyncDispatch\");\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(\"non-existing-type\")\n );\n\n update(mockState, asyncAcion);\n\n setTimeout(\n () => { expect(asyncDispatch).not.toHaveBeenCalled(); done(); },\n 50\n );\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { fieldCreated } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createdFieldState = { type: \"fictitious-instance\" };\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldCreatedAction = fieldCreated(createdFieldState);\nconst newState = update(mockState, fieldCreatedAction);\n\ndescribe(\"Update.fieldCreated\", () => {\n it(\"outputs a state with the new field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length + 1);\n expect(\n newState.fieldsState\n .find(v => v.type === createdFieldState.type)\n ).not.toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0]).toEqual(mockCurrentState[0]);\n expect(newState.fieldsStateHistory[0][1]).toEqual(mockCurrentState[1]);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, fieldCreated(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, fieldCreated(createdFieldState));\n const changed2 = update(changed1, fieldCreated(createdFieldState));\n const changed3 = update(changed2, fieldCreated(createdFieldState));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length + 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleConfig } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateConfigShowing = {\n id: 123,\n configShowing: true,\n};\n\nconst fieldStateConfigNotShowing = {\n id: 321,\n configShowing: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateConfigShowing, fieldStateConfigNotShowing],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleConfig\", () => {\n it(\"turns the config option to false when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(false);\n });\n\n it(\"turns the config option to true when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigNotShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleRequired } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateIsRequired = {\n id: 123,\n required: true,\n};\n\nconst fieldStateIsNotRequired = {\n id: 321,\n required: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateIsRequired, fieldStateIsNotRequired],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleRequired\", () => {\n it(\"turns the required option to false when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(false);\n });\n\n it(\"turns the required option to true when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsNotRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { deleteField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst toBeDeletedFieldState = { type: \"fictitious-instance\", id: 0 };\nconst mockCurrentState = [toBeDeletedFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldDeleteAction = deleteField(toBeDeletedFieldState);\nconst newState = update(mockState, fieldDeleteAction);\n\ndescribe(\"Update.deleteField\", () => {\n it(\"outputs a state without the field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length - 1);\n expect(\n newState.fieldsState\n .find(v => v.id === toBeDeletedFieldState.id)\n ).toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[1].id).toEqual(mockCurrentState[1].id);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, deleteField(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after deleting a field\", () => {\n const mockField1 = Object.assign({}, toBeDeletedFieldState, { id: 5 });\n const mockField2 = Object.assign({}, toBeDeletedFieldState, { id: 6 });\n const mockField3 = Object.assign({}, toBeDeletedFieldState, { id: 7 });\n\n const mockState2 = Object.assign({}, mockState, {\n fieldsState: [\n mockField1,\n mockField2,\n mockField3,\n ],\n });\n const changed1 = update(mockState2, deleteField(mockField1));\n const changed2 = update(changed1, deleteField(mockField2));\n const changed3 = update(changed2, deleteField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState2.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState2.fieldsState.length - 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { updateField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst oldFieldState = {\n type: \"fictitious-instance\",\n id: \"0\",\n configShowing: false,\n required: false,\n color: \"blue\",\n};\nconst newFieldState = Object.assign({}, oldFieldState, { color: \"green\" });\nconst mockCurrentState = [oldFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldUpdateAction = updateField(newFieldState);\nconst newState = update(mockState, fieldUpdateAction);\n\ndescribe(\"Update.updateField\", () => {\n it(\"outputs a state the field updated\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(\n newState.fieldsState\n .find(v => v.color === newFieldState.color)\n ).not.toEqual(undefined);\n });\n\n it(\"outputs a state the updated field in the correct order\", () => {\n expect(newState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(newState.fieldsState[0].color).toEqual(newFieldState.color);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[0].color).toEqual(mockCurrentState[0].color);\n });\n\n it(\"Returns the current state if an invalid field state is given to it\", () => {\n const isSame = (state1, state2) => {\n expect(state1.fieldTypes.length).toEqual(state2.fieldTypes.length);\n expect(state1.fieldsState.length).toEqual(state2.fieldsState.length);\n expect(state1.fieldsState[0].color).toEqual(state2.fieldsState[0].color);\n expect(state1.fieldsState[0].id).toEqual(state2.fieldsState[0].id);\n expect(state1.fieldsStateHistory.length).toEqual(state2.fieldsStateHistory.length);\n };\n\n const sameState1 = update(mockState, updateField(null));\n isSame(mockState, sameState1);\n\n const sameState2 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { id: null }))\n );\n isSame(mockState, sameState2);\n\n const sameState3 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { configShowing: null }))\n );\n isSame(mockState, sameState3);\n\n const sameState4 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { required: null }))\n );\n\n isSame(mockState, sameState4);\n });\n\n it(\"does not break the state after updating a field multiple times a field\", () => {\n const mockField1 = Object.assign({}, oldFieldState, { color: \"yellow\" });\n const mockField2 = Object.assign({}, oldFieldState, { color: \"orange\" });\n const mockField3 = Object.assign({}, oldFieldState, { color: \"purple\" });\n\n const changed1 = update(mockState, updateField(mockField1));\n const changed2 = update(changed1, updateField(mockField2));\n const changed3 = update(changed2, updateField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(changed3.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(changed3.fieldsState[0].color).toEqual(mockField3.color);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { reorderFields } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst templateField = {\n type: \"fictitious-instance\",\n required: false,\n configShowing: false,\n id: \"0\",\n};\nconst field1 = Object.assign({}, templateField, { id: \"1\" });\nconst field2 = Object.assign({}, templateField, { id: \"2\" });\nconst field3 = Object.assign({}, templateField, { id: \"3\" });\nconst mockCurrentState = [field1, field2, field3];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newOrder = [\"2\", \"3\", \"1\"];\nconst reorderFieldsAction = reorderFields(newOrder);\nconst newState = update(mockState, reorderFieldsAction);\n\ndescribe(\"Update.reorderFields\", () => {\n it(\"outputs a state with fields in the new order\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(newState.fieldsState[0].id).toEqual(newOrder[0]);\n expect(newState.fieldsState[1].id).toEqual(newOrder[1]);\n expect(newState.fieldsState[2].id).toEqual(newOrder[2]);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0].id).toEqual(mockCurrentState[0].id);\n expect(newState.fieldsStateHistory[0][1].id).toEqual(mockCurrentState[1].id);\n expect(newState.fieldsStateHistory[0][2].id).toEqual(mockCurrentState[2].id);\n });\n\n it(\"Returns the current state if any field id is missing\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"Returns the current state if the reorder array has more elements than it should\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\", \"3\", \"4\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, reorderFields([\"1\", \"2\", \"3\"]));\n const changed2 = update(changed1, reorderFields([\"3\", \"1\", \"2\"]));\n const changed3 = update(changed2, reorderFields([\"3\", \"2\", \"1\"]));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n expect(changed3.fieldsState[0].id).toEqual(\"3\");\n expect(changed3.fieldsState[1].id).toEqual(\"2\");\n expect(changed3.fieldsState[2].id).toEqual(\"1\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importCustomComponents } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createType = name => ({\n initialState: _ => _,\n RenderEditor: _ => _,\n info: { type: name, group: \"custom\", displayName: name },\n});\n\nconst mockState = {\n fieldTypes: [createType(\"fictitious-instance\")],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst customTypes = [\n createType(\"custom-1\"),\n createType(\"custom-2\"),\n createType(\"custom-3\"),\n];\n\nconst importCustomComponentsAction = importCustomComponents(customTypes);\nconst newState = update(mockState, importCustomComponentsAction);\n\n\ndescribe(\"Update.importCustomComponents\", () => {\n it(\"Appends the new valid custom types to the end of the existing types\", () => {\n expect(newState.fieldTypes.length).toEqual(mockState.fieldTypes.length + customTypes.length);\n expect(newState.fieldTypes[1].info.type).toEqual(customTypes[0].info.type);\n expect(newState.fieldTypes[2].info.type).toEqual(customTypes[1].info.type);\n expect(newState.fieldTypes[3].info.type).toEqual(customTypes[2].info.type);\n });\n\n it(\"Returns an unchanged array if customTypes is invalid\", () => {\n expect(update(mockState, importCustomComponents(null))).toEqual(mockState);\n\n const invalid1 = [\n Object.assign({}, createType(\"custom-1\"), { info: null }),\n ];\n expect(update(mockState, importCustomComponents(invalid1))).toEqual(mockState);\n\n const invalid2 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: null, group: \"custom\", displayName: \"custom\" } }),\n ];\n expect(update(mockState, importCustomComponents(invalid2))).toEqual(mockState);\n\n const invalid3 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: null, displayName: \"custom\" } }\n ),\n ];\n expect(update(mockState, importCustomComponents(invalid3))).toEqual(mockState);\n\n const invalid4 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: \"custom\", displayName: null } }),\n ];\n expect(update(mockState, importCustomComponents(invalid4))).toEqual(mockState);\n\n const invalid5 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { RenderEditor: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid5))).toEqual(mockState);\n\n const invalid6 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { initialState: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid6))).toEqual(mockState);\n });\n});\n"],"names":["undo","importCustomComponents","importState","createField","fieldCreated","toggleConfig","toggleRequired","deleteField","updateField","reorderFields","describe","action","type","toEqual","mockStateToImport","newFieldsState","fieldType","createdFieldState","fieldState","newFieldState","newFieldsOrder","customComponents","define","asyncDispatchMiddleware","syncActivityFinished","actionQueue","flushQueue","forEach","store","dispatch","a","asyncDispatch","asyncAction","concat","actionWithAsyncDispatch","Immutable","merge","fakeAction","done","next","returnedAction","not","undefined","fakeAsyncAction","fakeStore","_isPlaceholder","_curry1","_curry2","_curry3","_checkForMethod","set","over","always","_isString","_arity","bind","_xwrap","_isArrayLike","_reduce","slice","reduce","_pipe","tail","_concat","path","_isTransformer","_curryN","_has","_isArguments","_dispatchable","_xmap","curryN","keys","_map","map","Either","require$$0","updateAt","_default","keyArray","newVal","obj","deepNewVal","reduceRight","result","key","deep","StateLenses","_default2","_default3","createId","Date","now","Math","random","toString","pushHistoryState","state","newHistoryState","_default4","fieldsStateHistory","_default6","fieldsState","hideConfigs","_default7","Object","assign","s","configShowing","propertyTypeCheck","propertyName","babelHelpers.typeof","Right","Left","validateField","fromNullable","leftMap","fs","chain","lastHistoryState","_","Infinity","_identity","ap","prepend","sequence","_arrayFromIterator","_containsWith","identical","_functionName","_equals","isArray","Array","arr","fieldTypeIsValid","validTypes","field","find","validFieldTypes","of","validateFieldsState","fieldTypes","addRequiredProperties","fieldStates","id","bimap","console","error","getOrElse","_reduced","_xfind","Task","typeConstructor","v","info","reject","resolve","called","constr","initialState","Promise","then","catch","insertRequiredProps","createFieldAsynchronously","rejected","fork","err","Maybe","clone","unimplemented","noop","historyStateWithNewField","newField","_default5","replaceFieldState","aField","required","_xfilter","_isObject","_filter","historyStateWithoutField","updateFieldState","historyStateWithNewOrder","newOrder","f1","f2","indexOf","o","length","stateIds","noMissingId","acc","fId","includes","hasRequiredInfo","component","c","isComponentValid","validateComponents","addToFieldTypes","actionHandlers","isExpectedAction","isReduxAction","update","assert","currentFieldsState","oldFieldsState","mockState","emptyMockState","emptyHistoryMockState","modifiedState","undoAction","typesArray","mockCurrentState","mockHistory","newValidState","newInvalidState","updated","displayName","group","validState2","idx","promiseTypeInstance","promiseType","syncTypeInstance","syncType","asyncAcion","jasmine","createSpy","toHaveBeenCalled","fieldCreatedAction","newState","sameState","changed1","changed2","changed3","fieldStateConfigShowing","fieldStateConfigNotShowing","f","fieldStateIsRequired","fieldStateIsNotRequired","toBeDeletedFieldState","fieldDeleteAction","recentHistoryState","mockField1","mockField2","mockField3","mockState2","oldFieldState","color","fieldUpdateAction","isSame","state1","state2","sameState1","sameState2","sameState3","sameState4","templateField","field1","field2","field3","reorderFieldsAction","createType","name","customTypes","importCustomComponentsAction","invalid1","invalid2","invalid3","invalid4","invalid5","RenderEditor","invalid6"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL0FjdGlvbnMuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy9hY3Rpb25zLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvc2VhbWxlc3MtaW1tdXRhYmxlL3NyYy9zZWFtbGVzcy1pbW11dGFibGUuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy91dGlscy9hc3luY0Rpc3BhdGNoTWlkZGxld2FyZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3V0aWxzLmFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZmwtYXNzZXJ0L2Rpc3QvYXNzZXJ0LmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc0FycmF5LmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNQbGFjZWhvbGRlci5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY3VycnkxLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeTIuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2N1cnJ5My5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zbGljZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9vdmVyLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Fsd2F5cy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zZXQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2FyaXR5LmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19waXBlLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc1N0cmluZy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNBcnJheUxpa2UuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3h3cmFwLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2JpbmQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3JlZHVjZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZWR1Y2UuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdGFpbC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waXBlLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jb25jYXQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcHJlcGVuZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wYXRoLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3Byb3AuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXIuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fbWFwLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZkJhc2UuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3htYXAuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2N1cnJ5Ti5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeU4uanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2hhcy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNBcmd1bWVudHMuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMva2V5cy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9tYXAuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbGVucy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL2RhdGEuZWl0aGVyL2xpYi9laXRoZXIuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLmVpdGhlci9saWIvaW5kZXguanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvdXRpbHMuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvdW5kby5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faWRlbnRpdHkuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWRlbnRpdHkuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXAuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmVkdWNlUmlnaHQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc2VxdWVuY2UuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHJhdmVyc2UuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2FycmF5RnJvbUl0ZXJhdG9yLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jb250YWluc1dpdGguanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2Z1bmN0aW9uTmFtZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pZGVudGljYWwuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHlwZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZXF1YWxzLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2VxdWFscy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9pbXBvcnRTdGF0ZS5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fcmVkdWNlZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGZpbmQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZmluZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL2RhdGEudGFzay9saWIvdGFzay5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL2RhdGEudGFzay9saWIvaW5kZXguanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvY3JlYXRlRmllbGQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXBwZW5kLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5tYXliZS9saWIvbWF5YmUuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLm1heWJlL2xpYi9pbmRleC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9maWVsZENyZWF0ZWQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvZmllbGQudG9nZ2xlQ29uZmlnLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkLnRvZ2dsZVJlcXVpcmVkLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19maWx0ZXIuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzT2JqZWN0LmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZmlsdGVyLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZpbHRlci5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9maWVsZC5kZWxldGVGaWVsZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9maWVsZC51cGRhdGVGaWVsZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zb3J0LmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL3Jlb3JkZXJGaWVsZHMuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvaW1wb3J0Q3VzdG9tQ29tcG9uZW50cy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9pbmRleC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS91bmRvLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ltcG9ydFN0YXRlLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2NyZWF0ZUZpZWxkLmpzIiwiL1VzZXJzL2pzY2htaWQvc2x2L2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ZpZWxkQ3JlYXRlZC5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZC50b2dnbGVDb25maWcuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvZmllbGQudG9nZ2xlUmVxdWlyZWQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvZmllbGQuZGVsZXRlRmllbGQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvZmllbGQudXBkYXRlRmllbGQuanMiLCIvVXNlcnMvanNjaG1pZC9zbHYvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvcmVvcmRlckZpZWxkcy5qcyIsIi9Vc2Vycy9qc2NobWlkL3Nsdi9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9pbXBvcnRDdXN0b21Db21wb25lbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vXG4vLyAgICBBQ1RJT04gQ1JFQVRPUlNcbi8vXG5cbmV4cG9ydCBjb25zdCB1bmRvID0gXyA9PlxuKHtcbiAgdHlwZTogXCJ1bmRvXCIsXG59KTtcblxuZXhwb3J0IGNvbnN0IGltcG9ydEN1c3RvbUNvbXBvbmVudHMgPSBjdXN0b21Db21wb25lbnRzID0+XG4oe1xuICB0eXBlOiBcImltcG9ydEN1c3RvbUNvbXBvbmVudHNcIixcbiAgY3VzdG9tQ29tcG9uZW50cyxcbn0pO1xuXG5cbmV4cG9ydCBjb25zdCBpbXBvcnRTdGF0ZSA9IG5ld0ZpZWxkc1N0YXRlID0+XG4oe1xuICB0eXBlOiBcImltcG9ydFN0YXRlXCIsXG4gIG5ld0ZpZWxkc1N0YXRlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGaWVsZCA9IGZpZWxkVHlwZSA9PlxuKHtcbiAgdHlwZTogXCJjcmVhdGVGaWVsZFwiLFxuICBmaWVsZFR5cGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IGZpZWxkQ3JlYXRlZCA9IGNyZWF0ZWRGaWVsZFN0YXRlID0+XG4oe1xuICB0eXBlOiBcImZpZWxkQ3JlYXRlZFwiLFxuICBjcmVhdGVkRmllbGRTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9nZ2xlQ29uZmlnID0gZmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJ0b2dnbGVDb25maWdcIixcbiAgZmllbGRTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9nZ2xlUmVxdWlyZWQgPSBmaWVsZFN0YXRlID0+XG4oe1xuICB0eXBlOiBcInRvZ2dsZVJlcXVpcmVkXCIsXG4gIGZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUZpZWxkID0gZmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJkZWxldGVGaWVsZFwiLFxuICBmaWVsZFN0YXRlLFxufSk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWVsZCA9IG5ld0ZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwidXBkYXRlRmllbGRcIixcbiAgbmV3RmllbGRTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgcmVvcmRlckZpZWxkcyA9IG5ld0ZpZWxkc09yZGVyID0+XG4oe1xuICB0eXBlOiBcInJlb3JkZXJGaWVsZHNcIixcbiAgbmV3RmllbGRzT3JkZXIsXG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuXG5pbXBvcnQge1xuICB1bmRvLFxuICBpbXBvcnRTdGF0ZSxcbiAgY3JlYXRlRmllbGQsXG4gIGZpZWxkQ3JlYXRlZCxcbiAgdG9nZ2xlQ29uZmlnLFxuICB0b2dnbGVSZXF1aXJlZCxcbiAgZGVsZXRlRmllbGQsXG4gIHVwZGF0ZUZpZWxkLFxuICByZW9yZGVyRmllbGRzLFxuICBpbXBvcnRDdXN0b21Db21wb25lbnRzLFxufSBmcm9tIFwiLi4vanMvQWN0aW9uc1wiO1xuXG5kZXNjcmliZShcIkFjdGlvblwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwidW5kb1wiLCAoKSA9PiB7XG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHVuZG8oKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInVuZG9cIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiaW1wb3J0U3RhdGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tTdGF0ZVRvSW1wb3J0ID0gW1wiYVwiLCBcImJcIl07XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gaW1wb3J0U3RhdGUobW9ja1N0YXRlVG9JbXBvcnQpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiaW1wb3J0U3RhdGVcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydFN0YXRlKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICAgIGV4cGVjdChhY3Rpb24ubmV3RmllbGRzU3RhdGUpLnRvRXF1YWwobW9ja1N0YXRlVG9JbXBvcnQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImNyZWF0ZUZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZFR5cGUgPSBcInRlc3RGaWVsZFwiO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZpZWxkKGZpZWxkVHlwZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJjcmVhdGVGaWVsZFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiQ3JlYXRlcyB0aGUgY29ycmVjdCB2YXJpYWJsZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gY3JlYXRlRmllbGQoZmllbGRUeXBlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uZmllbGRUeXBlKS50b0VxdWFsKGZpZWxkVHlwZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiZmllbGRDcmVhdGVkXCIsICgpID0+IHtcbiAgICBjb25zdCBjcmVhdGVkRmllbGRTdGF0ZSA9IHt9O1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJmaWVsZENyZWF0ZWRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmNyZWF0ZWRGaWVsZFN0YXRlKS50b0VxdWFsKGNyZWF0ZWRGaWVsZFN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ0b2dnbGVDb25maWdcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVDb25maWcoZmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ0b2dnbGVDb25maWdcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uZmllbGRTdGF0ZSkudG9FcXVhbChmaWVsZFN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ0b2dnbGVSZXF1aXJlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRTdGF0ZSA9IHt9O1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRvZ2dsZVJlcXVpcmVkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwidG9nZ2xlUmVxdWlyZWRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRvZ2dsZVJlcXVpcmVkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5maWVsZFN0YXRlKS50b0VxdWFsKGZpZWxkU3RhdGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImRlbGV0ZUZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gZGVsZXRlRmllbGQoZmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJkZWxldGVGaWVsZFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiQ3JlYXRlcyB0aGUgY29ycmVjdCB2YXJpYWJsZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gZGVsZXRlRmllbGQoZmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkU3RhdGUpLnRvRXF1YWwoZmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidXBkYXRlRmllbGRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG5ld0ZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB1cGRhdGVGaWVsZChuZXdGaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInVwZGF0ZUZpZWxkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB1cGRhdGVGaWVsZChuZXdGaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24ubmV3RmllbGRTdGF0ZSkudG9FcXVhbChuZXdGaWVsZFN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJyZW9yZGVyRmllbGRzXCIsICgpID0+IHtcbiAgICBjb25zdCBuZXdGaWVsZHNPcmRlciA9IHt9O1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHJlb3JkZXJGaWVsZHMobmV3RmllbGRzT3JkZXIpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwicmVvcmRlckZpZWxkc1wiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiQ3JlYXRlcyB0aGUgY29ycmVjdCB2YXJpYWJsZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gcmVvcmRlckZpZWxkcyhuZXdGaWVsZHNPcmRlcik7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkc09yZGVyKS50b0VxdWFsKG5ld0ZpZWxkc09yZGVyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIsICgpID0+IHtcbiAgICBjb25zdCBjdXN0b21Db21wb25lbnRzID0gW107XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhjdXN0b21Db21wb25lbnRzKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcImltcG9ydEN1c3RvbUNvbXBvbmVudHNcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydEN1c3RvbUNvbXBvbmVudHMoY3VzdG9tQ29tcG9uZW50cyk7XG4gICAgICBleHBlY3QoYWN0aW9uLmN1c3RvbUNvbXBvbmVudHMpLnRvRXF1YWwoY3VzdG9tQ29tcG9uZW50cyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iLCIoZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBpbW11dGFibGVJbml0KGNvbmZpZykge1xuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL3YxNS4wLjEvc3JjL2lzb21vcnBoaWMvY2xhc3NpYy9lbGVtZW50L1JlYWN0RWxlbWVudC5qcyNMMjFcbiAgdmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEVfRkFMTEJBQ0sgPSAweGVhYzc7XG5cbiAgdmFyIGdsb2JhbENvbmZpZyA9IHtcbiAgICB1c2Vfc3RhdGljOiBmYWxzZVxuICB9O1xuICBpZiAoaXNPYmplY3QoY29uZmlnKSkge1xuICAgICAgaWYgKGNvbmZpZy51c2Vfc3RhdGljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnbG9iYWxDb25maWcudXNlX3N0YXRpYyA9IEJvb2xlYW4oY29uZmlnLnVzZV9zdGF0aWMpO1xuICAgICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICBkYXRhICE9PSBudWxsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3RhbnRpYXRlRW1wdHlPYmplY3Qob2JqKSB7XG4gICAgICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gICAgICBpZiAoIXByb3RvdHlwZSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcbiAgICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFByb3BlcnR5VG8odGFyZ2V0LCBtZXRob2ROYW1lLCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFuUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lKSB7XG4gICAgYWRkUHJvcGVydHlUbyh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEltbXV0YWJsZUVycm9yKFwiVGhlIFwiICsgbWV0aG9kTmFtZSArXG4gICAgICAgIFwiIG1ldGhvZCBjYW5ub3QgYmUgaW52b2tlZCBvbiBhbiBJbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmUuXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGltbXV0YWJpbGl0eVRhZyA9IFwiX19pbW11dGFibGVfaW52YXJpYW50c19ob2xkXCI7XG5cbiAgZnVuY3Rpb24gYWRkSW1tdXRhYmlsaXR5VGFnKHRhcmdldCkge1xuICAgIGFkZFByb3BlcnR5VG8odGFyZ2V0LCBpbW11dGFiaWxpdHlUYWcsIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJbW11dGFibGUodGFyZ2V0KSB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQgPT09IG51bGwgfHwgQm9vbGVhbihcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGltbXV0YWJpbGl0eVRhZylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIEphdmFTY3JpcHQsIG9ubHkgb2JqZWN0cyBhcmUgZXZlbiBwb3RlbnRpYWxseSBtdXRhYmxlLlxuICAgICAgLy8gc3RyaW5ncywgbnVtYmVycywgbnVsbCwgYW5kIHVuZGVmaW5lZCBhcmUgYWxsIG5hdHVyYWxseSBpbW11dGFibGUuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgICAvLyBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIChOYU4gIT09IE5hTikgZXZhbHVhdGluZyB0byB0cnVlXG4gICAgcmV0dXJuIChhID09PSBiIHx8IChhICE9PSBhICYmIGIgIT09IGIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRhcmdldCAhPT0gbnVsbCAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmICEoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIERhdGUpO1xuICB9XG5cbiAgdmFyIG11dGF0aW5nT2JqZWN0TWV0aG9kcyA9IFtcbiAgICBcInNldFByb3RvdHlwZU9mXCJcbiAgXTtcblxuICB2YXIgbm9uTXV0YXRpbmdPYmplY3RNZXRob2RzID0gW1xuICAgIFwia2V5c1wiXG4gIF07XG5cbiAgdmFyIG11dGF0aW5nQXJyYXlNZXRob2RzID0gbXV0YXRpbmdPYmplY3RNZXRob2RzLmNvbmNhdChbXG4gICAgXCJwdXNoXCIsIFwicG9wXCIsIFwic29ydFwiLCBcInNwbGljZVwiLCBcInNoaWZ0XCIsIFwidW5zaGlmdFwiLCBcInJldmVyc2VcIlxuICBdKTtcblxuICB2YXIgbm9uTXV0YXRpbmdBcnJheU1ldGhvZHMgPSBub25NdXRhdGluZ09iamVjdE1ldGhvZHMuY29uY2F0KFtcbiAgICBcIm1hcFwiLCBcImZpbHRlclwiLCBcInNsaWNlXCIsIFwiY29uY2F0XCIsIFwicmVkdWNlXCIsIFwicmVkdWNlUmlnaHRcIlxuICBdKTtcblxuICB2YXIgbXV0YXRpbmdEYXRlTWV0aG9kcyA9IG11dGF0aW5nT2JqZWN0TWV0aG9kcy5jb25jYXQoW1xuICAgIFwic2V0RGF0ZVwiLCBcInNldEZ1bGxZZWFyXCIsIFwic2V0SG91cnNcIiwgXCJzZXRNaWxsaXNlY29uZHNcIiwgXCJzZXRNaW51dGVzXCIsIFwic2V0TW9udGhcIiwgXCJzZXRTZWNvbmRzXCIsXG4gICAgXCJzZXRUaW1lXCIsIFwic2V0VVRDRGF0ZVwiLCBcInNldFVUQ0Z1bGxZZWFyXCIsIFwic2V0VVRDSG91cnNcIiwgXCJzZXRVVENNaWxsaXNlY29uZHNcIiwgXCJzZXRVVENNaW51dGVzXCIsXG4gICAgXCJzZXRVVENNb250aFwiLCBcInNldFVUQ1NlY29uZHNcIiwgXCJzZXRZZWFyXCJcbiAgXSk7XG5cbiAgZnVuY3Rpb24gSW1tdXRhYmxlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubmFtZSA9ICdNeUVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG4gIEltbXV0YWJsZUVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBJbW11dGFibGVFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFcnJvcjtcblxuICBmdW5jdGlvbiBtYWtlSW1tdXRhYmxlKG9iaiwgYmFubmVkTWV0aG9kcykge1xuICAgIC8vIFRhZyBpdCBzbyB3ZSBjYW4gcXVpY2tseSB0ZWxsIGl0J3MgaW1tdXRhYmxlIGxhdGVyLlxuICAgIGFkZEltbXV0YWJpbGl0eVRhZyhvYmopO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgLy8gTWFrZSBhbGwgbXV0YXRpbmcgbWV0aG9kcyB0aHJvdyBleGNlcHRpb25zLlxuICAgICAgZm9yICh2YXIgaW5kZXggaW4gYmFubmVkTWV0aG9kcykge1xuICAgICAgICBpZiAoYmFubmVkTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcbiAgICAgICAgICBiYW5Qcm9wZXJ0eShvYmosIGJhbm5lZE1ldGhvZHNbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGcmVlemUgaXQgYW5kIHJldHVybiBpdC5cbiAgICAgIE9iamVjdC5mcmVlemUob2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1ldGhvZFJldHVybkltbXV0YWJsZShvYmosIG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgY3VycmVudE1ldGhvZCA9IG9ialttZXRob2ROYW1lXTtcblxuICAgIGFkZFByb3BlcnR5VG8ob2JqLCBtZXRob2ROYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBJbW11dGFibGUoY3VycmVudE1ldGhvZC5hcHBseShvYmosIGFyZ3VtZW50cykpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlTZXQoaWR4LCB2YWx1ZSwgY29uZmlnKSB7XG4gICAgdmFyIGRlZXAgICAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLmRlZXA7XG5cbiAgICBpZiAoaWR4IGluIHRoaXMpIHtcbiAgICAgIGlmIChkZWVwICYmIHRoaXNbaWR4XSAhPT0gdmFsdWUgJiYgaXNNZXJnYWJsZU9iamVjdCh2YWx1ZSkgJiYgaXNNZXJnYWJsZU9iamVjdCh0aGlzW2lkeF0pKSB7XG4gICAgICAgIHZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKHRoaXNbaWR4XSwgdmFsdWUsIHtkZWVwOiB0cnVlLCBtb2RlOiAncmVwbGFjZSd9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VxdWFsKHRoaXNbaWR4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtdXRhYmxlID0gYXNNdXRhYmxlQXJyYXkuY2FsbCh0aGlzKTtcbiAgICBtdXRhYmxlW2lkeF0gPSBJbW11dGFibGUodmFsdWUpO1xuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkobXV0YWJsZSk7XG4gIH1cblxuICB2YXIgaW1tdXRhYmxlRW1wdHlBcnJheSA9IEltbXV0YWJsZShbXSk7XG5cbiAgZnVuY3Rpb24gYXJyYXlTZXRJbihwdGgsIHZhbHVlLCBjb25maWcpIHtcbiAgICB2YXIgaGVhZCA9IHB0aFswXTtcblxuICAgIGlmIChwdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gYXJyYXlTZXQuY2FsbCh0aGlzLCBoZWFkLCB2YWx1ZSwgY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhaWwgPSBwdGguc2xpY2UoMSk7XG4gICAgICB2YXIgdGhpc0hlYWQgPSB0aGlzW2hlYWRdO1xuICAgICAgdmFyIG5ld1ZhbHVlO1xuXG4gICAgICBpZiAodHlwZW9mKHRoaXNIZWFkKSA9PT0gXCJvYmplY3RcIiAmJiB0aGlzSGVhZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNaWdodCAodmFsaWRseSkgYmUgb2JqZWN0IG9yIGFycmF5XG4gICAgICAgIG5ld1ZhbHVlID0gSW1tdXRhYmxlLnNldEluKHRoaXNIZWFkLCB0YWlsLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmV4dEhlYWQgPSB0YWlsWzBdO1xuICAgICAgICAvLyBJZiB0aGUgbmV4dCBwYXRoIHBhcnQgaXMgYSBudW1iZXIsIHRoZW4gd2UgYXJlIHNldHRpbmcgaW50byBhbiBhcnJheSwgZWxzZSBhbiBvYmplY3QuXG4gICAgICAgIGlmIChuZXh0SGVhZCAhPT0gJycgJiYgaXNGaW5pdGUobmV4dEhlYWQpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBhcnJheVNldEluLmNhbGwoaW1tdXRhYmxlRW1wdHlBcnJheSwgdGFpbCwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gb2JqZWN0U2V0SW4uY2FsbChpbW11dGFibGVFbXB0eU9iamVjdCwgdGFpbCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWFkIGluIHRoaXMgJiYgdGhpc0hlYWQgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgbXV0YWJsZSA9IGFzTXV0YWJsZUFycmF5LmNhbGwodGhpcyk7XG4gICAgICBtdXRhYmxlW2hlYWRdID0gbmV3VmFsdWU7XG4gICAgICByZXR1cm4gbWFrZUltbXV0YWJsZUFycmF5KG11dGFibGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VJbW11dGFibGVBcnJheShhcnJheSkge1xuICAgIC8vIERvbid0IGNoYW5nZSB0aGVpciBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB3cmFwIHRoZXNlIGZ1bmN0aW9ucyB0byBtYWtlIHN1cmVcbiAgICAvLyB0aGV5IGFsd2F5cyByZXR1cm4gYW4gaW1tdXRhYmxlIHZhbHVlLlxuICAgIGZvciAodmFyIGluZGV4IGluIG5vbk11dGF0aW5nQXJyYXlNZXRob2RzKSB7XG4gICAgICBpZiAobm9uTXV0YXRpbmdBcnJheU1ldGhvZHMuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG4gICAgICAgIHZhciBtZXRob2ROYW1lID0gbm9uTXV0YXRpbmdBcnJheU1ldGhvZHNbaW5kZXhdO1xuICAgICAgICBtYWtlTWV0aG9kUmV0dXJuSW1tdXRhYmxlKGFycmF5LCBtZXRob2ROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcImZsYXRNYXBcIiwgIGZsYXRNYXApO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJhc09iamVjdFwiLCBhc09iamVjdCk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcImFzTXV0YWJsZVwiLCBhc011dGFibGVBcnJheSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcInNldFwiLCBhcnJheVNldCk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcInNldEluXCIsIGFycmF5U2V0SW4pO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJ1cGRhdGVcIiwgdXBkYXRlKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwidXBkYXRlSW5cIiwgdXBkYXRlSW4pO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJnZXRJblwiLCBnZXRJbik7XG4gICAgfVxuXG4gICAgZm9yKHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycmF5W2ldID0gSW1tdXRhYmxlKGFycmF5W2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZShhcnJheSwgbXV0YXRpbmdBcnJheU1ldGhvZHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZURhdGUoZGF0ZSkge1xuICAgIGlmICghZ2xvYmFsQ29uZmlnLnVzZV9zdGF0aWMpIHtcbiAgICAgIGFkZFByb3BlcnR5VG8oZGF0ZSwgXCJhc011dGFibGVcIiwgYXNNdXRhYmxlRGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGUoZGF0ZSwgbXV0YXRpbmdEYXRlTWV0aG9kcyk7XG4gIH1cblxuICBmdW5jdGlvbiBhc011dGFibGVEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmdldFRpbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogRWZmZWN0aXZlbHkgcGVyZm9ybXMgYSBtYXAoKSBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXksIHVzaW5nIHRoZVxuICAgKiBwcm92aWRlZCBpdGVyYXRvciwgZXhjZXB0IHRoYXQgd2hlbmV2ZXIgdGhlIGl0ZXJhdG9yIHJldHVybnMgYW4gYXJyYXksIHRoYXRcbiAgICogYXJyYXkncyBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGZpbmFsIHJlc3VsdCBpbnN0ZWFkIG9mIHRoZSBhcnJheSBpdHNlbGYuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdG9yIC0gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkuIEl0IHdpbGwgcmVjZWl2ZSB0aHJlZSBhcmd1bWVudHM6IHRoZSBjdXJyZW50IHZhbHVlLCB0aGUgY3VycmVudCBpbmRleCwgYW5kIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGZsYXRNYXAoaXRlcmF0b3IpIHtcbiAgICAvLyBDYWxsaW5nIC5mbGF0TWFwKCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBbXSxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGluZGV4O1xuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgaXRlcmF0b3JSZXN1bHQgPSBpdGVyYXRvcih0aGlzW2luZGV4XSwgaW5kZXgsIHRoaXMpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVyYXRvclJlc3VsdCkpIHtcbiAgICAgICAgLy8gQ29uY2F0ZW5hdGUgQXJyYXkgcmVzdWx0cyBpbnRvIHRoZSByZXR1cm4gdmFsdWUgd2UncmUgYnVpbGRpbmcgdXAuXG4gICAgICAgIHJlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCwgaXRlcmF0b3JSZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIG5vbi1BcnJheSByZXN1bHRzIHRoZSBzYW1lIHdheSBtYXAoKSBkb2VzLlxuICAgICAgICByZXN1bHQucHVzaChpdGVyYXRvclJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVBcnJheShyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSW1tdXRhYmxlIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBrZXlzVG9SZW1vdmUgLSBBIGxpc3Qgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGtleXMgdG8gZXhjbHVkZSBpbiB0aGUgcmV0dXJuIHZhbHVlLiBJbnN0ZWFkIG9mIHByb3ZpZGluZyBhIHNpbmdsZSBhcnJheSwgdGhpcyBtZXRob2QgY2FuIGFsc28gYmUgY2FsbGVkIGJ5IHBhc3NpbmcgbXVsdGlwbGUgc3RyaW5ncyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuXG4gICAqL1xuICBmdW5jdGlvbiB3aXRob3V0KHJlbW92ZSkge1xuICAgIC8vIENhbGxpbmcgLndpdGhvdXQoKSB3aXRoIG5vIGFyZ3VtZW50cyBpcyBhIG5vLW9wLiBEb24ndCBib3RoZXIgY2xvbmluZy5cbiAgICBpZiAodHlwZW9mIHJlbW92ZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlbW92ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBJZiB3ZSB3ZXJlbid0IGdpdmVuIGFuIGFycmF5LCB1c2UgdGhlIGFyZ3VtZW50cyBsaXN0LlxuICAgICAgdmFyIGtleXNUb1JlbW92ZUFycmF5ID0gKEFycmF5LmlzQXJyYXkocmVtb3ZlKSkgP1xuICAgICAgICAgcmVtb3ZlLnNsaWNlKCkgOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgICAvLyBDb252ZXJ0IG51bWVyaWMga2V5cyB0byBzdHJpbmdzIHNpbmNlIHRoYXQncyBob3cgdGhleSdsbFxuICAgICAgLy8gY29tZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgb2JqZWN0LlxuICAgICAga2V5c1RvUmVtb3ZlQXJyYXkuZm9yRWFjaChmdW5jdGlvbihlbCwgaWR4LCBhcnIpIHtcbiAgICAgICAgaWYodHlwZW9mKGVsKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGFycltpZHhdID0gZWwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJlbW92ZSA9IGZ1bmN0aW9uKHZhbCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXlzVG9SZW1vdmVBcnJheS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gaW5zdGFudGlhdGVFbXB0eU9iamVjdCh0aGlzKTtcblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzKSB7XG4gICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHJlbW92ZSh0aGlzW2tleV0sIGtleSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlT2JqZWN0KHJlc3VsdCk7XG4gIH1cblxuICBmdW5jdGlvbiBhc011dGFibGVBcnJheShvcHRzKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdLCBpLCBsZW5ndGg7XG5cbiAgICBpZihvcHRzICYmIG9wdHMuZGVlcCkge1xuICAgICAgZm9yKGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFzRGVlcE11dGFibGUodGhpc1tpXSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IoaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZmZlY3RpdmVseSBwZXJmb3JtcyBhIFttYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkgb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCBleHBlY3RpbmcgdGhhdCB0aGUgaXRlcmF0b3IgZnVuY3Rpb25cbiAgICogd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgdHdvIGVsZW1lbnRzIC0gdGhlIGZpcnN0IHJlcHJlc2VudGluZyBhIGtleSwgdGhlIG90aGVyXG4gICAqIGEgdmFsdWUuIFRoZW4gcmV0dXJucyBhbiBJbW11dGFibGUgT2JqZWN0IGNvbnN0cnVjdGVkIG9mIHRob3NlIGtleXMgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBBIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgdHdvIGVsZW1lbnRzIC0gdGhlIGZpcnN0IHJlcHJlc2VudGluZyB0aGUgZGVzaXJlZCBrZXksIHRoZSBvdGhlciB0aGUgZGVzaXJlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzT2JqZWN0KGl0ZXJhdG9yKSB7XG4gICAgLy8gSWYgbm8gaXRlcmF0b3Igd2FzIHByb3ZpZGVkLCBhc3N1bWUgdGhlIGlkZW50aXR5IGZ1bmN0aW9uXG4gICAgLy8gKHN1Z2dlc3RpbmcgdGhpcyBhcnJheSBpcyBhbHJlYWR5IGEgbGlzdCBvZiBrZXkvdmFsdWUgcGFpcnMuKVxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaXRlcmF0b3IgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHt9LFxuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aCxcbiAgICAgICAgaW5kZXg7XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBwYWlyICA9IGl0ZXJhdG9yKHRoaXNbaW5kZXhdLCBpbmRleCwgdGhpcyksXG4gICAgICAgICAga2V5ICAgPSBwYWlyWzBdLFxuICAgICAgICAgIHZhbHVlID0gcGFpclsxXTtcblxuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNEZWVwTXV0YWJsZShvYmopIHtcbiAgICBpZiAoXG4gICAgICAoIW9iaikgfHxcbiAgICAgICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JykgfHxcbiAgICAgICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGltbXV0YWJpbGl0eVRhZykpIHx8XG4gICAgICAob2JqIGluc3RhbmNlb2YgRGF0ZSlcbiAgICApIHsgcmV0dXJuIG9iajsgfVxuICAgIHJldHVybiBJbW11dGFibGUuYXNNdXRhYmxlKG9iaiwge2RlZXA6IHRydWV9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1aWNrQ29weShzcmMsIGRlc3QpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzcmMsIGtleSkpIHtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJbW11dGFibGUgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBvZiBib3RoXG4gICAqIHRoaXMgb2JqZWN0IGFuZCB0aGUgcHJvdmlkZWQgb2JqZWN0LCBwcmlvcml0aXppbmcgdGhlIHByb3ZpZGVkIG9iamVjdCdzXG4gICAqIHZhbHVlcyB3aGVuZXZlciB0aGUgc2FtZSBrZXkgaXMgcHJlc2VudCBpbiBib3RoIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvdGhlciAtIFRoZSBvdGhlciBvYmplY3QgdG8gbWVyZ2UuIE11bHRpcGxlIG9iamVjdHMgY2FuIGJlIHBhc3NlZCBhcyBhbiBhcnJheS4gSW4gc3VjaCBhIGNhc2UsIHRoZSBsYXRlciBhbiBvYmplY3QgYXBwZWFycyBpbiB0aGF0IGxpc3QsIHRoZSBoaWdoZXIgaXRzIHByaW9yaXR5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlnIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNldHRpbmdzLiBTdXBwb3J0ZWQgc2V0dGluZ3MgYXJlOiB7ZGVlcDogdHJ1ZX0gZm9yIGRlZXAgbWVyZ2UgYW5kIHttZXJnZXI6IG1lcmdlckZ1bmN9IHdoZXJlIG1lcmdlckZ1bmMgaXMgYSBmdW5jdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0YWtlcyBhIHByb3BlcnR5IGZyb20gYm90aCBvYmplY3RzLiBJZiBhbnl0aGluZyBpcyByZXR1cm5lZCBpdCBvdmVycmlkZXMgdGhlIG5vcm1hbCBtZXJnZSBiZWhhdmlvdXIuXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZShvdGhlciwgY29uZmlnKSB7XG4gICAgLy8gQ2FsbGluZyAubWVyZ2UoKSB3aXRoIG5vIGFyZ3VtZW50cyBpcyBhIG5vLW9wLiBEb24ndCBib3RoZXIgY2xvbmluZy5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKG90aGVyID09PSBudWxsIHx8ICh0eXBlb2Ygb3RoZXIgIT09IFwib2JqZWN0XCIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW1tdXRhYmxlI21lcmdlIGNhbiBvbmx5IGJlIGludm9rZWQgd2l0aCBvYmplY3RzIG9yIGFycmF5cywgbm90IFwiICsgSlNPTi5zdHJpbmdpZnkob3RoZXIpKTtcbiAgICB9XG5cbiAgICB2YXIgcmVjZWl2ZWRBcnJheSA9IChBcnJheS5pc0FycmF5KG90aGVyKSksXG4gICAgICAgIGRlZXAgICAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLmRlZXAsXG4gICAgICAgIG1vZGUgICAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLm1vZGUgfHwgJ21lcmdlJyxcbiAgICAgICAgbWVyZ2VyICAgICAgICA9IGNvbmZpZyAmJiBjb25maWcubWVyZ2VyLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICAvLyBVc2UgdGhlIGdpdmVuIGtleSB0byBleHRyYWN0IGEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LCB0aGVuIHBsYWNlXG4gICAgLy8gdGhhdCB2YWx1ZSBpbiB0aGUgcmVzdWx0IG9iamVjdCB1bmRlciB0aGUgc2FtZSBrZXkuIElmIHRoYXQgcmVzdWx0ZWRcbiAgICAvLyBpbiBhIGNoYW5nZSBmcm9tIHRoaXMgb2JqZWN0J3MgdmFsdWUgYXQgdGhhdCBrZXksIHNldCBhbnlDaGFuZ2VzID0gdHJ1ZS5cbiAgICBmdW5jdGlvbiBhZGRUb1Jlc3VsdChjdXJyZW50T2JqLCBvdGhlck9iaiwga2V5KSB7XG4gICAgICB2YXIgaW1tdXRhYmxlVmFsdWUgPSBJbW11dGFibGUob3RoZXJPYmpba2V5XSk7XG4gICAgICB2YXIgbWVyZ2VyUmVzdWx0ID0gbWVyZ2VyICYmIG1lcmdlcihjdXJyZW50T2JqW2tleV0sIGltbXV0YWJsZVZhbHVlLCBjb25maWcpO1xuICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRPYmpba2V5XTtcblxuICAgICAgaWYgKChyZXN1bHQgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICAgKG1lcmdlclJlc3VsdCAhPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICAoIWN1cnJlbnRPYmouaGFzT3duUHJvcGVydHkoa2V5KSkgfHxcbiAgICAgICAgIWlzRXF1YWwoaW1tdXRhYmxlVmFsdWUsIGN1cnJlbnRWYWx1ZSkpIHtcblxuICAgICAgICB2YXIgbmV3VmFsdWU7XG5cbiAgICAgICAgaWYgKG1lcmdlclJlc3VsdCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gbWVyZ2VyUmVzdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKGRlZXAgJiYgaXNNZXJnYWJsZU9iamVjdChjdXJyZW50VmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QoaW1tdXRhYmxlVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBJbW11dGFibGUubWVyZ2UoY3VycmVudFZhbHVlLCBpbW11dGFibGVWYWx1ZSwgY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGltbXV0YWJsZVZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGN1cnJlbnRWYWx1ZSwgbmV3VmFsdWUpIHx8ICFjdXJyZW50T2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIE1ha2UgYSBzaGFsbG93IGNsb25lIG9mIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgICAgICAgICAgIHJlc3VsdCA9IHF1aWNrQ29weShjdXJyZW50T2JqLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KGN1cnJlbnRPYmopKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXN1bHRba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJEcm9wcGVkS2V5cyhjdXJyZW50T2JqLCBvdGhlck9iaikge1xuICAgICAgZm9yICh2YXIga2V5IGluIGN1cnJlbnRPYmopIHtcbiAgICAgICAgaWYgKCFvdGhlck9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgICAgICAgICByZXN1bHQgPSBxdWlja0NvcHkoY3VycmVudE9iaiwgaW5zdGFudGlhdGVFbXB0eU9iamVjdChjdXJyZW50T2JqKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXk7XG5cbiAgICAvLyBBY2hpZXZlIHByaW9yaXRpemF0aW9uIGJ5IG92ZXJyaWRpbmcgcHJldmlvdXMgdmFsdWVzIHRoYXQgZ2V0IGluIHRoZSB3YXkuXG4gICAgaWYgKCFyZWNlaXZlZEFycmF5KSB7XG4gICAgICAvLyBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2U6IGp1c3QgbWVyZ2Ugb25lIG9iamVjdCBpbnRvIHRoZSBleGlzdGluZyBvbmUuXG4gICAgICBmb3IgKGtleSBpbiBvdGhlcikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvdGhlciwga2V5KSkge1xuICAgICAgICAgIGFkZFRvUmVzdWx0KHRoaXMsIG90aGVyLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobW9kZSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIGNsZWFyRHJvcHBlZEtleXModGhpcywgb3RoZXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBhbHNvIGFjY2VwdCBhbiBBcnJheVxuICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBvdGhlci5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBvdGhlckZyb21BcnJheSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBmb3IgKGtleSBpbiBvdGhlckZyb21BcnJheSkge1xuICAgICAgICAgIGlmIChvdGhlckZyb21BcnJheS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBhZGRUb1Jlc3VsdChyZXN1bHQgIT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRoaXMsIG90aGVyRnJvbUFycmF5LCBrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlT2JqZWN0KHJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb2JqZWN0UmVwbGFjZSh2YWx1ZSwgY29uZmlnKSB7XG4gICAgdmFyIGRlZXAgICAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLmRlZXA7XG5cbiAgICAvLyBDYWxsaW5nIC5yZXBsYWNlKCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbW11dGFibGUjcmVwbGFjZSBjYW4gb25seSBiZSBpbnZva2VkIHdpdGggb2JqZWN0cyBvciBhcnJheXMsIG5vdCBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEltbXV0YWJsZS5tZXJnZSh0aGlzLCB2YWx1ZSwge2RlZXA6IGRlZXAsIG1vZGU6ICdyZXBsYWNlJ30pO1xuICB9XG5cbiAgdmFyIGltbXV0YWJsZUVtcHR5T2JqZWN0ID0gSW1tdXRhYmxlKHt9KTtcblxuICBmdW5jdGlvbiBvYmplY3RTZXRJbihwYXRoLCB2YWx1ZSwgY29uZmlnKSB7XG4gICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIEFycmF5KSB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBmaXJzdCBhcmd1bWVudCB0byBJbW11dGFibGUjc2V0SW4gbXVzdCBiZSBhbiBhcnJheSBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBcXFwia2V5XFxcIiBzdHJpbmcuXCIpO1xuICAgIH1cblxuICAgIHZhciBoZWFkID0gcGF0aFswXTtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBvYmplY3RTZXQuY2FsbCh0aGlzLCBoZWFkLCB2YWx1ZSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICB2YXIgdGFpbCA9IHBhdGguc2xpY2UoMSk7XG4gICAgdmFyIG5ld1ZhbHVlO1xuICAgIHZhciB0aGlzSGVhZCA9IHRoaXNbaGVhZF07XG5cbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShoZWFkKSAmJiB0eXBlb2YodGhpc0hlYWQpID09PSBcIm9iamVjdFwiICYmIHRoaXNIZWFkICE9PSBudWxsKSB7XG4gICAgICAvLyBNaWdodCAodmFsaWRseSkgYmUgb2JqZWN0IG9yIGFycmF5XG4gICAgICBuZXdWYWx1ZSA9IEltbXV0YWJsZS5zZXRJbih0aGlzSGVhZCwgdGFpbCwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWYWx1ZSA9IG9iamVjdFNldEluLmNhbGwoaW1tdXRhYmxlRW1wdHlPYmplY3QsIHRhaWwsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShoZWFkKSAmJiB0aGlzSGVhZCA9PT0gbmV3VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciBtdXRhYmxlID0gcXVpY2tDb3B5KHRoaXMsIGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcykpO1xuICAgIG11dGFibGVbaGVhZF0gPSBuZXdWYWx1ZTtcbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChtdXRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9iamVjdFNldChwcm9wZXJ0eSwgdmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICBpZiAoZGVlcCAmJiB0aGlzW3Byb3BlcnR5XSAhPT0gdmFsdWUgJiYgaXNNZXJnYWJsZU9iamVjdCh2YWx1ZSkgJiYgaXNNZXJnYWJsZU9iamVjdCh0aGlzW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgdmFsdWUgPSBJbW11dGFibGUubWVyZ2UodGhpc1twcm9wZXJ0eV0sIHZhbHVlLCB7ZGVlcDogdHJ1ZSwgbW9kZTogJ3JlcGxhY2UnfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcXVhbCh0aGlzW3Byb3BlcnR5XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtdXRhYmxlID0gcXVpY2tDb3B5KHRoaXMsIGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcykpO1xuICAgIG11dGFibGVbcHJvcGVydHldID0gSW1tdXRhYmxlKHZhbHVlKTtcbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChtdXRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwcm9wZXJ0eSwgdXBkYXRlcikge1xuICAgIHZhciByZXN0QXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgdmFyIGluaXRpYWxWYWwgPSB0aGlzW3Byb3BlcnR5XTtcbiAgICByZXR1cm4gSW1tdXRhYmxlLnNldCh0aGlzLCBwcm9wZXJ0eSwgdXBkYXRlci5hcHBseShpbml0aWFsVmFsLCBbaW5pdGlhbFZhbF0uY29uY2F0KHJlc3RBcmdzKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5QYXRoKG9iaiwgcGF0aCkge1xuICAgIC8qanNoaW50IGVxbnVsbDp0cnVlICovXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXRoLmxlbmd0aDsgb2JqICE9IG51bGwgJiYgaSA8IGw7IGkrKykge1xuICAgICAgb2JqID0gb2JqW3BhdGhbaV1dO1xuICAgIH1cblxuICAgIHJldHVybiAoaSAmJiBpID09IGwpID8gb2JqIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlSW4ocGF0aCwgdXBkYXRlcikge1xuICAgIHZhciByZXN0QXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgdmFyIGluaXRpYWxWYWwgPSBnZXRJblBhdGgodGhpcywgcGF0aCk7XG5cbiAgICByZXR1cm4gSW1tdXRhYmxlLnNldEluKHRoaXMsIHBhdGgsIHVwZGF0ZXIuYXBwbHkoaW5pdGlhbFZhbCwgW2luaXRpYWxWYWxdLmNvbmNhdChyZXN0QXJncykpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluKHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldEluUGF0aCh0aGlzLCBwYXRoKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlT2JqZWN0KG9wdHMpIHtcbiAgICB2YXIgcmVzdWx0ID0gaW5zdGFudGlhdGVFbXB0eU9iamVjdCh0aGlzKSwga2V5O1xuXG4gICAgaWYob3B0cyAmJiBvcHRzLmRlZXApIHtcbiAgICAgIGZvciAoa2V5IGluIHRoaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYXNEZWVwTXV0YWJsZSh0aGlzW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoa2V5IGluIHRoaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIENyZWF0ZXMgcGxhaW4gb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNsb25pbmdcbiAgZnVuY3Rpb24gaW5zdGFudGlhdGVQbGFpbk9iamVjdCgpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IHdpdGggaW1tdXRhYmxlIG1ldGhvZHMsIGZyZWV6ZXMgaXQsIGFuZCByZXR1cm5zIGl0LlxuICBmdW5jdGlvbiBtYWtlSW1tdXRhYmxlT2JqZWN0KG9iaikge1xuICAgIGlmICghZ2xvYmFsQ29uZmlnLnVzZV9zdGF0aWMpIHtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcIm1lcmdlXCIsIG1lcmdlKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcInJlcGxhY2VcIiwgb2JqZWN0UmVwbGFjZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJ3aXRob3V0XCIsIHdpdGhvdXQpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwiYXNNdXRhYmxlXCIsIGFzTXV0YWJsZU9iamVjdCk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJzZXRcIiwgb2JqZWN0U2V0KTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcInNldEluXCIsIG9iamVjdFNldEluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcInVwZGF0ZVwiLCB1cGRhdGUpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwidXBkYXRlSW5cIiwgdXBkYXRlSW4pO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwiZ2V0SW5cIiwgZ2V0SW4pO1xuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlKG9iaiwgbXV0YXRpbmdPYmplY3RNZXRob2RzKTtcbiAgfVxuXG4gIC8vIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSB2YWxpZCByZWFjdCBlbGVtZW50XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL3YxNS4wLjEvc3JjL2lzb21vcnBoaWMvY2xhc3NpYy9lbGVtZW50L1JlYWN0RWxlbWVudC5qcyNMMzI2XG4gIGZ1bmN0aW9uIGlzUmVhY3RFbGVtZW50KG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICBvYmogIT09IG51bGwgJiZcbiAgICAgICAgICAgKG9iai4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFX0ZBTExCQUNLIHx8IG9iai4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRmlsZU9iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIEZpbGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc1Byb21pc2Uob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgIHR5cGVvZiBvYmoudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gSW1tdXRhYmxlKG9iaiwgb3B0aW9ucywgc3RhY2tSZW1haW5pbmcpIHtcbiAgICBpZiAoaXNJbW11dGFibGUob2JqKSB8fCBpc1JlYWN0RWxlbWVudChvYmopIHx8IGlzRmlsZU9iamVjdChvYmopIHx8IGlzRXJyb3Iob2JqKSkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9IGVsc2UgaWYgKGlzUHJvbWlzZShvYmopKSB7XG4gICAgICByZXR1cm4gb2JqLnRoZW4oSW1tdXRhYmxlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVBcnJheShvYmouc2xpY2UoKSk7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gbWFrZUltbXV0YWJsZURhdGUobmV3IERhdGUob2JqLmdldFRpbWUoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEb24ndCBmcmVlemUgdGhlIG9iamVjdCB3ZSB3ZXJlIGdpdmVuOyBtYWtlIGEgY2xvbmUgYW5kIHVzZSB0aGF0LlxuICAgICAgdmFyIHByb3RvdHlwZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5wcm90b3R5cGU7XG4gICAgICB2YXIgaW5zdGFudGlhdGVFbXB0eU9iamVjdCA9XG4gICAgICAgICghcHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgP1xuICAgICAgICAgIGluc3RhbnRpYXRlUGxhaW5PYmplY3QgOiAoZnVuY3Rpb24oKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7IH0pO1xuICAgICAgdmFyIGNsb25lID0gaW5zdGFudGlhdGVFbXB0eU9iamVjdCgpO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIC8qanNoaW50IGVxbnVsbDp0cnVlICovXG4gICAgICAgIGlmIChzdGFja1JlbWFpbmluZyA9PSBudWxsKSB7XG4gICAgICAgICAgc3RhY2tSZW1haW5pbmcgPSA2NDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhY2tSZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbW11dGFibGVFcnJvcihcIkF0dGVtcHQgdG8gY29uc3RydWN0IEltbXV0YWJsZSBmcm9tIGEgZGVlcGx5IG5lc3RlZCBvYmplY3Qgd2FzIGRldGVjdGVkLlwiICtcbiAgICAgICAgICAgIFwiIEhhdmUgeW91IHRyaWVkIHRvIHdyYXAgYW4gb2JqZWN0IHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcyAoZS5nLiBSZWFjdCBlbGVtZW50KT9cIiArXG4gICAgICAgICAgICBcIiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3J0ZmVsZG1hbi9zZWFtbGVzcy1pbW11dGFibGUvd2lraS9EZWVwbHktbmVzdGVkLW9iamVjdC13YXMtZGV0ZWN0ZWQgZm9yIGRldGFpbHMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrUmVtYWluaW5nIC09IDE7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpKSB7XG4gICAgICAgICAgY2xvbmVba2V5XSA9IEltbXV0YWJsZShvYmpba2V5XSwgdW5kZWZpbmVkLCBzdGFja1JlbWFpbmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QoY2xvbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdyYXBwZXIgdG8gYWxsb3cgdGhlIHVzZSBvZiBvYmplY3QgbWV0aG9kcyBhcyBzdGF0aWMgbWV0aG9kcyBvZiBJbW11dGFibGUuXG4gIGZ1bmN0aW9uIHRvU3RhdGljKGZuKSB7XG4gICAgZnVuY3Rpb24gc3RhdGljV3JhcHBlcigpIHtcbiAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgdmFyIHNlbGYgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRpY1dyYXBwZXI7XG4gIH1cblxuICAvLyBXcmFwcGVyIHRvIGFsbG93IHRoZSB1c2Ugb2Ygb2JqZWN0IG1ldGhvZHMgYXMgc3RhdGljIG1ldGhvZHMgb2YgSW1tdXRhYmxlLlxuICAvLyB3aXRoIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlvbiBvZiBjaG9vc2luZyB3aGljaCBmdW5jdGlvbiB0byBjYWxsIGRlcGVuZGluZ1xuICAvLyBpZiBhcmd1bWVudCBpcyBhbiBhcnJheSBvciBhbiBvYmplY3QuXG4gIGZ1bmN0aW9uIHRvU3RhdGljT2JqZWN0T3JBcnJheShmbk9iamVjdCwgZm5BcnJheSkge1xuICAgIGZ1bmN0aW9uIHN0YXRpY1dyYXBwZXIoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIHZhciBzZWxmID0gYXJncy5zaGlmdCgpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZikpIHtcbiAgICAgICAgICByZXR1cm4gZm5BcnJheS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZuT2JqZWN0LmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0aWNXcmFwcGVyO1xuICB9XG5cbiAgLy8gV3JhcHBlciB0byBhbGxvdyB0aGUgdXNlIG9mIG9iamVjdCBtZXRob2RzIGFzIHN0YXRpYyBtZXRob2RzIG9mIEltbXV0YWJsZS5cbiAgLy8gd2l0aCB0aGUgYWRkaXRpb25hbCBjb25kaXRpb24gb2YgY2hvb3Npbmcgd2hpY2ggZnVuY3Rpb24gdG8gY2FsbCBkZXBlbmRpbmdcbiAgLy8gaWYgYXJndW1lbnQgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IG9yIGEgZGF0ZS5cbiAgZnVuY3Rpb24gdG9TdGF0aWNPYmplY3RPckRhdGVPckFycmF5KGZuT2JqZWN0LCBmbkFycmF5LCBmbkRhdGUpIHtcbiAgICBmdW5jdGlvbiBzdGF0aWNXcmFwcGVyKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgc2VsZiA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGYpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXkuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIGZuRGF0ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZuT2JqZWN0LmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0aWNXcmFwcGVyO1xuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSBsaWJyYXJ5XG4gIEltbXV0YWJsZS5mcm9tICAgICAgICAgICA9IEltbXV0YWJsZTtcbiAgSW1tdXRhYmxlLmlzSW1tdXRhYmxlICAgID0gaXNJbW11dGFibGU7XG4gIEltbXV0YWJsZS5JbW11dGFibGVFcnJvciA9IEltbXV0YWJsZUVycm9yO1xuICBJbW11dGFibGUubWVyZ2UgICAgICAgICAgPSB0b1N0YXRpYyhtZXJnZSk7XG4gIEltbXV0YWJsZS5yZXBsYWNlICAgICAgICA9IHRvU3RhdGljKG9iamVjdFJlcGxhY2UpO1xuICBJbW11dGFibGUud2l0aG91dCAgICAgICAgPSB0b1N0YXRpYyh3aXRob3V0KTtcbiAgSW1tdXRhYmxlLmFzTXV0YWJsZSAgICAgID0gdG9TdGF0aWNPYmplY3RPckRhdGVPckFycmF5KGFzTXV0YWJsZU9iamVjdCwgYXNNdXRhYmxlQXJyYXksIGFzTXV0YWJsZURhdGUpO1xuICBJbW11dGFibGUuc2V0ICAgICAgICAgICAgPSB0b1N0YXRpY09iamVjdE9yQXJyYXkob2JqZWN0U2V0LCBhcnJheVNldCk7XG4gIEltbXV0YWJsZS5zZXRJbiAgICAgICAgICA9IHRvU3RhdGljT2JqZWN0T3JBcnJheShvYmplY3RTZXRJbiwgYXJyYXlTZXRJbik7XG4gIEltbXV0YWJsZS51cGRhdGUgICAgICAgICA9IHRvU3RhdGljKHVwZGF0ZSk7XG4gIEltbXV0YWJsZS51cGRhdGVJbiAgICAgICA9IHRvU3RhdGljKHVwZGF0ZUluKTtcbiAgSW1tdXRhYmxlLmdldEluICAgICAgICAgID0gdG9TdGF0aWMoZ2V0SW4pO1xuICBJbW11dGFibGUuZmxhdE1hcCAgICAgICAgPSB0b1N0YXRpYyhmbGF0TWFwKTtcbiAgSW1tdXRhYmxlLmFzT2JqZWN0ICAgICAgID0gdG9TdGF0aWMoYXNPYmplY3QpO1xuICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBJbW11dGFibGUuc3RhdGljID0gaW1tdXRhYmxlSW5pdCh7XG4gICAgICAgICAgdXNlX3N0YXRpYzogdHJ1ZVxuICAgICAgfSk7XG4gIH1cblxuICBPYmplY3QuZnJlZXplKEltbXV0YWJsZSk7XG5cbiAgcmV0dXJuIEltbXV0YWJsZTtcbn1cblxuICB2YXIgSW1tdXRhYmxlID0gaW1tdXRhYmxlSW5pdCgpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBJbW11dGFibGU7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZXhwb3J0cy5JbW11dGFibGUgPSBJbW11dGFibGU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikge1xuICAgIHdpbmRvdy5JbW11dGFibGUgPSBJbW11dGFibGU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbC5JbW11dGFibGUgPSBJbW11dGFibGU7XG4gIH1cbn0pKCk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcblxuLy8gVGhpcyBtaWRkbGV3YXJlIHdpbGwganVzdCBhZGQgdGhlIHByb3BlcnR5IFwiYXN5bmMgZGlzcGF0Y2hcIlxuLy8gdG8gYWN0aW9ucyB3aXRoIHRoZSBcImFzeW5jXCIgcHJvcHBlcnR5IHNldCB0byB0cnVlXG5jb25zdCBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZSA9IHN0b3JlID0+IG5leHQgPT4gYWN0aW9uID0+IHtcbiAgbGV0IHN5bmNBY3Rpdml0eUZpbmlzaGVkID0gZmFsc2U7XG4gIGxldCBhY3Rpb25RdWV1ZSA9IFtdO1xuXG4gIGZ1bmN0aW9uIGZsdXNoUXVldWUoKSB7XG4gICAgYWN0aW9uUXVldWUuZm9yRWFjaChhID0+IHN0b3JlLmRpc3BhdGNoKGEpKTsgLy8gZmx1c2ggcXVldWVcbiAgICBhY3Rpb25RdWV1ZSA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gYXN5bmNEaXNwYXRjaChhc3luY0FjdGlvbikge1xuICAgIGFjdGlvblF1ZXVlID0gYWN0aW9uUXVldWUuY29uY2F0KFthc3luY0FjdGlvbl0pO1xuXG4gICAgaWYgKHN5bmNBY3Rpdml0eUZpbmlzaGVkKSB7XG4gICAgICBmbHVzaFF1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWN0aW9uV2l0aEFzeW5jRGlzcGF0Y2ggPVxuICAgICAgSW1tdXRhYmxlKGFjdGlvbikubWVyZ2UoeyBhc3luY0Rpc3BhdGNoIH0pO1xuXG4gIG5leHQoYWN0aW9uV2l0aEFzeW5jRGlzcGF0Y2gpO1xuICBzeW5jQWN0aXZpdHlGaW5pc2hlZCA9IHRydWU7XG4gIGZsdXNoUXVldWUoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG5pbXBvcnQgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmUgZnJvbSBcIi4uL2pzL3V0aWxzL2FzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlXCI7XG5cbmNvbnN0IGZha2VBY3Rpb24gPSB7IHR5cGU6IFwiZmFrZSBhY3Rpb25cIiB9O1xuXG5kZXNjcmliZShcIlRoZSBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZVwiLCAoKSA9PiB7XG4gIGl0KFwiY2FsbHMgbmV4dCB3aXRoIGFzeW5jRGlzcGF0Y2ggcHJvcGVydHlcIiwgKGRvbmUpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gcmV0dXJuZWRBY3Rpb24gPT4ge1xuICAgICAgZXhwZWN0KHJldHVybmVkQWN0aW9uLmFzeW5jRGlzcGF0Y2gpLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QodHlwZW9mIHJldHVybmVkQWN0aW9uLmFzeW5jRGlzcGF0Y2gpLnRvRXF1YWwoXCJmdW5jdGlvblwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmUoXCJmYWtlU3RvcmVcIikobmV4dCkoZmFrZUFjdGlvbik7XG4gIH0pO1xuXG5cbiAgaXQoXCJhc3luY0Rpc3BhdGNoIHRyaWdnZXJzIGEgc3RvcmUgZGlzcGF0Y2hcIiwgKGRvbmUpID0+IHtcbiAgICBjb25zdCBmYWtlQXN5bmNBY3Rpb24gPSB7IHR5cGU6IFwiZmFrZUFzeW5jQWN0aW9uXCIgfTtcblxuICAgIGNvbnN0IGZha2VTdG9yZSA9IHtcbiAgICAgIGRpc3BhdGNoOiBhY3Rpb24gPT4ge1xuICAgICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoZmFrZUFzeW5jQWN0aW9uLnR5cGUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBuZXh0ID0gcmV0dXJuZWRBY3Rpb24gPT5cbiAgICAgIHJldHVybmVkQWN0aW9uLmFzeW5jRGlzcGF0Y2goZmFrZUFzeW5jQWN0aW9uKTtcblxuICAgIGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlKGZha2VTdG9yZSkobmV4dCkoZmFrZUFjdGlvbik7XG4gIH0pO1xufSk7XG4iLCIvLyBCdWcgY2hlY2tpbmcgZnVuY3Rpb24gdGhhdCB3aWxsIHRocm93IGFuIGVycm9yIHdoZW5ldmVyXG4vLyB0aGUgY29uZGl0aW9uIHNlbnQgdG8gaXQgaXMgZXZhbHVhdGVkIHRvIGZhbHNlXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBhbmQgb3V0cHV0cyB0aGUgY29ycmVjdCBtZXNzYWdlIGlmIHRoZSBjb25kaXRpb25cbiAqIGlzIGZhbHNlLiBPdGhlcndpc2UgaXQgb3V0cHV0cyBudWxsLlxuICogQGFwaSBwcml2YXRlXG4gKiBAbWV0aG9kIHByb2Nlc3NDb25kaXRpb25cbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4ge1N0cmluZyB8IG51bGx9ICAtIEVycm9yIG1lc3NhZ2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIG51bCBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgY29tcGxldGVFcnJvck1lc3NhZ2UgPSAnJztcbiAgICB2YXIgcmUgPSAvYXQgKFteXFxzXSspXFxzXFwoL2c7XG4gICAgdmFyIHN0YWNrVHJhY2UgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICB2YXIgc3RhY2tGdW5jdGlvbnMgPSBbXTtcblxuICAgIHZhciBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgd2hpbGUgKGZ1bmNOYW1lICYmIGZ1bmNOYW1lWzFdKSB7XG4gICAgICBzdGFja0Z1bmN0aW9ucy5wdXNoKGZ1bmNOYW1lWzFdKTtcbiAgICAgIGZ1bmNOYW1lID0gcmUuZXhlYyhzdGFja1RyYWNlKTtcbiAgICB9XG5cbiAgICAvLyBOdW1iZXIgMCBpcyBwcm9jZXNzQ29uZGl0aW9uIGl0c2VsZixcbiAgICAvLyBOdW1iZXIgMSBpcyBhc3NlcnQsXG4gICAgLy8gTnVtYmVyIDIgaXMgdGhlIGNhbGxlciBmdW5jdGlvbi5cbiAgICBpZiAoc3RhY2tGdW5jdGlvbnNbMl0pIHtcbiAgICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gc3RhY2tGdW5jdGlvbnNbMl0gKyAnOiAnICsgY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gICAgfVxuXG4gICAgY29tcGxldGVFcnJvck1lc3NhZ2UgKz0gZXJyb3JNZXNzYWdlO1xuICAgIHJldHVybiBjb21wbGV0ZUVycm9yTWVzc2FnZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgYm9vbGVhbiBwYXNzZWQgdG8gaXQgZXZhbHVhdGVzIHRvIGZhbHNlLlxuICogVG8gYmUgdXNlZCBsaWtlIHRoaXM6XG4gKiBcdFx0YXNzZXJ0KG15RGF0ZSAhPT0gdW5kZWZpbmVkLCBcIkRhdGUgY2Fubm90IGJlIHVuZGVmaW5lZC5cIik7XG4gKiBAYXBpIHB1YmxpY1xuICogQG1ldGhvZCBhc3NlcnRcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4gdm9pZFxuICovXG5mdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgdmFyIGVycm9yID0gcHJvY2Vzc0NvbmRpdGlvbihjb25kaXRpb24sIGVycm9yTWVzc2FnZSk7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgYSB3YXJuaW5nIGlmIHRoZSBib29sZWFuIHBhc3NlZCB0byBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuXG4gKiBUbyBiZSB1c2VkIGxpa2UgdGhpczpcbiAqIFx0XHRhc3NlcnQud2FybihteURhdGUgIT09IHVuZGVmaW5lZCwgXCJObyBkYXRlIHByb3ZpZGVkLlwiKTtcbiAqIEBhcGkgcHVibGljXG4gKiBAbWV0aG9kIHdhcm5cbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4gdm9pZFxuICovXG5hc3NlcnQud2FybiA9IGZ1bmN0aW9uIHdhcm4oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgdmFyIGVycm9yID0gcHJvY2Vzc0NvbmRpdGlvbihjb25kaXRpb24sIGVycm9yTWVzc2FnZSk7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgYXNzZXJ0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lJaXdpYzI5MWNtTmxjeUk2V3lKaGMzTmxjblF1YW5NaVhTd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeThnUW5WbklHTm9aV05yYVc1bklHWjFibU4wYVc5dUlIUm9ZWFFnZDJsc2JDQjBhSEp2ZHlCaGJpQmxjbkp2Y2lCM2FHVnVaWFpsY2x4dUx5OGdkR2hsSUdOdmJtUnBkR2x2YmlCelpXNTBJSFJ2SUdsMElHbHpJR1YyWVd4MVlYUmxaQ0IwYnlCbVlXeHpaVnh1THlvcVhHNGdLaUJRY205alpYTnpaWE1nZEdobElHMWxjM05oWjJVZ1lXNWtJRzkxZEhCMWRITWdkR2hsSUdOdmNuSmxZM1FnYldWemMyRm5aU0JwWmlCMGFHVWdZMjl1WkdsMGFXOXVYRzRnS2lCcGN5Qm1ZV3h6WlM0Z1QzUm9aWEozYVhObElHbDBJRzkxZEhCMWRITWdiblZzYkM1Y2JpQXFJRUJoY0drZ2NISnBkbUYwWlZ4dUlDb2dRRzFsZEdodlpDQndjbTlqWlhOelEyOXVaR2wwYVc5dVhHNGdLaUJBY0dGeVlXMGdJSHRDYjI5c1pXRnVmU0JqYjI1a2FYUnBiMjRnTFNCU1pYTjFiSFFnYjJZZ2RHaGxJR1YyWVd4MVlYUmxaQ0JqYjI1a2FYUnBiMjVjYmlBcUlFQndZWEpoYlNBZ2UxTjBjbWx1WjMwZ1pYSnliM0pOWlhOellXZGxJQzBnVFdWemMyRm5aU0JsZUhCc1lXbHVhV2NnZEdobElHVnljbTl5SUdsdUlHTmhjMlVnYVhRZ2FYTWdkR2h5YjNkdVhHNGdLaUJBY21WMGRYSnVJSHRUZEhKcGJtY2dmQ0J1ZFd4c2ZTQWdMU0JGY25KdmNpQnRaWE56WVdkbElHbG1JSFJvWlhKbElHbHpJR0Z1SUdWeWNtOXlMQ0J1ZFd3Z2IzUm9aWEozYVhObExseHVJQ292WEc1bWRXNWpkR2x2YmlCd2NtOWpaWE56UTI5dVpHbDBhVzl1S0dOdmJtUnBkR2x2Yml3Z1pYSnliM0pOWlhOellXZGxLU0I3WEc0Z0lHbG1JQ2doWTI5dVpHbDBhVzl1S1NCN1hHNGdJQ0FnYkdWMElHTnZiWEJzWlhSbFJYSnliM0pOWlhOellXZGxJRDBnSnljN1hHNGdJQ0FnWTI5dWMzUWdjbVVnUFNBdllYUWdLRnRlWEZ4elhTc3BYRnh6WEZ3b0wyYzdYRzRnSUNBZ1kyOXVjM1FnYzNSaFkydFVjbUZqWlNBOUlHNWxkeUJGY25KdmNpZ3BMbk4wWVdOck8xeHVJQ0FnSUdOdmJuTjBJSE4wWVdOclJuVnVZM1JwYjI1eklEMGdXMTA3WEc1Y2JpQWdJQ0JzWlhRZ1puVnVZMDVoYldVZ1BTQnlaUzVsZUdWaktITjBZV05yVkhKaFkyVXBPMXh1SUNBZ0lIZG9hV3hsSUNobWRXNWpUbUZ0WlNBbUppQm1kVzVqVG1GdFpWc3hYU2tnZTF4dUlDQWdJQ0FnYzNSaFkydEdkVzVqZEdsdmJuTXVjSFZ6YUNobWRXNWpUbUZ0WlZzeFhTazdYRzRnSUNBZ0lDQm1kVzVqVG1GdFpTQTlJSEpsTG1WNFpXTW9jM1JoWTJ0VWNtRmpaU2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeThnVG5WdFltVnlJREFnYVhNZ2NISnZZMlZ6YzBOdmJtUnBkR2x2YmlCcGRITmxiR1lzWEc0Z0lDQWdMeThnVG5WdFltVnlJREVnYVhNZ1lYTnpaWEowTEZ4dUlDQWdJQzh2SUU1MWJXSmxjaUF5SUdseklIUm9aU0JqWVd4c1pYSWdablZ1WTNScGIyNHVYRzRnSUNBZ2FXWWdLSE4wWVdOclJuVnVZM1JwYjI1eld6SmRLU0I3WEc0Z0lDQWdJQ0JqYjIxd2JHVjBaVVZ5Y205eVRXVnpjMkZuWlNBOUlHQWtlM04wWVdOclJuVnVZM1JwYjI1eld6SmRmVG9nSkh0amIyMXdiR1YwWlVWeWNtOXlUV1Z6YzJGblpYMWdPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHTnZiWEJzWlhSbFJYSnliM0pOWlhOellXZGxJQ3M5SUdWeWNtOXlUV1Z6YzJGblpUdGNiaUFnSUNCeVpYUjFjbTRnWTI5dGNHeGxkR1ZGY25KdmNrMWxjM05oWjJVN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2JuVnNiRHRjYm4xY2JseHVMeW9xWEc0Z0tpQlVhSEp2ZDNNZ1lXNGdaWEp5YjNJZ2FXWWdkR2hsSUdKdmIyeGxZVzRnY0dGemMyVmtJSFJ2SUdsMElHVjJZV3gxWVhSbGN5QjBieUJtWVd4elpTNWNiaUFxSUZSdklHSmxJSFZ6WldRZ2JHbHJaU0IwYUdsek9seHVJQ29nWEhSY2RHRnpjMlZ5ZENodGVVUmhkR1VnSVQwOUlIVnVaR1ZtYVc1bFpDd2dYQ0pFWVhSbElHTmhibTV2ZENCaVpTQjFibVJsWm1sdVpXUXVYQ0lwTzF4dUlDb2dRR0Z3YVNCd2RXSnNhV05jYmlBcUlFQnRaWFJvYjJRZ1lYTnpaWEowWEc0Z0tpQkFjR0Z5WVcwZ0lIdENiMjlzWldGdWZTQmpiMjVrYVhScGIyNGdMU0JTWlhOMWJIUWdiMllnZEdobElHVjJZV3gxWVhSbFpDQmpiMjVrYVhScGIyNWNiaUFxSUVCd1lYSmhiU0FnZTFOMGNtbHVaMzBnWlhKeWIzSk5aWE56WVdkbElDMGdUV1Z6YzJGblpTQmxlSEJzWVdsdWFXY2dkR2hsSUdWeWNtOXlJR2x1SUdOaGMyVWdhWFFnYVhNZ2RHaHliM2R1WEc0Z0tpQkFjbVYwZFhKdUlIWnZhV1JjYmlBcUwxeHVablZ1WTNScGIyNGdZWE56WlhKMEtHTnZibVJwZEdsdmJpd2daWEp5YjNKTlpYTnpZV2RsS1NCN1hHNGdJR052Ym5OMElHVnljbTl5SUQwZ2NISnZZMlZ6YzBOdmJtUnBkR2x2YmloamIyNWthWFJwYjI0c0lHVnljbTl5VFdWemMyRm5aU2s3WEc0Z0lHbG1JQ2gwZVhCbGIyWWdaWEp5YjNJZ1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHVnljbTl5S1R0Y2JpQWdmVnh1ZlZ4dVhHNHZLaXBjYmlBcUlFeHZaM01nWVNCM1lYSnVhVzVuSUdsbUlIUm9aU0JpYjI5c1pXRnVJSEJoYzNObFpDQjBieUJwZENCbGRtRnNkV0YwWlhNZ2RHOGdabUZzYzJVdVhHNGdLaUJVYnlCaVpTQjFjMlZrSUd4cGEyVWdkR2hwY3pwY2JpQXFJRngwWEhSaGMzTmxjblF1ZDJGeWJpaHRlVVJoZEdVZ0lUMDlJSFZ1WkdWbWFXNWxaQ3dnWENKT2J5QmtZWFJsSUhCeWIzWnBaR1ZrTGx3aUtUdGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaUJBYldWMGFHOWtJSGRoY201Y2JpQXFJRUJ3WVhKaGJTQWdlMEp2YjJ4bFlXNTlJR052Ym1ScGRHbHZiaUF0SUZKbGMzVnNkQ0J2WmlCMGFHVWdaWFpoYkhWaGRHVmtJR052Ym1ScGRHbHZibHh1SUNvZ1FIQmhjbUZ0SUNCN1UzUnlhVzVuZlNCbGNuSnZjazFsYzNOaFoyVWdMU0JOWlhOellXZGxJR1Y0Y0d4aGFXNXBaeUIwYUdVZ1pYSnliM0lnYVc0Z1kyRnpaU0JwZENCcGN5QjBhSEp2ZDI1Y2JpQXFJRUJ5WlhSMWNtNGdkbTlwWkZ4dUlDb3ZYRzVoYzNObGNuUXVkMkZ5YmlBOUlHWjFibU4wYVc5dUlIZGhjbTRvWTI5dVpHbDBhVzl1TENCbGNuSnZjazFsYzNOaFoyVXBJSHRjYmlBZ1kyOXVjM1FnWlhKeWIzSWdQU0J3Y205alpYTnpRMjl1WkdsMGFXOXVLR052Ym1ScGRHbHZiaXdnWlhKeWIzSk5aWE56WVdkbEtUdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCbGNuSnZjaUE5UFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNCamIyNXpiMnhsTG5kaGNtNG9aWEp5YjNJcE8xeHVJQ0I5WEc1OU8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQmhjM05sY25RN1hHNGlYU3dpWm1sc1pTSTZJbUZ6YzJWeWRDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSXZjMjkxY21ObEx5SjlcbiIsIi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHZhbGAgaXMgYW4gYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc0FycmF5KFtdKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc0FycmF5KG51bGwpOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5KHt9KTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gX2lzQXJyYXkodmFsKSB7XG4gIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoID49IDAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59OyIsInZhciBfaXNBcnJheSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhpcyBjaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIFttZXRob2RuYW1lXSBmdW5jdGlvbi4gSWYgaXQgaXNuJ3QgYW5cbiAqIGFycmF5IGl0IHdpbGwgZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIG90aGVyd2lzZSBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHJhbWRhXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gcmFtZGEgaW1wbGVtdGF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge09iamVjdH0gV2hhdGV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kIGlzLlxuICovXG5cblxuZnVuY3Rpb24gX2NoZWNrRm9yTWV0aG9kKG1ldGhvZG5hbWUsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbbGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIF9pc0FycmF5KG9iaikgfHwgdHlwZW9mIG9ialttZXRob2RuYW1lXSAhPT0gJ2Z1bmN0aW9uJyA/IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBvYmpbbWV0aG9kbmFtZV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIGxlbmd0aCAtIDEpKTtcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NoZWNrRm9yTWV0aG9kOyIsImZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKGEpIHtcbiAgICAgICByZXR1cm4gYSAhPSBudWxsICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzUGxhY2Vob2xkZXI7IiwidmFyIF9pc1BsYWNlaG9sZGVyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuXG5cbmZ1bmN0aW9uIF9jdXJyeTEoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYxKGEpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBfaXNQbGFjZWhvbGRlcihhKSkge1xuICAgICAgcmV0dXJuIGYxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTE7IiwidmFyIF9jdXJyeTEgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9fY3VycnkxJyk7XG5cbnZhciBfaXNQbGFjZWhvbGRlciA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cbi8qKlxuICogT3B0aW1pemVkIGludGVybmFsIHR3by1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjIgOiBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjIgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iKTtcbiAgICAgICAgfSkgOiBmbihhLCBiKTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTI7IiwidmFyIF9jdXJyeTEgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9fY3VycnkxJyk7XG5cbnZhciBfY3VycnkyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2N1cnJ5MicpO1xuXG52YXIgX2lzUGxhY2Vob2xkZXIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9faXNQbGFjZWhvbGRlcicpO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBfY3VycnkzKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMyhhLCBiLCBjKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjMgOiBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYzIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkyKGZ1bmN0aW9uIChfYSwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9iLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgX2MpO1xuICAgICAgICB9KSA6IF9jdXJyeTEoZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIGIsIF9jKTtcbiAgICAgICAgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBmMyA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBfYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkyKGZ1bmN0aW9uIChfYSwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9iLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGEpID8gX2N1cnJ5MShmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIGIsIGMpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpID8gX2N1cnJ5MShmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIGMpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MShmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IGZuKGEsIGIsIGMpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MzsiLCJ2YXIgX2NoZWNrRm9yTWV0aG9kID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kJyk7XG5cbnZhciBfY3VycnkzID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cblxuXG52YXIgc2xpY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShmcm9tSW5kZXgsIHRvSW5kZXgsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIGZyb21JbmRleCwgdG9JbmRleCk7XG59KSk7XG5tb2R1bGUuZXhwb3J0cyA9IHNsaWNlOyIsInZhciBfY3VycnkzID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG4vLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbi8vIHRyYW5zZm9ybXMgdGhlIGhlbGQgdmFsdWUgd2l0aCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG5cblxudmFyIElkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHgsIG1hcDogZnVuY3Rpb24gKGYpIHtcbiAgICAgIHJldHVybiBJZGVudGl0eShmKHgpKTtcbiAgICB9IH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5wcm9wLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydGT08nLCAnYmFyJywgJ2JheiddXG4gKi9cbnZhciBvdmVyID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gb3ZlcihsZW5zLCBmLCB4KSB7XG4gIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIGZpcnN0IHRyYW5zZm9ybWVkIHdpdGggYGZgLFxuICAvLyB0aGVuIHNldCBhcyB0aGUgdmFsdWUgb2YgYW4gYElkZW50aXR5YC4gVGhpcyBpcyB0aGVuIG1hcHBlZCBvdmVyIHdpdGggdGhlXG4gIC8vIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgbGVucy5cbiAgcmV0dXJuIGxlbnMoZnVuY3Rpb24gKHkpIHtcbiAgICByZXR1cm4gSWRlbnRpdHkoZih5KSk7XG4gIH0pKHgpLnZhbHVlO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IG92ZXI7IiwidmFyIF9jdXJyeTEgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG5cblxudmFyIGFsd2F5cyA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGFsd2F5cyh2YWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9O1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGFsd2F5czsiLCJ2YXIgX2N1cnJ5MyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxudmFyIGFsd2F5cyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2Fsd2F5cycpO1xuXG52YXIgb3ZlciA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL292ZXInKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgXCJzZXR0aW5nXCIgdGhlIHBvcnRpb24gb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlXG4gKiBmb2N1c2VkIGJ5IHRoZSBnaXZlbiBsZW5zIHRvIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBMZW5zIHMgYSAtPiBhIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5wcm9wLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4TGVucyA9IFIubGVuc1Byb3AoJ3gnKTtcbiAqXG4gKiAgICAgIFIuc2V0KHhMZW5zLCA0LCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5zZXQoeExlbnMsIDgsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA4LCB5OiAyfVxuICovXG5cblxudmFyIHNldCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHNldChsZW5zLCB2LCB4KSB7XG4gIHJldHVybiBvdmVyKGxlbnMsIGFsd2F5cyh2KSwgeCk7XG59KTtcbm1vZHVsZS5leHBvcnRzID0gc2V0OyIsImZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgOTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIF9hcml0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIHRlbicpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9hcml0eTsiLCJmdW5jdGlvbiBfcGlwZShmLCBnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGcuY2FsbCh0aGlzLCBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcGlwZTsiLCJmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzU3RyaW5nOyIsInZhciBfY3VycnkxID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2N1cnJ5MScpO1xuXG52YXIgX2lzQXJyYXkgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9faXNBcnJheScpO1xuXG52YXIgX2lzU3RyaW5nID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2lzU3RyaW5nJyk7XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIHNpbWlsYXIgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGhhcyBhIG51bWVyaWMgbGVuZ3RoIHByb3BlcnR5IGFuZCBleHRyZW1lIGluZGljZXMgZGVmaW5lZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2lzQXJyYXlMaWtlKFtdKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh0cnVlKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2Uoe30pOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7bGVuZ3RoOiAxMH0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7MDogJ3plcm8nLCA5OiAnbmluZScsIGxlbmd0aDogMTB9KTsgLy89PiB0cnVlXG4gKi9cblxuXG52YXIgX2lzQXJyYXlMaWtlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNBcnJheUxpa2UoeCkge1xuICBpZiAoX2lzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoX2lzU3RyaW5nKHgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgcmV0dXJuICEheC5sZW5ndGg7XG4gIH1cbiAgaWYgKHgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHgubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB4Lmhhc093blByb3BlcnR5KDApICYmIHguaGFzT3duUHJvcGVydHkoeC5sZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KTtcbm1vZHVsZS5leHBvcnRzID0gX2lzQXJyYXlMaWtlOyIsInZhciBYV3JhcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhXcmFwKGZuKSB7XG4gICAgdGhpcy5mID0gZm47XG4gIH1cbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW5pdCBub3QgaW1wbGVtZW50ZWQgb24gWFdyYXAnKTtcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAoYWNjKSB7XG4gICAgcmV0dXJuIGFjYztcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcblxuICByZXR1cm4gWFdyYXA7XG59KCk7XG5cbmZ1bmN0aW9uIF94d3JhcChmbikge1xuICByZXR1cm4gbmV3IFhXcmFwKGZuKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3h3cmFwOyIsInZhciBfYXJpdHkgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXJpdHknKTtcblxudmFyIF9jdXJyeTIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgYm91bmQgdG8gYSBjb250ZXh0LlxuICogTm90ZTogYFIuYmluZGAgZG9lcyBub3QgcHJvdmlkZSB0aGUgYWRkaXRpb25hbCBhcmd1bWVudC1iaW5kaW5nIGNhcGFiaWxpdGllcyBvZlxuICogW0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKiAtPiAqKSAtPiB7Kn0gLT4gKCogLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiaW5kIHRvIGNvbnRleHRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzT2JqIFRoZSBjb250ZXh0IHRvIGJpbmQgYGZuYCB0b1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgaW4gdGhlIGNvbnRleHQgb2YgYHRoaXNPYmpgLlxuICogQHNlZSBSLnBhcnRpYWxcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbG9nID0gUi5iaW5kKGNvbnNvbGUubG9nLCBjb25zb2xlKTtcbiAqICAgICAgUi5waXBlKFIuYXNzb2MoJ2EnLCAyKSwgUi50YXAobG9nKSwgUi5hc3NvYygnYScsIDMpKSh7YTogMX0pOyAvLz0+IHthOiAzfVxuICogICAgICAvLyBsb2dzIHthOiAyfVxuICogQHN5bWIgUi5iaW5kKGYsIG8pKGEsIGIpID0gZi5jYWxsKG8sIGEsIGIpXG4gKi9cblxuXG52YXIgYmluZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNPYmopIHtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc09iaiwgYXJndW1lbnRzKTtcbiAgfSk7XG59KTtcbm1vZHVsZS5leHBvcnRzID0gYmluZDsiLCJ2YXIgX2lzQXJyYXlMaWtlID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2lzQXJyYXlMaWtlJyk7XG5cbnZhciBfeHdyYXAgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9feHdyYXAnKTtcblxudmFyIGJpbmQgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi4vYmluZCcpO1xuXG5mdW5jdGlvbiBfYXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBsaXN0W2lkeF0pO1xuICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICBhY2MgPSBhY2NbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn1cblxuZnVuY3Rpb24gX21ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmosIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ob2JqW21ldGhvZE5hbWVdKGJpbmQoeGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10sIHhmKSwgYWNjKSk7XG59XG5cbnZhciBzeW1JdGVyYXRvciA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InO1xuXG5mdW5jdGlvbiBfcmVkdWNlKGZuLCBhY2MsIGxpc3QpIHtcbiAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gX3h3cmFwKGZuKTtcbiAgfVxuICBpZiAoX2lzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgcmV0dXJuIF9hcnJheVJlZHVjZShmbiwgYWNjLCBsaXN0KTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RbJ2ZhbnRhc3ktbGFuZC9yZWR1Y2UnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBfbWV0aG9kUmVkdWNlKGZuLCBhY2MsIGxpc3QsICdmYW50YXN5LWxhbmQvcmVkdWNlJyk7XG4gIH1cbiAgaWYgKGxpc3Rbc3ltSXRlcmF0b3JdICE9IG51bGwpIHtcbiAgICByZXR1cm4gX2l0ZXJhYmxlUmVkdWNlKGZuLCBhY2MsIGxpc3Rbc3ltSXRlcmF0b3JdKCkpO1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdC5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIF9pdGVyYWJsZVJlZHVjZShmbiwgYWNjLCBsaXN0KTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3QucmVkdWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIF9tZXRob2RSZWR1Y2UoZm4sIGFjYywgbGlzdCwgJ3JlZHVjZScpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlOiBsaXN0IG11c3QgYmUgYXJyYXkgb3IgaXRlcmFibGUnKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZHVjZTsiLCJ2YXIgX2N1cnJ5MyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxudmFyIF9yZWR1Y2UgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG5cbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBsaXN0LCBzdWNjZXNzaXZlbHkgY2FsbGluZ1xuICogdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGFuZCBwYXNzaW5nIGl0IGFuIGFjY3VtdWxhdG9yIHZhbHVlIGFuZCB0aGUgY3VycmVudFxuICogdmFsdWUgZnJvbSB0aGUgYXJyYXksIGFuZCB0aGVuIHBhc3NpbmcgdGhlIHJlc3VsdCB0byB0aGUgbmV4dCBjYWxsLlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnRjdXQgdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBUaGUgYXJndW1lbnRzJyBvcmRlciBvZiBbYHJlZHVjZVJpZ2h0YF0oI3JlZHVjZVJpZ2h0KSdzIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBpcyAqKHZhbHVlLCBhY2MpKi5cbiAqXG4gKiBOb3RlOiBgUi5yZWR1Y2VgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlI0Rlc2NyaXB0aW9uXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHJlZHVjZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC4gV2hlblxuICogZG9pbmcgc28sIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGhhbmRsZSB0aGUgW2BSLnJlZHVjZWRgXSgjcmVkdWNlZClcbiAqIHNob3J0Y3V0aW5nLCBhcyB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBieSBgcmVkdWNlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGUgYWNjdW11bGF0b3IgYW5kIHRoZVxuICogICAgICAgIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2VkLCBSLmFkZEluZGV4LCBSLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2UoUi5zdWJ0cmFjdCwgMCwgWzEsIDIsIDMsIDRdKSAvLyA9PiAoKCgoMCAtIDEpIC0gMikgLSAzKSAtIDQpID0gLTEwXG4gKiAgICAgIC8vICAgICAgICAgIC0gICAgICAgICAgICAgICAtMTBcbiAqICAgICAgLy8gICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgICAgICAtICAgNCAgICAgICAgICAgLTYgICA0XG4gKiAgICAgIC8vICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAtICAgMyAgID09PiAgICAgLTMgICAzXG4gKiAgICAgIC8vICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgIC0gICAyICAgICAgICAgICAtMSAgIDJcbiAqICAgICAgLy8gICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAwICAgMSAgICAgICAgICAgIDAgICAxXG4gKlxuICogQHN5bWIgUi5yZWR1Y2UoZiwgYSwgW2IsIGMsIGRdKSA9IGYoZihmKGEsIGIpLCBjKSwgZClcbiAqL1xuXG5cbnZhciByZWR1Y2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhfcmVkdWNlKTtcbm1vZHVsZS5leHBvcnRzID0gcmVkdWNlOyIsInZhciBfY2hlY2tGb3JNZXRob2QgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QnKTtcblxudmFyIF9jdXJyeTEgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cbnZhciBzbGljZSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL3NsaWNlJyk7XG5cbi8qKlxuICogUmV0dXJucyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0XG4gKiB3aXRoIGEgYHRhaWxgIG1ldGhvZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHNsaWNlYCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXVxuICogQHNpZyBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuaGVhZCwgUi5pbml0LCBSLmxhc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRhaWwoWzEsIDIsIDNdKTsgIC8vPT4gWzIsIDNdXG4gKiAgICAgIFIudGFpbChbMSwgMl0pOyAgICAgLy89PiBbMl1cbiAqICAgICAgUi50YWlsKFsxXSk7ICAgICAgICAvLz0+IFtdXG4gKiAgICAgIFIudGFpbChbXSk7ICAgICAgICAgLy89PiBbXVxuICpcbiAqICAgICAgUi50YWlsKCdhYmMnKTsgIC8vPT4gJ2JjJ1xuICogICAgICBSLnRhaWwoJ2FiJyk7ICAgLy89PiAnYidcbiAqICAgICAgUi50YWlsKCdhJyk7ICAgIC8vPT4gJydcbiAqICAgICAgUi50YWlsKCcnKTsgICAgIC8vPT4gJydcbiAqL1xuXG5cbnZhciB0YWlsID0gLyojX19QVVJFX18qL19jdXJyeTEoIC8qI19fUFVSRV9fKi9fY2hlY2tGb3JNZXRob2QoJ3RhaWwnLCAvKiNfX1BVUkVfXyovc2xpY2UoMSwgSW5maW5pdHkpKSk7XG5tb2R1bGUuZXhwb3J0cyA9IHRhaWw7IiwidmFyIF9hcml0eSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xuXG52YXIgX3BpcGUgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fcGlwZScpO1xuXG52YXIgcmVkdWNlID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vcmVkdWNlJyk7XG5cbnZhciB0YWlsID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vdGFpbCcpO1xuXG4vKipcbiAqIFBlcmZvcm1zIGxlZnQtdG8tcmlnaHQgZnVuY3Rpb24gY29tcG9zaXRpb24uIFRoZSBsZWZ0bW9zdCBmdW5jdGlvbiBtYXkgaGF2ZVxuICogYW55IGFyaXR5OyB0aGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYHNlcXVlbmNlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIHJlc3VsdCBvZiBwaXBlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCgoYSwgYiwgLi4uLCBuKSAtPiBvKSwgKG8gLT4gcCksIC4uLiwgKHggLT4geSksICh5IC0+IHopKSAtPiAoKGEsIGIsIC4uLiwgbikgLT4geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBmID0gUi5waXBlKE1hdGgucG93LCBSLm5lZ2F0ZSwgUi5pbmMpO1xuICpcbiAqICAgICAgZigzLCA0KTsgLy8gLSgzXjQpICsgMVxuICogQHN5bWIgUi5waXBlKGYsIGcsIGgpKGEsIGIpID0gaChnKGYoYSwgYikpKVxuICovXG5cblxuZnVuY3Rpb24gcGlwZSgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BpcGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIF9hcml0eShhcmd1bWVudHNbMF0ubGVuZ3RoLCByZWR1Y2UoX3BpcGUsIGFyZ3VtZW50c1swXSwgdGFpbChhcmd1bWVudHMpKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHBpcGU7IiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbmZ1bmN0aW9uIF9jb25jYXQoc2V0MSwgc2V0Mikge1xuICBzZXQxID0gc2V0MSB8fCBbXTtcbiAgc2V0MiA9IHNldDIgfHwgW107XG4gIHZhciBpZHg7XG4gIHZhciBsZW4xID0gc2V0MS5sZW5ndGg7XG4gIHZhciBsZW4yID0gc2V0Mi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuMSkge1xuICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHNldDFbaWR4XTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuMikge1xuICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHNldDJbaWR4XTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfY29uY2F0OyIsInZhciBfY29uY2F0ID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbmNhdCcpO1xuXG52YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG5cblxudmFyIHByZXBlbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwcmVwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KFtlbF0sIGxpc3QpO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IHByZXBlbmQ7IiwidmFyIF9jdXJyeTIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnRcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IGEgfCBVbmRlZmluZWRcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYC5cbiAqIEBzZWUgUi5wcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cblxuXG52YXIgcGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHBhdGgocGF0aHMsIG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IHBhdGhzLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWwgPSB2YWxbcGF0aHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBwYXRoOyIsInZhciBfY3VycnkyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG52YXIgcGF0aCA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL3BhdGgnKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aGVuIHN1cHBsaWVkIGFuIG9iamVjdCByZXR1cm5zIHRoZSBpbmRpY2F0ZWRcbiAqIHByb3BlcnR5IG9mIHRoYXQgb2JqZWN0LCBpZiBpdCBleGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHMgLT4ge3M6IGF9IC0+IGEgfCBVbmRlZmluZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBwIFRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBhdCBgb2JqLnBgLlxuICogQHNlZSBSLnBhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3AoJ3gnLCB7eDogMTAwfSk7IC8vPT4gMTAwXG4gKiAgICAgIFIucHJvcCgneCcsIHt9KTsgLy89PiB1bmRlZmluZWRcbiAqL1xuXG52YXIgcHJvcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHByb3AocCwgb2JqKSB7XG4gIHJldHVybiBwYXRoKFtwXSwgb2JqKTtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBwcm9wOyIsImZ1bmN0aW9uIF9pc1RyYW5zZm9ybWVyKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9ialsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9PT0gJ2Z1bmN0aW9uJztcbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzVHJhbnNmb3JtZXI7IiwidmFyIF9pc0FycmF5ID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2lzQXJyYXknKTtcblxudmFyIF9pc1RyYW5zZm9ybWVyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2lzVHJhbnNmb3JtZXInKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBkaXNwYXRjaGVzIHdpdGggZGlmZmVyZW50IHN0cmF0ZWdpZXMgYmFzZWQgb24gdGhlXG4gKiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvbiAobGFzdCBhcmd1bWVudCkuIElmIGl0IGlzIGFuIGFycmF5LCBleGVjdXRlcyBbZm5dLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBoYXMgYSBmdW5jdGlvbiB3aXRoIG9uZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kIG5hbWVzLCBpdCB3aWxsXG4gKiBleGVjdXRlIHRoYXQgZnVuY3Rpb24gKGZ1bmN0b3IgY2FzZSkuIE90aGVyd2lzZSwgaWYgaXQgaXMgYSB0cmFuc2Zvcm1lcixcbiAqIHVzZXMgdHJhbnNkdWNlciBbeGZdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lciAodHJhbnNkdWNlciBjYXNlKS5cbiAqIE90aGVyd2lzZSwgaXQgd2lsbCBkZWZhdWx0IHRvIGV4ZWN1dGluZyBbZm5dLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRob2ROYW1lcyBwcm9wZXJ0aWVzIHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0geGYgdHJhbnNkdWNlciB0byBpbml0aWFsaXplIGlmIG9iamVjdCBpcyB0cmFuc2Zvcm1lclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gZGVmYXVsdCByYW1kYSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBkaXNwYXRjaGVzIG9uIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uXG4gKi9cblxuXG5mdW5jdGlvbiBfZGlzcGF0Y2hhYmxlKG1ldGhvZE5hbWVzLCB4ZiwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICB2YXIgb2JqID0gYXJncy5wb3AoKTtcbiAgICBpZiAoIV9pc0FycmF5KG9iaikpIHtcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgd2hpbGUgKGlkeCA8IG1ldGhvZE5hbWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialttZXRob2ROYW1lc1tpZHhdXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kTmFtZXNbaWR4XV0uYXBwbHkob2JqLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXNUcmFuc2Zvcm1lcihvYmopKSB7XG4gICAgICAgIHZhciB0cmFuc2R1Y2VyID0geGYuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgIHJldHVybiB0cmFuc2R1Y2VyKG9iaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGlzcGF0Y2hhYmxlOyIsImZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbm1vZHVsZS5leHBvcnRzID0gX21hcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvaW5pdCddKCk7XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfVxufTsiLCJ2YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19jdXJyeTInKTtcblxudmFyIF94ZkJhc2UgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cbnZhciBYTWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBYTWFwKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG5cbiAgcmV0dXJuIFhNYXA7XG59KCk7XG5cbnZhciBfeG1hcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIF94bWFwKGYsIHhmKSB7XG4gIHJldHVybiBuZXcgWE1hcChmLCB4Zik7XG59KTtcbm1vZHVsZS5leHBvcnRzID0gX3htYXA7IiwidmFyIF9hcml0eSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19hcml0eScpO1xuXG52YXIgX2lzUGxhY2Vob2xkZXIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9faXNQbGFjZWhvbGRlcicpO1xuXG4vKipcbiAqIEludGVybmFsIGN1cnJ5TiBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBvZiB0aGUgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IHJlY2VpdmVkIEFuIGFycmF5IG9mIGFyZ3VtZW50cyByZWNlaXZlZCB0aHVzIGZhci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuXG5cbmZ1bmN0aW9uIF9jdXJyeU4obGVuZ3RoLCByZWNlaXZlZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29tYmluZWQgPSBbXTtcbiAgICB2YXIgYXJnc0lkeCA9IDA7XG4gICAgdmFyIGxlZnQgPSBsZW5ndGg7XG4gICAgdmFyIGNvbWJpbmVkSWR4ID0gMDtcbiAgICB3aGlsZSAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggfHwgYXJnc0lkeCA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggJiYgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8IGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG4gICAgICBpZiAoIV9pc1BsYWNlaG9sZGVyKHJlc3VsdCkpIHtcbiAgICAgICAgbGVmdCAtPSAxO1xuICAgICAgfVxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKSA6IF9hcml0eShsZWZ0LCBfY3VycnlOKGxlbmd0aCwgY29tYmluZWQsIGZuKSk7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeU47IiwidmFyIF9hcml0eSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xuXG52YXIgX2N1cnJ5MSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxudmFyIF9jdXJyeTIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cbnZhciBfY3VycnlOID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5TicpO1xuXG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzdW1BcmdzID0gKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpO1xuICpcbiAqICAgICAgdmFyIGN1cnJpZWRBZGRGb3VyTnVtYmVycyA9IFIuY3VycnlOKDQsIHN1bUFyZ3MpO1xuICogICAgICB2YXIgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgdmFyIGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cblxuXG52YXIgY3VycnlOID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gY3VycnlOKGxlbmd0aCwgZm4pIHtcbiAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBfY3VycnkxKGZuKTtcbiAgfVxuICByZXR1cm4gX2FyaXR5KGxlbmd0aCwgX2N1cnJ5TihsZW5ndGgsIFtdLCBmbikpO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGN1cnJ5TjsiLCJmdW5jdGlvbiBfaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9oYXM7IiwidmFyIF9oYXMgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9faGFzJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgX2lzQXJndW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09PSAnW29iamVjdCBBcmd1bWVudHNdJyA/IGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuICB9IDogZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gX2hhcygnY2FsbGVlJywgeCk7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9pc0FyZ3VtZW50czsiLCJ2YXIgX2N1cnJ5MSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxudmFyIF9oYXMgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9faGFzJyk7XG5cbnZhciBfaXNBcmd1bWVudHMgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcmd1bWVudHMnKTtcblxuLy8gY292ZXIgSUUgPCA5IGtleXMgaXNzdWVzXG5cblxudmFyIGhhc0VudW1CdWcgPSAhIC8qI19fUFVSRV9fKi97IHRvU3RyaW5nOiBudWxsIH0ucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyk7XG52YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWydjb25zdHJ1Y3RvcicsICd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAnaGFzT3duUHJvcGVydHknLCAndG9Mb2NhbGVTdHJpbmcnXTtcbi8vIFNhZmFyaSBidWdcbnZhciBoYXNBcmdzRW51bUJ1ZyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICByZXR1cm4gYXJndW1lbnRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdsZW5ndGgnKTtcbn0oKTtcblxudmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIua2V5c0luLCBSLnZhbHVlc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIua2V5cyh7YTogMSwgYjogMiwgYzogM30pOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICovXG52YXIgX2tleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgIWhhc0FyZ3NFbnVtQnVnID8gZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdChvYmopICE9PSBvYmogPyBbXSA6IE9iamVjdC5rZXlzKG9iaik7XG59IDogZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgaWYgKE9iamVjdChvYmopICE9PSBvYmopIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHByb3AsIG5JZHg7XG4gIHZhciBrcyA9IFtdO1xuICB2YXIgY2hlY2tBcmdzTGVuZ3RoID0gaGFzQXJnc0VudW1CdWcgJiYgX2lzQXJndW1lbnRzKG9iaik7XG4gIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICBpZiAoX2hhcyhwcm9wLCBvYmopICYmICghY2hlY2tBcmdzTGVuZ3RoIHx8IHByb3AgIT09ICdsZW5ndGgnKSkge1xuICAgICAga3Nba3MubGVuZ3RoXSA9IHByb3A7XG4gICAgfVxuICB9XG4gIGlmIChoYXNFbnVtQnVnKSB7XG4gICAgbklkeCA9IG5vbkVudW1lcmFibGVQcm9wcy5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChuSWR4ID49IDApIHtcbiAgICAgIHByb3AgPSBub25FbnVtZXJhYmxlUHJvcHNbbklkeF07XG4gICAgICBpZiAoX2hhcyhwcm9wLCBvYmopICYmICFjb250YWlucyhrcywgcHJvcCkpIHtcbiAgICAgICAga3Nba3MubGVuZ3RoXSA9IHByb3A7XG4gICAgICB9XG4gICAgICBuSWR4IC09IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBrcztcbn07XG52YXIga2V5cyA9IC8qI19fUFVSRV9fKi9fY3VycnkxKF9rZXlzKTtcbm1vZHVsZS5leHBvcnRzID0ga2V5czsiLCJ2YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxudmFyIF9kaXNwYXRjaGFibGUgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlJyk7XG5cbnZhciBfbWFwID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX21hcCcpO1xuXG52YXIgX3JlZHVjZSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19yZWR1Y2UnKTtcblxudmFyIF94bWFwID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX3htYXAnKTtcblxudmFyIGN1cnJ5TiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2N1cnJ5TicpO1xuXG52YXIga2V5cyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZFxuICogYSBbZnVuY3Rvcl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNmdW5jdG9yKSxcbiAqIGFwcGxpZXMgdGhlIGZ1bmN0aW9uIHRvIGVhY2ggb2YgdGhlIGZ1bmN0b3IncyB2YWx1ZXMsIGFuZCByZXR1cm5zXG4gKiBhIGZ1bmN0b3Igb2YgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogUmFtZGEgcHJvdmlkZXMgc3VpdGFibGUgYG1hcGAgaW1wbGVtZW50YXRpb25zIGZvciBgQXJyYXlgIGFuZCBgT2JqZWN0YCxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFwcGxpZWQgdG8gYFsxLCAyLCAzXWAgb3IgYHt4OiAxLCB5OiAyLCB6OiAzfWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYG1hcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEFsc28gdHJlYXRzIGZ1bmN0aW9ucyBhcyBmdW5jdG9ycyBhbmQgd2lsbCBjb21wb3NlIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBpbnB1dCBgbGlzdGAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0LlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkb3VibGUgPSB4ID0+IHggKiAyO1xuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCBbMSwgMiwgM10pOyAvLz0+IFsyLCA0LCA2XVxuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCB7eDogMSwgeTogMiwgejogM30pOyAvLz0+IHt4OiAyLCB5OiA0LCB6OiA2fVxuICogQHN5bWIgUi5tYXAoZiwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpXVxuICogQHN5bWIgUi5tYXAoZiwgeyB4OiBhLCB5OiBiIH0pID0geyB4OiBmKGEpLCB5OiBmKGIpIH1cbiAqIEBzeW1iIFIubWFwKGYsIGZ1bmN0b3JfbykgPSBmdW5jdG9yX28ubWFwKGYpXG4gKi9cblxuXG52YXIgbWFwID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsnZmFudGFzeS1sYW5kL21hcCcsICdtYXAnXSwgX3htYXAsIGZ1bmN0aW9uIG1hcChmbiwgZnVuY3Rvcikge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jdG9yKSkge1xuICAgIGNhc2UgJ1tvYmplY3QgRnVuY3Rpb25dJzpcbiAgICAgIHJldHVybiBjdXJyeU4oZnVuY3Rvci5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZnVuY3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgIH0pO1xuICAgIGNhc2UgJ1tvYmplY3QgT2JqZWN0XSc6XG4gICAgICByZXR1cm4gX3JlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBmbihmdW5jdG9yW2tleV0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZnVuY3RvcikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX21hcChmbiwgZnVuY3Rvcik7XG4gIH1cbn0pKTtcbm1vZHVsZS5leHBvcnRzID0gbWFwOyIsInZhciBfY3VycnkyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG52YXIgbWFwID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vbWFwJyk7XG5cbi8qKlxuICogUmV0dXJucyBhIGxlbnMgZm9yIHRoZSBnaXZlbiBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMuIFRoZSBnZXR0ZXIgXCJnZXRzXCJcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXM7IHRoZSBzZXR0ZXIgXCJzZXRzXCIgdGhlIHZhbHVlIG9mIHRoZSBmb2N1cy4gVGhlIHNldHRlclxuICogc2hvdWxkIG5vdCBtdXRhdGUgdGhlIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgKHMgLT4gYSkgLT4gKChhLCBzKSAtPiBzKSAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0dGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXJcbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlciwgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeExlbnMgPSBSLmxlbnMoUi5wcm9wKCd4JyksIFIuYXNzb2MoJ3gnKSk7XG4gKlxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgICAgLy89PiAxXG4gKiAgICAgIFIuc2V0KHhMZW5zLCA0LCB7eDogMSwgeTogMn0pOyAgICAgICAgICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLm92ZXIoeExlbnMsIFIubmVnYXRlLCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogLTEsIHk6IDJ9XG4gKi9cblxuXG52YXIgbGVucyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0b0Z1bmN0b3JGbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gbWFwKGZ1bmN0aW9uIChmb2N1cykge1xuICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgfSwgdG9GdW5jdG9yRm4oZ2V0dGVyKHRhcmdldCkpKTtcbiAgICB9O1xuICB9O1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGxlbnM7IiwidmFyIF9jdXJyeTEgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cbnZhciBjdXJyeU4gPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9jdXJyeU4nKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY3VycmllZCBlcXVpdmFsZW50IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbi4gVGhlIGN1cnJpZWQgZnVuY3Rpb25cbiAqIGhhcyB0d28gdW51c3VhbCBjYXBhYmlsaXRpZXMuIEZpcnN0LCBpdHMgYXJndW1lbnRzIG5lZWRuJ3QgYmUgcHJvdmlkZWQgb25lXG4gKiBhdCBhIHRpbWUuIElmIGBmYCBpcyBhIHRlcm5hcnkgZnVuY3Rpb24gYW5kIGBnYCBpcyBgUi5jdXJyeShmKWAsIHRoZVxuICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxKSgyKSgzKWBcbiAqICAgLSBgZygxKSgyLCAzKWBcbiAqICAgLSBgZygxLCAyKSgzKWBcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqXG4gKiBTZWNvbmRseSwgdGhlIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUgW2BSLl9fYF0oI19fKSBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIFtgUi5fX2BdKCNfXyksXG4gKiB0aGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqICAgLSBgZyhfLCAyLCAzKSgxKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxKSgyKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxLCAyKWBcbiAqICAgLSBgZyhfLCAyKSgxKSgzKWBcbiAqICAgLSBgZyhfLCAyKSgxLCAzKWBcbiAqICAgLSBgZyhfLCAyKShfLCAzKSgxKWBcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3LCBjdXJyaWVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLmN1cnJ5TlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBhZGRGb3VyTnVtYmVycyA9IChhLCBiLCBjLCBkKSA9PiBhICsgYiArIGMgKyBkO1xuICpcbiAqICAgICAgdmFyIGN1cnJpZWRBZGRGb3VyTnVtYmVycyA9IFIuY3VycnkoYWRkRm91ck51bWJlcnMpO1xuICogICAgICB2YXIgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgdmFyIGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cblxuXG52YXIgY3VycnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBjdXJyeShmbikge1xuICByZXR1cm4gY3VycnlOKGZuLmxlbmd0aCwgZm4pO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGN1cnJ5OyIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9laXRoZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBFaXRoZXJcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuLy8gLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhlIGBFaXRoZXIoYSwgYilgIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBsb2dpY2FsIGRpc2p1bmN0aW9uIGJldHdlZW4gYGFgXG4gKiBhbmQgYGJgLiBJbiBvdGhlciB3b3JkcywgYEVpdGhlcmAgbWF5IGNvbnRhaW4gZWl0aGVyIGEgdmFsdWUgb2YgdHlwZSBgYWAgb3JcbiAqIGEgdmFsdWUgb2YgdHlwZSBgYmAsIGF0IGFueSBnaXZlbiB0aW1lLiBUaGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gaXNcbiAqIGJpYXNlZCBvbiB0aGUgcmlnaHQgdmFsdWUgKGBiYCksIHRodXMgcHJvamVjdGlvbnMgd2lsbCB0YWtlIHRoZSByaWdodCB2YWx1ZVxuICogb3ZlciB0aGUgbGVmdCBvbmUuXG4gKlxuICogVGhpcyBjbGFzcyBtb2RlbHMgdHdvIGRpZmZlcmVudCBjYXNlczogYExlZnQgYWAgYW5kIGBSaWdodCBiYCwgYW5kIGNhbiBob2xkXG4gKiBvbmUgb2YgdGhlIGNhc2VzIGF0IGFueSBnaXZlbiB0aW1lLiBUaGUgcHJvamVjdGlvbnMgYXJlLCBub25lIHRoZSBsZXNzLFxuICogYmlhc2VkIGZvciB0aGUgYFJpZ2h0YCBjYXNlLCB0aHVzIGEgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIHN0cnVjdHVyZSBpcyB0b1xuICogaG9sZCB0aGUgcmVzdWx0cyBvZiBjb21wdXRhdGlvbnMgdGhhdCBtYXkgZmFpbCwgd2hlbiB5b3Ugd2FudCB0byBzdG9yZVxuICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24pLlxuICpcbiAqIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWVzIG9mIGBFaXRoZXIoYSwgYilgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWQgYnlcbiAqIHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5IHNlcXVlbmNpbmdcbiAqIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXQgeW91IGRvbid0IGtub3dcbiAqIHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseSAocmV0dXJuaW5nIGEgYExlZnQgYWApIGlmIGFueVxuICogb2YgdGhlIG9wZXJhdGlvbnMgZmFpbC5cbiAqXG4gKiBXaGlsZSB0aGlzIGNsYXNzIGNhbiBjZXJ0YWlubHkgbW9kZWwgaW5wdXQgdmFsaWRhdGlvbnMsIHRoZSBbVmFsaWRhdGlvbl1bXVxuICogc3RydWN0dXJlIGxlbmRzIGl0c2VsZiBiZXR0ZXIgdG8gdGhhdCB1c2UgY2FzZSwgc2luY2UgaXQgY2FuIG5hdHVyYWxseVxuICogYWdncmVnYXRlIGZhaWx1cmVzIOKAlCBtb25hZHMgc2hvcnRjdXQgb24gdGhlIGZpcnN0IGZhaWx1cmUuXG4gKlxuICogW1ZhbGlkYXRpb25dOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS52YWxpZGF0aW9uXG4gKlxuICpcbiAqIEBjbGFzc1xuICogQHN1bW1hcnlcbiAqIEVpdGhlclvOsSwgzrJdIDw6IEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIEZ1bmN0b3JbzrJdXG4gKiAgICAgICAgICAgICAgICwgQ2hhaW5bzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICogICAgICAgICAgICAgICAsIEVxXG4gKi9cbmZ1bmN0aW9uIEVpdGhlcigpIHsgfVxuXG5MZWZ0LnByb3RvdHlwZSA9IGNsb25lKEVpdGhlci5wcm90b3R5cGUpXG5mdW5jdGlvbiBMZWZ0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuUmlnaHQucHJvdG90eXBlID0gY2xvbmUoRWl0aGVyLnByb3RvdHlwZSlcbmZ1bmN0aW9uIFJpZ2h0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBob2xkaW5nIGEgYExlZnRgIHZhbHVlLiBUaGlzXG4gKiB1c3VhbGx5IHJlcHJlc2VudHMgYSBmYWlsdXJlIGR1ZSB0byB0aGUgcmlnaHQtYmlhcyBvZiB0aGlzIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBhIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuTGVmdCA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBMZWZ0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLkxlZnQgPSBFaXRoZXIuTGVmdFxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgaG9sZGluZyBhIGBSaWdodGAgdmFsdWUuIFRoaXNcbiAqIHVzdWFsbHkgcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgdmFsdWUgZHVlIHRvIHRoZSByaWdodCBiaWFzIG9mIHRoaXNcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgRWl0aGVyW86xLCDOsl1cbiAqL1xuRWl0aGVyLlJpZ2h0ID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gbmV3IFJpZ2h0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLlJpZ2h0ID0gRWl0aGVyLlJpZ2h0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBmcm9tIGEgbnVsbGFibGUgdHlwZS5cbiAqXG4gKiBUYWtlcyB0aGUgYExlZnRgIGNhc2UgaWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4gVGFrZXMgdGhlXG4gKiBgUmlnaHRgIGNhc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBzdW1tYXJ5IM6xIOKGkiBFaXRoZXJbzrEsIM6xXVxuICovXG5FaXRoZXIuZnJvbU51bGxhYmxlID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYSAhPSBudWxsPyAgICAgICBuZXcgUmlnaHQoYSlcbiAgOiAgICAgIC8qIG90aGVyd2lzZSAqLyAgbmV3IExlZnQoYSlcbn1cbkVpdGhlci5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gRWl0aGVyLmZyb21OdWxsYWJsZVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhIGBWYWxpZGF0aW9uW86xLCDOsl1gIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuZnJvbVZhbGlkYXRpb24gPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmZvbGQoRWl0aGVyLkxlZnQsIEVpdGhlci5SaWdodClcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIHN5bmNocm9ub3VzIGNvbXB1dGF0aW9uIHRoYXQgbWF5IHRocm93IGFuZCBjb252ZXJ0cyBpdCB0byBhblxuICogRWl0aGVyIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgKM6x4oKBLCDOseKCgiwgLi4uLCDOseKCmSAtPiDOsiA6OiB0aHJvd3MgzrMpIC0+ICjOseKCgSwgzrHigoIsIC4uLiwgzrHigpkgLT4gRWl0aGVyW86zLCDOsl0pXG4gKi9cbkVpdGhlci50cnkgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBSaWdodChmLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICByZXR1cm4gbmV3IExlZnQoZSlcbiAgICB9XG4gIH1cbn1cblxuXG4vLyAtLSBQcmVkaWNhdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBgRWl0aGVyW86xLCDOsl1gIGNvbnRhaW5zIGEgYExlZnRgIHZhbHVlLlxuICpcbiAqIEBzdW1tYXJ5IEJvb2xlYW5cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5pc0xlZnQgPSBmYWxzZVxuTGVmdC5wcm90b3R5cGUuaXNMZWZ0ICAgPSB0cnVlXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBjb250YWlucyBhIGBSaWdodGAgdmFsdWUuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzUmlnaHQgPSBmYWxzZVxuUmlnaHQucHJvdG90eXBlLmlzUmlnaHQgID0gdHJ1ZVxuXG5cbi8vIC0tIEFwcGxpY2F0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBpbnN0YW5jZSBob2xkaW5nIHRoZSBgUmlnaHRgIHZhbHVlIGBiYC5cbiAqXG4gKiBgYmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYW5vdGhlclxuICogYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrIg4oaSIEVpdGhlclvOsSwgzrJdXG4gKi9cbkVpdGhlci5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBSaWdodChhKVxufVxuRWl0aGVyLnByb3RvdHlwZS5vZiA9IEVpdGhlci5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgUmlnaHRgIGNhc2Ugb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlXG4gKiB0byBhbm90aGVyIGFwcGxpY2F0aXZlIHR5cGUuXG4gKlxuICogVGhlIGBFaXRoZXJbzrEsIM6yXWAgc2hvdWxkIGNvbnRhaW4gYSBmdW5jdGlvbiB2YWx1ZSwgb3RoZXJ3aXNlIGEgYFR5cGVFcnJvcmBcbiAqIGlzIHRocm93bi5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrIg4oaSIM6zXSwgZjpBcHBsaWNhdGl2ZVtfXSkgPT4gZlvOsl0g4oaSIGZbzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuYXAgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmFwID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gdGhpc1xufVxuXG5SaWdodC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIEZ1bmN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGBSaWdodGAgdmFsdWUgb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhclxuICogdW5hcnkgZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6yIOKGkiDOsykg4oaSIEVpdGhlclvOsSwgzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUubWFwID0gdW5pbXBsZW1lbnRlZFxuTGVmdC5wcm90b3R5cGUubWFwICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLm9mKGYodGhpcy52YWx1ZSkpXG59XG5cblxuLy8gLS0gQ2hhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgYFJpZ2h0YCB2YWx1ZSBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnlcbiAqIGZ1bmN0aW9uIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdLCBtOk1vbmFkW19dKSA9PiAozrIg4oaSIG1bzrNdKSDihpIgbVvOs11cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5jaGFpbiA9IHVuaW1wbGVtZW50ZWRcbkxlZnQucHJvdG90eXBlLmNoYWluICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYodGhpcy52YWx1ZSlcbn1cblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb25jYXRzIHRoZSBgUmlnaHRgIHZhbHVlIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSB3aXRoIGFub3RoZXIgYFJpZ2h0YCBvciBrZWVwcyB0aGUgYExlZnRgIG9uIGVpdGhlciBzaWRlXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIG06TW9ub2lkXSkgPT4gRWl0aGVyW86yLCBtXSDihpIgRWl0aGVyW86xLCBtXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmNvbmNhdCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXNcbn1cblxuUmlnaHQucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIHZhciB0aGF0ID0gdGhpc1xuICByZXR1cm4gb3RoZXIuZm9sZChmdW5jdGlvbihfKXtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LlJpZ2h0KHRoYXQudmFsdWUuY29uY2F0KHkpKVxuICAgICAgICAgICAgICAgICAgICB9KVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS50b1N0cmluZyA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuTGVmdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5SaWdodC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuUmlnaHQoJyArIHRoaXMudmFsdWUgKyAnKSdcbn1cblxuXG4vLyAtLSBFcSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUZXN0cyBpZiBhbiBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBpcyBlcXVhbCB0byBhbm90aGVyIGBFaXRoZXJbzrEsIM6yXWBcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBFaXRoZXJbzrEsIM6yXSDihpIgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzRXF1YWwgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzTGVmdCAmJiAoYS52YWx1ZSA9PT0gdGhpcy52YWx1ZSlcbn1cblxuUmlnaHQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzUmlnaHQgJiYgKGEudmFsdWUgPT09IHRoaXMudmFsdWUpXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBSaWdodGAgdmFsdWUgb3V0IG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSwgaWYgaXRcbiAqIGV4aXN0cy4gT3RoZXJ3aXNlIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IFZvaWQg4oaSIM6yICAgICAgICAgOjogcGFydGlhbCwgdGhyb3dzXG4gKiBAc2VlIHtAbGluayBtb2R1bGU6bGliL2VpdGhlcn5FaXRoZXIjZ2V0T3JFbHNlfSDigJQgQSBnZXR0ZXIgdGhhdCBjYW4gaGFuZGxlIGZhaWx1cmVzLlxuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9laXRoZXJ+RWl0aGVyI21lcmdlfSDigJQgVGhlIGNvbnZlcmdlbmNlIG9mIGJvdGggdmFsdWVzLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBpZiB0aGUgc3RydWN0dXJlIGhhcyBubyBgUmlnaHRgIHZhbHVlLlxuICovXG5FaXRoZXIucHJvdG90eXBlLmdldCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW4ndCBleHRyYWN0IHRoZSB2YWx1ZSBvZiBhIExlZnQoYSkuXCIpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBgUmlnaHRgIHZhbHVlIG91dCBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIElmIHRoZVxuICogc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBhIGBSaWdodGAgdmFsdWUsIHJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gzrIg4oaSIM6yXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuZ2V0T3JFbHNlID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgYExlZnRgIHZhbHVlIGludG8gYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZ1xuICogaWYgdGhlIHN0cnVjdHVyZSBjb250YWluIGEgYFJpZ2h0YCB2YWx1ZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiAozrEg4oaSIEVpdGhlclvOsywgzrJdKSDihpIgRWl0aGVyW86zLCDOsl1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUub3JFbHNlICA9IG5vb3BcblxuTGVmdC5wcm90b3R5cGUub3JFbHNlID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygd2hpY2hldmVyIHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIHRoYXQgaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrFdKSA9PiBWb2lkIOKGkiDOsVxuICovXG5FaXRoZXIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRm9sZHMgYW5kIEV4dGVuZGVkIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIGVhY2ggY2FzZSBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgzrNcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5mb2xkID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24oZiwgXykge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uKF8sIGcpIHtcbiAgcmV0dXJuIGcodGhpcy52YWx1ZSlcbn1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IHsgTGVmdDogzrEg4oaSIM6zLCBSaWdodDogzrIg4oaSIM6zIH0g4oaSIM6zXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuY2F0YSA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uTGVmdCh0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uUmlnaHQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gVm9pZCDihpIgRWl0aGVyW86yLCDOsV1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5zd2FwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KHRoaXMudmFsdWUpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLkxlZnQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIE1hcHMgYm90aCBzaWRlcyBvZiB0aGUgZGlzanVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBFaXRoZXJbzrMsIM60XVxuICovXG5FaXRoZXIucHJvdG90eXBlLmJpbWFwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5iaW1hcCA9IGZ1bmN0aW9uKGYsIF8pIHtcbiAgcmV0dXJuIHRoaXMuTGVmdChmKHRoaXMudmFsdWUpKVxufVxuXG5SaWdodC5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbihfLCBnKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KGcodGhpcy52YWx1ZSkpXG59XG5cblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpIOKGkiBFaXRoZXJbzrMsIM6yXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmxlZnRNYXAgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUubGVmdE1hcCAgPSBub29wXG5cbkxlZnQucHJvdG90eXBlLmxlZnRNYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLkxlZnQoZih0aGlzLnZhbHVlKSlcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2VpdGhlcicpIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IGN1cnJ5LCBsZW5zLCBwcm9wLCBwcmVwZW5kLCBvdmVyLCBzZXQsIHBpcGUgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBdCA9IGN1cnJ5KChrZXlBcnJheSwgbmV3VmFsLCBvYmopID0+IHtcbiAgY29uc3QgZGVlcE5ld1ZhbCA9IGtleUFycmF5LnJlZHVjZVJpZ2h0KFxuICAgIChyZXN1bHQsIGtleSkgPT4gKHsgW2tleV06IHJlc3VsdCB9KVxuICAgICwgbmV3VmFsXG4gICk7XG5cbiAgcmV0dXJuIEltbXV0YWJsZShvYmopLm1lcmdlKGRlZXBOZXdWYWwsIHsgZGVlcDogdHJ1ZSB9KTtcbn0pO1xuXG4vLyBTdGF0ZSBsZW5zZXNcbmV4cG9ydCBjb25zdCBTdGF0ZUxlbnNlcyA9IHtcbiAgZmllbGRUeXBlczogbGVucyhwcm9wKFwiZmllbGRUeXBlc1wiKSwgdXBkYXRlQXQoW1wiZmllbGRUeXBlc1wiXSkpLFxuICBmaWVsZHNTdGF0ZTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVcIiksIHVwZGF0ZUF0KFtcImZpZWxkc1N0YXRlXCJdKSksXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVIaXN0b3J5XCIpLCB1cGRhdGVBdChbXCJmaWVsZHNTdGF0ZUhpc3RvcnlcIl0pKSxcbn07XG5cbi8vIF8gPT4gU3RyaW5nXG5leHBvcnQgY29uc3QgY3JlYXRlSWQgPSBfID0+XG4gIChEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKTtcblxuLy8gU3RhdGUgLT4gW2ZpZWxkc1N0YXRlXSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IHB1c2hIaXN0b3J5U3RhdGUgPSBjdXJyeSgoc3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSkgPT4gcGlwZShcbiAgLy8gQWRkIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVxuICBvdmVyKFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlSGlzdG9yeSwgcHJlcGVuZChzdGF0ZS5maWVsZHNTdGF0ZSkpLFxuICAvLyBNYWtlIG5ldyBTdGF0ZSB0aGUgY3VycmVudFxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSlcbikoc3RhdGUpKTtcblxuXG4vLyBTdGF0ZSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IGhpZGVDb25maWdzID0gc3RhdGUgPT5cbiAgc2V0KFxuICAgIFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlLFxuICAgIHN0YXRlLmZpZWxkc1N0YXRlLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMsIHsgY29uZmlnU2hvd2luZzogZmFsc2UgfSkpLFxuICAgIHN0YXRlXG4gICk7XG5cblxuLy8gU3RyaW5nIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gRWl0aGVyIFN0cmluZyBPYmplY3RcbmV4cG9ydCBjb25zdCBwcm9wZXJ0eVR5cGVDaGVjayA9IGN1cnJ5KChwcm9wZXJ0eU5hbWUsIHR5cGUsIG9iaikgPT5cbiAgdHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdID09PSB0eXBlXG4gICAgPyBFaXRoZXIuUmlnaHQob2JqKVxuICAgIDogRWl0aGVyLkxlZnQoYFByb3BlcnR5ICcke3Byb3BlcnR5TmFtZX0nIGNhbm5vdCBiZSBvZiB0eXBlICR7dHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdfWApXG4pO1xuXG4vLyBDaGVja3MgdGhhdCBhIGZpZWxkIGhhcyBpdHMgZXNzZW50aWFsIHByb3BlcnRpZXNcbi8vIE9iamVjdCAtPiBFaXRoZXIgU3RyaW5nIE9iamVjdFxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRmllbGQgPSBmaWVsZFN0YXRlID0+XG4gIEVpdGhlci5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgICAubGVmdE1hcChmcyA9PiBgQSBmaWVsZCBTdGF0ZSBjYW5ub3QgYmUgZW1wdHkgJHt0eXBlb2YgZnN9YClcbiAgICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJyZXF1aXJlZFwiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiY29uZmlnU2hvd2luZ1wiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiaWRcIiwgXCJzdHJpbmdcIikpO1xuIiwiaW1wb3J0IHsgU3RhdGVMZW5zZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgc2V0LCBvdmVyLCBzbGljZSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuXG5jb25zdCBsYXN0SGlzdG9yeVN0YXRlID0gc3RhdGUgPT5cbiAgc3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdIHx8IFtdO1xuXG5jb25zdCB1bmRvID0gKHN0YXRlLCBfKSA9PiBwaXBlKFxuICAvLyBNYWtlIGxhc3QgaGlzdG9yeSBsYXN0IHN0YXRlIHRoZSBjdXJyZW50IG9uZVxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGxhc3RIaXN0b3J5U3RhdGUoc3RhdGUpKSxcbiAgLy8gUmVtb3ZlIGxhc3QgaGlzdG9yeSBzdGF0ZSBmcm9tIHRoZSBoaXN0b3J5IGFycmF5XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGVIaXN0b3J5LCBzbGljZSgxLCBJbmZpbml0eSkpXG4pKHN0YXRlKTtcblxuZXhwb3J0IGRlZmF1bHQgdW5kbztcbiIsImZ1bmN0aW9uIF9pZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaWRlbnRpdHk7IiwidmFyIF9jdXJyeTEgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cbnZhciBfaWRlbnRpdHkgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9faWRlbnRpdHknKTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIHZhciBvYmogPSB7fTtcbiAqICAgICAgUi5pZGVudGl0eShvYmopID09PSBvYmo7IC8vPT4gdHJ1ZVxuICogQHN5bWIgUi5pZGVudGl0eShhKSA9IGFcbiAqL1xuXG5cbnZhciBpZGVudGl0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKF9pZGVudGl0eSk7XG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5OyIsInZhciBfY29uY2F0ID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbmNhdCcpO1xuXG52YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxudmFyIF9yZWR1Y2UgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG5cbnZhciBtYXAgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9tYXAnKTtcblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBBbHNvXG4gKiB0cmVhdHMgY3VycmllZCBmdW5jdGlvbnMgYXMgYXBwbGljYXRpdmVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBzaWcgQXBwbHkgZiA9PiBmIChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBzaWcgKGEgLT4gYiAtPiBjKSAtPiAoYSAtPiBiKSAtPiAoYSAtPiBjKVxuICogQHBhcmFtIHsqfSBhcHBseUZcbiAqIEBwYXJhbSB7Kn0gYXBwbHlYXG4gKiBAcmV0dXJuIHsqfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXAoW1IubXVsdGlwbHkoMiksIFIuYWRkKDMpXSwgWzEsMiwzXSk7IC8vPT4gWzIsIDQsIDYsIDQsIDUsIDZdXG4gKiAgICAgIFIuYXAoW1IuY29uY2F0KCd0YXN0eSAnKSwgUi50b1VwcGVyXSwgWydwaXp6YScsICdzYWxhZCddKTsgLy89PiBbXCJ0YXN0eSBwaXp6YVwiLCBcInRhc3R5IHNhbGFkXCIsIFwiUElaWkFcIiwgXCJTQUxBRFwiXVxuICpcbiAqICAgICAgLy8gUi5hcCBjYW4gYWxzbyBiZSB1c2VkIGFzIFMgY29tYmluYXRvclxuICogICAgICAvLyB3aGVuIG9ubHkgdHdvIGZ1bmN0aW9ucyBhcmUgcGFzc2VkXG4gKiAgICAgIFIuYXAoUi5jb25jYXQsIFIudG9VcHBlcikoJ1JhbWRhJykgLy89PiAnUmFtZGFSQU1EQSdcbiAqIEBzeW1iIFIuYXAoW2YsIGddLCBbYSwgYl0pID0gW2YoYSksIGYoYiksIGcoYSksIGcoYildXG4gKi9cblxuXG52YXIgYXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBseUYsIGFwcGx5WCkge1xuICByZXR1cm4gdHlwZW9mIGFwcGx5WFsnZmFudGFzeS1sYW5kL2FwJ10gPT09ICdmdW5jdGlvbicgPyBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddKGFwcGx5RikgOiB0eXBlb2YgYXBwbHlGLmFwID09PSAnZnVuY3Rpb24nID8gYXBwbHlGLmFwKGFwcGx5WCkgOiB0eXBlb2YgYXBwbHlGID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gYXBwbHlGKHgpKGFwcGx5WCh4KSk7XG4gIH0gOlxuICAvLyBlbHNlXG4gIF9yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZikge1xuICAgIHJldHVybiBfY29uY2F0KGFjYywgbWFwKGYsIGFwcGx5WCkpO1xuICB9LCBbXSwgYXBwbHlGKTtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBhcDsiLCJ2YXIgX2N1cnJ5MyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogU2ltaWxhciB0byBbYHJlZHVjZWBdKCNyZWR1Y2UpLCBleGNlcHQgbW92ZXMgdGhyb3VnaCB0aGUgaW5wdXQgbGlzdCBmcm9tIHRoZVxuICogcmlnaHQgdG8gdGhlIGxlZnQuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICoodmFsdWUsIGFjYykqLCB3aGlsZSB0aGUgYXJndW1lbnRzJ1xuICogb3JkZXIgb2YgYHJlZHVjZWAncyBpdGVyYXRvciBmdW5jdGlvbiBpcyAqKGFjYywgdmFsdWUpKi5cbiAqXG4gKiBOb3RlOiBgUi5yZWR1Y2VSaWdodGAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2QuIEZvciBtb3JlIGRldGFpbHNcbiAqIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0I0Rlc2NyaXB0aW9uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKGEsIGIpIC0+IGIpIC0+IGIgLT4gW2FdIC0+IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheVxuICogICAgICAgIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIucmVkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2VSaWdodChSLnN1YnRyYWN0LCAwLCBbMSwgMiwgMywgNF0pIC8vID0+ICgxIC0gKDIgLSAoMyAtICg0IC0gMCkpKSkgPSAtMlxuICogICAgICAvLyAgICAtICAgICAgICAgICAgICAgLTJcbiAqICAgICAgLy8gICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAxICAgLSAgICAgICAgICAgIDEgICAzXG4gKiAgICAgIC8vICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgIDIgICAtICAgICA9PT4gICAgMiAgLTFcbiAqICAgICAgLy8gICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAgIDMgICAtICAgICAgICAgICAgMyAgIDRcbiAqICAgICAgLy8gICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgICAgICA0ICAgMCAgICAgICAgICAgIDQgICAwXG4gKlxuICogQHN5bWIgUi5yZWR1Y2VSaWdodChmLCBhLCBbYiwgYywgZF0pID0gZihiLCBmKGMsIGYoZCwgYSkpKVxuICovXG5cblxudmFyIHJlZHVjZVJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gcmVkdWNlUmlnaHQoZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBhY2MgPSBmbihsaXN0W2lkeF0sIGFjYyk7XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2VSaWdodDsiLCJ2YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxudmFyIGFwID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vYXAnKTtcblxudmFyIG1hcCA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL21hcCcpO1xuXG52YXIgcHJlcGVuZCA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL3ByZXBlbmQnKTtcblxudmFyIHJlZHVjZVJpZ2h0ID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vcmVkdWNlUmlnaHQnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgW1RyYXZlcnNhYmxlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI3RyYXZlcnNhYmxlKVxuICogb2YgW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKSBpbnRvIGFuXG4gKiBBcHBsaWNhdGl2ZSBvZiBUcmF2ZXJzYWJsZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2VxdWVuY2VgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSB0KSA9PiAoYSAtPiBmIGEpIC0+IHQgKGYgYSkgLT4gZiAodCBhKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb2ZcbiAqIEBwYXJhbSB7Kn0gdHJhdmVyc2FibGVcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudHJhdmVyc2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNlcXVlbmNlKE1heWJlLm9mLCBbSnVzdCgxKSwgSnVzdCgyKSwgSnVzdCgzKV0pOyAgIC8vPT4gSnVzdChbMSwgMiwgM10pXG4gKiAgICAgIFIuc2VxdWVuY2UoTWF5YmUub2YsIFtKdXN0KDEpLCBKdXN0KDIpLCBOb3RoaW5nKCldKTsgLy89PiBOb3RoaW5nKClcbiAqXG4gKiAgICAgIFIuc2VxdWVuY2UoUi5vZiwgSnVzdChbMSwgMiwgM10pKTsgLy89PiBbSnVzdCgxKSwgSnVzdCgyKSwgSnVzdCgzKV1cbiAqICAgICAgUi5zZXF1ZW5jZShSLm9mLCBOb3RoaW5nKCkpOyAgICAgICAvLz0+IFtOb3RoaW5nKCldXG4gKi9cblxuXG52YXIgc2VxdWVuY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBzZXF1ZW5jZShvZiwgdHJhdmVyc2FibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0cmF2ZXJzYWJsZS5zZXF1ZW5jZSA9PT0gJ2Z1bmN0aW9uJyA/IHRyYXZlcnNhYmxlLnNlcXVlbmNlKG9mKSA6IHJlZHVjZVJpZ2h0KGZ1bmN0aW9uICh4LCBhY2MpIHtcbiAgICByZXR1cm4gYXAobWFwKHByZXBlbmQsIHgpLCBhY2MpO1xuICB9LCBvZihbXSksIHRyYXZlcnNhYmxlKTtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBzZXF1ZW5jZTsiLCJ2YXIgX2N1cnJ5MyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxudmFyIG1hcCA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL21hcCcpO1xuXG52YXIgc2VxdWVuY2UgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9zZXF1ZW5jZScpO1xuXG4vKipcbiAqIE1hcHMgYW4gW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9uIG92ZXIgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpLFxuICogdGhlbiB1c2VzIFtgc2VxdWVuY2VgXSgjc2VxdWVuY2UpIHRvIHRyYW5zZm9ybSB0aGUgcmVzdWx0aW5nIFRyYXZlcnNhYmxlIG9mIEFwcGxpY2F0aXZlXG4gKiBpbnRvIGFuIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGB0cmF2ZXJzZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoQXBwbGljYXRpdmUgZiwgVHJhdmVyc2FibGUgdCkgPT4gKGEgLT4gZiBhKSAtPiAoYSAtPiBmIGIpIC0+IHQgYSAtPiBmICh0IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIFJldHVybnMgYE5vdGhpbmdgIGlmIHRoZSBnaXZlbiBkaXZpc29yIGlzIGAwYFxuICogICAgICBzYWZlRGl2ID0gbiA9PiBkID0+IGQgPT09IDAgPyBOb3RoaW5nKCkgOiBKdXN0KG4gLyBkKVxuICpcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCA0LCA1XSk7IC8vPT4gSnVzdChbNSwgMi41LCAyXSlcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCAwLCA1XSk7IC8vPT4gTm90aGluZ1xuICovXG5cblxudmFyIHRyYXZlcnNlID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gdHJhdmVyc2Uob2YsIGYsIHRyYXZlcnNhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdHJhdmVyc2FibGVbJ2ZhbnRhc3ktbGFuZC90cmF2ZXJzZSddID09PSAnZnVuY3Rpb24nID8gdHJhdmVyc2FibGVbJ2ZhbnRhc3ktbGFuZC90cmF2ZXJzZSddKGYsIG9mKSA6IHNlcXVlbmNlKG9mLCBtYXAoZiwgdHJhdmVyc2FibGUpKTtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZTsiLCJmdW5jdGlvbiBfYXJyYXlGcm9tSXRlcmF0b3IoaXRlcikge1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgbmV4dDtcbiAgd2hpbGUgKCEobmV4dCA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XG4gICAgbGlzdC5wdXNoKG5leHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBsaXN0O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlGcm9tSXRlcmF0b3I7IiwiZnVuY3Rpb24gX2NvbnRhaW5zV2l0aChwcmVkLCB4LCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChwcmVkKHgsIGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jb250YWluc1dpdGg7IiwiZnVuY3Rpb24gX2Z1bmN0aW9uTmFtZShmKSB7XG4gIC8vIFN0cmluZyh4ID0+IHgpIGV2YWx1YXRlcyB0byBcInggPT4geFwiLCBzbyB0aGUgcGF0dGVybiBtYXkgbm90IG1hdGNoLlxuICB2YXIgbWF0Y2ggPSBTdHJpbmcoZikubWF0Y2goL15mdW5jdGlvbiAoXFx3KikvKTtcbiAgcmV0dXJuIG1hdGNoID09IG51bGwgPyAnJyA6IG1hdGNoWzFdO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZnVuY3Rpb25OYW1lOyIsInZhciBfY3VycnkyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBpdHMgYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIGZhbHNlIG90aGVyd2lzZS4gVmFsdWVzIGFyZVxuICogaWRlbnRpY2FsIGlmIHRoZXkgcmVmZXJlbmNlIHRoZSBzYW1lIG1lbW9yeS4gYE5hTmAgaXMgaWRlbnRpY2FsIHRvIGBOYU5gO1xuICogYDBgIGFuZCBgLTBgIGFyZSBub3QgaWRlbnRpY2FsLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE1LjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIG8gPSB7fTtcbiAqICAgICAgUi5pZGVudGljYWwobywgbyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlkZW50aWNhbCgxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pZGVudGljYWwoW10sIFtdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbCgwLCAtMCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pZGVudGljYWwoTmFOLCBOYU4pOyAvLz0+IHRydWVcbiAqL1xuXG5cbnZhciBpZGVudGljYWwgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBpZGVudGljYWwoYSwgYikge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmIChhID09PSBiKSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG59KTtcbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpY2FsOyIsInZhciBfY3VycnkxID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG4vKipcbiAqIEdpdmVzIGEgc2luZ2xlLXdvcmQgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSAobmF0aXZlKSB0eXBlIG9mIGEgdmFsdWUsXG4gKiByZXR1cm5pbmcgc3VjaCBhbnN3ZXJzIGFzICdPYmplY3QnLCAnTnVtYmVyJywgJ0FycmF5Jywgb3IgJ051bGwnLiBEb2VzIG5vdFxuICogYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB1c2VyIE9iamVjdCB0eXBlcyBhbnkgZnVydGhlciwgcmVwb3J0aW5nIHRoZW0gYWxsIGFzXG4gKiAnT2JqZWN0Jy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHlwZSh7fSk7IC8vPT4gXCJPYmplY3RcIlxuICogICAgICBSLnR5cGUoMSk7IC8vPT4gXCJOdW1iZXJcIlxuICogICAgICBSLnR5cGUoZmFsc2UpOyAvLz0+IFwiQm9vbGVhblwiXG4gKiAgICAgIFIudHlwZSgncycpOyAvLz0+IFwiU3RyaW5nXCJcbiAqICAgICAgUi50eXBlKG51bGwpOyAvLz0+IFwiTnVsbFwiXG4gKiAgICAgIFIudHlwZShbXSk7IC8vPT4gXCJBcnJheVwiXG4gKiAgICAgIFIudHlwZSgvW0Etel0vKTsgLy89PiBcIlJlZ0V4cFwiXG4gKiAgICAgIFIudHlwZSgoKSA9PiB7fSk7IC8vPT4gXCJGdW5jdGlvblwiXG4gKiAgICAgIFIudHlwZSh1bmRlZmluZWQpOyAvLz0+IFwiVW5kZWZpbmVkXCJcbiAqL1xuXG5cbnZhciB0eXBlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gdHlwZSh2YWwpIHtcbiAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/ICdOdWxsJyA6IHZhbCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKS5zbGljZSg4LCAtMSk7XG59KTtcbm1vZHVsZS5leHBvcnRzID0gdHlwZTsiLCJ2YXIgX2FycmF5RnJvbUl0ZXJhdG9yID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2FycmF5RnJvbUl0ZXJhdG9yJyk7XG5cbnZhciBfY29udGFpbnNXaXRoID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX2NvbnRhaW5zV2l0aCcpO1xuXG52YXIgX2Z1bmN0aW9uTmFtZSA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19mdW5jdGlvbk5hbWUnKTtcblxudmFyIF9oYXMgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9faGFzJyk7XG5cbnZhciBpZGVudGljYWwgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi4vaWRlbnRpY2FsJyk7XG5cbnZhciBrZXlzID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4uL2tleXMnKTtcblxudmFyIHR5cGUgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi4vdHlwZScpO1xuXG4vKipcbiAqIHByaXZhdGUgX3VuaXFDb250ZW50RXF1YWxzIGZ1bmN0aW9uLlxuICogVGhhdCBmdW5jdGlvbiBpcyBjaGVja2luZyBlcXVhbGl0eSBvZiAyIGl0ZXJhdG9yIGNvbnRlbnRzIHdpdGggMiBhc3N1bXB0aW9uc1xuICogLSBpdGVyYXRvcnMgbGVuZ3RocyBhcmUgdGhlIHNhbWVcbiAqIC0gaXRlcmF0b3JzIHZhbHVlcyBhcmUgdW5pcXVlXG4gKlxuICogZmFsc2UtcG9zaXRpdmUgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQgZm9yIGNvbXBhcmlzaW9uIG9mLCBlLmcuXG4gKiAtIFsxLDIsM10gYW5kIFsxLDIsMyw0XVxuICogLSBbMSwxLDFdIGFuZCBbMSwyLDNdXG4gKiAqL1xuXG5mdW5jdGlvbiBfdW5pcUNvbnRlbnRFcXVhbHMoYUl0ZXJhdG9yLCBiSXRlcmF0b3IsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBhID0gX2FycmF5RnJvbUl0ZXJhdG9yKGFJdGVyYXRvcik7XG4gIHZhciBiID0gX2FycmF5RnJvbUl0ZXJhdG9yKGJJdGVyYXRvcik7XG5cbiAgZnVuY3Rpb24gZXEoX2EsIF9iKSB7XG4gICAgcmV0dXJuIF9lcXVhbHMoX2EsIF9iLCBzdGFja0Euc2xpY2UoKSwgc3RhY2tCLnNsaWNlKCkpO1xuICB9XG5cbiAgLy8gaWYgKmEqIGFycmF5IGNvbnRhaW5zIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IGluY2x1ZGVkIGluICpiKlxuICByZXR1cm4gIV9jb250YWluc1dpdGgoZnVuY3Rpb24gKGIsIGFJdGVtKSB7XG4gICAgcmV0dXJuICFfY29udGFpbnNXaXRoKGVxLCBhSXRlbSwgYik7XG4gIH0sIGIsIGEpO1xufVxuXG5mdW5jdGlvbiBfZXF1YWxzKGEsIGIsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmIChpZGVudGljYWwoYSwgYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciB0eXBlQSA9IHR5cGUoYSk7XG5cbiAgaWYgKHR5cGVBICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYlsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicgJiYgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddKGIpICYmIHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicgJiYgYlsnZmFudGFzeS1sYW5kL2VxdWFscyddKGEpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYi5lcXVhbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGEuZXF1YWxzKGIpICYmIHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJiBiLmVxdWFscyhhKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZUEpIHtcbiAgICBjYXNlICdBcmd1bWVudHMnOlxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgaWYgKHR5cGVvZiBhLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nICYmIF9mdW5jdGlvbk5hbWUoYS5jb25zdHJ1Y3RvcikgPT09ICdQcm9taXNlJykge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBpZGVudGljYWwoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICBpZiAoIWlkZW50aWNhbChhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBhLm5hbWUgPT09IGIubmFtZSAmJiBhLm1lc3NhZ2UgPT09IGIubWVzc2FnZTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgaWYgKCEoYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJiBhLmlnbm9yZUNhc2UgPT09IGIuaWdub3JlQ2FzZSAmJiBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiYgYS5zdGlja3kgPT09IGIuc3RpY2t5ICYmIGEudW5pY29kZSA9PT0gYi51bmljb2RlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpZHggPSBzdGFja0EubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgaWYgKHN0YWNrQVtpZHhdID09PSBhKSB7XG4gICAgICByZXR1cm4gc3RhY2tCW2lkeF0gPT09IGI7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3VuaXFDb250ZW50RXF1YWxzKGEuZW50cmllcygpLCBiLmVudHJpZXMoKSwgc3RhY2tBLmNvbmNhdChbYV0pLCBzdGFja0IuY29uY2F0KFtiXSkpO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3VuaXFDb250ZW50RXF1YWxzKGEudmFsdWVzKCksIGIudmFsdWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcbiAgICBjYXNlICdBcmd1bWVudHMnOlxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICBjYXNlICdPYmplY3QnOlxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICBjYXNlICdFcnJvcic6XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQ2NEFycmF5JzpcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV4dGVuZGVkU3RhY2tBID0gc3RhY2tBLmNvbmNhdChbYV0pO1xuICB2YXIgZXh0ZW5kZWRTdGFja0IgPSBzdGFja0IuY29uY2F0KFtiXSk7XG5cbiAgaWR4ID0ga2V5c0EubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG4gICAgaWYgKCEoX2hhcyhrZXksIGIpICYmIF9lcXVhbHMoYltrZXldLCBhW2tleV0sIGV4dGVuZGVkU3RhY2tBLCBleHRlbmRlZFN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZXF1YWxzOyIsInZhciBfY3VycnkyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG52YXIgX2VxdWFscyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19lcXVhbHMnKTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBpdHMgYXJndW1lbnRzIGFyZSBlcXVpdmFsZW50LCBgZmFsc2VgIG90aGVyd2lzZS4gSGFuZGxlc1xuICogY3ljbGljYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuICpcbiAqIERpc3BhdGNoZXMgc3ltbWV0cmljYWxseSB0byB0aGUgYGVxdWFsc2AgbWV0aG9kcyBvZiBib3RoIGFyZ3VtZW50cywgaWZcbiAqIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVxdWFscygxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZXF1YWxzKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5lcXVhbHMoWzEsIDIsIDNdLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqXG4gKiAgICAgIHZhciBhID0ge307IGEudiA9IGE7XG4gKiAgICAgIHZhciBiID0ge307IGIudiA9IGI7XG4gKiAgICAgIFIuZXF1YWxzKGEsIGIpOyAvLz0+IHRydWVcbiAqL1xuXG5cbnZhciBlcXVhbHMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gX2VxdWFscyhhLCBiLCBbXSwgW10pO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsczsiLCIvKiBAZmxvdyB3ZWFrICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBwdXNoSGlzdG9yeVN0YXRlLCBjcmVhdGVJZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjdXJyeSwgZXF1YWxzLCB0cmF2ZXJzZSwgaWRlbnRpdHksIHBhdGggfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbi8vIFthXSA9PiBFaXRoZXIgU3RyaW5nIFthXVxuY29uc3QgaXNBcnJheSA9IGFyciA9PlxuICBBcnJheS5pc0FycmF5KGFycilcbiAgICA/IEVpdGhlci5SaWdodChhcnIpXG4gICAgOiBFaXRoZXIuTGVmdChgSW52YWxpZCBzdGF0ZXMgc2VudCB3aXRoIGltcG9ydFN0YXRlLiBFeHBlY3RlZCBBcnJheSBidXQgcmVjZWl2ZWQgJHt0eXBlb2YgYXJyfWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cblxuY29uc3QgZmllbGRUeXBlSXNWYWxpZCA9IGN1cnJ5KCh2YWxpZFR5cGVzLCBmaWVsZCkgPT5cbiAgdmFsaWRUeXBlcy5maW5kKGVxdWFscyhmaWVsZC50eXBlKSlcbiAgICA/IEVpdGhlci5SaWdodChmaWVsZClcbiAgICA6IEVpdGhlci5MZWZ0KGBJbnZhbGlkIGZpZWxkIHR5cGUgJHtmaWVsZC50eXBlfWApXG4pO1xuXG5jb25zdCB2YWxpZEZpZWxkVHlwZXMgPSBjdXJyeSgodmFsaWRUeXBlcywgZmllbGRzU3RhdGUpID0+XG4gIHRyYXZlcnNlKEVpdGhlci5vZiwgZmllbGRUeXBlSXNWYWxpZCh2YWxpZFR5cGVzKSwgZmllbGRzU3RhdGUpXG4pO1xuXG5cbi8vIFthXSAtPiBbYV0gLT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IHZhbGlkYXRlRmllbGRzU3RhdGUgPSBjdXJyeSgoZmllbGRzU3RhdGUsIHN0YXRlKSA9PlxuICBFaXRoZXIub2YoZmllbGRzU3RhdGUpXG4gICAgLmNoYWluKGlzQXJyYXkpXG4gICAgLmNoYWluKHZhbGlkRmllbGRUeXBlcyhzdGF0ZS5maWVsZFR5cGVzLm1hcChwYXRoKFtcImluZm9cIiwgXCJ0eXBlXCJdKSkpKVxuKTtcblxuXG4vLyBBZGQgcmVxdWlyZWQgcHJvcGVydGllcyB0aGF0IGFyZSBub3QgbWFuYWdlZCBieSB0aGUgZmllbGRcbi8vIGNvbXBvbmVudCBidXQgYnkgdGhlIEZvcm1CdWlsZGVyIGNvbXBvbmVudCBpdHNlbGYsIHNvIG1heVxuLy8gbm90IGJlIHRoZXJlLlxuLy8gW2FdID0+IFthXVxuY29uc3QgYWRkUmVxdWlyZWRQcm9wZXJ0aWVzID0gZmllbGRTdGF0ZXMgPT5cbiAgZmllbGRTdGF0ZXNcbiAgICAubWFwKHMgPT4gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgY29uZmlnU2hvd2luZzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBzLFxuICAgICAgeyBpZDogY3JlYXRlSWQoKSB9XG4gICAgKSk7XG5cblxuLy8gSWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBpbXBvcnQsIHRoZSBzYW1lIHN0YXRlXG4vLyB3aWxsIGJlIHJldHVybmVkXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgbmV3RmllbGRzU3RhdGUgfSkgPT5cbiAgdmFsaWRhdGVGaWVsZHNTdGF0ZShuZXdGaWVsZHNTdGF0ZSwgc3RhdGUpXG4gICAgLm1hcChhZGRSZXF1aXJlZFByb3BlcnRpZXMpXG4gICAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgICAuYmltYXAoY29uc29sZS5lcnJvciwgaWRlbnRpdHkpXG4gICAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCJmdW5jdGlvbiBfcmVkdWNlZCh4KSB7XG4gIHJldHVybiB4ICYmIHhbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10gPyB4IDoge1xuICAgICdAQHRyYW5zZHVjZXIvdmFsdWUnOiB4LFxuICAgICdAQHRyYW5zZHVjZXIvcmVkdWNlZCc6IHRydWVcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZHVjZWQ7IiwidmFyIF9jdXJyeTIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9fY3VycnkyJyk7XG5cbnZhciBfcmVkdWNlZCA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19yZWR1Y2VkJyk7XG5cbnZhciBfeGZCYXNlID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG52YXIgWEZpbmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuXG4gIGZ1bmN0aW9uIFhGaW5kKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5mb3VuZCA9IGZhbHNlO1xuICB9XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdm9pZCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYRmluZDtcbn0oKTtcblxudmFyIF94ZmluZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIF94ZmluZChmLCB4Zikge1xuICByZXR1cm4gbmV3IFhGaW5kKGYsIHhmKTtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfeGZpbmQ7IiwidmFyIF9jdXJyeTIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cbnZhciBfZGlzcGF0Y2hhYmxlID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xuXG52YXIgX3hmaW5kID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX3hmaW5kJyk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDIpKSh4cyk7IC8vPT4ge2E6IDJ9XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cblxuXG52YXIgZmluZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZpbmQnXSwgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbm1vZHVsZS5leHBvcnRzID0gZmluZDsiLCIndXNlIHN0cmljdCc7XG5cblxuLyoqXG4gKiBBIGhlbHBlciBmb3IgZGVsYXlpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBzdW1tYXJ5IChBbnkuLi4gLT4gQW55KSAtPiBWb2lkXG4gKi9cbnZhciBkZWxheWVkID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCc/ICBzZXRJbW1lZGlhdGVcbiAgICAgICAgICAgIDogdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnPyAgICAgICBwcm9jZXNzLm5leHRUaWNrXG4gICAgICAgICAgICA6IC8qIG90aGVyd2lzZSAqLyAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dFxuXG4vKipcbiAqIEBtb2R1bGUgbGliL3Rhc2tcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBUYXNrO1xuXG4vLyAtLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUaGUgYFRhc2tbzrEsIM6yXWAgc3RydWN0dXJlIHJlcHJlc2VudHMgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIHRpbWUuIFRoaXNcbiAqIGFsbG93cyBvbmUgdG8gbW9kZWwgdGltZS1iYXNlZCBlZmZlY3RzIGV4cGxpY2l0bHksIHN1Y2ggdGhhdCBvbmUgY2FuIGhhdmVcbiAqIGZ1bGwga25vd2xlZGdlIG9mIHdoZW4gdGhleSdyZSBkZWFsaW5nIHdpdGggZGVsYXllZCBjb21wdXRhdGlvbnMsIGxhdGVuY3ksXG4gKiBvciBhbnl0aGluZyB0aGF0IGNhbiBub3QgYmUgY29tcHV0ZWQgaW1tZWRpYXRlbHkuXG4gKlxuICogQSBjb21tb24gdXNlIGZvciB0aGlzIHN0cnVjdHVyZSBpcyB0byByZXBsYWNlIHRoZSB1c3VhbCBDb250aW51YXRpb24tUGFzc2luZ1xuICogU3R5bGUgZm9ybSBvZiBwcm9ncmFtbWluZywgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjb21wb3NlIGFuZCBzZXF1ZW5jZVxuICogdGltZS1kZXBlbmRlbnQgZWZmZWN0cyB1c2luZyB0aGUgZ2VuZXJpYyBhbmQgcG93ZXJmdWwgbW9uYWRpYyBvcGVyYXRpb25zLlxuICpcbiAqIEBjbGFzc1xuICogQHN1bW1hcnlcbiAqICgozrEg4oaSIFZvaWQpLCAozrIg4oaSIFZvaWQpIOKGkiBWb2lkKSwgKFZvaWQg4oaSIFZvaWQpIOKGkiBUYXNrW86xLCDOsl1cbiAqXG4gKiBUYXNrW86xLCDOsl0gPDogQ2hhaW5bzrJdXG4gKiAgICAgICAgICAgICAgICwgTW9uYWRbzrJdXG4gKiAgICAgICAgICAgICAgICwgRnVuY3RvclvOsl1cbiAqICAgICAgICAgICAgICAgLCBBcHBsaWNhdGl2ZVvOsl1cbiAqICAgICAgICAgICAgICAgLCBTZW1pZ3JvdXBbzrJdXG4gKiAgICAgICAgICAgICAgICwgTW9ub2lkW86yXVxuICogICAgICAgICAgICAgICAsIFNob3dcbiAqL1xuZnVuY3Rpb24gVGFzayhjb21wdXRhdGlvbiwgY2xlYW51cCkge1xuICB0aGlzLmZvcmsgPSBjb21wdXRhdGlvbjtcblxuICB0aGlzLmNsZWFudXAgPSBjbGVhbnVwIHx8IGZ1bmN0aW9uKCkge307XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgVGFza1vOsSwgzrJdYCBjb250YWluaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6yYC5cbiAqXG4gKiBgzrJgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrIg4oaSIFRhc2tbzrEsIM6yXVxuICovXG5UYXNrLnByb3RvdHlwZS5vZiA9IGZ1bmN0aW9uIF9vZihiKSB7XG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihfLCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIHJlc29sdmUoYik7XG4gIH0pO1xufTtcblxuVGFzay5vZiA9IFRhc2sucHJvdG90eXBlLm9mO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYFRhc2tbzrEsIM6yXWAgY29udGFpbmluZyB0aGUgc2luZ2xlIHZhbHVlIGDOsWAuXG4gKlxuICogYM6xYCBjYW4gYmUgYW55IHZhbHVlLCBpbmNsdWRpbmcgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW5vdGhlclxuICogYFRhc2tbzrEsIM6yXWAgc3RydWN0dXJlLlxuICpcbiAqIEBzdW1tYXJ5IM6xIOKGkiBUYXNrW86xLCDOsl1cbiAqL1xuVGFzay5wcm90b3R5cGUucmVqZWN0ZWQgPSBmdW5jdGlvbiBfcmVqZWN0ZWQoYSkge1xuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0KSB7XG4gICAgcmV0dXJuIHJlamVjdChhKTtcbiAgfSk7XG59O1xuXG5UYXNrLnJlamVjdGVkID0gVGFzay5wcm90b3R5cGUucmVqZWN0ZWQ7XG5cbi8vIC0tIEZ1bmN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHN1Y2Nlc3NmdWwgdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gIHVzaW5nIGEgcmVndWxhciB1bmFyeVxuICogZnVuY3Rpb24uXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrIg4oaSIM6zKSDihpIgVGFza1vOsSwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIF9tYXAoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoYSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZihiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLy8gLS0gQ2hhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgc3VjY2VzZnVsIHZhbHVlIG9mIHRoZSBgVGFza1vOsSwgzrJdYCB1c2luZyBhIGZ1bmN0aW9uIHRvIGFcbiAqIG1vbmFkLlxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gKM6yIOKGkiBUYXNrW86xLCDOs10pIOKGkiBUYXNrW86xLCDOs11cbiAqL1xuVGFzay5wcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbiBfY2hhaW4oZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoYSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIGYoYikuZm9yayhyZWplY3QsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9LCBjbGVhbnVwKTtcbn07XG5cbi8vIC0tIEFwcGx5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEFwcGx5cyB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSBvZiB0aGUgYFRhc2tbzrEsICjOsiDihpIgzrMpXWAgdG8gdGhlIHN1Y2Nlc3NmdWxcbiAqIHZhbHVlIG9mIHRoZSBgVGFza1vOsSwgzrJdYFxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCAozrIg4oaSIM6zKV0gPT4gVGFza1vOsSwgzrJdIOKGkiBUYXNrW86xLCDOs11cbiAqL1xuXG5UYXNrLnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIF9hcCh0aGF0KSB7XG4gIHZhciBmb3JrVGhpcyA9IHRoaXMuZm9yaztcbiAgdmFyIGZvcmtUaGF0ID0gdGhhdC5mb3JrO1xuICB2YXIgY2xlYW51cFRoaXMgPSB0aGlzLmNsZWFudXA7XG4gIHZhciBjbGVhbnVwVGhhdCA9IHRoYXQuY2xlYW51cDtcblxuICBmdW5jdGlvbiBjbGVhbnVwQm90aChzdGF0ZSkge1xuICAgIGNsZWFudXBUaGlzKHN0YXRlWzBdKTtcbiAgICBjbGVhbnVwVGhhdChzdGF0ZVsxXSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgdmFyIGZ1bmMsIGZ1bmNMb2FkZWQgPSBmYWxzZTtcbiAgICB2YXIgdmFsLCB2YWxMb2FkZWQgPSBmYWxzZTtcbiAgICB2YXIgcmVqZWN0ZWQgPSBmYWxzZTtcbiAgICB2YXIgYWxsU3RhdGU7XG5cbiAgICB2YXIgdGhpc1N0YXRlID0gZm9ya1RoaXMoZ3VhcmRSZWplY3QsIGd1YXJkUmVzb2x2ZShmdW5jdGlvbih4KSB7XG4gICAgICBmdW5jTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGZ1bmMgPSB4O1xuICAgIH0pKTtcblxuICAgIHZhciB0aGF0U3RhdGUgPSBmb3JrVGhhdChndWFyZFJlamVjdCwgZ3VhcmRSZXNvbHZlKGZ1bmN0aW9uKHgpIHtcbiAgICAgIHZhbExvYWRlZCA9IHRydWU7XG4gICAgICB2YWwgPSB4O1xuICAgIH0pKTtcblxuICAgIGZ1bmN0aW9uIGd1YXJkUmVzb2x2ZShzZXR0ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRlcih4KTtcbiAgICAgICAgaWYgKGZ1bmNMb2FkZWQgJiYgdmFsTG9hZGVkKSB7XG4gICAgICAgICAgZGVsYXllZChmdW5jdGlvbigpeyBjbGVhbnVwQm90aChhbGxTdGF0ZSkgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoZnVuYyh2YWwpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGd1YXJkUmVqZWN0KHgpIHtcbiAgICAgIGlmICghcmVqZWN0ZWQpIHtcbiAgICAgICAgcmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVqZWN0KHgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxTdGF0ZSA9IFt0aGlzU3RhdGUsIHRoYXRTdGF0ZV07XG4gIH0sIGNsZWFudXBCb3RoKTtcbn07XG5cbi8vIC0tIFNlbWlncm91cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBlYXJsaWVyIG9mIHRoZSB0d28gdGFza3MgYFRhc2tbzrEsIM6yXWBcbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+IFRhc2tbzrEsIM6yXSDihpIgVGFza1vOsSwgzrJdXG4gKi9cblxuVGFzay5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gX2NvbmNhdCh0aGF0KSB7XG4gIHZhciBmb3JrVGhpcyA9IHRoaXMuZm9yaztcbiAgdmFyIGZvcmtUaGF0ID0gdGhhdC5mb3JrO1xuICB2YXIgY2xlYW51cFRoaXMgPSB0aGlzLmNsZWFudXA7XG4gIHZhciBjbGVhbnVwVGhhdCA9IHRoYXQuY2xlYW51cDtcblxuICBmdW5jdGlvbiBjbGVhbnVwQm90aChzdGF0ZSkge1xuICAgIGNsZWFudXBUaGlzKHN0YXRlWzBdKTtcbiAgICBjbGVhbnVwVGhhdChzdGF0ZVsxXSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICB2YXIgYWxsU3RhdGU7XG4gICAgdmFyIHRoaXNTdGF0ZSA9IGZvcmtUaGlzKGd1YXJkKHJlamVjdCksIGd1YXJkKHJlc29sdmUpKTtcbiAgICB2YXIgdGhhdFN0YXRlID0gZm9ya1RoYXQoZ3VhcmQocmVqZWN0KSwgZ3VhcmQocmVzb2x2ZSkpO1xuXG4gICAgcmV0dXJuIGFsbFN0YXRlID0gW3RoaXNTdGF0ZSwgdGhhdFN0YXRlXTtcblxuICAgIGZ1bmN0aW9uIGd1YXJkKGYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgICAgIGlmICghZG9uZSkge1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIGRlbGF5ZWQoZnVuY3Rpb24oKXsgY2xlYW51cEJvdGgoYWxsU3RhdGUpIH0pXG4gICAgICAgICAgcmV0dXJuIGYoeCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LCBjbGVhbnVwQm90aCk7XG5cbn07XG5cbi8vIC0tIE1vbm9pZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgVGFzayB0aGF0IHdpbGwgbmV2ZXIgcmVzb2x2ZVxuICpcbiAqIEBzdW1tYXJ5IFZvaWQg4oaSIFRhc2tbzrEsIF9dXG4gKi9cblRhc2suZW1wdHkgPSBmdW5jdGlvbiBfZW1wdHkoKSB7XG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbigpIHt9KTtcbn07XG5cblRhc2sucHJvdG90eXBlLmVtcHR5ID0gVGFzay5lbXB0eTtcblxuLy8gLS0gU2hvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGBUYXNrW86xLCDOsl1gXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBfdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnVGFzayc7XG59O1xuXG4vLyAtLSBFeHRyYWN0aW5nIGFuZCByZWNvdmVyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZmFpbHVyZSB2YWx1ZSBpbnRvIGEgbmV3IGBUYXNrW86xLCDOsl1gLiBEb2VzIG5vdGhpbmcgaWYgdGhlXG4gKiBzdHJ1Y3R1cmUgYWxyZWFkeSBjb250YWlucyBhIHN1Y2Nlc3NmdWwgdmFsdWUuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrEg4oaSIFRhc2tbzrMsIM6yXSkg4oaSIFRhc2tbzrMsIM6yXVxuICovXG5UYXNrLnByb3RvdHlwZS5vckVsc2UgPSBmdW5jdGlvbiBfb3JFbHNlKGYpIHtcbiAgdmFyIGZvcmsgPSB0aGlzLmZvcms7XG4gIHZhciBjbGVhbnVwID0gdGhpcy5jbGVhbnVwO1xuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICByZXR1cm4gZm9yayhmdW5jdGlvbihhKSB7XG4gICAgICByZXR1cm4gZihhKS5mb3JrKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLy8gLS0gRm9sZHMgYW5kIGV4dGVuZGVkIHRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2F0YW1vcnBoaXNtLiBUYWtlcyB0d28gZnVuY3Rpb25zLCBhcHBsaWVzIHRoZSBsZWZ0bW9zdCBvbmUgdG8gdGhlIGZhaWx1cmVcbiAqIHZhbHVlLCBhbmQgdGhlIHJpZ2h0bW9zdCBvbmUgdG8gdGhlIHN1Y2Nlc3NmdWwgdmFsdWUsIGRlcGVuZGluZyBvbiB3aGljaCBvbmVcbiAqIGlzIHByZXNlbnQuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrEg4oaSIM6zKSwgKM6yIOKGkiDOsykg4oaSIFRhc2tbzrQsIM6zXVxuICovXG5UYXNrLnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gX2ZvbGQoZiwgZykge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGYoYSkpO1xuICAgIH0sIGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGcoYikpO1xuICAgIH0pO1xuICB9LCBjbGVhbnVwKTtcbn07XG5cbi8qKlxuICogQ2F0YW1vcnBoaXNtLlxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4geyBSZWplY3RlZDogzrEg4oaSIM6zLCBSZXNvbHZlZDogzrIg4oaSIM6zIH0g4oaSIFRhc2tbzrQsIM6zXVxuICovXG5UYXNrLnByb3RvdHlwZS5jYXRhID0gZnVuY3Rpb24gX2NhdGEocGF0dGVybikge1xuICByZXR1cm4gdGhpcy5mb2xkKHBhdHRlcm4uUmVqZWN0ZWQsIHBhdHRlcm4uUmVzb2x2ZWQpO1xufTtcblxuLyoqXG4gKiBTd2FwcyB0aGUgZGlzanVuY3Rpb24gdmFsdWVzLlxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gVm9pZCDihpIgVGFza1vOsiwgzrFdXG4gKi9cblRhc2sucHJvdG90eXBlLnN3YXAgPSBmdW5jdGlvbiBfc3dhcCgpIHtcbiAgdmFyIGZvcmsgPSB0aGlzLmZvcms7XG4gIHZhciBjbGVhbnVwID0gdGhpcy5jbGVhbnVwO1xuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICByZXR1cm4gZm9yayhmdW5jdGlvbihhKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KGIpO1xuICAgIH0pO1xuICB9LCBjbGVhbnVwKTtcbn07XG5cbi8qKlxuICogTWFwcyBib3RoIHNpZGVzIG9mIHRoZSBkaXNqdW5jdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM60KSDihpIgVGFza1vOsywgzrRdXG4gKi9cblRhc2sucHJvdG90eXBlLmJpbWFwID0gZnVuY3Rpb24gX2JpbWFwKGYsIGcpIHtcbiAgdmFyIGZvcmsgPSB0aGlzLmZvcms7XG4gIHZhciBjbGVhbnVwID0gdGhpcy5jbGVhbnVwO1xuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICByZXR1cm4gZm9yayhmdW5jdGlvbihhKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KGYoYSkpO1xuICAgIH0sIGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGcoYikpO1xuICAgIH0pO1xuICB9LCBjbGVhbnVwKTtcbn07XG5cbi8qKlxuICogTWFwcyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkaXNqdW5jdGlvbiAoZmFpbHVyZSkuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrEg4oaSIM6zKSDihpIgVGFza1vOsywgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLnJlamVjdGVkTWFwID0gZnVuY3Rpb24gX3JlamVjdGVkTWFwKGYpIHtcbiAgdmFyIGZvcmsgPSB0aGlzLmZvcms7XG4gIHZhciBjbGVhbnVwID0gdGhpcy5jbGVhbnVwO1xuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICByZXR1cm4gZm9yayhmdW5jdGlvbihhKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KGYoYSkpO1xuICAgIH0sIGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGIpO1xuICAgIH0pO1xuICB9LCBjbGVhbnVwKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vdGFzaycpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgcHJvcCwgZmluZCwgaWRlbnRpdHksIHBpcGUgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5pbXBvcnQgVGFzayBmcm9tIFwiZGF0YS50YXNrXCI7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IGZpZWxkQ3JlYXRlZCB9IGZyb20gXCIuLi9BY3Rpb25zXCI7XG5cbi8vIFN0YXRlIC0+IFN0cmluZyAtPiBFaXRoZXIgU3RyaW5nIEZ1bmN0aW9uXG5jb25zdCB0eXBlQ29uc3RydWN0b3IgPSAoc3RhdGUsIGZpZWxkVHlwZSkgPT4ge1xuICByZXR1cm4gRWl0aGVyLm9mKHN0YXRlKVxuICAgIC5tYXAocHJvcChcImZpZWxkVHlwZXNcIikpXG4gICAgLm1hcChmaW5kKHYgPT4gdi5pbmZvLnR5cGUgPT09IGZpZWxkVHlwZSkpXG4gICAgLmNoYWluKEVpdGhlci5mcm9tTnVsbGFibGUpXG4gICAgLmJpbWFwKF8gPT4gYEZpZWxkIFwiJHtmaWVsZFR5cGV9XCIgZG9lcyBub3QgZXhpc3QuYCwgaWRlbnRpdHkpO1xufTtcblxuLy8geyBpbml0aWFsU3RhdGU6IEZ1bmN0aW9uIH0gLT4gVGFzayBTdHJpbmcgT2JqZWN0XG5jb25zdCBjcmVhdGVGaWVsZCA9IGNvbnN0ciA9PlxuICBuZXcgVGFzaygocmVqZWN0LCByZXNvbHZlKSA9PiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9taXNlIGlzIG9ubHkgcmVzb2x2ZWQgb25jZVxuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBmaWVsZFN0YXRlID0gY29uc3RyLmluaXRpYWxTdGF0ZSgpO1xuXG4gICAgaWYgKCEoZmllbGRTdGF0ZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICByZXNvbHZlKGZpZWxkU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFN0YXRlXG4gICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2godiA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpIHsgdGhyb3cgdjsgfVxuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZWplY3Qodik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4vLyBPYmplY3QgLT4gT2JqZWN0XG5jb25zdCBpbnNlcnRSZXF1aXJlZFByb3BzID0gZmllbGQgPT5cbiAgSW1tdXRhYmxlKGZpZWxkKS5tZXJnZSh7XG4gICAgaWQ6IGNyZWF0ZUlkKCksXG4gICAgY29uZmlnU2hvd2luZzogdHJ1ZSxcbiAgfSwge1xuICAgIGRlZXA6IHRydWUsXG4gIH0pO1xuXG5jb25zdCBjcmVhdGVGaWVsZEFzeW5jaHJvbm91c2x5ID0gKHN0YXRlLCBmaWVsZFR5cGUsIGFzeW5jRGlzcGF0Y2gpID0+XG4gIHR5cGVDb25zdHJ1Y3RvcihzdGF0ZSwgZmllbGRUeXBlKVxuICAubWFwKGNyZWF0ZUZpZWxkKSAvLyBFaXRoZXIgU3RyaW5nIChUYXNrIFN0cmluZyBPYmplY3QpXG4gIC5sZWZ0TWFwKFRhc2sucmVqZWN0ZWQpXG4gIC5tZXJnZSgpIC8vIFRhc2sgU3RyaW5nIE9iamVjdFxuICAubWFwKGluc2VydFJlcXVpcmVkUHJvcHMpXG4gIC5mb3JrKCAvLyBleGVjdXRlIHRhc2tcbiAgICBlcnIgPT4gY29uc29sZS5lcnJvcihcIlRhc2sgcmVqZWN0ZWRcIiwgZXJyKSxcbiAgICBwaXBlKGZpZWxkQ3JlYXRlZCwgYXN5bmNEaXNwYXRjaClcbiAgKTtcblxuLy8gVGhpcyBpcyBhbiBhc3luYyBhY3Rpb24uIFdoZW4gaXQgaXMgZmluaXNoZWQgaXQgd2lsbCB0cmlnZ2VyIHRoZVxuLy8gZmllbGQgY3JlYXRlZCBhY3Rpb25cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBmaWVsZFR5cGUsIGFzeW5jRGlzcGF0Y2ggfSkgPT4ge1xuICBjcmVhdGVGaWVsZEFzeW5jaHJvbm91c2x5KHN0YXRlLCBmaWVsZFR5cGUsIGFzeW5jRGlzcGF0Y2gpO1xuICByZXR1cm4gc3RhdGU7XG59O1xuIiwidmFyIF9jb25jYXQgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29uY2F0Jyk7XG5cbnZhciBfY3VycnkyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgZm9sbG93ZWQgYnlcbiAqIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBlbGVtZW50IHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gYWRkIGEgbmV3IGl0ZW0gdG8uXG4gKiAgICAgICAgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBvbGQgbGlzdCBmb2xsb3dlZCBieSBgZWxgLlxuICogQHNlZSBSLnByZXBlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbJ3dyaXRlJywgJ21vcmUnXSk7IC8vPT4gWyd3cml0ZScsICdtb3JlJywgJ3Rlc3RzJ11cbiAqICAgICAgUi5hcHBlbmQoJ3Rlc3RzJywgW10pOyAvLz0+IFsndGVzdHMnXVxuICogICAgICBSLmFwcGVuZChbJ3Rlc3RzJ10sIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCBbJ3Rlc3RzJ11dXG4gKi9cblxuXG52YXIgYXBwZW5kID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYXBwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KGxpc3QsIFtlbF0pO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGFwcGVuZDsiLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBRdWlsZHJlZW4gTW90dGEgPHF1aWxkcmVlbkBnbWFpbC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbi8vIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzXG4vLyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sXG4vLyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLFxuLy8gcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSxcbi8vIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sXG4vLyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuLy8gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbi8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbi8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkVcbi8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT05cbi8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8qKlxuICogQG1vZHVsZSBsaWIvbWF5YmVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXliZVxuXG4vLyAtLSBBbGlhc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBjbG9uZSAgICAgICAgID0gT2JqZWN0LmNyZWF0ZVxudmFyIHVuaW1wbGVtZW50ZWQgPSBmdW5jdGlvbigpeyB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKSB9XG52YXIgbm9vcCAgICAgICAgICA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQSBzdHJ1Y3R1cmUgZm9yIHZhbHVlcyB0aGF0IG1heSBub3QgYmUgcHJlc2VudCwgb3IgY29tcHV0YXRpb25zIHRoYXQgbWF5XG4gKiBmYWlsLiBgTWF5YmUoYSlgIGV4cGxpY2l0bHkgbW9kZWxzIHRoZSBlZmZlY3RzIHRoYXQgYXJlIGltcGxpY2l0IGluXG4gKiBgTnVsbGFibGVgIHR5cGVzLCB0aHVzIGhhcyBub25lIG9mIHRoZSBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGhcbiAqIGBudWxsYCBvciBgdW5kZWZpbmVkYCDigJQgbGlrZSBgTnVsbFBvaW50ZXJFeGNlcHRpb25zYC5cbiAqXG4gKiBUaGUgY2xhc3MgbW9kZWxzIHR3byBkaWZmZXJlbnQgY2FzZXM6XG4gKlxuICogICsgYEp1c3QgYWAg4oCUIHJlcHJlc2VudHMgYSBgTWF5YmUoYSlgIHRoYXQgY29udGFpbnMgYSB2YWx1ZS4gYGFgIG1heVxuICogICAgIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiAgKyBgTm90aGluZ2Ag4oCUIHJlcHJlc2VudHMgYSBgTWF5YmUoYSlgIHRoYXQgaGFzIG5vIHZhbHVlcy4gT3IgYVxuICogICAgIGZhaWx1cmUgdGhhdCBuZWVkcyBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIENvbW1vbiB1c2VzIG9mIHRoaXMgc3RydWN0dXJlIGluY2x1ZGVzIG1vZGVsbGluZyB2YWx1ZXMgdGhhdCBtYXkgb3IgbWF5XG4gKiBub3QgYmUgcHJlc2VudCBpbiBhIGNvbGxlY3Rpb24sIHRodXMgaW5zdGVhZCBvZiBuZWVkaW5nIGFcbiAqIGBjb2xsZWN0aW9uLmhhcyhhKWAsIHRoZSBgY29sbGVjdGlvbi5nZXQoYSlgIG9wZXJhdGlvbiBnaXZlcyB5b3UgYWxsXG4gKiB0aGUgaW5mb3JtYXRpb24geW91IG5lZWQg4oCUIGBjb2xsZWN0aW9uLmdldChhKS5pcy1ub3RoaW5nYCBiZWluZ1xuICogZXF1aXZhbGVudCB0byBgY29sbGVjdGlvbi5oYXMoYSlgOyBTaW1pbGFybHkgdGhlIHNhbWUgcmVhc29uaW5nIG1heVxuICogYmUgYXBwbGllZCB0byBjb21wdXRhdGlvbnMgdGhhdCBtYXkgZmFpbCB0byBwcm92aWRlIGEgdmFsdWUsIGUuZy46XG4gKiBgY29sbGVjdGlvbi5maW5kKHByZWRpY2F0ZSlgIGNhbiBzYWZlbHkgcmV0dXJuIGEgYE1heWJlKGEpYCBpbnN0YW5jZSxcbiAqIGV2ZW4gaWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbnVsbGFibGUgdmFsdWVzLlxuICpcbiAqIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWVzIG9mIGBNYXliZShhKWAgY2FuIGJlIGNvbWJpbmVkIGFuZCBtYW5pcHVsYXRlZFxuICogYnkgdXNpbmcgdGhlIGV4cHJlc3NpdmUgbW9uYWRpYyBvcGVyYXRpb25zLiBUaGlzIGFsbG93cyBzYWZlbHlcbiAqIHNlcXVlbmNpbmcgb3BlcmF0aW9ucyB0aGF0IG1heSBmYWlsLCBhbmQgc2FmZWx5IGNvbXBvc2luZyB2YWx1ZXMgdGhhdFxuICogeW91IGRvbid0IGtub3cgd2hldGhlciB0aGV5J3JlIHByZXNlbnQgb3Igbm90LCBmYWlsaW5nIGVhcmx5XG4gKiAocmV0dXJuaW5nIGEgYE5vdGhpbmdgKSBpZiBhbnkgb2YgdGhlIG9wZXJhdGlvbnMgZmFpbC5cbiAqXG4gKiBJZiBvbmUgd2FudHMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBmYWlsdXJlcywgdGhlXG4gKiBbRWl0aGVyXVtdIGFuZCBbVmFsaWRhdGlvbl1bXSBzdHJ1Y3R1cmVzIHByb3ZpZGUgc3VjaCBhIGNhcGFiaWxpdHksIGFuZFxuICogc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYE1heWJlKGEpYCBzdHJ1Y3R1cmUuXG4gKlxuICogW0VpdGhlcl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xrdGFsZS9kYXRhLmVpdGhlclxuICogW1ZhbGlkYXRpb25dOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS52YWxpZGF0aW9uXG4gKlxuICpcbiAqIEBjbGFzc1xuICovXG5mdW5jdGlvbiBNYXliZSgpIHt9XG5cbi8vIFRoZSBjYXNlIGZvciBzdWNjZXNzZnVsIHZhbHVlc1xuSnVzdC5wcm90b3R5cGUgPSBjbG9uZShNYXliZS5wcm90b3R5cGUpXG5mdW5jdGlvbiBKdXN0KGEpe1xuICB0aGlzLnZhbHVlID0gYVxufVxuXG4vLyBUaGUgY2FzZSBmb3IgZmFpbHVyZSB2YWx1ZXNcbk5vdGhpbmcucHJvdG90eXBlID0gY2xvbmUoTWF5YmUucHJvdG90eXBlKVxuZnVuY3Rpb24gTm90aGluZygpe31cblxuXG4vLyAtLSBDb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSB3aXRoIGFuIGFic2VudCB2YWx1ZS4gQ29tbW9ubHkgdXNlZFxuICogdG8gcmVwcmVzZW50IGEgZmFpbHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBWb2lkIOKGkiBNYXliZVvOsV1cbiAqL1xuTWF5YmUuTm90aGluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IE5vdGhpbmdcbn1cbk1heWJlLnByb3RvdHlwZS5Ob3RoaW5nID0gTWF5YmUuTm90aGluZ1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYE1heWJlW86xXWAgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHNpbmdsZSB2YWx1ZVxuICogYM6xYC4gQ29tbW9ubHkgdXNlZCB0byByZXByZXNlbnQgYSBzdWNjZXNzLlxuICpcbiAqIGDOsWAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYW5vdGhlclxuICogYE1heWJlW86xXWAgc3RydWN0dXJlLlxuICpcbiAqIEBzdW1tYXJ5IM6xIOKGkiBNYXliZVvOsV1cbiAqL1xuTWF5YmUuSnVzdCA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KGEpXG59XG5NYXliZS5wcm90b3R5cGUuSnVzdCA9IE1heWJlLkp1c3RcblxuXG4vLyAtLSBDb252ZXJzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSBmcm9tIGEgbnVsbGFibGUgdHlwZS5cbiAqXG4gKiBJZiB0aGUgdmFsdWUgaXMgZWl0aGVyIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFcbiAqIGBOb3RoaW5nYCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyB3cmFwcGVkIGluIGEgYEp1c3QozrEpYC5cbiAqXG4gKiBAc3VtbWFyeSDOsSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLmZyb21OdWxsYWJsZSA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIGEgIT0gbnVsbD8gICAgICAgbmV3IEp1c3QoYSlcbiAgOiAgICAgIC8qIG90aGVyd2lzZSAqLyAgbmV3IE5vdGhpbmdcbn1cbk1heWJlLnByb3RvdHlwZS5mcm9tTnVsbGFibGUgPSBNYXliZS5mcm9tTnVsbGFibGVcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsl1gIHN0cnVjdHVyZSBmcm9tIGFuIGBFaXRoZXJbzrEsIM6yXWAgdHlwZS5cbiAqXG4gKiBUaGUgbGVmdCBzaWRlIG9mIHRoZSBgRWl0aGVyYCBiZWNvbWVzIGBOb3RoaW5nYCwgYW5kIHRoZSByaWdodCBzaWRlXG4gKiBpcyB3cmFwcGVkIGluIGEgYEp1c3QozrIpYC5cbiAqXG4gKiBAc3VtbWFyeSBFaXRoZXJbzrEsIM6yXSDihpIgTWF5YmVbzrJdXG4gKi9cbk1heWJlLmZyb21FaXRoZXIgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmZvbGQoTWF5YmUuTm90aGluZywgTWF5YmUuSnVzdClcbn1cbk1heWJlLnByb3RvdHlwZS5mcm9tRWl0aGVyID0gTWF5YmUuZnJvbUVpdGhlclxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYE1heWJlW86yXWAgc3RydWN0dXJlIGZyb20gYSBgVmFsaWRhdGlvblvOsSwgzrJdYCB0eXBlLlxuICpcbiAqIFRoZSBmYWlsdXJlIHNpZGUgb2YgdGhlIGBWYWxpZGF0aW9uYCBiZWNvbWVzIGBOb3RoaW5nYCwgYW5kIHRoZSByaWdodFxuICogc2lkZSBpcyB3cmFwcGVkIGluIGEgYEp1c3QozrIpYC5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSBWYWxpZGF0aW9uW86xLCDOsl0g4oaSIE1heWJlW86yXVxuICovXG5NYXliZS5mcm9tVmFsaWRhdGlvbiAgICAgICAgICAgPSBNYXliZS5mcm9tRWl0aGVyXG5NYXliZS5wcm90b3R5cGUuZnJvbVZhbGlkYXRpb24gPSBNYXliZS5mcm9tRWl0aGVyXG5cblxuLy8gLS0gUHJlZGljYXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIGNvbnRhaW5zIGEgZmFpbHVyZSAoaS5lLjogYE5vdGhpbmdgKS5cbiAqXG4gKiBAc3VtbWFyeSBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc05vdGhpbmcgICA9IGZhbHNlXG5Ob3RoaW5nLnByb3RvdHlwZS5pc05vdGhpbmcgPSB0cnVlXG5cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgY29udGFpbnMgYSBzaW5nbGUgdmFsdWUgKGkuZS46IGBKdXN0KM6xKWApLlxuICpcbiAqIEBzdW1tYXJ5IEJvb2xlYW5cbiAqL1xuTWF5YmUucHJvdG90eXBlLmlzSnVzdCA9IGZhbHNlXG5KdXN0LnByb3RvdHlwZS5pc0p1c3QgID0gdHJ1ZVxuXG5cbi8vIC0tIEFwcGxpY2F0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYE1heWJlW86xXWAgc3RydWN0dXJlIGhvbGRpbmcgdGhlIHNpbmdsZSB2YWx1ZSBgzrFgLlxuICpcbiAqIGDOsWAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFub3RoZXJcbiAqIGBNYXliZVvOsV1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLm9mID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gbmV3IEp1c3QoYSlcbn1cbk1heWJlLnByb3RvdHlwZS5vZiA9IE1heWJlLm9mXG5cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBmdW5jdGlvbiBpbnNpZGUgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZSB0byBhbm90aGVyXG4gKiBhcHBsaWNhdGl2ZSB0eXBlLlxuICpcbiAqIFRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgc2hvdWxkIGNvbnRhaW4gYSBmdW5jdGlvbiB2YWx1ZSwgb3RoZXJ3aXNlIGFcbiAqIGBUeXBlRXJyb3JgIGlzIHRocm93bi5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQE1heWJlW86xIOKGkiDOsl0sIGY6QXBwbGljYXRpdmVbX10pID0+IGZbzrFdIOKGkiBmW86yXVxuICovXG5NYXliZS5wcm90b3R5cGUuYXAgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmFwID0gbm9vcFxuXG5KdXN0LnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uKGIpIHtcbiAgcmV0dXJuIGIubWFwKHRoaXMudmFsdWUpXG59XG5cblxuXG5cbi8vIC0tIEZ1bmN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZhbHVlIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdXNpbmcgYSByZWd1bGFyIHVuYXJ5XG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSBATWF5YmVbzrFdID0+ICjOsSDihpIgzrIpIOKGkiBNYXliZVvOsl1cbiAqL1xuTWF5YmUucHJvdG90eXBlLm1hcCAgID0gdW5pbXBsZW1lbnRlZFxuTm90aGluZy5wcm90b3R5cGUubWFwID0gbm9vcFxuXG5KdXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLm9mKGYodGhpcy52YWx1ZSkpXG59XG5cblxuLy8gLS0gQ2hhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmFsdWUgb2YgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZSB1c2luZyBhbiB1bmFyeSBmdW5jdGlvblxuICogdG8gbW9uYWRzLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChATWF5YmVbzrFdLCBtOk1vbmFkW19dKSA9PiAozrEg4oaSIG1bzrJdKSDihpIgbVvOsl1cbiAqL1xuTWF5YmUucHJvdG90eXBlLmNoYWluICAgPSB1bmltcGxlbWVudGVkXG5Ob3RoaW5nLnByb3RvdHlwZS5jaGFpbiA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiBmKHRoaXMudmFsdWUpXG59XG5cblxuLy8gLS0gU2hvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSBATWF5YmVbzrFdID0+IFZvaWQg4oaSIFN0cmluZ1xuICovXG5NYXliZS5wcm90b3R5cGUudG9TdHJpbmcgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnTWF5YmUuTm90aGluZydcbn1cblxuSnVzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdNYXliZS5KdXN0KCcgKyB0aGlzLnZhbHVlICsgJyknXG59XG5cblxuLy8gLS0gRXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGVzdHMgaWYgYSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgaXMgZXF1YWwgdG8gYW5vdGhlciBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBNYXliZVvOsV0g4oaSIEJvb2xlYW5cbiAqL1xuTWF5YmUucHJvdG90eXBlLmlzRXF1YWwgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLmlzTm90aGluZ1xufVxuXG5KdXN0LnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gYi5pc0p1c3RcbiAgJiYgICAgIGIudmFsdWUgPT09IHRoaXMudmFsdWVcbn1cblxuXG4vLyAtLSBFeHRyYWN0aW5nIGFuZCByZWNvdmVyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmFsdWUgb3V0IG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUsIGlmIGl0XG4gKiBleGlzdHMuIE90aGVyd2lzZSB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSBATWF5YmVbzrFdID0+IFZvaWQg4oaSIGEsICAgICAgOjogcGFydGlhbCwgdGhyb3dzXG4gKiBAc2VlIHtAbGluayBtb2R1bGU6bGliL21heWJlfk1heWJlI2dldE9yRWxzZX0g4oCUIEEgZ2V0dGVyIHRoYXQgY2FuIGhhbmRsZSBmYWlsdXJlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSBpZiB0aGUgc3RydWN0dXJlIGhhcyBubyB2YWx1ZSAoYE5vdGhpbmdgKS5cbiAqL1xuTWF5YmUucHJvdG90eXBlLmdldCA9IHVuaW1wbGVtZW50ZWRcblxuTm90aGluZy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW4ndCBleHRyYWN0IHRoZSB2YWx1ZSBvZiBhIE5vdGhpbmcuXCIpXG59XG5cbkp1c3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy52YWx1ZVxufVxuXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhbHVlIG91dCBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlLiBJZiB0aGVyZSBpcyBubyB2YWx1ZSxcbiAqIHJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiDOsSDihpIgzrFcbiAqL1xuTWF5YmUucHJvdG90eXBlLmdldE9yRWxzZSA9IHVuaW1wbGVtZW50ZWRcblxuTm90aGluZy5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYVxufVxuXG5KdXN0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZmFpbHVyZSBpbnRvIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZS4gRG9lcyBub3RoaW5nIGlmIHRoZVxuICogc3RydWN0dXJlIGFscmVhZHkgY29udGFpbnMgYSB2YWx1ZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSBATWF5YmVbzrFdID0+IChWb2lkIOKGkiBNYXliZVvOsV0pIOKGkiBNYXliZVvOsV1cbiAqL1xuTWF5YmUucHJvdG90eXBlLm9yRWxzZSA9IHVuaW1wbGVtZW50ZWRcblxuTm90aGluZy5wcm90b3R5cGUub3JFbHNlID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZigpXG59XG5cbkp1c3QucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uKF8pIHtcbiAgcmV0dXJuIHRoaXNcbn1cblxuXG4vKipcbiAqIENhdGFtb3JwaGlzbS5cbiAqIFxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiB7IE5vdGhpbmc6IFZvaWQg4oaSIM6yLCBKdXN0OiDOsSDihpIgzrIgfSDihpIgzrJcbiAqL1xuTWF5YmUucHJvdG90eXBlLmNhdGEgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmNhdGEgPSBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gIHJldHVybiBwYXR0ZXJuLk5vdGhpbmcoKVxufVxuXG5KdXN0LnByb3RvdHlwZS5jYXRhID0gZnVuY3Rpb24ocGF0dGVybikge1xuICByZXR1cm4gcGF0dGVybi5KdXN0KHRoaXMudmFsdWUpO1xufVxuXG5cbi8qKlxuICogSlNPTiBzZXJpYWxpc2F0aW9uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBPYmplY3RcbiAqL1xuTWF5YmUucHJvdG90eXBlLnRvSlNPTiA9IHVuaW1wbGVtZW50ZWRcblxuTm90aGluZy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB7ICcjdHlwZSc6ICdmb2xrdGFsZTpNYXliZS5Ob3RoaW5nJyB9XG59XG5cbkp1c3QucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4geyAnI3R5cGUnOiAnZm9sa3RhbGU6TWF5YmUuSnVzdCdcbiAgICAgICAgICwgdmFsdWU6IHRoaXMudmFsdWUgfVxufVxuIiwiLy8gQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUXVpbGRyZWVuIE1vdHRhIDxxdWlsZHJlZW5AZ21haWwuY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG4vLyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlc1xuLy8gKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuLy8gaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcbi8vIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4vLyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbi8vIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG4vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG4vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbWF5YmUnKSIsImltcG9ydCB7IGN1cnJ5LCBwaXBlLCBwcm9wLCBvdmVyLCBhcHBlbmQgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IGhpZGVDb25maWdzLCBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgTWF5YmUgZnJvbSBcImRhdGEubWF5YmVcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRoTmV3RmllbGQgPSBjdXJyeSgoc3RhdGUsIG5ld0ZpZWxkKSA9PiBwaXBlKFxuICBoaWRlQ29uZmlncyxcbiAgb3ZlcihTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSwgYXBwZW5kKG5ld0ZpZWxkKSlcbikoc3RhdGUpKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGNyZWF0ZWRGaWVsZFN0YXRlIH0pID0+XG4gIE1heWJlLmZyb21OdWxsYWJsZShjcmVhdGVkRmllbGRTdGF0ZSlcbiAgLm1hcChoaXN0b3J5U3RhdGVXaXRoTmV3RmllbGQoc3RhdGUpKVxuICAubWFwKHByb3AoXCJmaWVsZHNTdGF0ZVwiKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCB0b2dnbGVDb25maWcgPSBmaWVsZFN0YXRlID0+XG4gIEltbXV0YWJsZShmaWVsZFN0YXRlKS5zZXQoXCJjb25maWdTaG93aW5nXCIsICFmaWVsZFN0YXRlLmNvbmZpZ1Nob3dpbmcpO1xuXG5jb25zdCByZXBsYWNlRmllbGRTdGF0ZSA9IGN1cnJ5KChzdGF0ZSwgZmllbGRTdGF0ZSkgPT5cbiAgc3RhdGVcbiAgICAuZmllbGRzU3RhdGVcbiAgICAubWFwKGFGaWVsZCA9PiBhRmllbGQuaWQgPT09IGZpZWxkU3RhdGUuaWRcbiAgICAgID8gZmllbGRTdGF0ZVxuICAgICAgOiBhRmllbGRcbiAgICApXG4pO1xuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgZmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgLm1hcCh0b2dnbGVDb25maWcpXG4gIC5tYXAocmVwbGFjZUZpZWxkU3RhdGUoc3RhdGUpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgTWF5YmUgZnJvbSBcImRhdGEubWF5YmVcIjtcbmltcG9ydCBJbW11dGFibGUgZnJvbSBcInNlYW1sZXNzLWltbXV0YWJsZVwiO1xuaW1wb3J0IHsgcHVzaEhpc3RvcnlTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IHRvZ2dsZVJlcXVpcmVkID0gZmllbGRTdGF0ZSA9PlxuICBJbW11dGFibGUoZmllbGRTdGF0ZSkuc2V0KFwicmVxdWlyZWRcIiwgIWZpZWxkU3RhdGUucmVxdWlyZWQpO1xuXG5jb25zdCByZXBsYWNlRmllbGRTdGF0ZSA9IGN1cnJ5KChzdGF0ZSwgZmllbGRTdGF0ZSkgPT5cbiAgc3RhdGVcbiAgICAuZmllbGRzU3RhdGVcbiAgICAubWFwKGFGaWVsZCA9PiBhRmllbGQuaWQgPT09IGZpZWxkU3RhdGUuaWRcbiAgICAgID8gZmllbGRTdGF0ZVxuICAgICAgOiBhRmllbGRcbiAgICApXG4pO1xuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgZmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgLm1hcCh0b2dnbGVSZXF1aXJlZClcbiAgLm1hcChyZXBsYWNlRmllbGRTdGF0ZShzdGF0ZSkpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9maWx0ZXI7IiwiZnVuY3Rpb24gX2lzT2JqZWN0KHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pc09iamVjdDsiLCJ2YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL19jdXJyeTInKTtcblxudmFyIF94ZkJhc2UgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cbnZhciBYRmlsdGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBYRmlsdGVyKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gWEZpbHRlcjtcbn0oKTtcblxudmFyIF94ZmlsdGVyID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gX3hmaWx0ZXIoZiwgeGYpIHtcbiAgcmV0dXJuIG5ldyBYRmlsdGVyKGYsIHhmKTtcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfeGZpbHRlcjsiLCJ2YXIgX2N1cnJ5MiA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxudmFyIF9kaXNwYXRjaGFibGUgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlJyk7XG5cbnZhciBfZmlsdGVyID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2ZpbHRlcicpO1xuXG52YXIgX2lzT2JqZWN0ID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX2lzT2JqZWN0Jyk7XG5cbnZhciBfcmVkdWNlID0gLyojX19QVVJFX18qL3JlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZScpO1xuXG52YXIgX3hmaWx0ZXIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9feGZpbHRlcicpO1xuXG52YXIga2V5cyA9IC8qI19fUFVSRV9fKi9yZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUYWtlcyBhIHByZWRpY2F0ZSBhbmQgYSBgRmlsdGVyYWJsZWAsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbHRlcmAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fSBGaWx0ZXJhYmxlXG4gKiBAc2VlIFIucmVqZWN0LCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBpc0V2ZW4gPSBuID0+IG4gJSAyID09PSAwO1xuICpcbiAqICAgICAgUi5maWx0ZXIoaXNFdmVuLCBbMSwgMiwgMywgNF0pOyAvLz0+IFsyLCA0XVxuICpcbiAqICAgICAgUi5maWx0ZXIoaXNFdmVuLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHtiOiAyLCBkOiA0fVxuICovXG5cblxudmFyIGZpbHRlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZpbHRlciddLCBfeGZpbHRlciwgZnVuY3Rpb24gKHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIF9pc09iamVjdChmaWx0ZXJhYmxlKSA/IF9yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgaWYgKHByZWQoZmlsdGVyYWJsZVtrZXldKSkge1xuICAgICAgYWNjW2tleV0gPSBmaWx0ZXJhYmxlW2tleV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9LCBrZXlzKGZpbHRlcmFibGUpKSA6XG4gIC8vIGVsc2VcbiAgX2ZpbHRlcihwcmVkLCBmaWx0ZXJhYmxlKTtcbn0pKTtcbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyOyIsImltcG9ydCB7IGN1cnJ5LCBwcm9wLCBvdmVyLCBmaWx0ZXIgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IFN0YXRlTGVuc2VzLCBwdXNoSGlzdG9yeVN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBNYXliZSBmcm9tIFwiZGF0YS5tYXliZVwiO1xuXG4vLyBTdGF0ZSAtPiBPYmplY3QgLT4gU3RhdGVcbmNvbnN0IGhpc3RvcnlTdGF0ZVdpdGhvdXRGaWVsZCA9IGN1cnJ5KChzdGF0ZSwgZmllbGRTdGF0ZSkgPT5cbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBmaWx0ZXIoZnMgPT4gZnMuaWQgIT09IGZpZWxkU3RhdGUuaWQpLFxuICAgIHN0YXRlXG4gIClcbik7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBmaWVsZFN0YXRlIH0pID0+XG4gIE1heWJlLmZyb21OdWxsYWJsZShmaWVsZFN0YXRlKVxuICAubWFwKGhpc3RvcnlTdGF0ZVdpdGhvdXRGaWVsZChzdGF0ZSkpXG4gIC5tYXAocHJvcChcImZpZWxkc1N0YXRlXCIpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsImltcG9ydCB7IGN1cnJ5LCBwcm9wLCBvdmVyLCBtYXAgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IFN0YXRlTGVuc2VzLCBwdXNoSGlzdG9yeVN0YXRlLCB2YWxpZGF0ZUZpZWxkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCB1cGRhdGVGaWVsZFN0YXRlID0gY3VycnkoKHN0YXRlLCBuZXdGaWVsZFN0YXRlKSA9PlxuICBvdmVyKFxuICAgIFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlLFxuICAgIG1hcChmcyA9PiBmcy5pZCA9PT0gbmV3RmllbGRTdGF0ZS5pZCA/IG5ld0ZpZWxkU3RhdGUgOiBmcyksXG4gICAgc3RhdGVcbiAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkU3RhdGUgfSkgPT5cbiAgdmFsaWRhdGVGaWVsZChuZXdGaWVsZFN0YXRlKSAvLyBFaXRoZXJcbiAgLm1hcCh1cGRhdGVGaWVsZFN0YXRlKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5sZWZ0TWFwKGNvbnNvbGUuZXJyb3IpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwidmFyIF9jdXJyeTIgPSAvKiNfX1BVUkVfXyovcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cbi8qKlxuICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3QsIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24sXG4gKiB3aGljaCBzaG91bGQgYWNjZXB0IHR3byB2YWx1ZXMgYXQgYSB0aW1lIGFuZCByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlXG4gKiBmaXJzdCB2YWx1ZSBpcyBzbWFsbGVyLCBhIHBvc2l0aXZlIG51bWJlciBpZiBpdCdzIGxhcmdlciwgYW5kIHplcm8gaWYgdGhleVxuICogYXJlIGVxdWFsLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgYSAqKmNvcHkqKiBvZiB0aGUgbGlzdC4gSXQgZG9lcyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKGEsIGEpIC0+IE51bWJlcikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBBIHNvcnRpbmcgZnVuY3Rpb24gOjogYSAtPiBiIC0+IEludFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzb3J0XG4gKiBAcmV0dXJuIHtBcnJheX0gYSBuZXcgYXJyYXkgd2l0aCBpdHMgZWxlbWVudHMgc29ydGVkIGJ5IHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkaWZmID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH07XG4gKiAgICAgIFIuc29ydChkaWZmLCBbNCwyLDcsNV0pOyAvLz0+IFsyLCA0LCA1LCA3XVxuICovXG5cblxudmFyIHNvcnQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBzb3J0KGNvbXBhcmF0b3IsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoY29tcGFyYXRvcik7XG59KTtcbm1vZHVsZS5leHBvcnRzID0gc29ydDsiLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBjdXJyeSwgcGlwZSwgcHJvcCwgb3Zlciwgc29ydCB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IHsgaGlkZUNvbmZpZ3MsIFN0YXRlTGVuc2VzLCBwdXNoSGlzdG9yeVN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgaGlzdG9yeVN0YXRlV2l0aE5ld09yZGVyID0gY3VycnkoKHN0YXRlLCBuZXdPcmRlcikgPT4gcGlwZShcbiAgaGlkZUNvbmZpZ3MsXG4gIG92ZXIoXG4gICAgU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsXG4gICAgc29ydCgoZjEsIGYyKSA9PiBuZXdPcmRlci5pbmRleE9mKGYxLmlkKSAtIG5ld09yZGVyLmluZGV4T2YoZjIuaWQpKVxuICApXG4pKHN0YXRlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBuZXdGaWVsZHNPcmRlciB9KSA9PlxuICAobmV3RmllbGRzT3JkZXIgJiYgQXJyYXkuaXNBcnJheShuZXdGaWVsZHNPcmRlcilcbiAgICA/IEVpdGhlci5SaWdodChuZXdGaWVsZHNPcmRlcilcbiAgICA6IEVpdGhlci5MZWZ0KGBuZXdGaWVsZHNPcmRlciBtdXN0IGJlIGFuIGFycmF5IGJ1dCByZWNlaXZlZCAke3R5cGVvZiBuZXdGaWVsZHNPcmRlcn1gKVxuICApXG4gIC5jaGFpbihvID0+XG4gICAgby5sZW5ndGggPT09IHN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aFxuICAgICAgPyBFaXRoZXIuUmlnaHQobylcbiAgICAgIDogRWl0aGVyLkxlZnQoYG5ld0ZpZWxkc09yZGVyIGhhcyAke28ubGVuZ3RofSBlbGVtZW50cywgYnV0IHRoZSBjdXJyZW50IHN0YXRlIGhhcyAke3N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aH0gZWxlbWVudHNgKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgKVxuICAuY2hhaW4obyA9PiB7XG4gICAgY29uc3Qgc3RhdGVJZHMgPSBzdGF0ZS5maWVsZHNTdGF0ZS5tYXAocHJvcChcImlkXCIpKTtcbiAgICBjb25zdCBub01pc3NpbmdJZCA9IHN0YXRlSWRzLnJlZHVjZSgoYWNjLCBmSWQpID0+IGFjYyAmJiBvLmluY2x1ZGVzKGZJZCksIHRydWUpO1xuICAgIHJldHVybiBub01pc3NpbmdJZFxuICAgICAgPyBFaXRoZXIuUmlnaHQobylcbiAgICAgIDogRWl0aGVyLkxlZnQoXCJOb3QgYWxsIGlkcyBpbiB0aGUgbmV3IG9yZGVyIGFyZSBtYXRjaGVkIGluIHRoZSBleGlzdGluZyBzdGF0ZSBpZHMuXCIpO1xuICB9KVxuICAubWFwKGhpc3RvcnlTdGF0ZVdpdGhOZXdPcmRlcihzdGF0ZSkpXG4gIC5tYXAocHJvcChcImZpZWxkc1N0YXRlXCIpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAubGVmdE1hcChlcnIgPT4gY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIHJlb3JkZXI6ICR7ZXJyfWApKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIi8qIEBmbG93IHdlYWsgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbmltcG9ydCB7IFN0YXRlTGVuc2VzLCBwcm9wZXJ0eVR5cGVDaGVjayB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBvdmVyLCB0cmF2ZXJzZSwgY3VycnkgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbi8vIFthXSA9PiBFaXRoZXIgU3RyaW5nIFthXVxuY29uc3QgaXNBcnJheSA9IGFyciA9PlxuICBBcnJheS5pc0FycmF5KGFycilcbiAgICA/IEVpdGhlci5SaWdodChhcnIpXG4gICAgOiBFaXRoZXIuTGVmdChgRXhwZWN0ZWQgQXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIGFycn1gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG5cbi8vIE9iamVjdCAtPiBFaXRoZXIgU3RyaW5nIE9iamVjdFxuY29uc3QgaGFzUmVxdWlyZWRJbmZvID0gY29tcG9uZW50ID0+XG4gIHByb3BlcnR5VHlwZUNoZWNrKFwiaW5pdGlhbFN0YXRlXCIsIFwiZnVuY3Rpb25cIiwgY29tcG9uZW50KVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJSZW5kZXJFZGl0b3JcIiwgXCJmdW5jdGlvblwiKSlcbiAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiaW5mb1wiLCBcIm9iamVjdFwiKSlcbiAgLmNoYWluKGMgPT4gRWl0aGVyLmZyb21OdWxsYWJsZShjLmluZm8pKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJ0eXBlXCIsIFwic3RyaW5nXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJkaXNwbGF5TmFtZVwiLCBcInN0cmluZ1wiKSlcbiAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiZ3JvdXBcIiwgXCJzdHJpbmdcIikpXG4gIC5jaGFpbihfID0+IEVpdGhlci5SaWdodChjb21wb25lbnQpKTtcblxuY29uc3QgaXNDb21wb25lbnRWYWxpZCA9IGN1c3RvbUNvbXBvbmVudHMgPT5cbiAgdHJhdmVyc2UoRWl0aGVyLm9mLCBoYXNSZXF1aXJlZEluZm8sIGN1c3RvbUNvbXBvbmVudHMpO1xuXG4vLyBbYV0gLT4gW2FdIC0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCB2YWxpZGF0ZUNvbXBvbmVudHMgPSBjdXN0b21Db21wb25lbnRzID0+XG4gIEVpdGhlci5SaWdodChjdXN0b21Db21wb25lbnRzKVxuICAgIC5jaGFpbihpc0FycmF5KVxuICAgIC5jaGFpbihpc0NvbXBvbmVudFZhbGlkKTtcblxuY29uc3QgYWRkVG9GaWVsZFR5cGVzID0gY3VycnkoKHN0YXRlLCBjdXN0b21Db21wb25lbnRzKSA9PlxuICBvdmVyKFN0YXRlTGVuc2VzLmZpZWxkVHlwZXMsIHMgPT4gcy5jb25jYXQoY3VzdG9tQ29tcG9uZW50cyksIHN0YXRlKVxuKTtcblxuLy8gSWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBpbXBvcnQsIHRoZSBzYW1lIHN0YXRlXG4vLyB3aWxsIGJlIHJldHVybmVkXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgY3VzdG9tQ29tcG9uZW50cyB9KSA9PlxuICAoY3VzdG9tQ29tcG9uZW50c1xuICAgID8gRWl0aGVyLlJpZ2h0KGN1c3RvbUNvbXBvbmVudHMpXG4gICAgOiBFaXRoZXIuTGVmdChcIkVtcHR5IGN1c3RvbSBjb21wb25lbnRzXCIpXG4gIClcbiAgICAuY2hhaW4odmFsaWRhdGVDb21wb25lbnRzKVxuICAgIC5sZWZ0TWFwKGVyciA9PiBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBjdXN0b20gY29tcG9uZW50czpcIiwgZXJyKSlcbiAgICAubWFwKGFkZFRvRmllbGRUeXBlcyhzdGF0ZSkpXG4gICAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiZmwtYXNzZXJ0XCI7XG5pbXBvcnQgdW5kbyBmcm9tIFwiLi91bmRvXCI7XG5pbXBvcnQgaW1wb3J0U3RhdGUgZnJvbSBcIi4vaW1wb3J0U3RhdGVcIjtcbmltcG9ydCBjcmVhdGVGaWVsZCBmcm9tIFwiLi9jcmVhdGVGaWVsZFwiO1xuaW1wb3J0IGZpZWxkQ3JlYXRlZCBmcm9tIFwiLi9maWVsZENyZWF0ZWRcIjtcbmltcG9ydCB0b2dnbGVDb25maWcgZnJvbSBcIi4vZmllbGQudG9nZ2xlQ29uZmlnXCI7XG5pbXBvcnQgdG9nZ2xlUmVxdWlyZWQgZnJvbSBcIi4vZmllbGQudG9nZ2xlUmVxdWlyZWRcIjtcbmltcG9ydCBkZWxldGVGaWVsZCBmcm9tIFwiLi9maWVsZC5kZWxldGVGaWVsZFwiO1xuaW1wb3J0IHVwZGF0ZUZpZWxkIGZyb20gXCIuL2ZpZWxkLnVwZGF0ZUZpZWxkXCI7XG5pbXBvcnQgcmVvcmRlckZpZWxkcyBmcm9tIFwiLi9yZW9yZGVyRmllbGRzXCI7XG5pbXBvcnQgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyBmcm9tIFwiLi9pbXBvcnRDdXN0b21Db21wb25lbnRzXCI7XG5cbmNvbnN0IGFjdGlvbkhhbmRsZXJzID0ge1xuICB1bmRvLFxuICBpbXBvcnRTdGF0ZSxcbiAgY3JlYXRlRmllbGQsXG4gIGZpZWxkQ3JlYXRlZCxcbiAgdG9nZ2xlQ29uZmlnLFxuICB0b2dnbGVSZXF1aXJlZCxcbiAgZGVsZXRlRmllbGQsXG4gIHVwZGF0ZUZpZWxkLFxuICByZW9yZGVyRmllbGRzLFxuICBpbXBvcnRDdXN0b21Db21wb25lbnRzLFxufTtcblxuY29uc3QgaXNFeHBlY3RlZEFjdGlvbiA9IGEgPT4gYSAmJiBhLnR5cGUgJiYgYWN0aW9uSGFuZGxlcnNbYS50eXBlXTtcbmNvbnN0IGlzUmVkdXhBY3Rpb24gPSBhID0+IGEgJiYgYS50eXBlICYmIGEudHlwZS5pbmNsdWRlcyhcIkBAcmVkdXhcIik7XG5cblxuY29uc3QgdXBkYXRlID0gKHN0YXRlLCBhY3Rpb24pID0+XG4gIGlzRXhwZWN0ZWRBY3Rpb24oYWN0aW9uKVxuICAgID8gYWN0aW9uSGFuZGxlcnNbYWN0aW9uLnR5cGVdKHN0YXRlLCBhY3Rpb24pXG4gIDogaXNSZWR1eEFjdGlvbihhY3Rpb24pXG4gICAgPyBzdGF0ZVxuICA6IGFzc2VydChmYWxzZSwgYEludmFsaWQgYWN0aW9uIHR5cGU6ICR7YWN0aW9uLnR5cGV9YCk7XG5cbmV4cG9ydCBkZWZhdWx0IHVwZGF0ZTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuXG5pbXBvcnQgeyB1bmRvIGFzIHVuZG9BY3Rpb24gfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IGN1cnJlbnRGaWVsZHNTdGF0ZSA9IFtcImN1cnJlbnRcIl07XG5jb25zdCBvbGRGaWVsZHNTdGF0ZSA9IFtcIm9sZFwiXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW10sXG4gIGZpZWxkc1N0YXRlOiBjdXJyZW50RmllbGRzU3RhdGUsXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogW29sZEZpZWxkc1N0YXRlXSxcbn07XG5cbmNvbnN0IGVtcHR5TW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuY29uc3QgZW1wdHlIaXN0b3J5TW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IGN1cnJlbnRGaWVsZHNTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbXSxcbn07XG5cbmRlc2NyaWJlKFwiVXBkYXRlLnVuZG9cIiwgKCkgPT4ge1xuICBpdChcInJlbW92ZXMgZmlyc3Qgb2xkIHN0YXRlIGZyb20gaGlzdG9yeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHVuZG9BY3Rpb24oKSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoXCJzZXRzIGZpcnN0IG9sZCBzdGF0ZSBhcyBjdXJyZW50IHN0YXRlXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZSkudG9FcXVhbChvbGRGaWVsZHNTdGF0ZSk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lc24ndCBtb2RpZnkgdGhlIHN0YXRlIGlmIHRoZXJlIGFyZW4ndCBtb3JlIGhpc3Rvcnkgc3RhdGVzIHRvIHVuZG9cIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUoZW1wdHlNb2NrU3RhdGUsIHVuZG9BY3Rpb24oKSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUpLnRvRXF1YWwoZW1wdHlNb2NrU3RhdGUpO1xuICB9KTtcblxuICBpdChcInNldCdzIHRoZSBjdXJyZW50IHN0YXRlIHRvIGVtcHR5IGlmIHRoZXJlIGFyZSBubyBtb3JlIGhpc3Rvcnkgc3RhdGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKGVtcHR5SGlzdG9yeU1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5cbmltcG9ydCB7IGltcG9ydFN0YXRlIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCB0eXBlc0FycmF5ID0gW3tcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJSYWRpb0J1dHRvbnNcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJDaGVja2JveGVzXCIsXG4gIH0sXG59LCB7XG4gIFwiaW5mb1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiRHJvcGRvd25cIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJUZXh0Qm94XCIsXG4gIH0sXG59LCB7XG4gIFwiaW5mb1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiRW1haWxCb3hcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJUZWxlcGhvbmVCb3hcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJOdW1iZXJCb3hcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJUZXh0QXJlYVwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIkRhdGVGaWVsZFwiLFxuICB9LFxufV07XG5cbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbXCJhXCIsIFwiYlwiXTtcbmNvbnN0IG1vY2tIaXN0b3J5ID0gW107XG5jb25zdCBtb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IHR5cGVzQXJyYXksXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgbmV3VmFsaWRTdGF0ZSA9IFt7XG4gIFwidHlwZVwiOiBcIkNoZWNrYm94ZXNcIixcbiAgXCJkaXNwbGF5TmFtZVwiOiBcIkNoZWNrYm94ZXNcIixcbiAgXCJncm91cFwiOiBcIk9wdGlvbnMgQ29tcG9uZW50c1wiLFxuICBcImh0bWxJbnB1dFR5cGVcIjogXCJjaGVja2JveFwiLFxuICBcInRpdGxlXCI6IFwiQWRkIGEgdGl0bGVcIixcbiAgXCJpZFwiOiAyLFxuICBcIm9wdGlvbnNcIjogW3tcbiAgICBcImNhcHRpb25cIjogXCJJbnNlcnQgYW4gb3B0aW9uXCIsXG4gIH1dLFxuICBcIm5ld09wdGlvbkNhcHRpb25cIjogXCJcIixcbn1dO1xuXG5jb25zdCBuZXdJbnZhbGlkU3RhdGUgPSBbe1xuICBcInR5cGVcIjogXCJJbnZhbGlkIHR5cGVcIixcbiAgXCJkaXNwbGF5TmFtZVwiOiBcIkNoZWNrYm94ZXNcIixcbiAgXCJncm91cFwiOiBcIk9wdGlvbnMgQ29tcG9uZW50c1wiLFxuICBcImh0bWxJbnB1dFR5cGVcIjogXCJjaGVja2JveFwiLFxuICBcInRpdGxlXCI6IFwiQWRkIGEgdGl0bGVcIixcbiAgXCJvcHRpb25zXCI6IFt7XG4gICAgXCJjYXB0aW9uXCI6IFwiSW5zZXJ0IGFuIG9wdGlvblwiLFxuICB9XSxcbiAgXCJuZXdPcHRpb25DYXB0aW9uXCI6IFwiXCIsXG59XTtcblxuZGVzY3JpYmUoXCJVcGRhdGUuaW1wb3J0U3RhdGVcIiwgKCkgPT4ge1xuICBpdChcIlJldHVybnMgYW4gdW5jaGFuZ2VkIGFycmF5IGlmIHRoZSBuZXcgc3RhdGUgaXMgaW52YWxpZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydFN0YXRlKHt9KSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUobnVsbCkpKS50b0VxdWFsKG1vY2tTdGF0ZSk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyBhbiB1bmNoYW5nZWQgYXJyYXkgaWYgdGhlIGEgZmllbGQncyB0eXBlIGlzIG5vdCBpbiBmaWVsZFR5cGVzXCIsICgpID0+IHtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUobmV3SW52YWxpZFN0YXRlKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJTZW5kcyB0aGUgbGFzdCBjdXJyZW50IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUobmV3VmFsaWRTdGF0ZSkpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlSGlzdG9yeVswXS50b1N0cmluZygpKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUudG9TdHJpbmcoKSk7XG4gICAgZXhwZWN0KHVwZGF0ZWQuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrSGlzdG9yeS5sZW5ndGggKyAxKTtcbiAgfSk7XG5cbiAgaXQoXCJTZXRzIHRoZSBuZXcgc3RhdGUgYXMgY3VycmVudFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZCA9IHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydFN0YXRlKG5ld1ZhbGlkU3RhdGUpKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS50eXBlKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0udHlwZSk7XG4gICAgZXhwZWN0KHVwZGF0ZWQuZmllbGRzU3RhdGVbMF0udHlwZSkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS5kaXNwbGF5TmFtZSkudG9FcXVhbChuZXdWYWxpZFN0YXRlWzBdLmRpc3BsYXlOYW1lKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS5kaXNwbGF5TmFtZSkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS5ncm91cCkudG9FcXVhbChuZXdWYWxpZFN0YXRlWzBdLmdyb3VwKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS5ncm91cCkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJNYWtlcyBzdXJlIGFsbCBpZHMgYXJlIHN0cmluZ3NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkU3RhdGUyID0gbmV3VmFsaWRTdGF0ZVxuICAgICAgLm1hcCgodiwgaWR4KSA9PiBpZHggIT09IDAgPyB2IDogT2JqZWN0LmFzc2lnbih7fSwgdiwgeyBpZDogMiB9KSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydFN0YXRlKHZhbGlkU3RhdGUyKSk7XG4gICAgZXhwZWN0KHR5cGVvZiB1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKFwic3RyaW5nXCIpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBjcmVhdGVGaWVsZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgcHJvbWlzZVR5cGVJbnN0YW5jZSA9IHsgdHlwZTogXCJwcm9taXNlLWluc3RhbmNlXCIgfTtcbmNvbnN0IHByb21pc2VUeXBlID0ge1xuICBpbmZvOiB7IHR5cGU6IFwiUHJvbWlzZVR5cGVcIiB9LFxuICBpbml0aWFsU3RhdGU6ICgpID0+IFByb21pc2UucmVzb2x2ZShwcm9taXNlVHlwZUluc3RhbmNlKSxcbn07XG5cbmNvbnN0IHN5bmNUeXBlSW5zdGFuY2UgPSB7IHR5cGU6IFwic3luYy1pbnN0YW5jZVwiIH07XG5jb25zdCBzeW5jVHlwZSA9IHtcbiAgaW5mbzogeyB0eXBlOiBcIlN5bmNUeXBlXCIgfSxcbiAgaW5pdGlhbFN0YXRlOiAoKSA9PiBzeW5jVHlwZUluc3RhbmNlLFxufTtcblxuY29uc3QgdHlwZXNBcnJheSA9IFtwcm9taXNlVHlwZSwgc3luY1R5cGVdO1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogdHlwZXNBcnJheSxcbiAgZmllbGRzU3RhdGU6IG1vY2tDdXJyZW50U3RhdGUsXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbW9ja0hpc3RvcnksXG59O1xuXG5kZXNjcmliZShcIlVwZGF0ZS5jcmVhdGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0KFwiY3JlYXRlcyBmaWVsZHMgYXN5bmNocm9ub3VzbHlcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IHYgPT4ge1xuICAgICAgZXhwZWN0KHYpLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcInJldHVybnMgYSAnZmllbGRDcmVhdGVkJyBhY3Rpb24gd2hlbiBmaWVsZCBpcyBjcmVhdGVkXCIsIGRvbmUgPT4ge1xuICAgIGNvbnN0IGFzeW5jRGlzcGF0Y2ggPSBhY3Rpb24gPT4ge1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZmllbGRDcmVhdGVkXCIpO1xuICAgICAgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3luY0FjaW9uID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgYXN5bmNEaXNwYXRjaCB9LFxuICAgICAgY3JlYXRlRmllbGQoc3luY1R5cGUuaW5mby50eXBlKVxuICAgICk7XG5cbiAgICB1cGRhdGUobW9ja1N0YXRlLCBhc3luY0FjaW9uKTtcbiAgfSk7XG5cbiAgaXQoXCJjcmVhdGVzIHR5cGVzIHdpdGggY29uc3RydWN0b3JzIHRoYXQgcmV0dXJuIGEgcGxhaW4gb2JqZWN0XCIsIGRvbmUgPT4ge1xuICAgIGNvbnN0IGFzeW5jRGlzcGF0Y2ggPSBhY3Rpb24gPT4ge1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUudHlwZSkudG9FcXVhbChzeW5jVHlwZUluc3RhbmNlLnR5cGUpO1xuICAgICAgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3luY0FjaW9uID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgYXN5bmNEaXNwYXRjaCB9LFxuICAgICAgY3JlYXRlRmllbGQoc3luY1R5cGUuaW5mby50eXBlKVxuICAgICk7XG5cbiAgICB1cGRhdGUobW9ja1N0YXRlLCBhc3luY0FjaW9uKTtcbiAgfSk7XG5cbiAgaXQoXCJjcmVhdGVzIHR5cGVzIHdpdGggY29uc3RydWN0b3JzIHRoYXQgcmV0dXJuIGEgcHJvbWlzZVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gYWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUpLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QoYWN0aW9uLmNyZWF0ZWRGaWVsZFN0YXRlLnR5cGUpLnRvRXF1YWwocHJvbWlzZVR5cGVJbnN0YW5jZS50eXBlKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHByb21pc2VUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyByZXF1aXJlZCBmaWVsZHMgdG8gaW5zdGFuY2VcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLmNyZWF0ZWRGaWVsZFN0YXRlLmlkKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUuY29uZmlnU2hvd2luZykudG9FcXVhbChcImJvb2xlYW5cIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChwcm9taXNlVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGNyZWF0ZSBhIGZpZWxkIGlmIHR5cGUgaXMgbm90IGluIG1vZGVsLmZpZWxkVHlwZXNcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGphc21pbmUuY3JlYXRlU3B5KFwiYXN5bmNEaXNwYXRjaFwiKTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChcIm5vbi1leGlzdGluZy10eXBlXCIpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuXG4gICAgc2V0VGltZW91dChcbiAgICAgICgpID0+IHsgZXhwZWN0KGFzeW5jRGlzcGF0Y2gpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7IGRvbmUoKTsgfSxcbiAgICAgIDUwXG4gICAgKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgZmllbGRDcmVhdGVkIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCBjcmVhdGVkRmllbGRTdGF0ZSA9IHsgdHlwZTogXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIgfTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbXCJhXCIsIFwiYlwiXTtcbmNvbnN0IG1vY2tIaXN0b3J5ID0gW107XG5jb25zdCBtb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFt7IGluZm86IHsgdHlwZTogXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIgfSB9XSxcbiAgZmllbGRzU3RhdGU6IG1vY2tDdXJyZW50U3RhdGUsXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbW9ja0hpc3RvcnksXG59O1xuXG5jb25zdCBmaWVsZENyZWF0ZWRBY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuY29uc3QgbmV3U3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCBmaWVsZENyZWF0ZWRBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5maWVsZENyZWF0ZWRcIiwgKCkgPT4ge1xuICBpdChcIm91dHB1dHMgYSBzdGF0ZSB3aXRoIHRoZSBuZXcgZmllbGQgaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCArIDEpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYudHlwZSA9PT0gY3JlYXRlZEZpZWxkU3RhdGUudHlwZSlcbiAgICApLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KFwic2VuZHMgdGhlIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVswXSkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzBdKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzFdKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMV0pO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgaWYgbm8gbmV3IGZpZWxkIGlzIGdpdmVuIHRvIGl0XCIsICgpID0+IHtcbiAgICBjb25zdCBzYW1lU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCBmaWVsZENyZWF0ZWQobnVsbCkpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciBjcmVhdGluZyBvbmUgb2JqZWN0XCIsICgpID0+IHtcbiAgICBjb25zdCBjaGFuZ2VkMSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSkpO1xuICAgIGNvbnN0IGNoYW5nZWQyID0gdXBkYXRlKGNoYW5nZWQxLCBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgZmllbGRDcmVhdGVkKGNyZWF0ZWRGaWVsZFN0YXRlKSk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlLmxlbmd0aCArIDMpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG5cbmltcG9ydCB7IHRvZ2dsZUNvbmZpZyB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuXG5jb25zdCBmaWVsZFN0YXRlQ29uZmlnU2hvd2luZyA9IHtcbiAgaWQ6IDEyMyxcbiAgY29uZmlnU2hvd2luZzogdHJ1ZSxcbn07XG5cbmNvbnN0IGZpZWxkU3RhdGVDb25maWdOb3RTaG93aW5nID0ge1xuICBpZDogMzIxLFxuICBjb25maWdTaG93aW5nOiBmYWxzZSxcbn07XG5cbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW10sXG4gIGZpZWxkc1N0YXRlOiBbZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcsIGZpZWxkU3RhdGVDb25maWdOb3RTaG93aW5nXSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbXSxcbn07XG5cbmRlc2NyaWJlKFwiVXBkYXRlLnRvZ2dsZUNvbmZpZ1wiLCAoKSA9PiB7XG4gIGl0KFwidHVybnMgdGhlIGNvbmZpZyBvcHRpb24gdG8gZmFsc2Ugd2hlbiBuZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB0b2dnbGVDb25maWcoZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcpKTtcbiAgICBleHBlY3QoXG4gICAgICBtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZChmID0+IGYuaWQgPT09IGZpZWxkU3RhdGVDb25maWdTaG93aW5nLmlkKVxuICAgICAgLmNvbmZpZ1Nob3dpbmdcbiAgICApLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdChcInR1cm5zIHRoZSBjb25maWcgb3B0aW9uIHRvIHRydWUgd2hlbiBuZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB0b2dnbGVDb25maWcoZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmcpKTtcbiAgICBleHBlY3QoXG4gICAgICBtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZChmID0+IGYuaWQgPT09IGZpZWxkU3RhdGVDb25maWdTaG93aW5nLmlkKVxuICAgICAgLmNvbmZpZ1Nob3dpbmdcbiAgICApLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyB0aGUgbGFzdCBzdGF0ZSB0byB0aGUgaGlzdG9yeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnU2hvd2luZykpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHsgdG9nZ2xlUmVxdWlyZWQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cblxuY29uc3QgZmllbGRTdGF0ZUlzUmVxdWlyZWQgPSB7XG4gIGlkOiAxMjMsXG4gIHJlcXVpcmVkOiB0cnVlLFxufTtcblxuY29uc3QgZmllbGRTdGF0ZUlzTm90UmVxdWlyZWQgPSB7XG4gIGlkOiAzMjEsXG4gIHJlcXVpcmVkOiBmYWxzZSxcbn07XG5cbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW10sXG4gIGZpZWxkc1N0YXRlOiBbZmllbGRTdGF0ZUlzUmVxdWlyZWQsIGZpZWxkU3RhdGVJc05vdFJlcXVpcmVkXSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbXSxcbn07XG5cbmRlc2NyaWJlKFwiVXBkYXRlLnRvZ2dsZVJlcXVpcmVkXCIsICgpID0+IHtcbiAgaXQoXCJ0dXJucyB0aGUgcmVxdWlyZWQgb3B0aW9uIHRvIGZhbHNlIHdoZW4gbmVlZGVkXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlUmVxdWlyZWQoZmllbGRTdGF0ZUlzUmVxdWlyZWQpKTtcbiAgICBleHBlY3QoXG4gICAgICBtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZChmID0+IGYuaWQgPT09IGZpZWxkU3RhdGVJc1JlcXVpcmVkLmlkKVxuICAgICAgLnJlcXVpcmVkXG4gICAgKS50b0VxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoXCJ0dXJucyB0aGUgcmVxdWlyZWQgb3B0aW9uIHRvIHRydWUgd2hlbiBuZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlSXNOb3RSZXF1aXJlZCkpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUlzUmVxdWlyZWQuaWQpXG4gICAgICAucmVxdWlyZWRcbiAgICApLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyB0aGUgbGFzdCBzdGF0ZSB0byB0aGUgaGlzdG9yeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZVJlcXVpcmVkKGZpZWxkU3RhdGVJc1JlcXVpcmVkKSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgZGVsZXRlRmllbGQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IHRvQmVEZWxldGVkRmllbGRTdGF0ZSA9IHsgdHlwZTogXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIsIGlkOiAwIH07XG5jb25zdCBtb2NrQ3VycmVudFN0YXRlID0gW3RvQmVEZWxldGVkRmllbGRTdGF0ZSwgeyBpZDogMSB9LCB7IGlkOiAyIH1dO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW3sgaW5mbzogeyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9IH1dLFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmNvbnN0IGZpZWxkRGVsZXRlQWN0aW9uID0gZGVsZXRlRmllbGQodG9CZURlbGV0ZWRGaWVsZFN0YXRlKTtcbmNvbnN0IG5ld1N0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGREZWxldGVBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5kZWxldGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHdpdGhvdXQgdGhlIGZpZWxkIGluY2x1ZGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGggLSAxKTtcbiAgICBleHBlY3QoXG4gICAgICBuZXdTdGF0ZS5maWVsZHNTdGF0ZVxuICAgICAgLmZpbmQodiA9PiB2LmlkID09PSB0b0JlRGVsZXRlZEZpZWxkU3RhdGUuaWQpXG4gICAgKS50b0VxdWFsKHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KFwic2VuZHMgdGhlIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgcmVjZW50SGlzdG9yeVN0YXRlID0gbmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdO1xuICAgIGV4cGVjdChyZWNlbnRIaXN0b3J5U3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChyZWNlbnRIaXN0b3J5U3RhdGVbMV0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXS5pZCk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiBubyBuZXcgZmllbGQgaXMgZ2l2ZW4gdG8gaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNhbWVTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGRlbGV0ZUZpZWxkKG51bGwpKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCBicmVhayB0aGUgc3RhdGUgYWZ0ZXIgZGVsZXRpbmcgYSBmaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja0ZpZWxkMSA9IE9iamVjdC5hc3NpZ24oe30sIHRvQmVEZWxldGVkRmllbGRTdGF0ZSwgeyBpZDogNSB9KTtcbiAgICBjb25zdCBtb2NrRmllbGQyID0gT2JqZWN0LmFzc2lnbih7fSwgdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiA2IH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCB0b0JlRGVsZXRlZEZpZWxkU3RhdGUsIHsgaWQ6IDcgfSk7XG5cbiAgICBjb25zdCBtb2NrU3RhdGUyID0gT2JqZWN0LmFzc2lnbih7fSwgbW9ja1N0YXRlLCB7XG4gICAgICBmaWVsZHNTdGF0ZTogW1xuICAgICAgICBtb2NrRmllbGQxLFxuICAgICAgICBtb2NrRmllbGQyLFxuICAgICAgICBtb2NrRmllbGQzLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBjb25zdCBjaGFuZ2VkMSA9IHVwZGF0ZShtb2NrU3RhdGUyLCBkZWxldGVGaWVsZChtb2NrRmllbGQxKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIGRlbGV0ZUZpZWxkKG1vY2tGaWVsZDIpKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgZGVsZXRlRmllbGQobW9ja0ZpZWxkMykpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUyLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZTIuZmllbGRzU3RhdGUubGVuZ3RoIC0gMyk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5cbmltcG9ydCB7IHVwZGF0ZUZpZWxkIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCBvbGRGaWVsZFN0YXRlID0ge1xuICB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIixcbiAgaWQ6IFwiMFwiLFxuICBjb25maWdTaG93aW5nOiBmYWxzZSxcbiAgcmVxdWlyZWQ6IGZhbHNlLFxuICBjb2xvcjogXCJibHVlXCIsXG59O1xuY29uc3QgbmV3RmllbGRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIG9sZEZpZWxkU3RhdGUsIHsgY29sb3I6IFwiZ3JlZW5cIiB9KTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbb2xkRmllbGRTdGF0ZSwgeyBpZDogMSB9LCB7IGlkOiAyIH1dO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW3sgaW5mbzogeyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9IH1dLFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmNvbnN0IGZpZWxkVXBkYXRlQWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkVXBkYXRlQWN0aW9uKTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudXBkYXRlRmllbGRcIiwgKCkgPT4ge1xuICBpdChcIm91dHB1dHMgYSBzdGF0ZSB0aGUgZmllbGQgdXBkYXRlZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QoXG4gICAgICBuZXdTdGF0ZS5maWVsZHNTdGF0ZVxuICAgICAgLmZpbmQodiA9PiB2LmNvbG9yID09PSBuZXdGaWVsZFN0YXRlLmNvbG9yKVxuICAgICkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgdGhlIHVwZGF0ZWQgZmllbGQgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZVswXS5jb2xvcikudG9FcXVhbChuZXdGaWVsZFN0YXRlLmNvbG9yKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCByZWNlbnRIaXN0b3J5U3RhdGUgPSBuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF07XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChyZWNlbnRIaXN0b3J5U3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVswXS5jb2xvcikudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzBdLmNvbG9yKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIGFuIGludmFsaWQgZmllbGQgc3RhdGUgaXMgZ2l2ZW4gdG8gaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGlzU2FtZSA9IChzdGF0ZTEsIHN0YXRlMikgPT4ge1xuICAgICAgZXhwZWN0KHN0YXRlMS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgICAgZXhwZWN0KHN0YXRlMS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlLmxlbmd0aCk7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKHN0YXRlMi5maWVsZHNTdGF0ZVswXS5jb2xvcik7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKHN0YXRlMi5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICAgIH07XG5cbiAgICBjb25zdCBzYW1lU3RhdGUxID0gdXBkYXRlKG1vY2tTdGF0ZSwgdXBkYXRlRmllbGQobnVsbCkpO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTEpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlMiA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgaWQ6IG51bGwgfSkpXG4gICAgKTtcbiAgICBpc1NhbWUobW9ja1N0YXRlLCBzYW1lU3RhdGUyKTtcblxuICAgIGNvbnN0IHNhbWVTdGF0ZTMgPSB1cGRhdGUoXG4gICAgICBtb2NrU3RhdGUsXG4gICAgICB1cGRhdGVGaWVsZChPYmplY3QuYXNzaWduKHt9LCBuZXdGaWVsZFN0YXRlLCB7IGNvbmZpZ1Nob3dpbmc6IG51bGwgfSkpXG4gICAgKTtcbiAgICBpc1NhbWUobW9ja1N0YXRlLCBzYW1lU3RhdGUzKTtcblxuICAgIGNvbnN0IHNhbWVTdGF0ZTQgPSB1cGRhdGUoXG4gICAgICBtb2NrU3RhdGUsXG4gICAgICB1cGRhdGVGaWVsZChPYmplY3QuYXNzaWduKHt9LCBuZXdGaWVsZFN0YXRlLCB7IHJlcXVpcmVkOiBudWxsIH0pKVxuICAgICk7XG5cbiAgICBpc1NhbWUobW9ja1N0YXRlLCBzYW1lU3RhdGU0KTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCBicmVhayB0aGUgc3RhdGUgYWZ0ZXIgdXBkYXRpbmcgYSBmaWVsZCBtdWx0aXBsZSB0aW1lcyBhIGZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmllbGQxID0gT2JqZWN0LmFzc2lnbih7fSwgb2xkRmllbGRTdGF0ZSwgeyBjb2xvcjogXCJ5ZWxsb3dcIiB9KTtcbiAgICBjb25zdCBtb2NrRmllbGQyID0gT2JqZWN0LmFzc2lnbih7fSwgb2xkRmllbGRTdGF0ZSwgeyBjb2xvcjogXCJvcmFuZ2VcIiB9KTtcbiAgICBjb25zdCBtb2NrRmllbGQzID0gT2JqZWN0LmFzc2lnbih7fSwgb2xkRmllbGRTdGF0ZSwgeyBjb2xvcjogXCJwdXJwbGVcIiB9KTtcblxuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgdXBkYXRlRmllbGQobW9ja0ZpZWxkMSkpO1xuICAgIGNvbnN0IGNoYW5nZWQyID0gdXBkYXRlKGNoYW5nZWQxLCB1cGRhdGVGaWVsZChtb2NrRmllbGQyKSk7XG4gICAgY29uc3QgY2hhbmdlZDMgPSB1cGRhdGUoY2hhbmdlZDIsIHVwZGF0ZUZpZWxkKG1vY2tGaWVsZDMpKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZVswXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZVswXS5jb2xvcikudG9FcXVhbChtb2NrRmllbGQzLmNvbG9yKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgcmVvcmRlckZpZWxkcyB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgdGVtcGxhdGVGaWVsZCA9IHtcbiAgdHlwZTogXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIsXG4gIHJlcXVpcmVkOiBmYWxzZSxcbiAgY29uZmlnU2hvd2luZzogZmFsc2UsXG4gIGlkOiBcIjBcIixcbn07XG5jb25zdCBmaWVsZDEgPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZUZpZWxkLCB7IGlkOiBcIjFcIiB9KTtcbmNvbnN0IGZpZWxkMiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXBsYXRlRmllbGQsIHsgaWQ6IFwiMlwiIH0pO1xuY29uc3QgZmllbGQzID0gT2JqZWN0LmFzc2lnbih7fSwgdGVtcGxhdGVGaWVsZCwgeyBpZDogXCIzXCIgfSk7XG5jb25zdCBtb2NrQ3VycmVudFN0YXRlID0gW2ZpZWxkMSwgZmllbGQyLCBmaWVsZDNdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW3sgaW5mbzogeyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9IH1dLFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmNvbnN0IG5ld09yZGVyID0gW1wiMlwiLCBcIjNcIiwgXCIxXCJdO1xuY29uc3QgcmVvcmRlckZpZWxkc0FjdGlvbiA9IHJlb3JkZXJGaWVsZHMobmV3T3JkZXIpO1xuY29uc3QgbmV3U3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCByZW9yZGVyRmllbGRzQWN0aW9uKTtcblxuZGVzY3JpYmUoXCJVcGRhdGUucmVvcmRlckZpZWxkc1wiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHdpdGggZmllbGRzIGluIHRoZSBuZXcgb3JkZXJcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG5ld09yZGVyWzBdKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVbMV0uaWQpLnRvRXF1YWwobmV3T3JkZXJbMV0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChuZXdPcmRlclsyXSk7XG4gIH0pO1xuXG4gIGl0KFwic2VuZHMgdGhlIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVswXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzFdLmlkKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMV0uaWQpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMl0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsyXS5pZCk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiBhbnkgZmllbGQgaWQgaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiXSkpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMV0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzJdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgaWYgdGhlIHJlb3JkZXIgYXJyYXkgaGFzIG1vcmUgZWxlbWVudHMgdGhhbiBpdCBzaG91bGRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNhbWVTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHJlb3JkZXJGaWVsZHMoW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSkpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMV0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzJdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciBjcmVhdGluZyBvbmUgb2JqZWN0XCIsICgpID0+IHtcbiAgICBjb25zdCBjaGFuZ2VkMSA9IHVwZGF0ZShtb2NrU3RhdGUsIHJlb3JkZXJGaWVsZHMoW1wiMVwiLCBcIjJcIiwgXCIzXCJdKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIHJlb3JkZXJGaWVsZHMoW1wiM1wiLCBcIjFcIiwgXCIyXCJdKSk7XG4gICAgY29uc3QgY2hhbmdlZDMgPSB1cGRhdGUoY2hhbmdlZDIsIHJlb3JkZXJGaWVsZHMoW1wiM1wiLCBcIjJcIiwgXCIxXCJdKSk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKFwiM1wiKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVbMV0uaWQpLnRvRXF1YWwoXCIyXCIpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChcIjFcIik7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5cbmltcG9ydCB7IGltcG9ydEN1c3RvbUNvbXBvbmVudHMgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IGNyZWF0ZVR5cGUgPSBuYW1lID0+ICh7XG4gIGluaXRpYWxTdGF0ZTogXyA9PiBfLFxuICBSZW5kZXJFZGl0b3I6IF8gPT4gXyxcbiAgaW5mbzogeyB0eXBlOiBuYW1lLCBncm91cDogXCJjdXN0b21cIiwgZGlzcGxheU5hbWU6IG5hbWUgfSxcbn0pO1xuXG5jb25zdCBtb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtjcmVhdGVUeXBlKFwiZmljdGl0aW91cy1pbnN0YW5jZVwiKV0sXG4gIGZpZWxkc1N0YXRlOiBbXSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbXSxcbn07XG5cbmNvbnN0IGN1c3RvbVR5cGVzID0gW1xuICBjcmVhdGVUeXBlKFwiY3VzdG9tLTFcIiksXG4gIGNyZWF0ZVR5cGUoXCJjdXN0b20tMlwiKSxcbiAgY3JlYXRlVHlwZShcImN1c3RvbS0zXCIpLFxuXTtcblxuY29uc3QgaW1wb3J0Q3VzdG9tQ29tcG9uZW50c0FjdGlvbiA9IGltcG9ydEN1c3RvbUNvbXBvbmVudHMoY3VzdG9tVHlwZXMpO1xuY29uc3QgbmV3U3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uKTtcblxuXG5kZXNjcmliZShcIlVwZGF0ZS5pbXBvcnRDdXN0b21Db21wb25lbnRzXCIsICgpID0+IHtcbiAgaXQoXCJBcHBlbmRzIHRoZSBuZXcgdmFsaWQgY3VzdG9tIHR5cGVzIHRvIHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIHR5cGVzXCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoICsgY3VzdG9tVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRUeXBlc1sxXS5pbmZvLnR5cGUpLnRvRXF1YWwoY3VzdG9tVHlwZXNbMF0uaW5mby50eXBlKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRUeXBlc1syXS5pbmZvLnR5cGUpLnRvRXF1YWwoY3VzdG9tVHlwZXNbMV0uaW5mby50eXBlKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRUeXBlc1szXS5pbmZvLnR5cGUpLnRvRXF1YWwoY3VzdG9tVHlwZXNbMl0uaW5mby50eXBlKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIGFuIHVuY2hhbmdlZCBhcnJheSBpZiBjdXN0b21UeXBlcyBpcyBpbnZhbGlkXCIsICgpID0+IHtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhudWxsKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQxID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLCB7IGluZm86IG51bGwgfSksXG4gICAgXTtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhpbnZhbGlkMSkpKS50b0VxdWFsKG1vY2tTdGF0ZSk7XG5cbiAgICBjb25zdCBpbnZhbGlkMiA9IFtcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBjcmVhdGVUeXBlKFwiY3VzdG9tLTFcIiksXG4gICAgICAgIHsgaW5mbzogeyB0eXBlOiBudWxsLCBncm91cDogXCJjdXN0b21cIiwgZGlzcGxheU5hbWU6IFwiY3VzdG9tXCIgfSB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQyKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQzID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IFwiY3VzdG9tXCIsIGdyb3VwOiBudWxsLCBkaXNwbGF5TmFtZTogXCJjdXN0b21cIiB9IH1cbiAgICAgICksXG4gICAgXTtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhpbnZhbGlkMykpKS50b0VxdWFsKG1vY2tTdGF0ZSk7XG5cbiAgICBjb25zdCBpbnZhbGlkNCA9IFtcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBjcmVhdGVUeXBlKFwiY3VzdG9tLTFcIiksXG4gICAgICAgIHsgaW5mbzogeyB0eXBlOiBcImN1c3RvbVwiLCBncm91cDogXCJjdXN0b21cIiwgZGlzcGxheU5hbWU6IG51bGwgfSB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQ0KSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQ1ID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBSZW5kZXJFZGl0b3I6IFwibm90IGEgZnVuY3Rpb25cIiB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQ1KSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQ2ID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbml0aWFsU3RhdGU6IFwibm90IGEgZnVuY3Rpb25cIiB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQ2KSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJ1bmRvIiwiaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyIsImltcG9ydFN0YXRlIiwiY3JlYXRlRmllbGQiLCJmaWVsZENyZWF0ZWQiLCJ0b2dnbGVDb25maWciLCJ0b2dnbGVSZXF1aXJlZCIsImRlbGV0ZUZpZWxkIiwidXBkYXRlRmllbGQiLCJyZW9yZGVyRmllbGRzIiwiZGVzY3JpYmUiLCJhY3Rpb24iLCJ0eXBlIiwidG9FcXVhbCIsIm1vY2tTdGF0ZVRvSW1wb3J0IiwibmV3RmllbGRzU3RhdGUiLCJmaWVsZFR5cGUiLCJjcmVhdGVkRmllbGRTdGF0ZSIsImZpZWxkU3RhdGUiLCJuZXdGaWVsZFN0YXRlIiwibmV3RmllbGRzT3JkZXIiLCJjdXN0b21Db21wb25lbnRzIiwiZGVmaW5lIiwiYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmUiLCJzeW5jQWN0aXZpdHlGaW5pc2hlZCIsImFjdGlvblF1ZXVlIiwiZmx1c2hRdWV1ZSIsImZvckVhY2giLCJzdG9yZSIsImRpc3BhdGNoIiwiYSIsImFzeW5jRGlzcGF0Y2giLCJhc3luY0FjdGlvbiIsImNvbmNhdCIsImFjdGlvbldpdGhBc3luY0Rpc3BhdGNoIiwiSW1tdXRhYmxlIiwibWVyZ2UiLCJmYWtlQWN0aW9uIiwiZG9uZSIsIm5leHQiLCJyZXR1cm5lZEFjdGlvbiIsIm5vdCIsInVuZGVmaW5lZCIsImZha2VBc3luY0FjdGlvbiIsImZha2VTdG9yZSIsIl9pc1BsYWNlaG9sZGVyIiwiX2N1cnJ5MSIsIl9jdXJyeTIiLCJfY3VycnkzIiwiX2NoZWNrRm9yTWV0aG9kIiwic2V0Iiwib3ZlciIsImFsd2F5cyIsIl9pc1N0cmluZyIsIl9hcml0eSIsImJpbmQiLCJfeHdyYXAiLCJfaXNBcnJheUxpa2UiLCJfcmVkdWNlIiwic2xpY2UiLCJyZWR1Y2UiLCJfcGlwZSIsInRhaWwiLCJfY29uY2F0IiwicGF0aCIsIl9pc1RyYW5zZm9ybWVyIiwiX2N1cnJ5TiIsIl9oYXMiLCJfaXNBcmd1bWVudHMiLCJfZGlzcGF0Y2hhYmxlIiwiX3htYXAiLCJjdXJyeU4iLCJrZXlzIiwiX21hcCIsIm1hcCIsIkVpdGhlciIsInJlcXVpcmUkJDAiLCJ1cGRhdGVBdCIsIl9kZWZhdWx0Iiwia2V5QXJyYXkiLCJuZXdWYWwiLCJvYmoiLCJkZWVwTmV3VmFsIiwicmVkdWNlUmlnaHQiLCJyZXN1bHQiLCJrZXkiLCJkZWVwIiwiU3RhdGVMZW5zZXMiLCJfZGVmYXVsdDIiLCJfZGVmYXVsdDMiLCJjcmVhdGVJZCIsIkRhdGUiLCJub3ciLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJwdXNoSGlzdG9yeVN0YXRlIiwic3RhdGUiLCJuZXdIaXN0b3J5U3RhdGUiLCJfZGVmYXVsdDQiLCJmaWVsZHNTdGF0ZUhpc3RvcnkiLCJfZGVmYXVsdDYiLCJmaWVsZHNTdGF0ZSIsImhpZGVDb25maWdzIiwiX2RlZmF1bHQ3IiwiT2JqZWN0IiwiYXNzaWduIiwicyIsImNvbmZpZ1Nob3dpbmciLCJwcm9wZXJ0eVR5cGVDaGVjayIsInByb3BlcnR5TmFtZSIsImJhYmVsSGVscGVycy50eXBlb2YiLCJSaWdodCIsIkxlZnQiLCJ2YWxpZGF0ZUZpZWxkIiwiZnJvbU51bGxhYmxlIiwibGVmdE1hcCIsImZzIiwiY2hhaW4iLCJsYXN0SGlzdG9yeVN0YXRlIiwiXyIsIkluZmluaXR5IiwiX2lkZW50aXR5IiwiYXAiLCJwcmVwZW5kIiwic2VxdWVuY2UiLCJfYXJyYXlGcm9tSXRlcmF0b3IiLCJfY29udGFpbnNXaXRoIiwiaWRlbnRpY2FsIiwiX2Z1bmN0aW9uTmFtZSIsIl9lcXVhbHMiLCJpc0FycmF5IiwiQXJyYXkiLCJhcnIiLCJmaWVsZFR5cGVJc1ZhbGlkIiwidmFsaWRUeXBlcyIsImZpZWxkIiwiZmluZCIsInZhbGlkRmllbGRUeXBlcyIsIm9mIiwidmFsaWRhdGVGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZXMiLCJhZGRSZXF1aXJlZFByb3BlcnRpZXMiLCJmaWVsZFN0YXRlcyIsImlkIiwiYmltYXAiLCJjb25zb2xlIiwiZXJyb3IiLCJnZXRPckVsc2UiLCJfcmVkdWNlZCIsIl94ZmluZCIsIlRhc2siLCJ0eXBlQ29uc3RydWN0b3IiLCJ2IiwiaW5mbyIsInJlamVjdCIsInJlc29sdmUiLCJjYWxsZWQiLCJjb25zdHIiLCJpbml0aWFsU3RhdGUiLCJQcm9taXNlIiwidGhlbiIsImNhdGNoIiwiaW5zZXJ0UmVxdWlyZWRQcm9wcyIsImNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkiLCJyZWplY3RlZCIsImZvcmsiLCJlcnIiLCJNYXliZSIsImNsb25lIiwidW5pbXBsZW1lbnRlZCIsIm5vb3AiLCJoaXN0b3J5U3RhdGVXaXRoTmV3RmllbGQiLCJuZXdGaWVsZCIsIl9kZWZhdWx0NSIsInJlcGxhY2VGaWVsZFN0YXRlIiwiYUZpZWxkIiwicmVxdWlyZWQiLCJfeGZpbHRlciIsIl9pc09iamVjdCIsIl9maWx0ZXIiLCJoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQiLCJ1cGRhdGVGaWVsZFN0YXRlIiwiaGlzdG9yeVN0YXRlV2l0aE5ld09yZGVyIiwibmV3T3JkZXIiLCJmMSIsImYyIiwiaW5kZXhPZiIsIm8iLCJsZW5ndGgiLCJzdGF0ZUlkcyIsIm5vTWlzc2luZ0lkIiwiYWNjIiwiZklkIiwiaW5jbHVkZXMiLCJoYXNSZXF1aXJlZEluZm8iLCJjb21wb25lbnQiLCJjIiwiaXNDb21wb25lbnRWYWxpZCIsInZhbGlkYXRlQ29tcG9uZW50cyIsImFkZFRvRmllbGRUeXBlcyIsImFjdGlvbkhhbmRsZXJzIiwiaXNFeHBlY3RlZEFjdGlvbiIsImlzUmVkdXhBY3Rpb24iLCJ1cGRhdGUiLCJhc3NlcnQiLCJjdXJyZW50RmllbGRzU3RhdGUiLCJvbGRGaWVsZHNTdGF0ZSIsIm1vY2tTdGF0ZSIsImVtcHR5TW9ja1N0YXRlIiwiZW1wdHlIaXN0b3J5TW9ja1N0YXRlIiwibW9kaWZpZWRTdGF0ZSIsInVuZG9BY3Rpb24iLCJ0eXBlc0FycmF5IiwibW9ja0N1cnJlbnRTdGF0ZSIsIm1vY2tIaXN0b3J5IiwibmV3VmFsaWRTdGF0ZSIsIm5ld0ludmFsaWRTdGF0ZSIsInVwZGF0ZWQiLCJkaXNwbGF5TmFtZSIsImdyb3VwIiwidmFsaWRTdGF0ZTIiLCJpZHgiLCJwcm9taXNlVHlwZUluc3RhbmNlIiwicHJvbWlzZVR5cGUiLCJzeW5jVHlwZUluc3RhbmNlIiwic3luY1R5cGUiLCJhc3luY0FjaW9uIiwiamFzbWluZSIsImNyZWF0ZVNweSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJmaWVsZENyZWF0ZWRBY3Rpb24iLCJuZXdTdGF0ZSIsInNhbWVTdGF0ZSIsImNoYW5nZWQxIiwiY2hhbmdlZDIiLCJjaGFuZ2VkMyIsImZpZWxkU3RhdGVDb25maWdTaG93aW5nIiwiZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmciLCJmIiwiZmllbGRTdGF0ZUlzUmVxdWlyZWQiLCJmaWVsZFN0YXRlSXNOb3RSZXF1aXJlZCIsInRvQmVEZWxldGVkRmllbGRTdGF0ZSIsImZpZWxkRGVsZXRlQWN0aW9uIiwicmVjZW50SGlzdG9yeVN0YXRlIiwibW9ja0ZpZWxkMSIsIm1vY2tGaWVsZDIiLCJtb2NrRmllbGQzIiwibW9ja1N0YXRlMiIsIm9sZEZpZWxkU3RhdGUiLCJjb2xvciIsImZpZWxkVXBkYXRlQWN0aW9uIiwiaXNTYW1lIiwic3RhdGUxIiwic3RhdGUyIiwic2FtZVN0YXRlMSIsInNhbWVTdGF0ZTIiLCJzYW1lU3RhdGUzIiwic2FtZVN0YXRlNCIsInRlbXBsYXRlRmllbGQiLCJmaWVsZDEiLCJmaWVsZDIiLCJmaWVsZDMiLCJyZW9yZGVyRmllbGRzQWN0aW9uIiwiY3JlYXRlVHlwZSIsIm5hbWUiLCJjdXN0b21UeXBlcyIsImltcG9ydEN1c3RvbUNvbXBvbmVudHNBY3Rpb24iLCJpbnZhbGlkMSIsImludmFsaWQyIiwiaW52YWxpZDMiLCJpbnZhbGlkNCIsImludmFsaWQ1IiwiUmVuZGVyRWRpdG9yIiwiaW52YWxpZDYiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBSUEsQUFBTyxJQUFNQSxPQUFPLFNBQVBBLElBQU87U0FDbkI7VUFDTztHQUZZO0NBQWI7O0FBS1AsQUFBTyxJQUFNQyx5QkFBeUIsU0FBekJBLHNCQUF5QjtTQUNyQztVQUNPLHdCQURQOztHQURxQztDQUEvQjs7QUFPUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsY0FBYyxTQUFkQSxXQUFjO1NBQzFCO1VBQ08sYUFEUDs7R0FEMEI7Q0FBcEI7O0FBTVAsQUFBTyxJQUFNQyxlQUFlLFNBQWZBLFlBQWU7U0FDM0I7VUFDTyxjQURQOztHQUQyQjtDQUFyQjs7QUFNUCxBQUFPLElBQU1DLGVBQWUsU0FBZkEsWUFBZTtTQUMzQjtVQUNPLGNBRFA7O0dBRDJCO0NBQXJCOztBQU1QLEFBQU8sSUFBTUMsaUJBQWlCLFNBQWpCQSxjQUFpQjtTQUM3QjtVQUNPLGdCQURQOztHQUQ2QjtDQUF2Qjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsY0FBYyxTQUFkQSxXQUFjO1NBQzFCO1VBQ08sYUFEUDs7R0FEMEI7Q0FBcEI7O0FBTVAsQUFBTyxJQUFNQyxnQkFBZ0IsU0FBaEJBLGFBQWdCO1NBQzVCO1VBQ08sZUFEUDs7R0FENEI7Q0FBdEI7O0FDMURQOztBQUVBLEFBYUFDLFNBQVMsUUFBVCxFQUFtQixZQUFNO1dBQ2QsTUFBVCxFQUFpQixZQUFNO09BQ2xCLGlDQUFILEVBQXNDLFlBQU07VUFDcENDLFNBQVNYLE1BQWY7YUFDT1csT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsTUFBNUI7S0FGRjtHQURGOztXQU9TLGFBQVQsRUFBd0IsWUFBTTtRQUN0QkMsb0JBQW9CLENBQUMsR0FBRCxFQUFNLEdBQU4sQ0FBMUI7O09BRUcsaUNBQUgsRUFBc0MsWUFBTTtVQUNwQ0gsU0FBU1QsWUFBWVksaUJBQVosQ0FBZjthQUNPSCxPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0QixhQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNULFlBQVlZLGlCQUFaLENBQWY7YUFDT0gsT0FBT0ksY0FBZCxFQUE4QkYsT0FBOUIsQ0FBc0NDLGlCQUF0QztLQUZGO0dBUkY7O1dBY1MsYUFBVCxFQUF3QixZQUFNO1FBQ3RCRSxZQUFZLFdBQWxCOztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENMLFNBQVNSLFlBQVlhLFNBQVosQ0FBZjthQUNPTCxPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0QixhQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNSLFlBQVlhLFNBQVosQ0FBZjthQUNPTCxPQUFPSyxTQUFkLEVBQXlCSCxPQUF6QixDQUFpQ0csU0FBakM7S0FGRjtHQVJGOztXQWNTLGNBQVQsRUFBeUIsWUFBTTtRQUN2QkMsb0JBQW9CLEVBQTFCOztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENOLFNBQVNQLGFBQWFhLGlCQUFiLENBQWY7YUFDT04sT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsY0FBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTUCxhQUFhYSxpQkFBYixDQUFmO2FBQ09OLE9BQU9NLGlCQUFkLEVBQWlDSixPQUFqQyxDQUF5Q0ksaUJBQXpDO0tBRkY7R0FSRjs7V0FjUyxjQUFULEVBQXlCLFlBQU07UUFDdkJDLGFBQWEsRUFBbkI7O09BRUcsaUNBQUgsRUFBc0MsWUFBTTtVQUNwQ1AsU0FBU04sYUFBYWEsVUFBYixDQUFmO2FBQ09QLE9BQU9DLElBQWQsRUFBb0JDLE9BQXBCLENBQTRCLGNBQTVCO0tBRkY7O09BS0csK0JBQUgsRUFBb0MsWUFBTTtVQUNsQ0YsU0FBU04sYUFBYWEsVUFBYixDQUFmO2FBQ09QLE9BQU9PLFVBQWQsRUFBMEJMLE9BQTFCLENBQWtDSyxVQUFsQztLQUZGO0dBUkY7O1dBY1MsZ0JBQVQsRUFBMkIsWUFBTTtRQUN6QkEsYUFBYSxFQUFuQjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDUCxTQUFTTCxlQUFlWSxVQUFmLENBQWY7YUFDT1AsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsZ0JBQTVCO0tBRkY7O09BS0csK0JBQUgsRUFBb0MsWUFBTTtVQUNsQ0YsU0FBU0wsZUFBZVksVUFBZixDQUFmO2FBQ09QLE9BQU9PLFVBQWQsRUFBMEJMLE9BQTFCLENBQWtDSyxVQUFsQztLQUZGO0dBUkY7O1dBY1MsYUFBVCxFQUF3QixZQUFNO1FBQ3RCQSxhQUFhLEVBQW5COztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENQLFNBQVNKLFlBQVlXLFVBQVosQ0FBZjthQUNPUCxPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0QixhQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNKLFlBQVlXLFVBQVosQ0FBZjthQUNPUCxPQUFPTyxVQUFkLEVBQTBCTCxPQUExQixDQUFrQ0ssVUFBbEM7S0FGRjtHQVJGOztXQWNTLGFBQVQsRUFBd0IsWUFBTTtRQUN0QkMsZ0JBQWdCLEVBQXRCOztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENSLFNBQVNILFlBQVlXLGFBQVosQ0FBZjthQUNPUixPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0QixhQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNILFlBQVlXLGFBQVosQ0FBZjthQUNPUixPQUFPUSxhQUFkLEVBQTZCTixPQUE3QixDQUFxQ00sYUFBckM7S0FGRjtHQVJGOztXQWNTLGVBQVQsRUFBMEIsWUFBTTtRQUN4QkMsaUJBQWlCLEVBQXZCOztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENULFNBQVNGLGNBQWNXLGNBQWQsQ0FBZjthQUNPVCxPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0QixlQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNGLGNBQWNXLGNBQWQsQ0FBZjthQUNPVCxPQUFPUyxjQUFkLEVBQThCUCxPQUE5QixDQUFzQ08sY0FBdEM7S0FGRjtHQVJGOztXQWNTLHdCQUFULEVBQW1DLFlBQU07UUFDakNDLG1CQUFtQixFQUF6Qjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDVixTQUFTVix1QkFBdUJvQixnQkFBdkIsQ0FBZjthQUNPVixPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0Qix3QkFBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTVix1QkFBdUJvQixnQkFBdkIsQ0FBZjthQUNPVixPQUFPVSxnQkFBZCxFQUFnQ1IsT0FBaEMsQ0FBd0NRLGdCQUF4QztLQUZGO0dBUkY7Q0F4SEY7Ozs7Ozs7QUNmQSxDQUFDLFdBQVc7RUFDVixZQUFZLENBQUM7O0FBRWYsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFOzs7RUFHN0IsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0VBQ25HLElBQUksMkJBQTJCLEdBQUcsTUFBTSxDQUFDOztFQUV6QyxJQUFJLFlBQVksR0FBRztJQUNqQixVQUFVLEVBQUUsS0FBSztHQUNsQixDQUFDO0VBQ0YsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDbEIsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtVQUNqQyxZQUFZLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7T0FDeEQ7R0FDSjs7RUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7SUFDdEI7TUFDRSxPQUFPLElBQUksS0FBSyxRQUFRO01BQ3hCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFDcEIsSUFBSSxLQUFLLElBQUk7TUFDYjtHQUNIOztFQUVELFNBQVMsc0JBQXNCLENBQUMsR0FBRyxFQUFFO01BQ2pDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDM0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtVQUNaLE9BQU8sRUFBRSxDQUFDO09BQ2IsTUFBTTtVQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztPQUNuQztHQUNKOztFQUVELFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO0lBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRTtNQUN4QyxVQUFVLEVBQUUsS0FBSztNQUNqQixZQUFZLEVBQUUsS0FBSztNQUNuQixRQUFRLEVBQUUsS0FBSztNQUNmLEtBQUssRUFBRSxLQUFLO0tBQ2IsQ0FBQyxDQUFDO0dBQ0o7O0VBRUQsU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRTtJQUN2QyxhQUFhLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXO01BQzNDLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLFVBQVU7UUFDMUMsMkRBQTJELENBQUMsQ0FBQztLQUNoRSxDQUFDLENBQUM7R0FDSjs7RUFFRCxJQUFJLGVBQWUsR0FBRyw2QkFBNkIsQ0FBQzs7RUFFcEQsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7SUFDbEMsYUFBYSxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7R0FDOUM7O0VBRUQsU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0lBQzNCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO01BQzlCLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPO1FBQy9CLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDO09BQ3pELENBQUM7S0FDSCxNQUFNOzs7TUFHTCxPQUFPLElBQUksQ0FBQztLQUNiO0dBQ0Y7O0VBRUQsU0FBUyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTs7SUFFckIsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0dBQzFDOztFQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0lBQ2hDLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLFlBQVksSUFBSSxDQUFDLENBQUM7R0FDL0c7O0VBRUQsSUFBSSxxQkFBcUIsR0FBRztJQUMxQixnQkFBZ0I7R0FDakIsQ0FBQzs7RUFFRixJQUFJLHdCQUF3QixHQUFHO0lBQzdCLE1BQU07R0FDUCxDQUFDOztFQUVGLElBQUksb0JBQW9CLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDO0lBQ3RELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVM7R0FDL0QsQ0FBQyxDQUFDOztFQUVILElBQUksdUJBQXVCLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDO0lBQzVELEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYTtHQUM1RCxDQUFDLENBQUM7O0VBRUgsSUFBSSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7SUFDckQsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZO0lBQy9GLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLGVBQWU7SUFDL0YsYUFBYSxFQUFFLGVBQWUsRUFBRSxTQUFTO0dBQzFDLENBQUMsQ0FBQzs7RUFFSCxTQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUU7SUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7SUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDO0dBQ2xDO0VBQ0QsY0FBYyxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0VBQ3ZDLGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFN0MsU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRTs7SUFFekMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRXhCLEFBQTJDOztNQUV6QyxLQUFLLElBQUksS0FBSyxJQUFJLGFBQWEsRUFBRTtRQUMvQixJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7VUFDdkMsV0FBVyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN4QztPQUNGOzs7TUFHRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3BCOztJQUVELE9BQU8sR0FBRyxDQUFDO0dBQ1o7O0VBRUQsU0FBUyx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFO0lBQ2xELElBQUksYUFBYSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7SUFFcEMsYUFBYSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVztNQUN4QyxPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQ3ZELENBQUMsQ0FBQztHQUNKOztFQUVELFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQ3BDLElBQUksSUFBSSxZQUFZLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDOztJQUUxQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7TUFDZixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ3pGLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO09BQzFFO01BQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQzdCLE9BQU8sSUFBSSxDQUFDO09BQ2I7S0FDRjs7SUFFRCxJQUFJLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUNwQzs7RUFFRCxJQUFJLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7RUFFeEMsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7SUFDdEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVsQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3BCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNqRCxNQUFNO01BQ0wsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN4QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDMUIsSUFBSSxRQUFRLENBQUM7O01BRWIsSUFBSSxPQUFPLFFBQVEsQ0FBQyxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFOztRQUV0RCxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO09BQ25ELE1BQU07UUFDTCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRXZCLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7VUFDekMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlELE1BQU07VUFDTCxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaEU7T0FDRjs7TUFFRCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUN6QyxPQUFPLElBQUksQ0FBQztPQUNiOztNQUVELElBQUksT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztNQUN6QixPQUFPLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3BDO0dBQ0Y7O0VBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7OztJQUdqQyxLQUFLLElBQUksS0FBSyxJQUFJLHVCQUF1QixFQUFFO01BQ3pDLElBQUksdUJBQXVCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2pELElBQUksVUFBVSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELHlCQUF5QixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztPQUM5QztLQUNGOztJQUVELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO01BQzVCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDO01BQzFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO01BQzNDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO01BQ2xELGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO01BQ3RDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO01BQzFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO01BQ3ZDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO01BQzNDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3RDOztJQUVELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDckQsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoQzs7SUFFRCxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztHQUNuRDs7RUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQUksRUFBRTtJQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtNQUM1QixhQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztLQUNqRDs7SUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztHQUNqRDs7RUFFRCxTQUFTLGFBQWEsR0FBRztJQUN2QixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0dBQ2pDOzs7Ozs7Ozs7RUFTRCxTQUFTLE9BQU8sQ0FBQyxRQUFRLEVBQUU7O0lBRXpCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDMUIsT0FBTyxJQUFJLENBQUM7S0FDYjs7SUFFRCxJQUFJLE1BQU0sR0FBRyxFQUFFO1FBQ1gsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQ3BCLEtBQUssQ0FBQzs7SUFFVixLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtNQUN2QyxJQUFJLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzs7TUFFeEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFOztRQUVqQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7T0FDM0MsTUFBTTs7UUFFTCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0lBRUQsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUNuQzs7Ozs7OztFQU9ELFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRTs7SUFFdkIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDM0QsT0FBTyxJQUFJLENBQUM7S0FDYjs7SUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRTs7TUFFaEMsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQzNDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7TUFJMUQsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7UUFDL0MsR0FBRyxPQUFPLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRTtVQUMxQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzFCO09BQ0YsQ0FBQyxDQUFDOztNQUVILE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUU7UUFDMUIsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7T0FDOUMsQ0FBQztLQUNIOztJQUVELElBQUksTUFBTSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDOztJQUUxQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtNQUNwQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDaEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUN6QjtLQUNGOztJQUVELE9BQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDcEM7O0VBRUQsU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFO0lBQzVCLElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDOztJQUUzQixHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDckM7S0FDRixNQUFNO01BQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztPQUN0QjtLQUNGOztJQUVELE9BQU8sTUFBTSxDQUFDO0dBQ2Y7Ozs7Ozs7OztFQVNELFNBQVMsUUFBUSxDQUFDLFFBQVEsRUFBRTs7O0lBRzFCLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxFQUFFO01BQ2xDLFFBQVEsR0FBRyxTQUFTLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztLQUM5Qzs7SUFFRCxJQUFJLE1BQU0sR0FBRyxFQUFFO1FBQ1gsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQ3BCLEtBQUssQ0FBQzs7SUFFVixLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtNQUN2QyxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7VUFDMUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDZixLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUVwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0tBQ3JCOztJQUVELE9BQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDcEM7O0VBRUQsU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFO0lBQzFCO01BQ0UsQ0FBQyxDQUFDLEdBQUc7T0FDSixPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUM7T0FDeEIsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO09BQ3ZELEdBQUcsWUFBWSxJQUFJLENBQUM7TUFDckIsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFO0lBQ2pCLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztHQUMvQzs7RUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQzVCLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO01BQ25CLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtRQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQ3RCO0tBQ0Y7O0lBRUQsT0FBTyxJQUFJLENBQUM7R0FDYjs7Ozs7Ozs7Ozs7RUFXRCxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFOztJQUU1QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzFCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxFQUFFO01BQ2pELE1BQU0sSUFBSSxTQUFTLENBQUMsa0VBQWtFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ2pIOztJQUVELElBQUksYUFBYSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxZQUFZLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSTtRQUNyQyxJQUFJLFlBQVksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTztRQUNoRCxNQUFNLFVBQVUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNO1FBQ3ZDLE1BQU0sQ0FBQzs7Ozs7SUFLWCxTQUFTLFdBQVcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtNQUM5QyxJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDOUMsSUFBSSxZQUFZLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO01BQzdFLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7TUFFbkMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTO1NBQ3RCLFlBQVksS0FBSyxTQUFTLENBQUM7U0FDM0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTs7UUFFeEMsSUFBSSxRQUFRLENBQUM7O1FBRWIsSUFBSSxZQUFZLEVBQUU7VUFDaEIsUUFBUSxHQUFHLFlBQVksQ0FBQztTQUN6QixNQUFNLElBQUksSUFBSSxJQUFJLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxFQUFFO1VBQ3JGLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbEUsTUFBTTtVQUNMLFFBQVEsR0FBRyxjQUFjLENBQUM7U0FDM0I7O1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTs7WUFFeEIsTUFBTSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztXQUNwRTs7VUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ3hCO09BQ0Y7S0FDRjs7SUFFRCxTQUFTLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUU7TUFDOUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUU7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7VUFDakMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFOztZQUV4QixNQUFNLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1dBQ3BFO1VBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEI7T0FDRjtLQUNGOztJQUVELElBQUksR0FBRyxDQUFDOzs7SUFHUixJQUFJLENBQUMsYUFBYSxFQUFFOztNQUVsQixLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUU7UUFDakIsSUFBSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1VBQy9DLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO09BQ0Y7TUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDdEIsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO09BQy9CO0tBQ0YsTUFBTTs7TUFFTCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2xFLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs7UUFFbEMsS0FBSyxHQUFHLElBQUksY0FBYyxFQUFFO1VBQzFCLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxXQUFXLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztXQUN4RTtTQUNGO09BQ0Y7S0FDRjs7SUFFRCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7TUFDeEIsT0FBTyxJQUFJLENBQUM7S0FDYixNQUFNO01BQ0wsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwQztHQUNGOztFQUVELFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7SUFDcEMsSUFBSSxJQUFJLFlBQVksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7OztJQUcxQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzFCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUMvQyxNQUFNLElBQUksU0FBUyxDQUFDLG9FQUFvRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNuSDs7SUFFRCxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7R0FDcEU7O0VBRUQsSUFBSSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRXpDLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQ3hDLElBQUksRUFBRSxJQUFJLFlBQVksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDakQsTUFBTSxJQUFJLFNBQVMsQ0FBQyxnR0FBZ0csQ0FBQyxDQUFDO0tBQ3ZIOztJQUVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3JCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNsRDs7SUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUUxQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxRQUFRLENBQUMsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTs7TUFFbkYsUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNuRCxNQUFNO01BQ0wsUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hFOztJQUVELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO01BQ3RELE9BQU8sSUFBSSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDekIsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUNyQzs7RUFFRCxTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtJQUMxQyxJQUFJLElBQUksWUFBWSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQzs7SUFFMUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO01BQ2pDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7UUFDbkcsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7T0FDL0U7TUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDbEMsT0FBTyxJQUFJLENBQUM7T0FDYjtLQUNGOztJQUVELElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7R0FDckM7O0VBRUQsU0FBUyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNqQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDaEc7O0VBRUQsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTs7SUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQzFELEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEI7O0lBRUQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUM7R0FDeEM7O0VBRUQsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtJQUMvQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7O0lBRXZDLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUM5Rjs7RUFFRCxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO0lBQ2pDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsT0FBTyxLQUFLLEtBQUssU0FBUyxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7R0FDbkQ7O0VBRUQsU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFO0lBQzdCLElBQUksTUFBTSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQzs7SUFFL0MsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtNQUNwQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDeEM7T0FDRjtLQUNGLE1BQU07TUFDTCxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekI7T0FDRjtLQUNGOztJQUVELE9BQU8sTUFBTSxDQUFDO0dBQ2Y7OztFQUdELFNBQVMsc0JBQXNCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLENBQUM7R0FDWDs7O0VBR0QsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7SUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7TUFDNUIsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7TUFDbkMsYUFBYSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7TUFDN0MsYUFBYSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7TUFDdkMsYUFBYSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7TUFDakQsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7TUFDckMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7TUFDekMsYUFBYSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7TUFDckMsYUFBYSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7TUFDekMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDcEM7O0lBRUQsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDLENBQUM7R0FDbEQ7Ozs7RUFJRCxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUU7SUFDM0IsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRO1dBQ3ZCLEdBQUcsS0FBSyxJQUFJO1lBQ1gsR0FBRyxDQUFDLFFBQVEsS0FBSywyQkFBMkIsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLGtCQUFrQixDQUFDLENBQUM7R0FDOUY7O0VBRUQsU0FBUyxZQUFZLENBQUMsR0FBRyxFQUFFO0lBQ3pCLE9BQU8sT0FBTyxJQUFJLEtBQUssV0FBVztXQUMzQixHQUFHLFlBQVksSUFBSSxDQUFDO0dBQzVCOztFQUVELFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUN0QixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVE7V0FDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztHQUN2Qzs7RUFFRCxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUU7SUFDcEIsT0FBTyxHQUFHLFlBQVksS0FBSyxDQUFDO0dBQzdCOztFQUVELFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFO0lBQy9DLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ2hGLE9BQU8sR0FBRyxDQUFDO0tBQ1osTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUN6QixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDN0IsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN4QyxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksRUFBRTtNQUM5QixPQUFPLGlCQUFpQixDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbkQsTUFBTTs7TUFFTCxJQUFJLFNBQVMsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztNQUM3QyxJQUFJLHNCQUFzQjtRQUN4QixDQUFDLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUztVQUMzQyxzQkFBc0IsSUFBSSxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQy9FLElBQUksS0FBSyxHQUFHLHNCQUFzQixFQUFFLENBQUM7O01BRXJDLEFBQTJDOztRQUV6QyxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7VUFDMUIsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQUksY0FBYyxJQUFJLENBQUMsRUFBRTtVQUN2QixNQUFNLElBQUksY0FBYyxDQUFDLDBFQUEwRTtZQUNqRyxrRkFBa0Y7WUFDbEYsMEdBQTBHLENBQUMsQ0FBQztTQUMvRztRQUNELGNBQWMsSUFBSSxDQUFDLENBQUM7T0FDckI7O01BRUQsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1VBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUM3RDtPQUNGOztNQUVELE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbkM7R0FDRjs7O0VBR0QsU0FBUyxRQUFRLENBQUMsRUFBRSxFQUFFO0lBQ3BCLFNBQVMsYUFBYSxHQUFHO01BQ3ZCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO01BQ3BDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztNQUN4QixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCOztJQUVELE9BQU8sYUFBYSxDQUFDO0dBQ3RCOzs7OztFQUtELFNBQVMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNoRCxTQUFTLGFBQWEsR0FBRztNQUN2QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztNQUNwQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7TUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1VBQ3JCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDcEMsTUFBTTtVQUNILE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDckM7S0FDRjs7SUFFRCxPQUFPLGFBQWEsQ0FBQztHQUN0Qjs7Ozs7RUFLRCxTQUFTLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO0lBQzlELFNBQVMsYUFBYSxHQUFHO01BQ3ZCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO01BQ3BDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztNQUN4QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDckIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztPQUNwQyxNQUFNLElBQUksSUFBSSxZQUFZLElBQUksRUFBRTtVQUM3QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ25DLE1BQU07VUFDSCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3JDO0tBQ0Y7O0lBRUQsT0FBTyxhQUFhLENBQUM7R0FDdEI7OztFQUdELFNBQVMsQ0FBQyxJQUFJLGFBQWEsU0FBUyxDQUFDO0VBQ3JDLFNBQVMsQ0FBQyxXQUFXLE1BQU0sV0FBVyxDQUFDO0VBQ3ZDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0VBQzFDLFNBQVMsQ0FBQyxLQUFLLFlBQVksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0VBQzNDLFNBQVMsQ0FBQyxPQUFPLFVBQVUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0VBQ25ELFNBQVMsQ0FBQyxPQUFPLFVBQVUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0VBQzdDLFNBQVMsQ0FBQyxTQUFTLFFBQVEsMkJBQTJCLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztFQUN2RyxTQUFTLENBQUMsR0FBRyxjQUFjLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztFQUN0RSxTQUFTLENBQUMsS0FBSyxZQUFZLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztFQUMxRSxTQUFTLENBQUMsTUFBTSxXQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztFQUM1QyxTQUFTLENBQUMsUUFBUSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztFQUM5QyxTQUFTLENBQUMsS0FBSyxZQUFZLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztFQUMzQyxTQUFTLENBQUMsT0FBTyxVQUFVLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUM3QyxTQUFTLENBQUMsUUFBUSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztFQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtNQUMxQixTQUFTLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztVQUM3QixVQUFVLEVBQUUsSUFBSTtPQUNuQixDQUFDLENBQUM7R0FDTjs7RUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDOztFQUV6QixPQUFPLFNBQVMsQ0FBQztDQUNsQjs7RUFFQyxJQUFJLFNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQzs7RUFFaEMsSUFBSSxPQUFPQyxTQUFNLEtBQUssVUFBVSxJQUFJQSxTQUFNLENBQUMsR0FBRyxFQUFFO0lBQzlDQSxTQUFNLENBQUMsV0FBVztNQUNoQixPQUFPLFNBQVMsQ0FBQztLQUNsQixDQUFDLENBQUM7R0FDSixNQUFNLEFBQWdDO0lBQ3JDLGNBQWMsR0FBRyxTQUFTLENBQUM7R0FDNUIsQUFNQTtDQUNGLEdBQUcsQ0FBQzs7O0FDL3VCTDtBQUNBLEFBRUE7O0FBRUEsSUFBTUMsMEJBQTBCLFNBQTFCQSx1QkFBMEI7U0FBUztXQUFRLGtCQUFVO1VBQ3JEQyx1QkFBdUIsS0FBM0I7VUFDSUMsY0FBYyxFQUFsQjs7ZUFFU0MsVUFBVCxHQUFzQjtvQkFDUkMsT0FBWixDQUFvQjtpQkFBS0MsTUFBTUMsUUFBTixDQUFlQyxDQUFmLENBQUw7U0FBcEIsRUFEb0I7c0JBRU4sRUFBZDs7O2VBR09DLGFBQVQsQ0FBdUJDLFdBQXZCLEVBQW9DO3NCQUNwQlAsWUFBWVEsTUFBWixDQUFtQixDQUFDRCxXQUFELENBQW5CLENBQWQ7O1lBRUlSLG9CQUFKLEVBQTBCOzs7OztVQUt0QlUsMEJBQ0ZDLGtCQUFVeEIsTUFBVixFQUFrQnlCLEtBQWxCLENBQXdCLEVBQUVMLDRCQUFGLEVBQXhCLENBREo7O1dBR0tHLHVCQUFMOzZCQUN1QixJQUF2Qjs7S0FyQnVDO0dBQVQ7Q0FBaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQSxBQUVBLElBQU1HLGFBQWEsRUFBRXpCLE1BQU0sYUFBUixFQUFuQjs7QUFFQUYsU0FBUyw2QkFBVCxFQUF3QyxZQUFNO0tBQ3pDLHdDQUFILEVBQTZDLFVBQUM0QixJQUFELEVBQVU7UUFDL0NDLE9BQU8sU0FBUEEsSUFBTyxpQkFBa0I7YUFDdEJDLGVBQWVULGFBQXRCLEVBQXFDVSxHQUFyQyxDQUF5QzVCLE9BQXpDLENBQWlENkIsU0FBakQ7cUJBQ2NGLGVBQWVULGFBQTdCLEdBQTRDbEIsT0FBNUMsQ0FBb0QsVUFBcEQ7O0tBRkY7OzRCQU13QixXQUF4QixFQUFxQzBCLElBQXJDLEVBQTJDRixVQUEzQztHQVBGOztLQVdHLHlDQUFILEVBQThDLFVBQUNDLElBQUQsRUFBVTtRQUNoREssa0JBQWtCLEVBQUUvQixNQUFNLGlCQUFSLEVBQXhCOztRQUVNZ0MsWUFBWTtnQkFDTiwwQkFBVTtlQUNYakMsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEI4QixnQkFBZ0IvQixJQUE1Qzs7O0tBRko7O1FBT00yQixPQUFPLFNBQVBBLElBQU87YUFDWEMsZUFBZVQsYUFBZixDQUE2QlksZUFBN0IsQ0FEVztLQUFiOzs0QkFHd0JDLFNBQXhCLEVBQW1DTCxJQUFuQyxFQUF5Q0YsVUFBekM7R0FiRjtDQVpGOztBQ0xBOzs7Ozs7Ozs7OztBQVdBLFNBQVMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRTtFQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFO0lBQ2QsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7SUFDOUIsSUFBSSxFQUFFLEdBQUcsa0JBQWtCLENBQUM7SUFDNUIsSUFBSSxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDbkMsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDOztJQUV4QixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUM5QixjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2pDLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ2hDOzs7OztJQUtELElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ3JCLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7S0FDeEU7O0lBRUQsb0JBQW9CLElBQUksWUFBWSxDQUFDO0lBQ3JDLE9BQU8sb0JBQW9CLENBQUM7R0FDN0I7O0VBRUQsT0FBTyxJQUFJLENBQUM7Q0FDYjs7Ozs7Ozs7Ozs7O0FBWUQsU0FBUyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRTtFQUN2QyxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7RUFDdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7SUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUN4QjtDQUNGOzs7Ozs7Ozs7Ozs7QUFZRCxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUU7RUFDbkQsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0VBQ3RELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDckI7Q0FDRixDQUFDOztBQ3RFRjs7Ozs7Ozs7Ozs7O0FBWUEsWUFBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0VBQ3ZELE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssZ0JBQWdCLENBQUM7Q0FDbkc7O0FDWkQ7Ozs7Ozs7Ozs7OztBQVlBLFNBQVMsZUFBZSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUU7RUFDdkMsT0FBTyxZQUFZO0lBQ2pCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDOUIsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2hCLE9BQU8sRUFBRSxFQUFFLENBQUM7S0FDYjtJQUNELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQzlLLENBQUM7Q0FDSDtBQUNELHFCQUFjLEdBQUcsZUFBZTs7QUN4QmhDLFNBQVMsY0FBYyxDQUFDLENBQUMsRUFBRTtPQUNwQixPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLElBQUksQ0FBQztDQUMxRjtBQUNELG9CQUFjLEdBQUcsY0FBYzs7QUNEL0I7Ozs7Ozs7Ozs7QUFVQSxTQUFTLE9BQU8sQ0FBQyxFQUFFLEVBQUU7RUFDbkIsT0FBTyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDcEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSVEsZ0JBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUMvQyxPQUFPLEVBQUUsQ0FBQztLQUNYLE1BQU07TUFDTCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ2xDO0dBQ0YsQ0FBQztDQUNIO0FBQ0QsYUFBYyxHQUFHLE9BQU87O0FDakJ4Qjs7Ozs7Ozs7OztBQVVBLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtFQUNuQixPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdkIsUUFBUSxTQUFTLENBQUMsTUFBTTtNQUN0QixLQUFLLENBQUM7UUFDSixPQUFPLEVBQUUsQ0FBQztNQUNaLEtBQUssQ0FBQztRQUNKLE9BQU9BLGdCQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHQyxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7VUFDcEQsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xCLENBQUMsQ0FBQztNQUNMO1FBQ0UsT0FBT0QsZ0JBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSUEsZ0JBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUdBLGdCQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUdDLFNBQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRTtVQUM3RixPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEIsQ0FBQyxHQUFHRCxnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7VUFDN0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2pCO0dBQ0YsQ0FBQztDQUNIO0FBQ0QsYUFBYyxHQUFHLE9BQU87O0FDMUJ4Qjs7Ozs7Ozs7OztBQVVBLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtFQUNuQixPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzFCLFFBQVEsU0FBUyxDQUFDLE1BQU07TUFDdEIsS0FBSyxDQUFDO1FBQ0osT0FBTyxFQUFFLENBQUM7TUFDWixLQUFLLENBQUM7UUFDSixPQUFPRCxnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBR0UsU0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRTtVQUN4RCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3RCLENBQUMsQ0FBQztNQUNMLEtBQUssQ0FBQztRQUNKLE9BQU9GLGdCQUFjLENBQUMsQ0FBQyxDQUFDLElBQUlBLGdCQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHQSxnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHRSxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1VBQ2pHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEIsQ0FBQyxHQUFHRixnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHRSxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1VBQ2pELE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEIsQ0FBQyxHQUFHRCxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7VUFDekIsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNyQixDQUFDLENBQUM7TUFDTDtRQUNFLE9BQU9ELGdCQUFjLENBQUMsQ0FBQyxDQUFDLElBQUlBLGdCQUFjLENBQUMsQ0FBQyxDQUFDLElBQUlBLGdCQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHQSxnQkFBYyxDQUFDLENBQUMsQ0FBQyxJQUFJQSxnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHRSxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1VBQzNJLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEIsQ0FBQyxHQUFHRixnQkFBYyxDQUFDLENBQUMsQ0FBQyxJQUFJQSxnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHRSxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1VBQ3RFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEIsQ0FBQyxHQUFHRixnQkFBYyxDQUFDLENBQUMsQ0FBQyxJQUFJQSxnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHRSxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1VBQ3RFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEIsQ0FBQyxHQUFHRixnQkFBYyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxTQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7VUFDN0MsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNyQixDQUFDLEdBQUdELGdCQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUdDLFNBQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRTtVQUM3QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JCLENBQUMsR0FBR0QsZ0JBQWMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsU0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFO1VBQzdDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDckIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3BCO0dBQ0YsQ0FBQztDQUNIO0FBQ0QsYUFBYyxHQUFHLE9BQU87O0FDOUN4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkEsSUFBSSxLQUFLLGdCQUFnQkUsU0FBTyxlQUFlQyxpQkFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtFQUMvRyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0NBQzdELENBQUMsQ0FBQyxDQUFDO0FBQ0osV0FBYyxHQUFHLEtBQUs7O0FDL0J0Qjs7OztBQUlBLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxFQUFFO0VBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtNQUNqQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2QixFQUFFLENBQUM7Q0FDUCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkYsSUFBSSxJQUFJLGdCQUFnQkQsU0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOzs7O0VBSXhELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Q0FDYixDQUFDLENBQUM7QUFDSCxVQUFjLEdBQUcsSUFBSTs7QUN4Q3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkEsSUFBSSxNQUFNLGdCQUFnQkYsU0FBTyxDQUFDLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtFQUNyRCxPQUFPLFlBQVk7SUFDakIsT0FBTyxHQUFHLENBQUM7R0FDWixDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBQ0gsWUFBYyxHQUFHLE1BQU07O0FDdEJ2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLElBQUlJLEtBQUcsZ0JBQWdCRixTQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdEQsT0FBT0csTUFBSSxDQUFDLElBQUksRUFBRUMsUUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ2pDLENBQUMsQ0FBQztBQUNILFNBQWMsR0FBR0YsS0FBRzs7QUNqQ3BCLFNBQVMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7O0VBRXJCLFFBQVEsQ0FBQztJQUNQLEtBQUssQ0FBQztNQUNKLE9BQU8sWUFBWTtRQUNqQixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO09BQ2xDLENBQUM7SUFDSixLQUFLLENBQUM7TUFDSixPQUFPLFVBQVUsRUFBRSxFQUFFO1FBQ25CLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7T0FDbEMsQ0FBQztJQUNKLEtBQUssQ0FBQztNQUNKLE9BQU8sVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7T0FDbEMsQ0FBQztJQUNKLEtBQUssQ0FBQztNQUNKLE9BQU8sVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUMzQixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO09BQ2xDLENBQUM7SUFDSixLQUFLLENBQUM7TUFDSixPQUFPLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQy9CLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7T0FDbEMsQ0FBQztJQUNKLEtBQUssQ0FBQztNQUNKLE9BQU8sVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ25DLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7T0FDbEMsQ0FBQztJQUNKLEtBQUssQ0FBQztNQUNKLE9BQU8sVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUN2QyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO09BQ2xDLENBQUM7SUFDSixLQUFLLENBQUM7TUFDSixPQUFPLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQzNDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7T0FDbEMsQ0FBQztJQUNKLEtBQUssQ0FBQztNQUNKLE9BQU8sVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQy9DLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7T0FD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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 97d6d58..0c14598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,36 @@ { "name": "fl-form-builder", - "version": "1.4.0", + "version": "1.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", + "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", + "dev": true, + "requires": { + "acorn": "5.2.1", + "css": "2.2.1", + "normalize-path": "2.1.1", + "source-map": "0.5.7", + "through2": "2.0.3" + }, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "@gulp-sourcemaps/map-sources": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", @@ -81,7 +108,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.0" + "color-convert": "1.9.1" } }, "anymatch": { @@ -243,16 +270,16 @@ "dev": true }, "autoprefixer": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.5.tgz", - "integrity": "sha512-sMN453qIm8Z+tunzYWW+Y490wWkICHhCYm/VohLjjl+N7ARSFuF5au7E6tr7oEbeeXj8mNjpSw2kxjJaO6YCOw==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", + "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", "dev": true, "requires": { - "browserslist": "2.5.1", - "caniuse-lite": "1.0.30000746", + "browserslist": "2.9.0", + "caniuse-lite": "1.0.30000764", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "6.0.13", + "postcss": "6.0.14", "postcss-value-parser": "3.3.0" } }, @@ -455,6 +482,35 @@ "babel-types": "6.26.0" } }, + "babel-helper-module-imports": { + "version": "7.0.0-beta.3", + "resolved": "https://registry.npmjs.org/babel-helper-module-imports/-/babel-helper-module-imports-7.0.0-beta.3.tgz", + "integrity": "sha512-bdPrIXbUTYfREhRhjbN8SstwQaj0S4+rW4PKi1f2Wc5fizSh0hGYkfXUdiSSOgyTydm956tAyz4FrG61bqdQyw==", + "dev": true, + "requires": { + "babel-types": "7.0.0-beta.3", + "lodash": "4.17.4" + }, + "dependencies": { + "babel-types": { + "version": "7.0.0-beta.3", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz", + "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", @@ -541,13 +597,16 @@ } }, "babel-plugin-lodash": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.2.11.tgz", - "integrity": "sha1-Icj97J/hg176pzeHPjkCvdZtVwE=", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.2.tgz", + "integrity": "sha512-lNsptTRfc0FTdW56O087EiKEADVEjJo2frDQ97olMjCKbRZfZPu7MvdyxnZLOoDpuTCtavN8/4Zk65x4gT+C3Q==", "dev": true, "requires": { + "babel-helper-module-imports": "7.0.0-beta.3", + "babel-types": "6.26.0", "glob": "7.1.2", - "lodash": "4.17.4" + "lodash": "4.17.4", + "require-package-name": "2.0.1" } }, "babel-plugin-ramda": { @@ -556,7 +615,7 @@ "integrity": "sha1-JltUqS8p9e1WGAuVxJnRriqKJac=", "dev": true, "requires": { - "ramda": "0.22.1" + "ramda": "0.25.0" } }, "babel-plugin-syntax-async-functions": { @@ -915,9 +974,9 @@ } }, "babel-preset-env": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", - "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "dev": true, "requires": { "babel-plugin-check-es2015-constants": "6.22.0", @@ -947,7 +1006,7 @@ "babel-plugin-transform-es2015-unicode-regex": "6.24.1", "babel-plugin-transform-exponentiation-operator": "6.24.1", "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.5.1", + "browserslist": "2.9.0", "invariant": "2.2.2", "semver": "5.4.1" } @@ -1262,7 +1321,7 @@ "dev": true, "requires": { "async-each-series": "0.1.1", - "connect-history-api-fallback": "1.4.0", + "connect-history-api-fallback": "1.5.0", "immutable": "3.8.1", "server-destroy": "1.0.1", "stream-throttle": "0.1.3", @@ -1270,13 +1329,13 @@ } }, "browserslist": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.5.1.tgz", - "integrity": "sha512-jAvM2ku7YDJ+leAq3bFH1DE0Ylw+F+EQDq4GkqZfgPEqpWYw9ofQH85uKSB9r3Tv7XDbfqVtE+sdvKJW7IlPJA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.0.tgz", + "integrity": "sha512-vJEBcDTANoDhSHL46NeOEW5hvQw7It9uCqzeFPQhpawXfnOwnpvW5C97vn1eGJ7iCkSg8wWU0nYObE7d/N95Iw==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000746", - "electron-to-chromium": "1.3.26" + "caniuse-lite": "1.0.30000764", + "electron-to-chromium": "1.3.27" } }, "bs-recipes": { @@ -1322,15 +1381,15 @@ } }, "caniuse-db": { - "version": "1.0.30000746", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000746.tgz", - "integrity": "sha1-UBCYxm9fu/Y0wC8lUIsF6ICZEPQ=", + "version": "1.0.30000764", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000764.tgz", + "integrity": "sha1-1zqxGuYvap4vaYZ9bZwjrj8uXY0=", "dev": true }, "caniuse-lite": { - "version": "1.0.30000746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000746.tgz", - "integrity": "sha1-xk+Vo5Jc/TAgejCO12wa6W6gnqA=", + "version": "1.0.30000764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000764.tgz", + "integrity": "sha1-l+p0cvnT5pHu3jTyGYPPwhmseEI=", "dev": true }, "caseless": { @@ -1350,14 +1409,14 @@ } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "supports-color": "4.5.0" } }, "chokidar": { @@ -1368,7 +1427,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.2", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -1389,9 +1448,9 @@ } }, "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", "dev": true }, "clone-stats": { @@ -1413,9 +1472,9 @@ "dev": true }, "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { "color-name": "1.1.3" @@ -1502,9 +1561,9 @@ } }, "connect-history-api-fallback": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz", - "integrity": "sha1-PbJPlz9LkjsOgvYZzg3wJBHKYj0=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", "dev": true }, "console-control-strings": { @@ -1634,6 +1693,15 @@ "array-find-index": "1.0.2" } }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1685,21 +1753,24 @@ } }, "debug-fabulous": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", - "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.2.1.tgz", + "integrity": "sha512-u0TV6HcfLsZ03xLBhdhSViQMldaiQ2o+8/nSILaXkuNSWvxkx66vYJUAam0Eu7gAilJRX/69J4kKdqajQPaPyw==", "dev": true, "requires": { - "debug": "2.6.9", - "lazy-debug-legacy": "0.0.1", - "object-assign": "4.1.0" + "debug": "3.1.0", + "memoizee": "0.4.11", + "object-assign": "4.1.1" }, "dependencies": { - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } } } }, @@ -1715,7 +1786,7 @@ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "1.0.2" + "clone": "1.0.3" } }, "define-properties": { @@ -1898,9 +1969,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.26", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz", - "integrity": "sha1-mWQnKUhhp02cfIK5Jg6jAejALWY=", + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", "dev": true }, "emitter-steward": { @@ -2092,6 +2163,49 @@ "is-symbol": "1.0.1" } }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2128,6 +2242,16 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, "eventemitter3": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", @@ -2477,14 +2601,14 @@ "dev": true }, "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", "dev": true, "optional": true, "requires": { "nan": "2.7.0", - "node-pre-gyp": "0.6.36" + "node-pre-gyp": "0.6.39" }, "dependencies": { "abbrev": { @@ -2642,7 +2766,6 @@ "version": "2.0.5", "bundled": true, "dev": true, - "optional": true, "requires": { "boom": "2.10.1" } @@ -2690,6 +2813,12 @@ "dev": true, "optional": true }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, "ecc-jsbn": { "version": "0.1.1", "bundled": true, @@ -2831,7 +2960,6 @@ "version": "3.1.3", "bundled": true, "dev": true, - "optional": true, "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -2912,7 +3040,8 @@ "jsbn": { "version": "0.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "json-schema": { "version": "0.2.3", @@ -3002,11 +3131,13 @@ "optional": true }, "node-pre-gyp": { - "version": "0.6.36", + "version": "0.6.39", "bundled": true, "dev": true, "optional": true, "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", "mkdirp": "0.5.1", "nopt": "4.0.1", "npmlog": "4.1.0", @@ -3214,7 +3345,6 @@ "version": "1.0.9", "bundled": true, "dev": true, - "optional": true, "requires": { "hoek": "2.16.3" } @@ -3329,7 +3459,8 @@ "tweetnacl": { "version": "0.14.5", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "uid-number": { "version": "0.0.6", @@ -3979,112 +4110,18 @@ "lodash": "4.17.4", "ramda-fantasy": "0.8.0", "require-dir-all": "0.4.12" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "gulp-shell": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.6.3.tgz", - "integrity": "sha1-Lqpu3/+ovf96jwufmFKHbzMzHGs=", - "dev": true, - "requires": { - "async": "2.5.0", - "gulp-util": "3.0.8", - "lodash": "4.17.4", - "through2": "2.0.3" - } - }, - "ramda-fantasy": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ramda-fantasy/-/ramda-fantasy-0.8.0.tgz", - "integrity": "sha1-now32T7ApweWz8EIc92cUIUDkPY=", - "dev": true, - "requires": { - "ramda": "0.22.1" - } - } } }, "gulp-postcss": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-6.4.0.tgz", - "integrity": "sha1-eKMuPIeqbNzsWuHJBeGW1HjoxdU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-7.0.0.tgz", + "integrity": "sha1-z7YqGfqUf4vmfOnsronOuVnwz5M=", "dev": true, "requires": { "gulp-util": "3.0.8", - "postcss": "5.2.18", + "postcss": "6.0.14", "postcss-load-config": "1.2.0", "vinyl-sourcemaps-apply": "0.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } } }, "gulp-rename": { @@ -4101,38 +4138,50 @@ "requires": { "gulp-util": "3.0.8", "lodash.clonedeep": "4.5.0", - "node-sass": "4.5.3", + "node-sass": "4.6.1", "through2": "2.0.3", "vinyl-sourcemaps-apply": "0.2.1" } }, "gulp-shell": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.5.2.tgz", - "integrity": "sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0=", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.6.3.tgz", + "integrity": "sha1-Lqpu3/+ovf96jwufmFKHbzMzHGs=", "dev": true, "requires": { - "async": "1.5.2", + "async": "2.6.0", "gulp-util": "3.0.8", "lodash": "4.17.4", "through2": "2.0.3" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + } } }, "gulp-sourcemaps": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.0.tgz", - "integrity": "sha1-eG+XyUoPloSSRl1wVY4EJCxnlZg=", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.1.tgz", + "integrity": "sha512-1qHCI3hdmsMdq/SUotxwUh/L8YzlI6J9zQ5ifNOtx4Y6KV5y5sGuORv1KZzWhuKtz/mXNh5xLESUtwC4EndCjA==", "dev": true, "requires": { + "@gulp-sourcemaps/identity-map": "1.0.1", "@gulp-sourcemaps/map-sources": "1.0.0", "acorn": "4.0.13", "convert-source-map": "1.5.0", "css": "2.2.1", - "debug-fabulous": "0.0.4", + "debug-fabulous": "0.2.1", "detect-newline": "2.1.0", "graceful-fs": "4.1.11", "source-map": "0.6.1", - "strip-bom": "2.0.0", + "strip-bom-string": "1.0.0", "through2": "2.0.3", "vinyl": "1.2.0" }, @@ -4143,7 +4192,7 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "1.0.2", + "clone": "1.0.3", "clone-stats": "0.0.1", "replace-ext": "0.0.1" } @@ -4516,9 +4565,9 @@ "dev": true }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -4686,6 +4735,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -4932,7 +4987,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -4941,12 +4996,6 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, - "lazy-debug-legacy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", - "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE=", - "dev": true - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -4970,7 +5019,7 @@ "lodash.isstring": "4.0.1", "lodash.mapvalues": "4.6.0", "rechoir": "0.6.2", - "resolve": "1.4.0" + "resolve": "1.5.0" } }, "limiter": { @@ -5352,6 +5401,15 @@ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", "dev": true }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } + }, "magic-string": { "version": "0.22.4", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", @@ -5388,6 +5446,22 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "memoizee": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.11.tgz", + "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-weak-map": "2.0.2", + "event-emitter": "0.3.5", + "is-promise": "2.1.0", + "lru-queue": "0.1.0", + "next-tick": "1.0.0", + "timers-ext": "0.1.2" + } + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -5525,6 +5599,12 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -5565,9 +5645,9 @@ } }, "node-sass": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", - "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.6.1.tgz", + "integrity": "sha512-0zQQ7tjEK5W8RfW9LiQrkzfo7uLZ0QtZGV69rdKn5cFzdweHLJ14lR6xLPvI6UimkXMO8m0qDsXwUCNdnqV3sA==", "dev": true, "requires": { "async-foreach": "0.1.3", @@ -6055,14 +6135,14 @@ } }, "postcss": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", - "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.1.0", + "chalk": "2.3.0", "source-map": "0.6.1", - "supports-color": "4.4.0" + "supports-color": "4.5.0" } }, "postcss-load-config": { @@ -6172,18 +6252,18 @@ "dev": true }, "ramda": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.22.1.tgz", - "integrity": "sha1-Ax2gw99BfFszyWI0dX6zcDPzag4=", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", "dev": true }, "ramda-fantasy": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/ramda-fantasy/-/ramda-fantasy-0.7.0.tgz", - "integrity": "sha1-rHenpdVd/B3cIkrEGOm+iQDGXRc=", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ramda-fantasy/-/ramda-fantasy-0.8.0.tgz", + "integrity": "sha1-now32T7ApweWz8EIc92cUIUDkPY=", "dev": true, "requires": { - "ramda": "0.22.1" + "ramda": "0.25.0" } }, "randomatic": { @@ -6211,7 +6291,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -6222,7 +6302,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -6336,7 +6416,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "1.5.0" } }, "redent": { @@ -6526,6 +6606,12 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "require-package-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", + "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6533,9 +6619,9 @@ "dev": true }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -6586,9 +6672,9 @@ } }, "rollup": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.50.0.tgz", - "integrity": "sha512-7RqCBQ9iwsOBPkjYgoIaeUij606mSkDMExP0NT7QDI3bqkHYQHrQ83uoNIXwPcQm/vP2VbsUz3kiyZZ1qPlLTQ==", + "version": "0.51.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.51.5.tgz", + "integrity": "sha512-nvwUduO53TvWigOaOv7t+rNoEUW53sTUeqMAjlxp7ekeHirPECnWXSwiPwiqvGNdbJTQbOdHFPAZZfjo61BtVQ==", "dev": true }, "rollup-plugin-babel": { @@ -6601,22 +6687,22 @@ } }, "rollup-plugin-commonjs": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.1.tgz", - "integrity": "sha512-ZTwAetmKimCsuWost/+n4FaOpMoczBRTx+kuQaZCIKXTx/R1wNBezuX5NS0vnPKM3hBoErdpAqmNyVSCi5XKbg==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz", + "integrity": "sha512-qK0+uhktmnAgZkHkqFuajNmPw93fjrO7+CysDaxWE5jrUR9XSlSvuao5ZJP+XizxA8weakhgYYBtbVz9SGBpjA==", "dev": true, "requires": { - "acorn": "5.1.2", + "acorn": "5.2.1", "estree-walker": "0.5.0", "magic-string": "0.22.4", - "resolve": "1.4.0", + "resolve": "1.5.0", "rollup-pluginutils": "2.0.1" }, "dependencies": { "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", "dev": true }, "estree-walker": { @@ -6654,7 +6740,7 @@ "browser-resolve": "1.11.2", "builtin-modules": "1.1.1", "is-module": "1.0.0", - "resolve": "1.4.0" + "resolve": "1.5.0" } }, "rollup-plugin-replace": { @@ -7309,6 +7395,12 @@ "is-utf8": "0.2.1" } }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -7319,9 +7411,9 @@ } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -7406,6 +7498,16 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, + "timers-ext": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", + "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", + "dev": true, + "requires": { + "es5-ext": "0.10.35", + "next-tick": "1.0.0" + } + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", @@ -7649,7 +7751,7 @@ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "1.0.2", + "clone": "1.0.3", "clone-stats": "0.0.1", "replace-ext": "0.0.1" } diff --git a/package.json b/package.json index 1c1f0a7..f671ce7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fl-form-builder", - "version": "1.4.1", + "version": "1.4.2", "description": "A vanilla JS form builder", "main": "dist/fl-form-builder.js", "scripts": { @@ -13,48 +13,48 @@ "author": "lazamar @ FourLabs", "license": "MIT", "devDependencies": { - "autoprefixer": "^7.1.5", + "autoprefixer": "^7.1.6", "babel-core": "^6.26.0", "babel-plugin-external-helpers": "^6.22.0", - "babel-plugin-lodash": "^3.2.11", + "babel-plugin-lodash": "^3.3.2", "babel-plugin-ramda": "^1.4.3", - "babel-preset-env": "^1.6.0", + "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", - "browser-sync": "^2.18.5", - "caniuse-db": "^1.0.30000746", + "browser-sync": "^2.18.13", + "caniuse-db": "^1.0.30000764", "colors": "^1.1.2", - "data.either": "^1.4.0", + "data.either": "^1.5.1", "data.maybe": "^1.2.2", "data.task": "^3.1.1", - "diff": "^3.1.0", + "diff": "^3.4.0", "document-offset": "^1.0.4", "gulp": "^3.9.1", "gulp-babel": "^7.0.0", "gulp-flatmap": "^1.0.0", "gulp-jasmine": "^2.4.2", - "gulp-organiser": "^1.0.6", - "gulp-postcss": "^6.2.0", + "gulp-organiser": "^1.1.0", + "gulp-postcss": "^7.0.0", "gulp-rename": "^1.2.2", - "gulp-sass": "^3.0.0", - "gulp-shell": "^0.5.2", - "gulp-sourcemaps": "^1.9.1", + "gulp-sass": "^3.1.0", + "gulp-shell": "^0.6.3", + "gulp-sourcemaps": "^2.6.1", "gulp-uglify": "^2.0.0", - "is-equal": "^1.5.3", + "is-equal": "^1.5.5", "jasmine": "^2.8.0", "jasmine-core": "^2.8.0", "jasmine-reporters": "^2.2.1", - "lodash": "^4.17.2", + "lodash": "^4.17.4", "path": "^0.12.7", - "ramda": "^0.22.1", - "ramda-fantasy": "^0.7.0", + "ramda": "^0.25.0", + "ramda-fantasy": "^0.8.0", "react": "<16.0.0", "react-dom": "<16.0.0", "react-redux": "^5.0.6", "react-test-renderer": "<16.0.0", "redux": "^3.7.2", - "rollup": "0.50.0", + "rollup": "0.51.5", "rollup-plugin-babel": "^3.0.2", - "rollup-plugin-commonjs": "^8.2.1", + "rollup-plugin-commonjs": "^8.2.6", "rollup-plugin-node-resolve": "^3.0.0", "rollup-plugin-replace": "^2.0.0", "rollup-stream": "<1.24.0", @@ -63,70 +63,8 @@ "vinyl-source-stream": "^1.1.0" }, "dependencies": { - "bootstrap": "^3.3.6", - "x-div": "^1.0.44" + "bootstrap": "^3.3.7", + "x-div": "^1.1.1" }, - "repository": "https://github.com/fourlabsldn/fl-form-builder.git", - "resolutions": { - "lodash": "4.17.4", - "rollup": "0.41.6", - "chalk": "1.1.3", - "source-map": "0.5.6", - "supports-color": "2.0.0", - "ansi-styles": "2.2.1", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "ansi-regex": "2.1.1", - "glob": "7.1.1", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "debug": "2.3.3", - "ms": "0.7.2", - "jsesc": "1.3.0", - "core-js": "2.4.1", - "connect": "3.5.0", - "qs": "6.4.0", - "yargs": "6.4.0", - "etag": "1.8.0", - "nopt": "4.0.1", - "mime": "1.3.4", - "mkdirp": "0.5.1", - "graceful-fs": "4.1.11", - "readable-stream": "2.2.9", - "isarray": "1.0.0", - "string_decoder": "1.0.0", - "request": "2.81.0", - "semver": "5.3.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "caseless": "0.12.0", - "har-validator": "4.2.1", - "tunnel-agent": "0.6.0", - "assert-plus": "0.2.0", - "xtend": "4.0.1", - "camelcase": "3.0.0", - "cliui": "3.2.0", - "window-size": "0.2.0", - "acorn": "4.0.11", - "magic-string": "0.16.0", - "has-binary": "0.1.7", - "component-emitter": "1.2.1", - "yargs-parser": "4.2.1", - "strip-bom": "2.0.0", - "gulp-util": "3.0.8", - "dateformat": "2.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "through2": "2.0.3", - "vinyl": "1.2.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.templatesettings": "3.1.1", - "clone": "1.0.2", - "resolve": "1.3.3", - "gaze": "1.1.2", - "globule": "1.1.0", - "lru-cache": "4.0.2" - } + "repository": "https://github.com/fourlabsldn/fl-form-builder.git" } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c03f117..0000000 --- a/yarn.lock +++ /dev/null @@ -1,4622 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@gulp-sourcemaps/map-sources@1.X": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" - dependencies: - normalize-path "^2.0.1" - through2 "^2.0.3" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - -accepts@~1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - dependencies: - mime-types "~2.1.16" - negotiator "0.6.1" - -acorn@4.X: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -acorn@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" - -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-slice@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" - -array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -async-each-series@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - -async@1.5.2, async@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.5: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - dependencies: - lodash "^4.14.0" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" - -autoprefixer@^7.1.5: - version "7.1.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.6.tgz#fb933039f74af74a83e71225ce78d9fd58ba84d7" - dependencies: - browserslist "^2.5.1" - caniuse-lite "^1.0.30000748" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.13" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - -babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.6" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-module-imports@^7.0.0-beta.3: - version "7.0.0-beta.3" - resolved "https://registry.yarnpkg.com/babel-helper-module-imports/-/babel-helper-module-imports-7.0.0-beta.3.tgz#e15764e3af9c8e11810c09f78f498a2bdc71585a" - dependencies: - babel-types "7.0.0-beta.3" - lodash "^4.2.0" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-external-helpers@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-lodash@^3.2.11: - version "3.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.2.tgz#da3a5b49ba27447f54463f6c4fa81396ccdd463f" - dependencies: - babel-helper-module-imports "^7.0.0-beta.3" - babel-types "^6.26.0" - glob "^7.1.1" - lodash "^4.17.4" - require-package-name "^2.0.1" - -babel-plugin-ramda@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-ramda/-/babel-plugin-ramda-1.4.3.tgz#265b54a92f29f5ed56180b95c499d1ae2a8a25a7" - dependencies: - ramda "0.x" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@7.0.0-beta.3: - version "7.0.0-beta.3" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-7.0.0-beta.3.tgz#cd927ca70e0ae8ab05f4aab83778cfb3e6eb20b4" - dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" - -batch@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - dependencies: - callsite "1.0.0" - -binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" - -bl@^0.9.1: - version "0.9.5" - resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" - dependencies: - readable-stream "~1.0.26" - -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -bootstrap@^3.3.6: - version "3.3.7" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -browser-resolve@^1.11.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" - -browser-sync-client@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.5.1.tgz#ec1ad69a49c2e2d4b645b18b1c06c29b3d9af8eb" - dependencies: - etag "^1.7.0" - fresh "^0.3.0" - -browser-sync-ui@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz#640a537c180689303d5be92bc476b9ebc441c0bc" - dependencies: - async-each-series "0.1.1" - connect-history-api-fallback "^1.1.0" - immutable "^3.7.6" - server-destroy "1.0.1" - stream-throttle "^0.1.3" - weinre "^2.0.0-pre-I0Z7U9OV" - -browser-sync@^2.18.5: - version "2.18.13" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.13.tgz#c28dc3eb3be67c97a907082b772a37f915c14d7d" - dependencies: - browser-sync-client "2.5.1" - browser-sync-ui "0.6.3" - bs-recipes "1.3.4" - chokidar "1.7.0" - connect "3.5.0" - dev-ip "^1.0.1" - easy-extender "2.3.2" - eazy-logger "3.0.2" - emitter-steward "^1.0.0" - fs-extra "3.0.1" - http-proxy "1.15.2" - immutable "3.8.1" - localtunnel "1.8.3" - micromatch "2.3.11" - opn "4.0.2" - portscanner "2.1.1" - qs "6.2.1" - resp-modifier "6.0.2" - rx "4.1.0" - serve-index "1.8.0" - serve-static "1.12.2" - server-destroy "1.0.1" - socket.io "1.6.0" - socket.io-client "1.6.0" - ua-parser-js "0.7.12" - yargs "6.4.0" - -browserslist@^2.1.2, browserslist@^2.5.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.9.0.tgz#706aca15c53be15610f466e348cbfa0c00a6a379" - dependencies: - caniuse-lite "^1.0.30000760" - electron-to-chromium "^1.3.27" - -bs-recipes@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" - -builtin-modules@^1.0.0, builtin-modules@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2, camelcase@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -caniuse-db@^1.0.30000746: - version "1.0.30000764" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000764.tgz#d73ab11ae62f6a9e2f69867d6d9c23ae3f2e5d8d" - -caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000760: - version "1.0.30000764" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000764.tgz#97ea7472f9d3e691eede34f21983cfc219ac7842" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chokidar@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.0.3, cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone-stats@^0.0.1, clone-stats@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -colors@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.2.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -connect-history-api-fallback@^1.1.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" - -connect@1.x: - version "1.9.2" - resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" - dependencies: - formidable "1.0.x" - mime ">= 0.0.1" - qs ">= 0.4.0" - -connect@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" - dependencies: - debug "~2.2.0" - finalhandler "0.5.0" - parseurl "~1.3.1" - utils-merge "1.0.0" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -convert-source-map@1.X, convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" - dependencies: - is-directory "^0.3.1" - js-yaml "^3.4.3" - minimist "^1.2.0" - object-assign "^4.1.0" - os-homedir "^1.0.1" - parse-json "^2.2.0" - require-from-string "^1.1.0" - -create-react-class@^15.6.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a" - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -css@2.X: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" - dependencies: - inherits "^2.0.1" - source-map "^0.1.38" - source-map-resolve "^0.3.0" - urix "^0.1.0" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -data.either@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/data.either/-/data.either-1.5.1.tgz#71f9dbfc8fe3ab0112e52e443470bcd526f50b47" - -data.maybe@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/data.maybe/-/data.maybe-1.2.2.tgz#f955e4b5572b2eb5047eab93d8bb3a1cc76a2dc3" - -data.task@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/data.task/-/data.task-3.1.1.tgz#e985f5bedadd926b2d63c1a5d2076cff917a52ad" - -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - -debug-fabulous@0.0.X: - version "0.0.4" - resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763" - dependencies: - debug "2.X" - lazy-debug-legacy "0.0.X" - object-assign "4.1.0" - -debug@2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - dependencies: - ms "0.7.2" - -debug@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" - dependencies: - ms "0.7.3" - -debug@2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - -debug@2.X, debug@^2.2.0, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@1.1.1, depd@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - dependencies: - fs-exists-sync "^0.1.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" - -detect-newline@2.X: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - -dev-ip@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" - -diff@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" - -document-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/document-offset/-/document-offset-1.0.4.tgz#7345b819cdfef2bb45c63ce13056416063b70085" - dependencies: - dom-support "*" - get-document "1.0.0" - within-element "0.1.0" - -dom-support@*: - version "0.0.2" - resolved "https://registry.yarnpkg.com/dom-support/-/dom-support-0.0.2.tgz#0e129764ffa5e203d8ab5839e2e92dc2ae14ef7c" - dependencies: - domready "*" - -domready@*: - version "1.0.8" - resolved "https://registry.yarnpkg.com/domready/-/domready-1.0.8.tgz#91f252e597b65af77e745ae24dd0185d5e26d58c" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -easy-extender@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d" - dependencies: - lodash "^3.10.1" - -eazy-logger@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" - dependencies: - tfunk "^3.0.1" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-to-chromium@^1.3.27: - version "1.3.27" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" - -emitter-steward@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" - -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - -engine.io-client@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.1" - has-cors "1.1.0" - indexof "0.0.1" - parsejson "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" - yeast "0.1.2" - -engine.io-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" - dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" - base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" - -engine.io@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" - dependencies: - accepts "1.3.3" - base64id "0.1.0" - cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.1" - ws "1.1.1" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.6.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -estree-walker@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" - -estree-walker@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" - -estree-walker@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.0.tgz#aae3b57c42deb8010e349c892462f0e71c5dd1aa" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@^1.7.0, etag@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - dependencies: - os-homedir "^1.0.1" - -expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -express@2.5.x: - version "2.5.11" - resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" - dependencies: - connect "1.x" - mime "1.2.4" - mkdirp "0.3.0" - qs "0.4.x" - -extend@^3.0.0, extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -fancy-log@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fbjs@^0.8.16, fbjs@^0.8.9: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -finalhandler@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" - dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - statuses "~1.3.0" - unpipe "~1.0.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - -fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -fl-assert@^1.0.0: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fl-assert/-/fl-assert-1.0.10.tgz#d52b222a5fd4f4df09aa695507376cd21d60ca8f" - -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -formidable@1.0.x: - version "1.0.17" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" - -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" - -fresh@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - -gaze@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" - dependencies: - globule "^1.0.0" - -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-document@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-document/-/get-document-1.0.0.tgz#4821bce66f1c24cb0331602be6cb6b12c4f01c4b" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globule@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" - dependencies: - glob "~7.1.1" - lodash "~4.17.4" - minimatch "~3.0.2" - -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" - dependencies: - sparkles "^1.0.0" - -graceful-fs@4.X, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - -gulp-babel@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-7.0.0.tgz#7b93c975159f7a0553e4263b4a55100ccc239b28" - dependencies: - gulp-util "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-flatmap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulp-flatmap/-/gulp-flatmap-1.0.0.tgz#e634e03cffb263aebacfdc22dd8ce2f3d76ffe97" - dependencies: - gulp-util "~2.2.14" - through2 "~0.6.3" - -gulp-jasmine@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/gulp-jasmine/-/gulp-jasmine-2.4.2.tgz#5a7f47e27370c3619ac0a2a442be399671409db3" - dependencies: - arrify "^1.0.0" - gulp-util "^3.0.0" - jasmine "^2.3.0" - jasmine-terminal-reporter "^1.0.0" - through2 "^2.0.0" - -gulp-organiser@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/gulp-organiser/-/gulp-organiser-1.1.0.tgz#f5eda07d9e76559b5a087ffdd9a4c606c07354de" - dependencies: - gulp "^3.9.1" - gulp-shell "^0.6.3" - lodash "^4.15.0" - ramda-fantasy "^0.8.0" - require-dir-all "^0.4.9" - -gulp-postcss@^6.2.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/gulp-postcss/-/gulp-postcss-6.4.0.tgz#78a32e3c87aa6cdcec5ae1c905e196d478e8c5d5" - dependencies: - gulp-util "^3.0.8" - postcss "^5.2.12" - postcss-load-config "^1.2.0" - vinyl-sourcemaps-apply "^0.2.1" - -gulp-rename@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" - -gulp-sass@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-3.1.0.tgz#53dc4b68a1f5ddfe4424ab4c247655269a8b74b7" - dependencies: - gulp-util "^3.0" - lodash.clonedeep "^4.3.2" - node-sass "^4.2.0" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-shell@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.5.2.tgz#a4959ca0651ad1c7bbfe70b2d0adbbb4e1aea98d" - dependencies: - async "^1.5.0" - gulp-util "^3.0.7" - lodash "^4.0.0" - through2 "^2.0.0" - -gulp-shell@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.6.3.tgz#2eaa6edfffa8bdff7a8f0b9f9852876f33331c6b" - dependencies: - async "^2.1.5" - gulp-util "^3.0.8" - lodash "^4.17.4" - through2 "^2.0.3" - -gulp-sourcemaps@^1.9.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.0.tgz#786f97c94a0f968492465d70558e04242c679598" - dependencies: - "@gulp-sourcemaps/map-sources" "1.X" - acorn "4.X" - convert-source-map "1.X" - css "2.X" - debug-fabulous "0.0.X" - detect-newline "2.X" - graceful-fs "4.X" - source-map "0.X" - strip-bom "2.X" - through2 "2.X" - vinyl "1.X" - -gulp-uglify@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-2.1.2.tgz#6db85b1d0ee63d18058592b658649d65c2ec4541" - dependencies: - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash "^4.13.1" - make-error-cause "^1.1.1" - through2 "^2.0.0" - uglify-js "~2.8.10" - uglify-save-license "^0.4.1" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@~2.2.14: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - -gulp@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - dependencies: - isarray "0.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hoist-non-react-statics@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -http-errors@~1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" - dependencies: - inherits "2.0.3" - setprototypeof "1.0.2" - statuses ">= 1.3.1 < 2" - -http-errors@~1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-proxy@1.15.2: - version "1.15.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@~0.4.13: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -immutable@3.8.1, immutable@^3.7.6: - version "3.8.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" - -in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -interpret@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" - -invariant@^2.0.0, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-absolute@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-arrow-function@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-arrow-function/-/is-arrow-function-2.0.3.tgz#29be2c2d8d9450852b8bbafb635ba7b8d8e87ec2" - dependencies: - is-callable "^1.0.4" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.0.4, is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-equal@^1.5.3: - version "1.5.5" - resolved "https://registry.yarnpkg.com/is-equal/-/is-equal-1.5.5.tgz#5e85f1957e052883247feb386965a3bba15fbb3d" - dependencies: - has "^1.0.1" - is-arrow-function "^2.0.3" - is-boolean-object "^1.0.0" - is-callable "^1.1.3" - is-date-object "^1.0.1" - is-generator-function "^1.0.6" - is-number-object "^1.0.3" - is-regex "^1.0.3" - is-string "^1.0.4" - is-symbol "^1.0.1" - object.entries "^1.0.4" - -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-generator-function@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.6.tgz#9e71653cd15fff341c79c4151460a131d31e9fc4" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - -is-number-like@^1.0.3: - version "1.0.8" - resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" - dependencies: - lodash.isfinite "^3.3.2" - -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-regex@^1.0.3, is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" - dependencies: - unc-path-regex "^0.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -jasmine-core@^2.8.0, jasmine-core@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" - -jasmine-reporters@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.2.1.tgz#de9a9201367846269e7ca8adff5b44221671fcbd" - dependencies: - mkdirp "^0.5.1" - xmldom "^0.1.22" - -jasmine-terminal-reporter@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz#896f1ec8fdf4bf6aecdd41c503eda7347f61526b" - dependencies: - indent-string "^2.1.0" - pluralize "^1.2.1" - -jasmine@^2.3.0, jasmine@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" - dependencies: - exit "^0.1.2" - glob "^7.0.6" - jasmine-core "~2.8.0" - -js-base64@^2.1.8, js-base64@^2.1.9: - version "2.3.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.4.3: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-debug-legacy@0.0.X: - version "0.0.1" - resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -liftoff@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" - dependencies: - extend "^3.0.0" - findup-sync "^0.4.2" - fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -limiter@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.2.tgz#229d8055891c8b11af9e0ee5200e8e09bb3dcbeb" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -localtunnel@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.3.tgz#dcc5922fd85651037d4bde24fd93248d0b24eb05" - dependencies: - debug "2.6.8" - openurl "1.1.1" - request "2.81.0" - yargs "3.29.0" - -lodash-es@^4.2.0, lodash-es@^4.2.1: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - -lodash.clonedeep@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isfinite@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" - -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - -lodash.mergewith@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - -lodash@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@~4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -magic-string@^0.22.4: - version "0.22.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" - dependencies: - vlq "^0.2.1" - -make-error-cause@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" - dependencies: - make-error "^1.2.0" - -make-error@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" - -map-cache@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -meow@^3.3.0, meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.16, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" - -mime@1.3.4, "mime@>= 0.0.1": - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mini-deep-assign@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mini-deep-assign/-/mini-deep-assign-0.0.8.tgz#14fa4cad93d47cfbb4392796a8b0015e7f60cbcd" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -module-parent@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/module-parent/-/module-parent-0.0.2.tgz#be1cbb3cb6a55060fc86467d2f2d2cd0a600e199" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - -ms@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" - -ms@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -nan@^2.3.0, nan@^2.3.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" - -natives@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-gyp@^3.3.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - minimatch "^3.0.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "2" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -node-sass@^4.2.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.6.1.tgz#9b331cf943ee5440f199e858941a90d13bc9bfc5" - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - lodash.mergewith "^4.6.0" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.3.2" - node-gyp "^3.3.1" - npmlog "^4.0.0" - request "^2.79.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - -"nopt@2 || 3", nopt@3.0.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object-path@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" - -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.entries@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -openurl@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" - -opn@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@0, osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -parse-filepath@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" - dependencies: - is-absolute "^0.2.3" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - dependencies: - better-assert "~1.0.0" - -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - dependencies: - better-assert "~1.0.0" - -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - dependencies: - better-assert "~1.0.0" - -parseurl@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path@^0.12.7: - version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - dependencies: - process "^0.11.1" - util "^0.10.3" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - -portscanner@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" - dependencies: - async "1.5.2" - is-number-like "^1.0.3" - -postcss-load-config@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" - dependencies: - cosmiconfig "^2.1.0" - object-assign "^4.1.0" - postcss-load-options "^1.2.0" - postcss-load-plugins "^2.3.0" - -postcss-load-options@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" - dependencies: - cosmiconfig "^2.1.0" - object-assign "^4.1.0" - -postcss-load-plugins@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" - dependencies: - cosmiconfig "^2.1.1" - object-assign "^4.1.0" - -postcss-value-parser@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss@^5.2.12: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.13: - version "6.0.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885" - dependencies: - chalk "^2.3.0" - source-map "^0.6.1" - supports-color "^4.4.0" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -private@^0.1.6, private@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process@^0.11.1: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prop-types@^15.5.10: - version "15.6.0" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@0.4.x: - version "0.4.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" - -qs@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" - -"qs@>= 0.4.0", qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -ramda-fantasy@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/ramda-fantasy/-/ramda-fantasy-0.7.0.tgz#ac77a7a5d55dfc1ddc224ac418e9be8900c65d17" - dependencies: - ramda ">=0.15.0" - -ramda-fantasy@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/ramda-fantasy/-/ramda-fantasy-0.8.0.tgz#9e8c37d93ec0a70796cfc10873dd9c50850390f6" - dependencies: - ramda ">=0.15.0" - -ramda@0.x, ramda@>=0.15.0, ramda@^0.22.1: - version "0.22.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.22.1.tgz#031da0c3df417c5b33c96234757eb37033f36a0e" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@<16.0.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730" - dependencies: - fbjs "^0.8.9" - loose-envify "^1.1.0" - object-assign "^4.1.0" - prop-types "^15.5.10" - -react-redux@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.6.tgz#23ed3a4f986359d68b5212eaaa681e60d6574946" - dependencies: - hoist-non-react-statics "^2.2.1" - invariant "^2.0.0" - lodash "^4.2.0" - lodash-es "^4.2.0" - loose-envify "^1.1.0" - prop-types "^15.5.10" - -react-test-renderer@<16.0.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8" - dependencies: - fbjs "^0.8.9" - object-assign "^4.1.0" - -react@<16.0.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72" - dependencies: - create-react-class "^15.6.0" - fbjs "^0.8.9" - loose-envify "^1.1.0" - object-assign "^4.1.0" - prop-types "^15.5.10" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.26: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redux@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" - dependencies: - lodash "^4.2.1" - lodash-es "^4.2.1" - loose-envify "^1.1.0" - symbol-observable "^1.0.3" - -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - -regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -request@2, request@2.81.0, request@^2.79.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -require-dir-all@^0.4.9: - version "0.4.12" - resolved "https://registry.yarnpkg.com/require-dir-all/-/require-dir-all-0.4.12.tgz#ec7c7215a76e92207920c971f15477699eaf63a7" - dependencies: - mini-deep-assign "0.0.8" - module-parent "0.0.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-package-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" - -requires-port@1.x.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-url@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - dependencies: - path-parse "^1.0.5" - -resp-modifier@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" - dependencies: - debug "^2.2.0" - minimatch "^3.0.2" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -rollup-plugin-babel@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz#a2765dea0eaa8aece351c983573300d17497495b" - dependencies: - rollup-pluginutils "^1.5.0" - -rollup-plugin-commonjs@^8.2.1: - version "8.2.6" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz#27e5b9069ff94005bb01e01bb46a1e4873784677" - dependencies: - acorn "^5.2.1" - estree-walker "^0.5.0" - magic-string "^0.22.4" - resolve "^1.4.0" - rollup-pluginutils "^2.0.1" - -rollup-plugin-node-resolve@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" - dependencies: - browser-resolve "^1.11.0" - builtin-modules "^1.1.0" - is-module "^1.0.0" - resolve "^1.1.6" - -rollup-plugin-replace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.0.0.tgz#19074089c8ed57184b8cc64e967a03d095119277" - dependencies: - magic-string "^0.22.4" - minimatch "^3.0.2" - rollup-pluginutils "^2.0.1" - -rollup-pluginutils@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" - dependencies: - estree-walker "^0.2.1" - minimatch "^3.0.2" - -rollup-pluginutils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" - dependencies: - estree-walker "^0.3.0" - micromatch "^2.3.11" - -rollup-stream@<1.24.0: - version "1.23.1" - resolved "https://registry.yarnpkg.com/rollup-stream/-/rollup-stream-1.23.1.tgz#084b489cc4f8d780a27c187a53cef6598171f102" - dependencies: - rollup "^0.45.1" - -rollup@0.50.0: - version "0.50.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.50.0.tgz#4c158f4e780e6cb33ff0dbfc184a52cc58cd5f3b" - -rollup@^0.45.1: - version "0.45.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.45.2.tgz#63a284c2b31234656f24e9e9717fabb6a7f0fa43" - dependencies: - source-map-support "^0.4.0" - -rx@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - -safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -seamless-immutable@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.2.tgz#c87a1eba6767a32455311d76600ac5eddeafbb69" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -send@0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6" - dependencies: - debug "2.6.4" - depd "~1.1.0" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" - http-errors "~1.6.1" - mime "1.3.4" - ms "1.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - -serve-index@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" - dependencies: - accepts "~1.3.3" - batch "0.5.3" - debug "~2.2.0" - escape-html "~1.0.3" - http-errors "~1.5.0" - mime-types "~2.1.11" - parseurl "~1.3.1" - -serve-static@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.2.tgz#e546e2726081b81b4bcec8e90808ebcdd323afba" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.2" - -server-destroy@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" - dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" - -socket.io-client@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.0" - has-binary "0.1.7" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.5" - socket.io-parser "2.3.1" - to-array "0.1.4" - -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" - dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" - -socket.io@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" - dependencies: - debug "2.3.3" - engine.io "1.8.0" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.6.0" - socket.io-parser "2.3.1" - -source-map-resolve@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" - dependencies: - atob "~1.1.0" - resolve-url "~0.2.1" - source-map-url "~0.3.0" - urix "~0.1.0" - -source-map-support@^0.4.0, source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-url@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" - -source-map@0.X, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.1.38: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -"statuses@>= 1.3.1 < 2": - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -statuses@~1.3.0, statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" - dependencies: - readable-stream "^2.0.1" - -stream-consume@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" - -stream-throttle@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" - dependencies: - commander "^2.2.0" - limiter "^1.0.5" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom@2.X, strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -supports-color@^4.0.0, supports-color@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - dependencies: - has-flag "^2.0.0" - -symbol-observable@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" - -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.0.0, tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -tfunk@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b" - dependencies: - chalk "^1.1.1" - object-path "^0.9.0" - -through2@2.X, through2@^2.0.0, through2@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through2@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.1, through2@~0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - -tough-cookie@~2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -ua-parser-js@0.7.12, ua-parser-js@^0.7.9: - version "0.7.12" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" - -uglify-js@~2.8.10: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-save-license@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - -unc-path-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore@1.7.x: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - -universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -urix@^0.1.0, urix@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-1.0.0.tgz#ca067ea08431d507722b1de5083f602616ebc234" - dependencies: - bl "^0.9.1" - through2 "^0.6.1" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-source-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz#44cbe5108205279deb0c5653c094a2887938b1ab" - dependencies: - through2 "^0.6.1" - vinyl "^0.4.3" - -vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@1.X: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.0, vinyl@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vlq@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - -weinre@^2.0.0-pre-I0Z7U9OV: - version "2.0.0-pre-I0Z7U9OV" - resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" - dependencies: - express "2.5.x" - nopt "3.0.x" - underscore "1.7.x" - -whatwg-fetch@>=0.10.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which@1, which@^1.2.12, which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - -within-element@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/within-element/-/within-element-0.1.0.tgz#b610be314fb588bf21d7bd733906e437f30e2b95" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - -x-div@^1.0.44: - version "1.1.1" - resolved "https://registry.yarnpkg.com/x-div/-/x-div-1.1.1.tgz#8b067cfd763bc5f711e82be80887a960a761a85e" - dependencies: - fl-assert "^1.0.0" - -xmldom@^0.1.22: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" - -"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - -y18n@^3.2.0, y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs-parser@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - dependencies: - camelcase "^3.0.0" - -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - dependencies: - camelcase "^3.0.0" - -yargs@3.29.0: - version "3.29.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" - dependencies: - camelcase "^1.2.1" - cliui "^3.0.3" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - -yargs@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^4.1.0" - -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"