(function (factory) {
typeof define === 'function' && define.amd ? define(factory) :
factory();
})((function () { 'use strict';
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
/**
* lodash (Custom Build)
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors
* Released under MIT license
* Based on Underscore.js 1.8.3
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]';
/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;
/**
* A specialized version of `_.forEach` for arrays without support for
* iteratee shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns `array`.
*/
function arrayEach(array, iteratee) {
var index = -1,
length = array ? array.length : 0;
while (++index < length) {
if (iteratee(array[index], index, array) === false) {
break;
}
}
return array;
}
/**
* The base implementation of `_.times` without support for iteratee shorthands
* or max array length checks.
*
* @private
* @param {number} n The number of times to invoke `iteratee`.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the array of results.
*/
function baseTimes(n, iteratee) {
var index = -1,
result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
/**
* Creates a unary function that invokes `func` with its argument transformed.
*
* @private
* @param {Function} func The function to wrap.
* @param {Function} transform The argument transform.
* @returns {Function} Returns the new function.
*/
function overArg(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
/** Used for built-in method references. */
var objectProto$1 = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto$1.hasOwnProperty;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString$1 = objectProto$1.toString;
/** Built-in value references. */
var propertyIsEnumerable = objectProto$1.propertyIsEnumerable;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object);
/**
* Creates an array of the enumerable property names of the array-like `value`.
*
* @private
* @param {*} value The value to query.
* @param {boolean} inherited Specify returning inherited property names.
* @returns {Array} Returns the array of property names.
*/
function arrayLikeKeys(value, inherited) {
// Safari 8.1 makes `arguments.callee` enumerable in strict mode.
// Safari 9 makes `arguments.length` enumerable in strict mode.
var result = (isArray(value) || isArguments(value))
? baseTimes(value.length, String)
: [];
var length = result.length,
skipIndexes = !!length;
for (var key in value) {
if ((inherited || hasOwnProperty.call(value, key)) &&
!(skipIndexes && (key == 'length' || isIndex(key, length)))) {
result.push(key);
}
}
return result;
}
/**
* The base implementation of `_.forEach` without support for iteratee shorthands.
*
* @private
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object} Returns `collection`.
*/
var baseEach = createBaseEach(baseForOwn);
/**
* The base implementation of `baseForOwn` which iterates over `object`
* properties returned by `keysFunc` and invokes `iteratee` for each property.
* Iteratee functions may exit iteration early by explicitly returning `false`.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
var baseFor = createBaseFor();
/**
* The base implementation of `_.forOwn` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForOwn(object, iteratee) {
return object && baseFor(object, iteratee, keys);
}
/**
* The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function baseKeys(object) {
if (!isPrototype(object)) {
return nativeKeys(object);
}
var result = [];
for (var key in Object(object)) {
if (hasOwnProperty.call(object, key) && key != 'constructor') {
result.push(key);
}
}
return result;
}
/**
* Creates a `baseEach` or `baseEachRight` function.
*
* @private
* @param {Function} eachFunc The function to iterate over a collection.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee);
}
var length = collection.length,
index = fromRight ? length : -1,
iterable = Object(collection);
while ((fromRight ? index-- : ++index < length)) {
if (iteratee(iterable[index], index, iterable) === false) {
break;
}
}
return collection;
};
}
/**
* Creates a base function for methods like `_.forIn` and `_.forOwn`.
*
* @private
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var index = -1,
iterable = Object(object),
props = keysFunc(object),
length = props.length;
while (length--) {
var key = props[fromRight ? length : ++index];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
length = length == null ? MAX_SAFE_INTEGER : length;
return !!length &&
(typeof value == 'number' || reIsUint.test(value)) &&
(value > -1 && value % 1 == 0 && value < length);
}
/**
* Checks if `value` is likely a prototype object.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$1;
return value === proto;
}
/**
* Iterates over elements of `collection` and invokes `iteratee` for each element.
* The iteratee is invoked with three arguments: (value, index|key, collection).
* Iteratee functions may exit iteration early by explicitly returning `false`.
*
* **Note:** As with other "Collections" methods, objects with a "length"
* property are iterated like arrays. To avoid this behavior use `_.forIn`
* or `_.forOwn` for object iteration.
*
* @static
* @memberOf _
* @since 0.1.0
* @alias each
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Array|Object} Returns `collection`.
* @see _.forEachRight
* @example
*
* _([1, 2]).forEach(function(value) {
* console.log(value);
* });
* // => Logs `1` then `2`.
*
* _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
* console.log(key);
* });
* // => Logs 'a' then 'b' (iteration order is not guaranteed).
*/
function forEach(collection, iteratee) {
var func = isArray(collection) ? arrayEach : baseEach;
return func(collection, typeof iteratee == 'function' ? iteratee : identity);
}
/**
* Checks if `value` is likely an `arguments` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
* else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
// Safari 8.1 makes `arguments.callee` enumerable in strict mode.
return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
(!propertyIsEnumerable.call(value, 'callee') || objectToString$1.call(value) == argsTag);
}
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(document.body.children);
* // => false
*
* _.isArray('abc');
* // => false
*
* _.isArray(_.noop);
* // => false
*/
var isArray = Array.isArray;
/**
* Checks if `value` is array-like. A value is considered array-like if it's
* not a function and has a `value.length` that's an integer greater than or
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
* @example
*
* _.isArrayLike([1, 2, 3]);
* // => true
*
* _.isArrayLike(document.body.children);
* // => true
*
* _.isArrayLike('abc');
* // => true
*
* _.isArrayLike(_.noop);
* // => false
*/
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction(value);
}
/**
* This method is like `_.isArrayLike` except that it also checks if `value`
* is an object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array-like object,
* else `false`.
* @example
*
* _.isArrayLikeObject([1, 2, 3]);
* // => true
*
* _.isArrayLikeObject(document.body.children);
* // => true
*
* _.isArrayLikeObject('abc');
* // => false
*
* _.isArrayLikeObject(_.noop);
* // => false
*/
function isArrayLikeObject(value) {
return isObjectLike$1(value) && isArrayLike(value);
}
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 8-9 which returns 'object' for typed array and other constructors.
var tag = isObject$1(value) ? objectToString$1.call(value) : '';
return tag == funcTag || tag == genTag;
}
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This method is loosely based on
* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
* @example
*
* _.isLength(3);
* // => true
*
* _.isLength(Number.MIN_VALUE);
* // => false
*
* _.isLength(Infinity);
* // => false
*
* _.isLength('3');
* // => false
*/
function isLength(value) {
return typeof value == 'number' &&
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject$1(value) {
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike$1(value) {
return !!value && typeof value == 'object';
}
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
* for more details.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
function keys(object) {
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}
/**
* This method returns the first argument it receives.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Util
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'a': 1 };
*
* console.log(_.identity(object) === object);
* // => true
*/
function identity(value) {
return value;
}
var lodash_foreach = forEach;
const elInViewport = el => {
if (!document.body.contains(el)) {
return false;
}
const bounds = el.getBoundingClientRect();
return bounds.top <= window.innerHeight && bounds.top + bounds.height >= 0 && bounds.left <= window.innerWidth && bounds.left + bounds.width >= 0;
};
const isAllowedOrigin = origin => /^https:\/\/trell(?:o\.com|is\.coffee)$/.test(origin);
const boardUrlRegex = /^(https:\/\/[^/]*?)\/b\/([a-zA-Z0-9]{8,24})/;
const cardUrlRegex = /^(https:\/\/[^/]*?)\/c\/([a-zA-Z0-9]{8,24})/;
const isValidId = id => /^[a-f0-9]{24}$/.test(id) || /^[a-zA-Z0-9]{8}$/.test(id);
const togglePolling = (target, targetOrigin, secret, poll) => {
if (!target || !target.contentWindow) {
return;
}
target.contentWindow.postMessage({
secret,
command: 'polling',
options: {
enabled: poll
}
}, targetOrigin);
};
class TrelloBoards {
constructor() {
this.version = 'BUILD_VERSION';
if (document.readyState === 'complete') {
this.load();
} else {
window.addEventListener('load', () => this.load());
}
}
// eslint-disable-next-line class-methods-use-this
createBoardIframe(host, id, name, compact) {
let opts = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
const iframe = document.createElement('iframe');
const targetOrigin = encodeURIComponent(window.location.origin);
const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
const secret = Array(24).join().split(',').map(() => alphabet.charAt(Math.floor(Math.random() * alphabet.length))).join('');
iframe.src = `${host}/embed/board?` + `id=${id}&targetOrigin=${targetOrigin}&secret=${secret}&compact=${compact === true}`;
iframe.width = 248;
iframe.height = compact ? 185 : 218;
iframe.style.border = 'none';
iframe.style.overflow = 'hidden';
iframe.className = 'trello-board trello-board-rendered';
if (compact) {
iframe.classList.add('trello-board-compact');
}
if (opts && opts.apiToken && opts.apiKey) {
const {
apiKey,
apiToken
} = opts;
iframe.name = JSON.stringify({
apiKey,
apiToken
});
}
return iframe;
}
create(idOrUrl, el) {
let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
const {
apiKey,
apiToken
} = opts;
let host = 'https://trello.com';
let id = idOrUrl;
if (boardUrlRegex.test(id)) {
const parsed = boardUrlRegex.exec(id);
if (!parsed || !parsed[1] || !parsed[2]) {
throw new Error('Invalid Trello board url');
}
[, host, id] = parsed;
}
if (!isValidId(id)) {
// this doesn't look like an id to us
throw new Error('Invalid Trello board id');
}
const iframe = this.createBoardIframe(host, id, 'Trello Board', true, {
apiKey,
apiToken
});
el.appendChild(iframe);
}
load(el) {
let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
allAnchors: false
};
const {
allAnchors,
apiKey,
apiToken
} = opts;
const selector = allAnchors ? 'a' : 'blockquote.trello-board-compact>a';
const boardPlaceholders = (el || document).querySelectorAll(selector);
lodash_foreach(boardPlaceholders, anchor => {
const {
href
} = anchor;
const parsed = boardUrlRegex.exec(href);
if (!parsed || !parsed[1] || !parsed[2]) {
return;
}
const host = parsed[1];
const id = parsed[2];
const name = anchor.innerText;
const isCompact = true;
const iframe = this.createBoardIframe(host, id, name, isCompact, {
apiKey,
apiToken
});
if (allAnchors) {
// replace the anchor
anchor.parentNode.replaceChild(iframe, anchor);
} else {
// replace the blockquote
const blockquote = anchor.parentNode;
blockquote.parentNode.replaceChild(iframe, blockquote);
}
});
}
}
/**
* lodash (Custom Build)
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors
* Released under MIT license
* Based on Underscore.js 1.8.3
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/** Used as references for various `Number` constants. */
var NAN = 0 / 0;
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;
/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;
/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;
/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
nativeMin = Math.min;
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
*
* @static
* @memberOf _
* @since 2.4.0
* @category Date
* @returns {number} Returns the timestamp.
* @example
*
* _.defer(function(stamp) {
* console.log(_.now() - stamp);
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
var now = function() {
return root.Date.now();
};
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
* invoked. The debounced function comes with a `cancel` method to cancel
* delayed `func` invocations and a `flush` method to immediately invoke them.
* Provide `options` to indicate whether `func` should be invoked on the
* leading and/or trailing edge of the `wait` timeout. The `func` is invoked
* with the last arguments provided to the debounced function. Subsequent
* calls to the debounced function return the result of the last `func`
* invocation.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is
* invoked on the trailing edge of the timeout only if the debounced function
* is invoked more than once during the `wait` timeout.
*
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
*
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
* for details over the differences between `_.debounce` and `_.throttle`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to debounce.
* @param {number} [wait=0] The number of milliseconds to delay.
* @param {Object} [options={}] The options object.
* @param {boolean} [options.leading=false]
* Specify invoking on the leading edge of the timeout.
* @param {number} [options.maxWait]
* The maximum time `func` is allowed to be delayed before it's invoked.
* @param {boolean} [options.trailing=true]
* Specify invoking on the trailing edge of the timeout.
* @returns {Function} Returns the new debounced function.
* @example
*
* // Avoid costly calculations while the window size is in flux.
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
*
* // Invoke `sendMail` when clicked, debouncing subsequent calls.
* jQuery(element).on('click', _.debounce(sendMail, 300, {
* 'leading': true,
* 'trailing': false
* }));
*
* // Ensure `batchLog` is invoked once after 1 second of debounced calls.
* var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
* var source = new EventSource('/stream');
* jQuery(source).on('message', debounced);
*
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
function debounce(func, wait, options) {
var lastArgs,
lastThis,
maxWait,
result,
timerId,
lastCallTime,
lastInvokeTime = 0,
leading = false,
maxing = false,
trailing = true;
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = toNumber(wait) || 0;
if (isObject(options)) {
leading = !!options.leading;
maxing = 'maxWait' in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
trailing = 'trailing' in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
// Reset any `maxWait` timer.
lastInvokeTime = time;
// Start the timer for the trailing edge.
timerId = setTimeout(timerExpired, wait);
// Invoke the leading edge.
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime;
// Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
(timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
}
function timerExpired() {
var time = now();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
// Restart the timer.
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = undefined;
// Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = undefined;
return result;
}
function cancel() {
if (timerId !== undefined) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
function flush() {
return timerId === undefined ? result : trailingEdge(now());
}
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return !!value && typeof value == 'object';
}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value == 'symbol' ||
(isObjectLike(value) && objectToString.call(value) == symbolTag);
}
/**
* Converts `value` to a number.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {number} Returns the number.
* @example
*
* _.toNumber(3.2);
* // => 3.2
*
* _.toNumber(Number.MIN_VALUE);
* // => 5e-324
*
* _.toNumber(Infinity);
* // => Infinity
*
* _.toNumber('3.2');
* // => 3.2
*/
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
value = isObject(other) ? (other + '') : other;
}
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
return (isBinary || reIsOctal.test(value))
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: (reIsBadHex.test(value) ? NAN : +value);
}
var lodash_debounce = debounce;
class TrelloCards {
constructor() {
this.version = 'BUILD_VERSION';
this.activeCards = {};
const receiveMessage = event => {
if (!isAllowedOrigin(event.origin)) {
return;
}
if (event.data.command === 'resize' && event.data.secret) {
const card = this.activeCards[event.data.secret];
if (!card || !card.el) {
return;
}
const newHeight = event.data.options.height;
if (newHeight !== undefined) {
card.el.height = newHeight;
if (typeof this.onResize === 'function') {
this.onResize({
height: event.data.options.height,
width: parseInt(card.el.width, 10)
});
}
}
togglePolling(card.el, event.origin, event.data.secret, elInViewport(card.el));
}
};
window.addEventListener('message', receiveMessage, false);
window.addEventListener('resize', lodash_debounce(() => this.reassessVisibility(), 1000));
window.addEventListener('scroll', lodash_debounce(() => this.reassessVisibility(), 1000));
if (document.readyState === 'complete') {
this.load();
} else {
window.addEventListener('load', () => this.load());
}
}
reassessVisibility() {
lodash_foreach(this.activeCards, (card, secret) => {
const {
el,
host
} = card;
if (document.body.contains(el)) {
togglePolling(el, host, secret, elInViewport(el));
}
});
}
createCardIframe(host, id, name, compact) {
let opts = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
const iframe = document.createElement('iframe');
const targetOrigin = encodeURIComponent(window.location.origin);
const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
const secret = Array(24).join().split(',').map(() => alphabet.charAt(Math.floor(Math.random() * alphabet.length))).join('');
iframe.src = `${host}/embed/card?` + `id=${id}&targetOrigin=${targetOrigin}&secret=${secret}&compact=${compact === true}`;
iframe.width = 316;
iframe.height = 152;
iframe.style.border = 'none';
iframe.style.overflow = 'hidden';
iframe.className = 'trello-card trello-card-rendered';
if (compact) {
iframe.classList.add('trello-card-compact');
}
if (opts && opts.apiToken && opts.apiKey) {
const {
apiKey,
apiToken
} = opts;
iframe.name = JSON.stringify({
apiKey,
apiToken
});
}
iframe.onload = opts.onLoad;
this.activeCards[secret] = {
el: iframe,
host
};
return iframe;
}
create(idOrUrl, el) {
let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
compact: false
};
const {
compact,
apiKey,
apiToken,
onLoad,
onResize
} = opts;
let host = 'https://trello.com';
let id = idOrUrl;
if (cardUrlRegex.test(id)) {
const parsed = cardUrlRegex.exec(id);
if (!parsed || !parsed[1] || !parsed[2]) {
throw new Error('Invalid Trello card url');
}
[, host, id] = parsed;
}
if (!isValidId(id)) {
// this doesn't look like an id to us
throw new Error('Invalid Trello card id');
}
this.onResize = onResize;
const iframe = this.createCardIframe(host, id, 'Trello Card', compact, {
apiKey,
apiToken,
onLoad
});
el.appendChild(iframe);
}
load(el) {
let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
compact: false,
allAnchors: false
};
const {
allAnchors,
compact,
apiToken,
apiKey
} = opts;
const selector = allAnchors ? 'a' : 'blockquote.trello-card>a, blockquote.trello-card-compact>a';
const cardPlaceholders = (el || document).querySelectorAll(selector);
lodash_foreach(cardPlaceholders, anchor => {
const {
href
} = anchor;
const parsed = cardUrlRegex.exec(href);
if (!parsed || !parsed[1] || !parsed[2]) {
return;
}
const host = parsed[1];
const id = parsed[2];
const name = anchor.innerText;
const isCompact = compact === true || anchor.parentElement.classList.contains('trello-card-compact');
const iframe = this.createCardIframe(host, id, name, isCompact, {
apiKey,
apiToken
});
if (allAnchors) {
// replace the anchor
anchor.parentNode.replaceChild(iframe, anchor);
} else {
// replace the blockquote
const blockquote = anchor.parentNode;
blockquote.parentNode.replaceChild(iframe, blockquote);
}
});
}
}
// Attach our handlers to the window object if they aren't already there
if (!window.TrelloCards) {
window.TrelloCards = new TrelloCards();
}
if (!window.TrelloBoards) {
window.TrelloBoards = new TrelloBoards();
}
}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWQuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2guZm9yZWFjaC9pbmRleC5qcyIsIi4uL3NyYy9lbWJlZC91dGlscy5qcyIsIi4uL3NyYy9lbWJlZC9ib2FyZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLmRlYm91bmNlL2luZGV4LmpzIiwiLi4vc3JjL2VtYmVkL2NhcmRzLmpzIiwiLi4vc3JjL2VtYmVkL2VtYmVkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIC8vIFNhZmFyaSA5IG1ha2VzIGBhcmd1bWVudHMubGVuZ3RoYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICB2YXIgcmVzdWx0ID0gKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSlcbiAgICA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZylcbiAgICA6IFtdO1xuXG4gIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChrZXkgPT0gJ2xlbmd0aCcgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqL1xudmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpICYmXG4gICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LlxuICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAqIG9yIGBfLmZvck93bmAgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGFsaWFzIGVhY2hcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICogQHNlZSBfLmZvckVhY2hSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfKFsxLCAyXSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICpcbiAqIF8uZm9yRWFjaCh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAqICAgY29uc29sZS5sb2coa2V5KTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoIDogYmFzZUVhY2g7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gaXRlcmF0ZWUgOiBpZGVudGl0eSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2g7XG4iLCJleHBvcnQgY29uc3QgZWxJblZpZXdwb3J0ID0gKGVsKSA9PiB7XG4gIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgYm91bmRzID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgcmV0dXJuIChcbiAgICBib3VuZHMudG9wIDw9IHdpbmRvdy5pbm5lckhlaWdodCAmJlxuICAgIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IDAgJiZcbiAgICBib3VuZHMubGVmdCA8PSB3aW5kb3cuaW5uZXJXaWR0aCAmJlxuICAgIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IDBcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0FsbG93ZWRPcmlnaW4gPSAob3JpZ2luKSA9PiAvXmh0dHBzOlxcL1xcL3RyZWxsKD86b1xcLmNvbXxpc1xcLmNvZmZlZSkkLy50ZXN0KG9yaWdpbik7XG5cbmV4cG9ydCBjb25zdCBib2FyZFVybFJlZ2V4ID0gL14oaHR0cHM6XFwvXFwvW14vXSo/KVxcL2JcXC8oW2EtekEtWjAtOV17OCwyNH0pLztcbmV4cG9ydCBjb25zdCBjYXJkVXJsUmVnZXggPSAvXihodHRwczpcXC9cXC9bXi9dKj8pXFwvY1xcLyhbYS16QS1aMC05XXs4LDI0fSkvO1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZElkID0gKGlkKSA9PiAvXlthLWYwLTldezI0fSQvLnRlc3QoaWQpIHx8IC9eW2EtekEtWjAtOV17OH0kLy50ZXN0KGlkKTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZVBvbGxpbmcgPSAodGFyZ2V0LCB0YXJnZXRPcmlnaW4sIHNlY3JldCwgcG9sbCkgPT4ge1xuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNvbnRlbnRXaW5kb3cpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGFyZ2V0LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoXG4gICAge1xuICAgICAgc2VjcmV0LFxuICAgICAgY29tbWFuZDogJ3BvbGxpbmcnLFxuICAgICAgb3B0aW9uczogeyBlbmFibGVkOiBwb2xsIH0sXG4gICAgfSxcbiAgICB0YXJnZXRPcmlnaW5cbiAgKTtcbn07XG4iLCJpbXBvcnQgZm9yRWFjaCBmcm9tICdsb2Rhc2guZm9yZWFjaCc7XG5cbmltcG9ydCB7IGJvYXJkVXJsUmVnZXgsIGlzVmFsaWRJZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmVsbG9Cb2FyZHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSAnQlVJTERfVkVSU0lPTic7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIHRoaXMubG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHRoaXMubG9hZCgpKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBjcmVhdGVCb2FyZElmcmFtZShob3N0LCBpZCwgbmFtZSwgY29tcGFjdCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgY29uc3QgdGFyZ2V0T3JpZ2luID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuXG4gICAgY29uc3QgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknO1xuICAgIGNvbnN0IHNlY3JldCA9IEFycmF5KDI0KVxuICAgICAgLmpvaW4oKVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoKCkgPT4gYWxwaGFiZXQuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFscGhhYmV0Lmxlbmd0aCkpKVxuICAgICAgLmpvaW4oJycpO1xuXG4gICAgaWZyYW1lLnNyYyA9XG4gICAgICBgJHtob3N0fS9lbWJlZC9ib2FyZD9gICtcbiAgICAgIGBpZD0ke2lkfSZ0YXJnZXRPcmlnaW49JHt0YXJnZXRPcmlnaW59JnNlY3JldD0ke3NlY3JldH0mY29tcGFjdD0ke2NvbXBhY3QgPT09IHRydWV9YDtcbiAgICBpZnJhbWUud2lkdGggPSAyNDg7XG4gICAgaWZyYW1lLmhlaWdodCA9IGNvbXBhY3QgPyAxODUgOiAyMTg7XG4gICAgaWZyYW1lLnN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgICBpZnJhbWUuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBpZnJhbWUuY2xhc3NOYW1lID0gJ3RyZWxsby1ib2FyZCB0cmVsbG8tYm9hcmQtcmVuZGVyZWQnO1xuICAgIGlmIChjb21wYWN0KSB7XG4gICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZCgndHJlbGxvLWJvYXJkLWNvbXBhY3QnKTtcbiAgICB9XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5hcGlUb2tlbiAmJiBvcHRzLmFwaUtleSkge1xuICAgICAgY29uc3QgeyBhcGlLZXksIGFwaVRva2VuIH0gPSBvcHRzO1xuICAgICAgaWZyYW1lLm5hbWUgPSBKU09OLnN0cmluZ2lmeSh7IGFwaUtleSwgYXBpVG9rZW4gfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlmcmFtZTtcbiAgfVxuXG4gIGNyZWF0ZShpZE9yVXJsLCBlbCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgeyBhcGlLZXksIGFwaVRva2VuIH0gPSBvcHRzO1xuICAgIGxldCBob3N0ID0gJ2h0dHBzOi8vdHJlbGxvLmNvbSc7XG5cbiAgICBsZXQgaWQgPSBpZE9yVXJsO1xuICAgIGlmIChib2FyZFVybFJlZ2V4LnRlc3QoaWQpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBib2FyZFVybFJlZ2V4LmV4ZWMoaWQpO1xuICAgICAgaWYgKCFwYXJzZWQgfHwgIXBhcnNlZFsxXSB8fCAhcGFyc2VkWzJdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBUcmVsbG8gYm9hcmQgdXJsJyk7XG4gICAgICB9XG4gICAgICBbLCBob3N0LCBpZF0gPSBwYXJzZWQ7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZElkKGlkKSkge1xuICAgICAgLy8gdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhbiBpZCB0byB1c1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFRyZWxsbyBib2FyZCBpZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuY3JlYXRlQm9hcmRJZnJhbWUoaG9zdCwgaWQsICdUcmVsbG8gQm9hcmQnLCB0cnVlLCB7IGFwaUtleSwgYXBpVG9rZW4gfSk7XG5cbiAgICBlbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICB9XG5cbiAgbG9hZChlbCwgb3B0cyA9IHsgYWxsQW5jaG9yczogZmFsc2UgfSkge1xuICAgIGNvbnN0IHsgYWxsQW5jaG9ycywgYXBpS2V5LCBhcGlUb2tlbiB9ID0gb3B0cztcbiAgICBjb25zdCBzZWxlY3RvciA9IGFsbEFuY2hvcnMgPyAnYScgOiAnYmxvY2txdW90ZS50cmVsbG8tYm9hcmQtY29tcGFjdD5hJztcbiAgICBjb25zdCBib2FyZFBsYWNlaG9sZGVycyA9IChlbCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cbiAgICBmb3JFYWNoKGJvYXJkUGxhY2Vob2xkZXJzLCAoYW5jaG9yKSA9PiB7XG4gICAgICBjb25zdCB7IGhyZWYgfSA9IGFuY2hvcjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGJvYXJkVXJsUmVnZXguZXhlYyhocmVmKTtcbiAgICAgIGlmICghcGFyc2VkIHx8ICFwYXJzZWRbMV0gfHwgIXBhcnNlZFsyXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBob3N0ID0gcGFyc2VkWzFdO1xuICAgICAgY29uc3QgaWQgPSBwYXJzZWRbMl07XG4gICAgICBjb25zdCBuYW1lID0gYW5jaG9yLmlubmVyVGV4dDtcbiAgICAgIGNvbnN0IGlzQ29tcGFjdCA9IHRydWU7XG4gICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLmNyZWF0ZUJvYXJkSWZyYW1lKGhvc3QsIGlkLCBuYW1lLCBpc0NvbXBhY3QsIHsgYXBpS2V5LCBhcGlUb2tlbiB9KTtcblxuICAgICAgaWYgKGFsbEFuY2hvcnMpIHtcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgYW5jaG9yXG4gICAgICAgIGFuY2hvci5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChpZnJhbWUsIGFuY2hvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZXBsYWNlIHRoZSBibG9ja3F1b3RlXG4gICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBhbmNob3IucGFyZW50Tm9kZTtcbiAgICAgICAgYmxvY2txdW90ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChpZnJhbWUsIGJsb2NrcXVvdGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG4iLCJpbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCBmb3JFYWNoIGZyb20gJ2xvZGFzaC5mb3JlYWNoJztcblxuaW1wb3J0IHsgY2FyZFVybFJlZ2V4LCBlbEluVmlld3BvcnQsIGlzQWxsb3dlZE9yaWdpbiwgaXNWYWxpZElkLCB0b2dnbGVQb2xsaW5nIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyZWxsb0NhcmRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gJ0JVSUxEX1ZFUlNJT04nO1xuICAgIHRoaXMuYWN0aXZlQ2FyZHMgPSB7fTtcblxuICAgIGNvbnN0IHJlY2VpdmVNZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzQWxsb3dlZE9yaWdpbihldmVudC5vcmlnaW4pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmRhdGEuY29tbWFuZCA9PT0gJ3Jlc2l6ZScgJiYgZXZlbnQuZGF0YS5zZWNyZXQpIHtcbiAgICAgICAgY29uc3QgY2FyZCA9IHRoaXMuYWN0aXZlQ2FyZHNbZXZlbnQuZGF0YS5zZWNyZXRdO1xuICAgICAgICBpZiAoIWNhcmQgfHwgIWNhcmQuZWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gZXZlbnQuZGF0YS5vcHRpb25zLmhlaWdodDtcbiAgICAgICAgaWYgKG5ld0hlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2FyZC5lbC5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVzaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzaXplKHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBldmVudC5kYXRhLm9wdGlvbnMuaGVpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aDogcGFyc2VJbnQoY2FyZC5lbC53aWR0aCwgMTApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVBvbGxpbmcoY2FyZC5lbCwgZXZlbnQub3JpZ2luLCBldmVudC5kYXRhLnNlY3JldCwgZWxJblZpZXdwb3J0KGNhcmQuZWwpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZWNlaXZlTWVzc2FnZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ3Jlc2l6ZScsXG4gICAgICBkZWJvdW5jZSgoKSA9PiB0aGlzLnJlYXNzZXNzVmlzaWJpbGl0eSgpLCAxMDAwKVxuICAgICk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnc2Nyb2xsJyxcbiAgICAgIGRlYm91bmNlKCgpID0+IHRoaXMucmVhc3Nlc3NWaXNpYmlsaXR5KCksIDEwMDApXG4gICAgKTtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5sb2FkKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlYXNzZXNzVmlzaWJpbGl0eSgpIHtcbiAgICBmb3JFYWNoKHRoaXMuYWN0aXZlQ2FyZHMsIChjYXJkLCBzZWNyZXQpID0+IHtcbiAgICAgIGNvbnN0IHsgZWwsIGhvc3QgfSA9IGNhcmQ7XG4gICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCkpIHtcbiAgICAgICAgdG9nZ2xlUG9sbGluZyhlbCwgaG9zdCwgc2VjcmV0LCBlbEluVmlld3BvcnQoZWwpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgY2FyZCBpcyBub3QgaW4gdGhlIERPTVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlQ2FyZElmcmFtZShob3N0LCBpZCwgbmFtZSwgY29tcGFjdCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgY29uc3QgdGFyZ2V0T3JpZ2luID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuXG4gICAgY29uc3QgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknO1xuICAgIGNvbnN0IHNlY3JldCA9IEFycmF5KDI0KVxuICAgICAgLmpvaW4oKVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoKCkgPT4gYWxwaGFiZXQuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFscGhhYmV0Lmxlbmd0aCkpKVxuICAgICAgLmpvaW4oJycpO1xuXG4gICAgaWZyYW1lLnNyYyA9XG4gICAgICBgJHtob3N0fS9lbWJlZC9jYXJkP2AgK1xuICAgICAgYGlkPSR7aWR9JnRhcmdldE9yaWdpbj0ke3RhcmdldE9yaWdpbn0mc2VjcmV0PSR7c2VjcmV0fSZjb21wYWN0PSR7Y29tcGFjdCA9PT0gdHJ1ZX1gO1xuICAgIGlmcmFtZS53aWR0aCA9IDMxNjtcbiAgICBpZnJhbWUuaGVpZ2h0ID0gMTUyO1xuICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSAnbm9uZSc7XG4gICAgaWZyYW1lLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgaWZyYW1lLmNsYXNzTmFtZSA9ICd0cmVsbG8tY2FyZCB0cmVsbG8tY2FyZC1yZW5kZXJlZCc7XG4gICAgaWYgKGNvbXBhY3QpIHtcbiAgICAgIGlmcmFtZS5jbGFzc0xpc3QuYWRkKCd0cmVsbG8tY2FyZC1jb21wYWN0Jyk7XG4gICAgfVxuICAgIGlmIChvcHRzICYmIG9wdHMuYXBpVG9rZW4gJiYgb3B0cy5hcGlLZXkpIHtcbiAgICAgIGNvbnN0IHsgYXBpS2V5LCBhcGlUb2tlbiB9ID0gb3B0cztcbiAgICAgIGlmcmFtZS5uYW1lID0gSlNPTi5zdHJpbmdpZnkoeyBhcGlLZXksIGFwaVRva2VuIH0pO1xuICAgIH1cbiAgICBpZnJhbWUub25sb2FkID0gb3B0cy5vbkxvYWQ7XG5cbiAgICB0aGlzLmFjdGl2ZUNhcmRzW3NlY3JldF0gPSB7IGVsOiBpZnJhbWUsIGhvc3QgfTtcblxuICAgIHJldHVybiBpZnJhbWU7XG4gIH1cblxuICBjcmVhdGUoaWRPclVybCwgZWwsIG9wdHMgPSB7IGNvbXBhY3Q6IGZhbHNlIH0pIHtcbiAgICBjb25zdCB7IGNvbXBhY3QsIGFwaUtleSwgYXBpVG9rZW4sIG9uTG9hZCwgb25SZXNpemUgfSA9IG9wdHM7XG5cbiAgICBsZXQgaG9zdCA9ICdodHRwczovL3RyZWxsby5jb20nO1xuXG4gICAgbGV0IGlkID0gaWRPclVybDtcbiAgICBpZiAoY2FyZFVybFJlZ2V4LnRlc3QoaWQpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBjYXJkVXJsUmVnZXguZXhlYyhpZCk7XG4gICAgICBpZiAoIXBhcnNlZCB8fCAhcGFyc2VkWzFdIHx8ICFwYXJzZWRbMl0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFRyZWxsbyBjYXJkIHVybCcpO1xuICAgICAgfVxuICAgICAgWywgaG9zdCwgaWRdID0gcGFyc2VkO1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRJZChpZCkpIHtcbiAgICAgIC8vIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYW4gaWQgdG8gdXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBUcmVsbG8gY2FyZCBpZCcpO1xuICAgIH1cbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XG5cbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLmNyZWF0ZUNhcmRJZnJhbWUoaG9zdCwgaWQsICdUcmVsbG8gQ2FyZCcsIGNvbXBhY3QsIHtcbiAgICAgIGFwaUtleSxcbiAgICAgIGFwaVRva2VuLFxuICAgICAgb25Mb2FkLFxuICAgIH0pO1xuXG4gICAgZWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgfVxuXG4gIGxvYWQoZWwsIG9wdHMgPSB7IGNvbXBhY3Q6IGZhbHNlLCBhbGxBbmNob3JzOiBmYWxzZSB9KSB7XG4gICAgY29uc3QgeyBhbGxBbmNob3JzLCBjb21wYWN0LCBhcGlUb2tlbiwgYXBpS2V5IH0gPSBvcHRzO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYWxsQW5jaG9yc1xuICAgICAgPyAnYSdcbiAgICAgIDogJ2Jsb2NrcXVvdGUudHJlbGxvLWNhcmQ+YSwgYmxvY2txdW90ZS50cmVsbG8tY2FyZC1jb21wYWN0PmEnO1xuICAgIGNvbnN0IGNhcmRQbGFjZWhvbGRlcnMgPSAoZWwgfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuXG4gICAgZm9yRWFjaChjYXJkUGxhY2Vob2xkZXJzLCAoYW5jaG9yKSA9PiB7XG4gICAgICBjb25zdCB7IGhyZWYgfSA9IGFuY2hvcjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGNhcmRVcmxSZWdleC5leGVjKGhyZWYpO1xuICAgICAgaWYgKCFwYXJzZWQgfHwgIXBhcnNlZFsxXSB8fCAhcGFyc2VkWzJdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhvc3QgPSBwYXJzZWRbMV07XG4gICAgICBjb25zdCBpZCA9IHBhcnNlZFsyXTtcbiAgICAgIGNvbnN0IG5hbWUgPSBhbmNob3IuaW5uZXJUZXh0O1xuICAgICAgY29uc3QgaXNDb21wYWN0ID1cbiAgICAgICAgY29tcGFjdCA9PT0gdHJ1ZSB8fCBhbmNob3IucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3RyZWxsby1jYXJkLWNvbXBhY3QnKTtcbiAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuY3JlYXRlQ2FyZElmcmFtZShob3N0LCBpZCwgbmFtZSwgaXNDb21wYWN0LCB7IGFwaUtleSwgYXBpVG9rZW4gfSk7XG5cbiAgICAgIGlmIChhbGxBbmNob3JzKSB7XG4gICAgICAgIC8vIHJlcGxhY2UgdGhlIGFuY2hvclxuICAgICAgICBhbmNob3IucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaWZyYW1lLCBhbmNob3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgYmxvY2txdW90ZVxuICAgICAgICBjb25zdCBibG9ja3F1b3RlID0gYW5jaG9yLnBhcmVudE5vZGU7XG4gICAgICAgIGJsb2NrcXVvdGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaWZyYW1lLCBibG9ja3F1b3RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFRyZWxsb0JvYXJkcyBmcm9tICcuL2JvYXJkcyc7XG5pbXBvcnQgVHJlbGxvQ2FyZHMgZnJvbSAnLi9jYXJkcyc7XG5cbi8vIEF0dGFjaCBvdXIgaGFuZGxlcnMgdG8gdGhlIHdpbmRvdyBvYmplY3QgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeSB0aGVyZVxuaWYgKCF3aW5kb3cuVHJlbGxvQ2FyZHMpIHtcbiAgd2luZG93LlRyZWxsb0NhcmRzID0gbmV3IFRyZWxsb0NhcmRzKCk7XG59XG5pZiAoIXdpbmRvdy5UcmVsbG9Cb2FyZHMpIHtcbiAgd2luZG93LlRyZWxsb0JvYXJkcyA9IG5ldyBUcmVsbG9Cb2FyZHMoKTtcbn1cbiJdLCJuYW1lcyI6WyJvYmplY3RQcm90byIsIm9iamVjdFRvU3RyaW5nIiwiaXNPYmplY3RMaWtlIiwiaXNPYmplY3QiLCJlbEluVmlld3BvcnQiLCJlbCIsImRvY3VtZW50IiwiYm9keSIsImNvbnRhaW5zIiwiYm91bmRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG9wIiwid2luZG93IiwiaW5uZXJIZWlnaHQiLCJoZWlnaHQiLCJsZWZ0IiwiaW5uZXJXaWR0aCIsIndpZHRoIiwiaXNBbGxvd2VkT3JpZ2luIiwib3JpZ2luIiwidGVzdCIsImJvYXJkVXJsUmVnZXgiLCJjYXJkVXJsUmVnZXgiLCJpc1ZhbGlkSWQiLCJpZCIsInRvZ2dsZVBvbGxpbmciLCJ0YXJnZXQiLCJ0YXJnZXRPcmlnaW4iLCJzZWNyZXQiLCJwb2xsIiwiY29udGVudFdpbmRvdyIsInBvc3RNZXNzYWdlIiwiY29tbWFuZCIsIm9wdGlvbnMiLCJlbmFibGVkIiwiVHJlbGxvQm9hcmRzIiwiY29uc3RydWN0b3IiLCJ2ZXJzaW9uIiwicmVhZHlTdGF0ZSIsImxvYWQiLCJhZGRFdmVudExpc3RlbmVyIiwiY3JlYXRlQm9hcmRJZnJhbWUiLCJob3N0IiwibmFtZSIsImNvbXBhY3QiLCJvcHRzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaWZyYW1lIiwiY3JlYXRlRWxlbWVudCIsImVuY29kZVVSSUNvbXBvbmVudCIsImxvY2F0aW9uIiwiYWxwaGFiZXQiLCJBcnJheSIsImpvaW4iLCJzcGxpdCIsIm1hcCIsImNoYXJBdCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInNyYyIsInN0eWxlIiwiYm9yZGVyIiwib3ZlcmZsb3ciLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJhZGQiLCJhcGlUb2tlbiIsImFwaUtleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVhdGUiLCJpZE9yVXJsIiwicGFyc2VkIiwiZXhlYyIsIkVycm9yIiwiYXBwZW5kQ2hpbGQiLCJhbGxBbmNob3JzIiwic2VsZWN0b3IiLCJib2FyZFBsYWNlaG9sZGVycyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiYW5jaG9yIiwiaHJlZiIsImlubmVyVGV4dCIsImlzQ29tcGFjdCIsInBhcmVudE5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJibG9ja3F1b3RlIiwiZ2xvYmFsIiwiVHJlbGxvQ2FyZHMiLCJhY3RpdmVDYXJkcyIsInJlY2VpdmVNZXNzYWdlIiwiZXZlbnQiLCJkYXRhIiwiY2FyZCIsIm5ld0hlaWdodCIsIm9uUmVzaXplIiwicGFyc2VJbnQiLCJkZWJvdW5jZSIsInJlYXNzZXNzVmlzaWJpbGl0eSIsImNyZWF0ZUNhcmRJZnJhbWUiLCJvbmxvYWQiLCJvbkxvYWQiLCJjYXJkUGxhY2Vob2xkZXJzIiwicGFyZW50RWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztDQVNBO0NBQ0EsSUFBSSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUN4QztDQUNBO0NBQ0EsSUFBSSxPQUFPLEdBQUcsb0JBQW9CO0NBQ2xDLElBQUksT0FBTyxHQUFHLG1CQUFtQjtDQUNqQyxJQUFJLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQztBQUMxQztDQUNBO0NBQ0EsSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUM7QUFDbEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO0NBQ3BDLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN4QztDQUNBLEVBQUUsT0FBTyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUU7Q0FDM0IsSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRTtDQUN4RCxNQUFNLE1BQU07Q0FDWixLQUFLO0NBQ0wsR0FBRztDQUNILEVBQUUsT0FBTyxLQUFLLENBQUM7Q0FDZixDQUFDO0FBQ0Q7Q0FDQTtDQUNBO0NBQ0E7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