(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("Muxy", [], factory); else if(typeof exports === 'object') exports["Muxy"] = factory(); else root["Muxy"] = factory(); })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 61); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { var core = module.exports = { version: '2.5.6' }; if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef /***/ }), /* 1 */ /***/ (function(module, exports) { // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func : Function('return this')(); if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { var store = __webpack_require__(30)('wks'); var uid = __webpack_require__(20); var Symbol = __webpack_require__(1).Symbol; var USE_SYMBOL = typeof Symbol == 'function'; var $exports = module.exports = function (name) { return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); }; $exports.store = store; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _defineProperty = __webpack_require__(90); var _defineProperty2 = _interopRequireDefault(_defineProperty); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; (0, _defineProperty2.default)(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var core = __webpack_require__(0); var ctx = __webpack_require__(21); var hide = __webpack_require__(10); var has = __webpack_require__(9); var PROTOTYPE = 'prototype'; var $export = function (type, name, source) { var IS_FORCED = type & $export.F; var IS_GLOBAL = type & $export.G; var IS_STATIC = type & $export.S; var IS_PROTO = type & $export.P; var IS_BIND = type & $export.B; var IS_WRAP = type & $export.W; var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); var expProto = exports[PROTOTYPE]; var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]; var key, own, out; if (IS_GLOBAL) source = name; for (key in source) { // contains in native own = !IS_FORCED && target && target[key] !== undefined; if (own && has(exports, key)) continue; // export native or passed out = own ? target[key] : source[key]; // prevent global pollution for namespaces exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] // bind timers to global for call from export context : IS_BIND && own ? ctx(out, global) // wrap global constructors for prevent change them in library : IS_WRAP && target[key] == out ? (function (C) { var F = function (a, b, c) { if (this instanceof C) { switch (arguments.length) { case 0: return new C(); case 1: return new C(a); case 2: return new C(a, b); } return new C(a, b, c); } return C.apply(this, arguments); }; F[PROTOTYPE] = C[PROTOTYPE]; return F; // make static versions for prototype methods })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% if (IS_PROTO) { (exports.virtual || (exports.virtual = {}))[key] = out; // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out); } } }; // type bitmap $export.F = 1; // forced $export.G = 2; // global $export.S = 4; // static $export.P = 8; // proto $export.B = 16; // bind $export.W = 32; // wrap $export.U = 64; // safe $export.R = 128; // real proto method for `library` module.exports = $export; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(7); var IE8_DOM_DEFINE = __webpack_require__(43); var toPrimitive = __webpack_require__(33); var dP = Object.defineProperty; exports.f = __webpack_require__(8) ? Object.defineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPrimitive(P, true); anObject(Attributes); if (IE8_DOM_DEFINE) try { return dP(O, P, Attributes); } catch (e) { /* empty */ } if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); if ('value' in Attributes) O[P] = Attributes.value; return O; }; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(11); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; }; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { // Thank's IE8 for his funny defineProperty module.exports = !__webpack_require__(13)(function () { return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /* 9 */ /***/ (function(module, exports) { var hasOwnProperty = {}.hasOwnProperty; module.exports = function (it, key) { return hasOwnProperty.call(it, key); }; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(6); var createDesc = __webpack_require__(23); module.exports = __webpack_require__(8) ? function (object, key, value) { return dP.f(object, key, createDesc(1, value)); } : function (object, key, value) { object[key] = value; return object; }; /***/ }), /* 11 */ /***/ (function(module, exports) { module.exports = function (it) { return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { // to indexed object, toObject with fallback for non-array-like ES3 strings var IObject = __webpack_require__(41); var defined = __webpack_require__(27); module.exports = function (it) { return IObject(defined(it)); }; /***/ }), /* 13 */ /***/ (function(module, exports) { module.exports = function (exec) { try { return !!exec(); } catch (e) { return true; } }; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(68), __esModule: true }; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.errorPromise = exports.CurrentEnvironment = exports.eventPatternMatch = exports.forceType = exports.consolePrint = exports.ENVIRONMENTS = undefined; var _typeof2 = __webpack_require__(56); var _typeof3 = _interopRequireDefault(_typeof2); var _promise = __webpack_require__(14); var _promise2 = _interopRequireDefault(_promise); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ProductionEnvironment = { environment: 'production' }; var SandboxDevEnvironment = { environment: 'sandbox' }; var SandboxTwitchEnvironment = { environment: 'sandbox' }; var ServerEnvironment = { environment: 'server' }; var TestingEnvironment = { environment: 'testing' }; var ENVIRONMENTS = exports.ENVIRONMENTS = { PRODUCTION: ProductionEnvironment, SANDBOX_DEV: SandboxDevEnvironment, SANDBOX_TWITCH: SandboxTwitchEnvironment, SERVER: ServerEnvironment, TESTING: TestingEnvironment }; var Util = function () { function Util() { (0, _classCallCheck3.default)(this, Util); } (0, _createClass3.default)(Util, null, [{ key: 'errorPromise', value: function errorPromise(err) { return _promise2.default.reject(err); } }, { key: 'widestLine', value: function widestLine(lines) { return Math.max.apply(null, lines.map(function (x) { return x.length; })); } }, { key: 'asciiBox', value: function asciiBox(lines) { var contentWidth = Util.widestLine(lines); var intro = ' '.repeat(contentWidth / 2) + '\uD83E\uDD8A'; var out = [intro]; out.push('\u250C' + '─'.repeat(contentWidth + 2) + '\u2510'); lines.forEach(function (line) { var paddingRight = ' '.repeat(contentWidth - line.length); out.push('| ' + line + paddingRight + ' |'); }); out.push('\u2514' + '─'.repeat(contentWidth + 2) + '\u2518'); return out; } }, { key: 'isWindowFramed', value: function isWindowFramed() { var isNotChildWindow = !window.opener; var windowTop = window.top && window != window.top; var windowParent = window.parent && window != window.parent; var hasWindowAncestors = !!(windowTop || windowParent); return isNotChildWindow && hasWindowAncestors; } }, { key: 'currentEnvironment', value: function currentEnvironment(overrideWindow) { var vWindow = void 0; if (typeof window !== 'undefined') { vWindow = window; } if (overrideWindow) { vWindow = overrideWindow; } try { if (typeof module !== 'undefined' && module.exports && typeof vWindow === 'undefined') { return ENVIRONMENTS.SERVER; } if (!Util.isWindowFramed()) { return ENVIRONMENTS.SANDBOX_DEV; } if (vWindow.location.origin.indexOf('.ext-twitch.tv') !== -1) { return ENVIRONMENTS.PRODUCTION; } if (vWindow.document.referrer && vWindow.document.referrer.indexOf('twitch.tv') !== -1) { return ENVIRONMENTS.SANDBOX_TWITCH; } if (vWindow.testing) { return ENVIRONMENTS.TESTING; } } catch (err) { Util.consolePrint(err.toString(), { type: 'error' }); } return ENVIRONMENTS.SANDBOX_DEV; } }, { key: 'consolePrint', value: function consolePrint(lines) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!lines || Util.currentEnvironment() === Util.Environments.Production) { return; } var style = 'font-family: monospace;'; var lineArr = Array.isArray(lines) ? lines : lines.split('\n'); var type = options.type || 'log'; if (options.boxed) { lineArr = Util.asciiBox(lineArr); } if (options.style) { style += options.style; } if (Util.currentEnvironment() === Util.Environments.Server) { console[type].call(this, lineArr.join('\n')); } else { console[type].call(this, '%c' + lineArr.join('\n'), style); } } }, { key: 'eventPatternMatch', value: function eventPatternMatch(input, pattern) { var inputParts = input.split(':'); var patternParts = pattern.split(':'); if (inputParts.length !== patternParts.length) { return false; } for (var i = 0; i < inputParts.length; i += 1) { if (inputParts[i] !== patternParts[i] && patternParts[i] !== '*') { return false; } } return true; } }, { key: 'forceType', value: function forceType(value, type) { var types = [].concat(type); var typeString = typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value); if (types.indexOf(typeString) === -1) { throw new TypeError('expected \'' + typeString + '\' to be one of [' + types + ']'); } } }, { key: 'Environments', get: function get() { return { Production: ProductionEnvironment, SandboxDev: SandboxDevEnvironment, SandboxTwitch: SandboxTwitchEnvironment, Server: ServerEnvironment, Testing: TestingEnvironment }; } }]); return Util; }(); exports.default = Util; var consolePrint = exports.consolePrint = Util.consolePrint; var forceType = exports.forceType = Util.forceType; var eventPatternMatch = exports.eventPatternMatch = Util.eventPatternMatch; var CurrentEnvironment = exports.CurrentEnvironment = Util.currentEnvironment; var errorPromise = exports.errorPromise = Util.errorPromise; /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = __webpack_require__(40); var enumBugKeys = __webpack_require__(31); module.exports = Object.keys || function keys(O) { return $keys(O, enumBugKeys); }; /***/ }), /* 17 */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = function (it) { return toString.call(it).slice(8, -1); }; /***/ }), /* 18 */ /***/ (function(module, exports) { module.exports = true; /***/ }), /* 19 */ /***/ (function(module, exports) { module.exports = {}; /***/ }), /* 20 */ /***/ (function(module, exports) { var id = 0; var px = Math.random(); module.exports = function (key) { return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { // optional / simple context binding var aFunction = __webpack_require__(22); module.exports = function (fn, that, length) { aFunction(fn); if (that === undefined) return fn; switch (length) { case 1: return function (a) { return fn.call(that, a); }; case 2: return function (a, b) { return fn.call(that, a, b); }; case 3: return function (a, b, c) { return fn.call(that, a, b, c); }; } return function (/* ...args */) { return fn.apply(that, arguments); }; }; /***/ }), /* 22 */ /***/ (function(module, exports) { module.exports = function (it) { if (typeof it != 'function') throw TypeError(it + ' is not a function!'); return it; }; /***/ }), /* 23 */ /***/ (function(module, exports) { module.exports = function (bitmap, value) { return { enumerable: !(bitmap & 1), configurable: !(bitmap & 2), writable: !(bitmap & 4), value: value }; }; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { var def = __webpack_require__(6).f; var has = __webpack_require__(9); var TAG = __webpack_require__(2)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); }; /***/ }), /* 25 */ /***/ (function(module, exports) { exports.f = {}.propertyIsEnumerable; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) var defined = __webpack_require__(27); module.exports = function (it) { return Object(defined(it)); }; /***/ }), /* 27 */ /***/ (function(module, exports) { // 7.2.1 RequireObjectCoercible(argument) module.exports = function (it) { if (it == undefined) throw TypeError("Can't call method on " + it); return it; }; /***/ }), /* 28 */ /***/ (function(module, exports) { // 7.1.4 ToInteger var ceil = Math.ceil; var floor = Math.floor; module.exports = function (it) { return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); }; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { var shared = __webpack_require__(30)('keys'); var uid = __webpack_require__(20); module.exports = function (key) { return shared[key] || (shared[key] = uid(key)); }; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { var core = __webpack_require__(0); var global = __webpack_require__(1); var SHARED = '__core-js_shared__'; var store = global[SHARED] || (global[SHARED] = {}); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ version: core.version, mode: __webpack_require__(18) ? 'pure' : 'global', copyright: '© 2018 Denis Pushkarev (zloirock.ru)' }); /***/ }), /* 31 */ /***/ (function(module, exports) { // IE 8- don't enum bug keys module.exports = ( 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' ).split(','); /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(11); var document = __webpack_require__(1).document; // typeof document.createElement is 'object' in old IE var is = isObject(document) && isObject(document.createElement); module.exports = function (it) { return is ? document.createElement(it) : {}; }; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.1 ToPrimitive(input [, PreferredType]) var isObject = __webpack_require__(11); // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string module.exports = function (it, S) { if (!isObject(it)) return it; var fn, val; if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; throw TypeError("Can't convert object to primitive value"); }; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 25.4.1.5 NewPromiseCapability(C) var aFunction = __webpack_require__(22); function PromiseCapability(C) { var resolve, reject; this.promise = new C(function ($$resolve, $$reject) { if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); resolve = $$resolve; reject = $$reject; }); this.resolve = aFunction(resolve); this.reject = aFunction(reject); } module.exports.f = function (C) { return new PromiseCapability(C); }; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(95), __esModule: true }; /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { exports.f = __webpack_require__(2); /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var core = __webpack_require__(0); var LIBRARY = __webpack_require__(18); var wksExt = __webpack_require__(36); var defineProperty = __webpack_require__(6).f; module.exports = function (name) { var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); }; /***/ }), /* 38 */ /***/ (function(module, exports) { exports.f = Object.getOwnPropertySymbols; /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(63), __esModule: true }; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(9); var toIObject = __webpack_require__(12); var arrayIndexOf = __webpack_require__(65)(false); var IE_PROTO = __webpack_require__(29)('IE_PROTO'); module.exports = function (object, names) { var O = toIObject(object); var i = 0; var result = []; var key; for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); // Don't enum bug & hidden keys while (names.length > i) if (has(O, key = names[i++])) { ~arrayIndexOf(result, key) || result.push(key); } return result; }; /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = __webpack_require__(17); // eslint-disable-next-line no-prototype-builtins module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { return cof(it) == 'String' ? it.split('') : Object(it); }; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.15 ToLength var toInteger = __webpack_require__(28); var min = Math.min; module.exports = function (it) { return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 }; /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { module.exports = !__webpack_require__(8) && !__webpack_require__(13)(function () { return Object.defineProperty(__webpack_require__(32)('div'), 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /* 44 */ /***/ (function(module, exports) { /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $at = __webpack_require__(69)(true); // 21.1.3.27 String.prototype[@@iterator]() __webpack_require__(46)(String, 'String', function (iterated) { this._t = String(iterated); // target this._i = 0; // next index // 21.1.5.2.1 %StringIteratorPrototype%.next() }, function () { var O = this._t; var index = this._i; var point; if (index >= O.length) return { value: undefined, done: true }; point = $at(O, index); this._i += point.length; return { value: point, done: false }; }); /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var LIBRARY = __webpack_require__(18); var $export = __webpack_require__(5); var redefine = __webpack_require__(47); var hide = __webpack_require__(10); var Iterators = __webpack_require__(19); var $iterCreate = __webpack_require__(70); var setToStringTag = __webpack_require__(24); var getPrototypeOf = __webpack_require__(72); var ITERATOR = __webpack_require__(2)('iterator'); var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` var FF_ITERATOR = '@@iterator'; var KEYS = 'keys'; var VALUES = 'values'; var returnThis = function () { return this; }; module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { $iterCreate(Constructor, NAME, next); var getMethod = function (kind) { if (!BUGGY && kind in proto) return proto[kind]; switch (kind) { case KEYS: return function keys() { return new Constructor(this, kind); }; case VALUES: return function values() { return new Constructor(this, kind); }; } return function entries() { return new Constructor(this, kind); }; }; var TAG = NAME + ' Iterator'; var DEF_VALUES = DEFAULT == VALUES; var VALUES_BUG = false; var proto = Base.prototype; var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; var $default = $native || getMethod(DEFAULT); var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; var methods, key, IteratorPrototype; // Fix native if ($anyNative) { IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { // Set @@toStringTag to native iterators setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); } } // fix Array#{values, @@iterator}.name in V8 / FF if (DEF_VALUES && $native && $native.name !== VALUES) { VALUES_BUG = true; $default = function values() { return $native.call(this); }; } // Define iterator if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { hide(proto, ITERATOR, $default); } // Plug for library Iterators[NAME] = $default; Iterators[TAG] = returnThis; if (DEFAULT) { methods = { values: DEF_VALUES ? $default : getMethod(VALUES), keys: IS_SET ? $default : getMethod(KEYS), entries: $entries }; if (FORCED) for (key in methods) { if (!(key in proto)) redefine(proto, key, methods[key]); } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); } return methods; }; /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(10); /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = __webpack_require__(7); var dPs = __webpack_require__(71); var enumBugKeys = __webpack_require__(31); var IE_PROTO = __webpack_require__(29)('IE_PROTO'); var Empty = function () { /* empty */ }; var PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype var createDict = function () { // Thrash, waste and sodomy: IE GC bug var iframe = __webpack_require__(32)('iframe'); var i = enumBugKeys.length; var lt = '<'; var gt = '>'; var iframeDocument; iframe.style.display = 'none'; __webpack_require__(49).appendChild(iframe); iframe.src = 'javascript:'; // eslint-disable-line no-script-url // createDict = iframe.contentWindow.Object; // html.removeChild(iframe); iframeDocument = iframe.contentWindow.document; iframeDocument.open(); iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); iframeDocument.close(); createDict = iframeDocument.F; while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; return createDict(); }; module.exports = Object.create || function create(O, Properties) { var result; if (O !== null) { Empty[PROTOTYPE] = anObject(O); result = new Empty(); Empty[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO] = O; } else result = createDict(); return Properties === undefined ? result : dPs(result, Properties); }; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { var document = __webpack_require__(1).document; module.exports = document && document.documentElement; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(73); var global = __webpack_require__(1); var hide = __webpack_require__(10); var Iterators = __webpack_require__(19); var TO_STRING_TAG = __webpack_require__(2)('toStringTag'); var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' + 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' + 'TextTrackList,TouchList').split(','); for (var i = 0; i < DOMIterables.length; i++) { var NAME = DOMIterables[i]; var Collection = global[NAME]; var proto = Collection && Collection.prototype; if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); Iterators[NAME] = Iterators.Array; } /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { // getting tag from 19.1.3.6 Object.prototype.toString() var cof = __webpack_require__(17); var TAG = __webpack_require__(2)('toStringTag'); // ES3 wrong here var ARG = cof(function () { return arguments; }()) == 'Arguments'; // fallback for IE11 Script Access Denied error var tryGet = function (it, key) { try { return it[key]; } catch (e) { /* empty */ } }; module.exports = function (it) { var O, T, B; return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case : ARG ? cof(O) // ES3 arguments fallback : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; }; /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { // 7.3.20 SpeciesConstructor(O, defaultConstructor) var anObject = __webpack_require__(7); var aFunction = __webpack_require__(22); var SPECIES = __webpack_require__(2)('species'); module.exports = function (O, D) { var C = anObject(O).constructor; var S; return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); }; /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(21); var invoke = __webpack_require__(82); var html = __webpack_require__(49); var cel = __webpack_require__(32); var global = __webpack_require__(1); var process = global.process; var setTask = global.setImmediate; var clearTask = global.clearImmediate; var MessageChannel = global.MessageChannel; var Dispatch = global.Dispatch; var counter = 0; var queue = {}; var ONREADYSTATECHANGE = 'onreadystatechange'; var defer, channel, port; var run = function () { var id = +this; // eslint-disable-next-line no-prototype-builtins if (queue.hasOwnProperty(id)) { var fn = queue[id]; delete queue[id]; fn(); } }; var listener = function (event) { run.call(event.data); }; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: if (!setTask || !clearTask) { setTask = function setImmediate(fn) { var args = []; var i = 1; while (arguments.length > i) args.push(arguments[i++]); queue[++counter] = function () { // eslint-disable-next-line no-new-func invoke(typeof fn == 'function' ? fn : Function(fn), args); }; defer(counter); return counter; }; clearTask = function clearImmediate(id) { delete queue[id]; }; // Node.js 0.8- if (__webpack_require__(17)(process) == 'process') { defer = function (id) { process.nextTick(ctx(run, id, 1)); }; // Sphere (JS game engine) Dispatch API } else if (Dispatch && Dispatch.now) { defer = function (id) { Dispatch.now(ctx(run, id, 1)); }; // Browsers with MessageChannel, includes WebWorkers } else if (MessageChannel) { channel = new MessageChannel(); port = channel.port2; channel.port1.onmessage = listener; defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { defer = function (id) { global.postMessage(id + '', '*'); }; global.addEventListener('message', listener, false); // IE8- } else if (ONREADYSTATECHANGE in cel('script')) { defer = function (id) { html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { html.removeChild(this); run.call(id); }; }; // Rest old browsers } else { defer = function (id) { setTimeout(ctx(run, id, 1), 0); }; } } module.exports = { set: setTask, clear: clearTask }; /***/ }), /* 54 */ /***/ (function(module, exports) { module.exports = function (exec) { try { return { e: false, v: exec() }; } catch (e) { return { e: true, v: e }; } }; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(7); var isObject = __webpack_require__(11); var newPromiseCapability = __webpack_require__(34); module.exports = function (C, x) { anObject(C); if (isObject(x) && x.constructor === C) return x; var promiseCapability = newPromiseCapability.f(C); var resolve = promiseCapability.resolve; resolve(x); return promiseCapability.promise; }; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _iterator = __webpack_require__(96); var _iterator2 = _interopRequireDefault(_iterator); var _symbol = __webpack_require__(98); var _symbol2 = _interopRequireDefault(_symbol); var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) { return typeof obj === "undefined" ? "undefined" : _typeof(obj); } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); }; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var $keys = __webpack_require__(40); var hiddenKeys = __webpack_require__(31).concat('length', 'prototype'); exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return $keys(O, hiddenKeys); }; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = __webpack_require__(14); var _promise2 = _interopRequireDefault(_promise); var _stringify = __webpack_require__(35); var _stringify2 = _interopRequireDefault(_stringify); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); var _base = __webpack_require__(108); var _base2 = _interopRequireDefault(_base); var _xhrPromise = __webpack_require__(59); var _xhrPromise2 = _interopRequireDefault(_xhrPromise); var _util = __webpack_require__(15); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var API_URL = 'https://api.muxy.io'; var SANDBOX_URL = 'https://sandbox.api.muxy.io'; var SERVER_URL = API_URL; var ServerState = { AUTHENTICATION: 'authentication', USER: 'user_info', VIEWER: 'viewer_state', EXTENSION_VIEWER: 'extension_viewer_state', CHANNEL: 'channel_state', EXTENSION: 'extension_state', ALL: 'all_state' }; var StateClient = function () { function StateClient() { var _this = this; (0, _classCallCheck3.default)(this, StateClient); this.getState = function (identifier, substate) { return _this.signedRequest(identifier, 'GET', substate || ServerState.ALL); }; this.postState = function (identifier, substate, data) { return _this.signedRequest(identifier, 'POST', substate || ServerState.ALL, data); }; this.getUserInfo = function (identifier) { return _this.getState(identifier, ServerState.USER); }; this.getViewerState = function (identifier) { return _this.getState(identifier, ServerState.VIEWER); }; this.getExtensionViewerState = function (identifier) { return _this.getState(identifier, ServerState.EXTENSION_VIEWER); }; this.getChannelState = function (identifier) { return _this.getState(identifier, ServerState.CHANNEL); }; this.getExtensionState = function (identifier) { return _this.getState(identifier, ServerState.EXTENSION); }; this.setViewerState = function (identifier, state) { return _this.postState(identifier, ServerState.VIEWER, (0, _stringify2.default)(state)); }; this.setExtensionViewerState = function (identifier, state) { return _this.postState(identifier, ServerState.EXTENSION_VIEWER, (0, _stringify2.default)(state)); }; this.setChannelState = function (identifier, state) { return _this.postState(identifier, ServerState.CHANNEL, (0, _stringify2.default)(state)); }; this.getAccumulation = function (identifier, id, start) { return _this.signedRequest(identifier, 'GET', 'accumulate?id=' + (id || 'default') + '&start=' + start); }; this.accumulate = function (identifier, id, data) { return _this.signedRequest(identifier, 'POST', 'accumulate?id=' + (id || 'default'), (0, _stringify2.default)(data)); }; this.vote = function (identifier, id, data) { return _this.signedRequest(identifier, 'POST', 'vote?id=' + (id || 'default'), (0, _stringify2.default)(data)); }; this.getVotes = function (identifier, id) { return _this.signedRequest(identifier, 'GET', 'vote?id=' + (id || 'default')); }; this.rank = function (identifier, id, data) { return _this.signedRequest(identifier, 'POST', 'rank?id=' + (id || 'default'), (0, _stringify2.default)(data)); }; this.getRank = function (identifier, id) { return _this.signedRequest(identifier, 'GET', 'rank?id=' + (id || 'default')); }; this.deleteRank = function (identifier) { return _this.signedRequest(identifier, 'DELETE', 'rank'); }; this.getJSONStore = function (identifier, id) { return _this.signedRequest(identifier, 'GET', 'json_store?id=' + (id || 'default')); }; this.validateCode = function (identifier, code) { return _this.signedRequest(identifier, 'POST', 'validate_pin', (0, _stringify2.default)({ pin: code })); }; this.pinTokenExists = function (identifier) { return _this.signedRequest(identifier, 'GET', 'pin_token_exists'); }; this.revokeAllPINCodes = function (identifier) { return _this.signedRequest(identifier, 'DELETE', 'pin'); }; this.token = null; } (0, _createClass3.default)(StateClient, [{ key: 'updateAuth', value: function updateAuth(token) { this.token = token; } }, { key: 'signedRequest', value: function signedRequest(extensionID, method, endpoint, data) { var _this2 = this; if (!this.validateJWT()) { return (0, _util.errorPromise)('Your authentication token has expired.'); } return new _promise2.default(function (resolve, reject) { var xhrPromise = new _xhrPromise2.default(); xhrPromise.send({ method: method, url: SERVER_URL + '/v1/e/' + endpoint, headers: { Authorization: extensionID + ' ' + _this2.token }, data: data }).catch(reject).then(function (resp) { try { if (resp.status < 400) { resolve(resp.responseText); } else if (resp.responseText) { reject(resp.responseText); } else { reject('Server returned status ' + resp.status); } } catch (err) { reject(err); } }); }); } }, { key: 'validateJWT', value: function validateJWT() { try { var splitToken = this.token.split('.'); if (splitToken.length !== 3) { return false; } var tk = JSON.parse(_base2.default.decode(splitToken[1])); if (!tk.exp) { return false; } var now = new Date().valueOf(); if (tk.exp < now / 1000) { return false; } return true; } catch (err) { return false; } } }], [{ key: 'fetchTestAuth', value: function fetchTestAuth(testExtensionID, channelID, role) { return new _promise2.default(function (resolve, reject) { var xhrPromise = new _xhrPromise2.default(); xhrPromise.send({ method: 'POST', url: SANDBOX_URL + '/v1/e/authtoken', data: (0, _stringify2.default)({ app_id: testExtensionID, channel_id: channelID, role: role }) }).catch(reject).then(function (resp) { if (resp && resp.status < 400) { SERVER_URL = SANDBOX_URL; var auth = resp.responseText; auth.clientId = testExtensionID; auth.channelId = channelID; auth.userId = 'T12345678'; resolve(auth); } else { reject(); } }); }); } }, { key: 'setEnvironment', value: function setEnvironment(env) { if (env === _util.ENVIRONMENTS.SANDBOX_DEV || env === _util.ENVIRONMENTS.SANDBOX_TWITCH) { SERVER_URL = SANDBOX_URL; } } }]); return StateClient; }(); exports.default = StateClient; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _promise = __webpack_require__(14); var _promise2 = _interopRequireDefault(_promise); var _assign = __webpack_require__(110); var _assign2 = _interopRequireDefault(_assign); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ParseHeaders, XMLHttpRequestPromise; ParseHeaders = __webpack_require__(114); module.exports = XMLHttpRequestPromise = function () { function XMLHttpRequestPromise() {} XMLHttpRequestPromise.DEFAULT_CONTENT_TYPE = 'application/x-www-form-urlencoded; charset=UTF-8'; XMLHttpRequestPromise.prototype.send = function (options) { var defaults; if (options == null) { options = {}; } defaults = { method: 'GET', data: null, headers: {}, async: true, username: null, password: null, withCredentials: false }; options = (0, _assign2.default)({}, defaults, options); return new _promise2.default(function (_this) { return function (resolve, reject) { var e, header, ref, value, xhr; if (!XMLHttpRequest) { _this._handleError('browser', reject, null, "browser doesn't support XMLHttpRequest"); return; } if (typeof options.url !== 'string' || options.url.length === 0) { _this._handleError('url', reject, null, 'URL is a required parameter'); return; } _this._xhr = xhr = new XMLHttpRequest(); xhr.onload = function () { var responseText; _this._detachWindowUnload(); try { responseText = _this._getResponseText(); } catch (_error) { _this._handleError('parse', reject, null, 'invalid JSON response'); return; } return resolve({ url: _this._getResponseUrl(), status: xhr.status, statusText: xhr.statusText, responseText: responseText, headers: _this._getHeaders(), xhr: xhr }); }; xhr.onerror = function () { return _this._handleError('error', reject); }; xhr.ontimeout = function () { return _this._handleError('timeout', reject); }; xhr.onabort = function () { return _this._handleError('abort', reject); }; _this._attachWindowUnload(); xhr.open(options.method, options.url, options.async, options.username, options.password); if (options.withCredentials) { xhr.withCredentials = true; } if (options.data != null && !options.headers['Content-Type']) { options.headers['Content-Type'] = _this.constructor.DEFAULT_CONTENT_TYPE; } ref = options.headers; for (header in ref) { value = ref[header]; xhr.setRequestHeader(header, value); } try { return xhr.send(options.data); } catch (_error) { e = _error; return _this._handleError('send', reject, null, e.toString()); } }; }(this)); }; XMLHttpRequestPromise.prototype.getXHR = function () { return this._xhr; }; XMLHttpRequestPromise.prototype._attachWindowUnload = function () { this._unloadHandler = this._handleWindowUnload.bind(this); if (window.attachEvent) { return window.attachEvent('onunload', this._unloadHandler); } }; XMLHttpRequestPromise.prototype._detachWindowUnload = function () { if (window.detachEvent) { return window.detachEvent('onunload', this._unloadHandler); } }; XMLHttpRequestPromise.prototype._getHeaders = function () { return ParseHeaders(this._xhr.getAllResponseHeaders()); }; XMLHttpRequestPromise.prototype._getResponseText = function () { var responseText; responseText = typeof this._xhr.responseText === 'string' ? this._xhr.responseText : ''; switch ((this._xhr.getResponseHeader('Content-Type') || '').split(';')[0]) { case 'application/json': case 'text/javascript': responseText = JSON.parse(responseText + ''); } return responseText; }; XMLHttpRequestPromise.prototype._getResponseUrl = function () { if (this._xhr.responseURL != null) { return this._xhr.responseURL; } if (/^X-Request-URL:/m.test(this._xhr.getAllResponseHeaders())) { return this._xhr.getResponseHeader('X-Request-URL'); } return ''; }; XMLHttpRequestPromise.prototype._handleError = function (reason, reject, status, statusText) { this._detachWindowUnload(); return reject({ reason: reason, status: status || this._xhr.status, statusText: statusText || this._xhr.statusText, xhr: this._xhr }); }; XMLHttpRequestPromise.prototype._handleWindowUnload = function () { return this._xhr.abort(); }; return XMLHttpRequestPromise; }(); /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); var _util = __webpack_require__(15); var _stateClient = __webpack_require__(58); var _stateClient2 = _interopRequireDefault(_stateClient); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var TEST_AUTH_TIMEOUT_MS = 25 * 60 * 1000; var CONTEXT_CALLBACK_TIMEOUT = 30 * 1000; var Ext = function () { function Ext() { (0, _classCallCheck3.default)(this, Ext); } (0, _createClass3.default)(Ext, null, [{ key: 'fetchTestAuth', value: function fetchTestAuth(cb) { _stateClient2.default.fetchTestAuth(Ext.extensionID, Ext.testChannelID, Ext.testJWTRole).then(function (auth) { cb(auth); }).catch(cb); } }, { key: 'onAuthorized', value: function onAuthorized(cb) { switch ((0, _util.CurrentEnvironment)()) { case _util.ENVIRONMENTS.SANDBOX_DEV: Ext.fetchTestAuth(cb); setInterval(Ext.fetchTestAuth, TEST_AUTH_TIMEOUT_MS, cb); break; case _util.ENVIRONMENTS.SANDBOX_TWITCH: case _util.ENVIRONMENTS.PRODUCTION: { var timer = setTimeout(cb, 1000 * 15); window.Twitch.ext.onAuthorized(function (auth) { clearTimeout(timer); cb(auth); }); break; } default: (0, _util.consolePrint)('No authorization callback for ' + (0, _util.CurrentEnvironment)(), { type: 'error' }); } } }, { key: 'onContext', value: function onContext(cb) { switch ((0, _util.CurrentEnvironment)()) { case _util.ENVIRONMENTS.SANDBOX_TWITCH: case _util.ENVIRONMENTS.PRODUCTION: (function setupOnContextCallback() { var lastContextCall = 0; window.Twitch.ext.onContext(function (context) { var diff = new Date().getTime() - lastContextCall; if (diff < CONTEXT_CALLBACK_TIMEOUT) { return; } lastContextCall = new Date().getTime(); cb(context); }); })(); break; default: } } }, { key: 'beginPurchase', value: function beginPurchase(sku) { switch ((0, _util.CurrentEnvironment)()) { case _util.ENVIRONMENTS.SANDBOX_TWITCH: case _util.ENVIRONMENTS.PRODUCTION: window.Twitch.ext.purchases.beginPurchase(sku); break; default: (0, _util.consolePrint)('beginPurchase not supported for ' + (0, _util.CurrentEnvironment)(), { type: 'error' }); } } }, { key: 'getPrices', value: function getPrices(cb) { switch ((0, _util.CurrentEnvironment)()) { case _util.ENVIRONMENTS.SANDBOX_TWITCH: case _util.ENVIRONMENTS.PRODUCTION: window.Twitch.ext.purchases.getPrices().then(function (prices) { cb(prices); }).catch(cb); break; default: (0, _util.consolePrint)('getPrices not supported for ' + (0, _util.CurrentEnvironment)(), { type: 'error' }); } } }, { key: 'onReloadEntitlements', value: function onReloadEntitlements(cb) { switch ((0, _util.CurrentEnvironment)()) { case _util.ENVIRONMENTS.SANDBOX_TWITCH: case _util.ENVIRONMENTS.PRODUCTION: window.Twitch.ext.purchases.onReloadEntitlements(cb); break; default: (0, _util.consolePrint)('onReloadEntitlements not supported for ' + (0, _util.CurrentEnvironment)(), { type: 'error' }); } } }]); return Ext; }(); exports.default = Ext; /***/ }), /* 61 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _muxy = __webpack_require__(62); var _muxy2 = _interopRequireDefault(_muxy); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = _muxy2.default; /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _keys = __webpack_require__(39); var _keys2 = _interopRequireDefault(_keys); var _promise = __webpack_require__(14); var _promise2 = _interopRequireDefault(_promise); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); var _analytics = __webpack_require__(93); var _analytics2 = _interopRequireDefault(_analytics); var _stateClient = __webpack_require__(58); var _stateClient2 = _interopRequireDefault(_stateClient); var _twitchExt = __webpack_require__(60); var _twitchExt2 = _interopRequireDefault(_twitchExt); var _twitchClient = __webpack_require__(118); var _twitchClient2 = _interopRequireDefault(_twitchClient); var _messenger = __webpack_require__(119); var _messenger2 = _interopRequireDefault(_messenger); var _sdk = __webpack_require__(121); var _sdk2 = _interopRequireDefault(_sdk); var _user = __webpack_require__(122); var _user2 = _interopRequireDefault(_user); var _util = __webpack_require__(15); var _util2 = _interopRequireDefault(_util); var _package = __webpack_require__(123); var PackageConfig = _interopRequireWildcard(_package); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Muxy = function () { function Muxy() { var _this = this; (0, _classCallCheck3.default)(this, Muxy); this.Util = _util2.default; this.setupCalled = false; this.testChannelID = '23161357'; this.testJWTRole = 'viewer'; this.twitchClientID = ''; this.SDKClients = {}; this.client = new _stateClient2.default(); this.messenger = new _messenger2.default(); this.cachedTwitchClient = null; this.analytics = null; this.context = {}; this.user = null; this.loadPromise = new _promise2.default(function (resolve, reject) { _this.loadResolve = resolve; _this.loadReject = reject; }); this.SKUs = []; _stateClient2.default.setEnvironment(_util2.default.currentEnvironment()); } (0, _createClass3.default)(Muxy, [{ key: 'watchAuth', value: function watchAuth(extensionID) { var _this2 = this; _twitchExt2.default.extensionID = extensionID; _twitchExt2.default.testChannelID = this.testChannelID; _twitchExt2.default.testJWTRole = this.testJWTRole; _twitchExt2.default.onAuthorized(function (auth) { if (!auth) { _this2.loadReject('Received invalid authorization from Twitch'); return; } _this2.twitchClientID = auth.clientId; _this2.messenger.extensionID = auth.clientId; _this2.messenger.channelID = auth.channelId; _this2.client.updateAuth(auth.token); var resolvePromise = function resolvePromise(user) { _this2.user = user; var keys = (0, _keys2.default)(_this2.SDKClients); for (var i = 0; i < keys.length; i += 1) { _this2.SDKClients[keys[i]].user = _this2.user; } if (_this2.analytics) { _this2.analytics.user = _this2.user; } }; var onFirstAuth = function onFirstAuth() { _this2.client.getUserInfo(extensionID).then(function (userinfo) { var user = new _user2.default(auth); user.ip = userinfo.ip_address; user.registeredWithMuxy = userinfo.registered || false; user.visualizationID = userinfo.visualization_id || ''; updateUserContextSettings.call(_this2); resolvePromise(user); _this2.loadResolve(); }).catch(function (err) { _this2.loadReject(err); }); }; if (_this2.user) { _this2.user.updateAuth(auth); resolvePromise(_this2.user); } else { onFirstAuth(); } }); function updateUserContextSettings() { if (!this.user || !this.context) { return; } if (this.context.isFullScreen) { this.user.videoMode = 'fullscreen'; } else if (this.context.isTheatreMode) { this.user.videoMode = 'theatre'; } else { this.user.videoMode = 'default'; } this.user.game = this.context.game; this.user.bitrate = Math.round(this.context.bitrate || 0); this.user.latency = this.context.hlsLatencyBroadcaster; this.user.buffer = this.context.bufferSize; if (this.context.bufferSize < 1 && this.analytics) { this.analytics.sendEvent('video', 'buffer', 1); } } _twitchExt2.default.onContext(function (context) { _this2.context = context; if (_this2.user) { updateUserContextSettings.call(_this2); } }); } }, { key: 'setup', value: function setup(options) { if (this.setupCalled) { throw new Error('Muxy.setup() can only be called once.'); } if (!options || !options.extensionID && !options.clientID) { throw new Error('Muxy.setup() was called without an Extension Client ID'); } this.twitchClientID = options.clientID || options.extensionID; this.cachedTwitchClient = new _twitchClient2.default(this.twitchClientID); if (options.uaString) { this.analytics = new _analytics2.default(options.uaString, this.loadPromise); } if (!options.quiet) { Muxy.printInfo(); } this.setupCalled = true; } }, { key: 'SDK', value: function SDK(id) {} }, { key: 'TwitchClient', value: function TwitchClient() {} }], [{ key: 'printInfo', value: function printInfo() { var SDKInfoText = ['Muxy Extensions SDK', 'v' + PackageConfig.version + ' \xA9 ' + new Date().getFullYear() + ' ' + PackageConfig.author, PackageConfig.repository, '']; switch (_util2.default.currentEnvironment().environment) { case _util2.default.Environments.Testing.environment: SDKInfoText.push('Running in testing environment outside of Twitch'); break; case _util2.default.Environments.SandboxDev.environment: SDKInfoText.push('Running in sandbox environment outside of Twitch'); break; case _util2.default.Environments.SandboxTwitch.environment: SDKInfoText.push('Running in sandbox environment on Twitch'); break; case _util2.default.Environments.Production.environment: SDKInfoText.push('Running on production'); break; case _util2.default.Environments.Server.environment: SDKInfoText.push('Running on a NodeJS server'); break; default: SDKInfoText.push('Could not determine execution environment.'); } _util2.default.consolePrint(SDKInfoText, { boxed: true }); } }]); return Muxy; }(); var mxy = new Muxy(); mxy.SDK = function NewSDK(id) { if (!mxy.setupCalled) { throw new Error('Muxy.setup() must be called before creating a new SDK instance'); } var identifier = id || mxy.twitchClientID; if (!identifier) { return null; } if (!mxy.watchingAuth) { mxy.watchingAuth = true; mxy.watchAuth(identifier); } if (!mxy.SDKClients[identifier]) { mxy.SDKClients[identifier] = new _sdk2.default(identifier, mxy.client, mxy.user, mxy.messenger, mxy.analytics, mxy.loadPromise, mxy.SKUs); } return mxy.SDKClients[identifier]; }; mxy.TwitchClient = function NewTwitchClient() { if (!mxy.setupCalled) { throw new Error('Muxy.setup() must be called before creating a new TwitchClient instance'); } return mxy.cachedTwitchClient; }; exports.default = mxy; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(64); module.exports = __webpack_require__(0).Object.keys; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 Object.keys(O) var toObject = __webpack_require__(26); var $keys = __webpack_require__(16); __webpack_require__(67)('keys', function () { return function keys(it) { return $keys(toObject(it)); }; }); /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { // false -> Array#indexOf // true -> Array#includes var toIObject = __webpack_require__(12); var toLength = __webpack_require__(42); var toAbsoluteIndex = __webpack_require__(66); module.exports = function (IS_INCLUDES) { return function ($this, el, fromIndex) { var O = toIObject($this); var length = toLength(O.length); var index = toAbsoluteIndex(fromIndex, length); var value; // Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare if (IS_INCLUDES && el != el) while (length > index) { value = O[index++]; // eslint-disable-next-line no-self-compare if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not } else for (;length > index; index++) if (IS_INCLUDES || index in O) { if (O[index] === el) return IS_INCLUDES || index || 0; } return !IS_INCLUDES && -1; }; }; /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(28); var max = Math.max; var min = Math.min; module.exports = function (index, length) { index = toInteger(index); return index < 0 ? max(index + length, 0) : min(index, length); }; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { // most Object methods by ES6 should accept primitives var $export = __webpack_require__(5); var core = __webpack_require__(0); var fails = __webpack_require__(13); module.exports = function (KEY, exec) { var fn = (core.Object || {})[KEY] || Object[KEY]; var exp = {}; exp[KEY] = exec(fn); $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); }; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(44); __webpack_require__(45); __webpack_require__(50); __webpack_require__(76); __webpack_require__(88); __webpack_require__(89); module.exports = __webpack_require__(0).Promise; /***/ }), /* 69 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(28); var defined = __webpack_require__(27); // true -> String#at // false -> String#codePointAt module.exports = function (TO_STRING) { return function (that, pos) { var s = String(defined(that)); var i = toInteger(pos); var l = s.length; var a, b; if (i < 0 || i >= l) return TO_STRING ? '' : undefined; a = s.charCodeAt(i); return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; }; }; /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var create = __webpack_require__(48); var descriptor = __webpack_require__(23); var setToStringTag = __webpack_require__(24); var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() __webpack_require__(10)(IteratorPrototype, __webpack_require__(2)('iterator'), function () { return this; }); module.exports = function (Constructor, NAME, next) { Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); setToStringTag(Constructor, NAME + ' Iterator'); }; /***/ }), /* 71 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(6); var anObject = __webpack_require__(7); var getKeys = __webpack_require__(16); module.exports = __webpack_require__(8) ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var keys = getKeys(Properties); var length = keys.length; var i = 0; var P; while (length > i) dP.f(O, P = keys[i++], Properties[P]); return O; }; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = __webpack_require__(9); var toObject = __webpack_require__(26); var IE_PROTO = __webpack_require__(29)('IE_PROTO'); var ObjectProto = Object.prototype; module.exports = Object.getPrototypeOf || function (O) { O = toObject(O); if (has(O, IE_PROTO)) return O[IE_PROTO]; if (typeof O.constructor == 'function' && O instanceof O.constructor) { return O.constructor.prototype; } return O instanceof Object ? ObjectProto : null; }; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var addToUnscopables = __webpack_require__(74); var step = __webpack_require__(75); var Iterators = __webpack_require__(19); var toIObject = __webpack_require__(12); // 22.1.3.4 Array.prototype.entries() // 22.1.3.13 Array.prototype.keys() // 22.1.3.29 Array.prototype.values() // 22.1.3.30 Array.prototype[@@iterator]() module.exports = __webpack_require__(46)(Array, 'Array', function (iterated, kind) { this._t = toIObject(iterated); // target this._i = 0; // next index this._k = kind; // kind // 22.1.5.2.1 %ArrayIteratorPrototype%.next() }, function () { var O = this._t; var kind = this._k; var index = this._i++; if (!O || index >= O.length) { this._t = undefined; return step(1); } if (kind == 'keys') return step(0, index); if (kind == 'values') return step(0, O[index]); return step(0, [index, O[index]]); }, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) Iterators.Arguments = Iterators.Array; addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); /***/ }), /* 74 */ /***/ (function(module, exports) { module.exports = function () { /* empty */ }; /***/ }), /* 75 */ /***/ (function(module, exports) { module.exports = function (done, value) { return { value: value, done: !!done }; }; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var LIBRARY = __webpack_require__(18); var global = __webpack_require__(1); var ctx = __webpack_require__(21); var classof = __webpack_require__(51); var $export = __webpack_require__(5); var isObject = __webpack_require__(11); var aFunction = __webpack_require__(22); var anInstance = __webpack_require__(77); var forOf = __webpack_require__(78); var speciesConstructor = __webpack_require__(52); var task = __webpack_require__(53).set; var microtask = __webpack_require__(83)(); var newPromiseCapabilityModule = __webpack_require__(34); var perform = __webpack_require__(54); var userAgent = __webpack_require__(84); var promiseResolve = __webpack_require__(55); var PROMISE = 'Promise'; var TypeError = global.TypeError; var process = global.process; var versions = process && process.versions; var v8 = versions && versions.v8 || ''; var $Promise = global[PROMISE]; var isNode = classof(process) == 'process'; var empty = function () { /* empty */ }; var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; var USE_NATIVE = !!function () { try { // correct subclassing with @@species support var promise = $Promise.resolve(1); var FakePromise = (promise.constructor = {})[__webpack_require__(2)('species')] = function (exec) { exec(empty, empty); }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 // we can't detect it synchronously, so just check versions && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1; } catch (e) { /* empty */ } }(); // helpers var isThenable = function (it) { var then; return isObject(it) && typeof (then = it.then) == 'function' ? then : false; }; var notify = function (promise, isReject) { if (promise._n) return; promise._n = true; var chain = promise._c; microtask(function () { var value = promise._v; var ok = promise._s == 1; var i = 0; var run = function (reaction) { var handler = ok ? reaction.ok : reaction.fail; var resolve = reaction.resolve; var reject = reaction.reject; var domain = reaction.domain; var result, then, exited; try { if (handler) { if (!ok) { if (promise._h == 2) onHandleUnhandled(promise); promise._h = 1; } if (handler === true) result = value; else { if (domain) domain.enter(); result = handler(value); // may throw if (domain) { domain.exit(); exited = true; } } if (result === reaction.promise) { reject(TypeError('Promise-chain cycle')); } else if (then = isThenable(result)) { then.call(result, resolve, reject); } else resolve(result); } else reject(value); } catch (e) { if (domain && !exited) domain.exit(); reject(e); } }; while (chain.length > i) run(chain[i++]); // variable length - can't use forEach promise._c = []; promise._n = false; if (isReject && !promise._h) onUnhandled(promise); }); }; var onUnhandled = function (promise) { task.call(global, function () { var value = promise._v; var unhandled = isUnhandled(promise); var result, handler, console; if (unhandled) { result = perform(function () { if (isNode) { process.emit('unhandledRejection', value, promise); } else if (handler = global.onunhandledrejection) { handler({ promise: promise, reason: value }); } else if ((console = global.console) && console.error) { console.error('Unhandled promise rejection', value); } }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should promise._h = isNode || isUnhandled(promise) ? 2 : 1; } promise._a = undefined; if (unhandled && result.e) throw result.v; }); }; var isUnhandled = function (promise) { return promise._h !== 1 && (promise._a || promise._c).length === 0; }; var onHandleUnhandled = function (promise) { task.call(global, function () { var handler; if (isNode) { process.emit('rejectionHandled', promise); } else if (handler = global.onrejectionhandled) { handler({ promise: promise, reason: promise._v }); } }); }; var $reject = function (value) { var promise = this; if (promise._d) return; promise._d = true; promise = promise._w || promise; // unwrap promise._v = value; promise._s = 2; if (!promise._a) promise._a = promise._c.slice(); notify(promise, true); }; var $resolve = function (value) { var promise = this; var then; if (promise._d) return; promise._d = true; promise = promise._w || promise; // unwrap try { if (promise === value) throw TypeError("Promise can't be resolved itself"); if (then = isThenable(value)) { microtask(function () { var wrapper = { _w: promise, _d: false }; // wrap try { then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); } catch (e) { $reject.call(wrapper, e); } }); } else { promise._v = value; promise._s = 1; notify(promise, false); } } catch (e) { $reject.call({ _w: promise, _d: false }, e); // wrap } }; // constructor polyfill if (!USE_NATIVE) { // 25.4.3.1 Promise(executor) $Promise = function Promise(executor) { anInstance(this, $Promise, PROMISE, '_h'); aFunction(executor); Internal.call(this); try { executor(ctx($resolve, this, 1), ctx($reject, this, 1)); } catch (err) { $reject.call(this, err); } }; // eslint-disable-next-line no-unused-vars Internal = function Promise(executor) { this._c = []; // <- awaiting reactions this._a = undefined; // <- checked in isUnhandled reactions this._s = 0; // <- state this._d = false; // <- done this._v = undefined; // <- value this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled this._n = false; // <- notify }; Internal.prototype = __webpack_require__(85)($Promise.prototype, { // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) then: function then(onFulfilled, onRejected) { var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; reaction.fail = typeof onRejected == 'function' && onRejected; reaction.domain = isNode ? process.domain : undefined; this._c.push(reaction); if (this._a) this._a.push(reaction); if (this._s) notify(this, false); return reaction.promise; }, // 25.4.5.1 Promise.prototype.catch(onRejected) 'catch': function (onRejected) { return this.then(undefined, onRejected); } }); OwnPromiseCapability = function () { var promise = new Internal(); this.promise = promise; this.resolve = ctx($resolve, promise, 1); this.reject = ctx($reject, promise, 1); }; newPromiseCapabilityModule.f = newPromiseCapability = function (C) { return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); }; } $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); __webpack_require__(24)($Promise, PROMISE); __webpack_require__(86)(PROMISE); Wrapper = __webpack_require__(0)[PROMISE]; // statics $export($export.S + $export.F * !USE_NATIVE, PROMISE, { // 25.4.4.5 Promise.reject(r) reject: function reject(r) { var capability = newPromiseCapability(this); var $$reject = capability.reject; $$reject(r); return capability.promise; } }); $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { // 25.4.4.6 Promise.resolve(x) resolve: function resolve(x) { return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); } }); $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(87)(function (iter) { $Promise.all(iter)['catch'](empty); })), PROMISE, { // 25.4.4.1 Promise.all(iterable) all: function all(iterable) { var C = this; var capability = newPromiseCapability(C); var resolve = capability.resolve; var reject = capability.reject; var result = perform(function () { var values = []; var index = 0; var remaining = 1; forOf(iterable, false, function (promise) { var $index = index++; var alreadyCalled = false; values.push(undefined); remaining++; C.resolve(promise).then(function (value) { if (alreadyCalled) return; alreadyCalled = true; values[$index] = value; --remaining || resolve(values); }, reject); }); --remaining || resolve(values); }); if (result.e) reject(result.v); return capability.promise; }, // 25.4.4.4 Promise.race(iterable) race: function race(iterable) { var C = this; var capability = newPromiseCapability(C); var reject = capability.reject; var result = perform(function () { forOf(iterable, false, function (promise) { C.resolve(promise).then(capability.resolve, reject); }); }); if (result.e) reject(result.v); return capability.promise; } }); /***/ }), /* 77 */ /***/ (function(module, exports) { module.exports = function (it, Constructor, name, forbiddenField) { if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { throw TypeError(name + ': incorrect invocation!'); } return it; }; /***/ }), /* 78 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(21); var call = __webpack_require__(79); var isArrayIter = __webpack_require__(80); var anObject = __webpack_require__(7); var toLength = __webpack_require__(42); var getIterFn = __webpack_require__(81); var BREAK = {}; var RETURN = {}; var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); var f = ctx(fn, that, entries ? 2 : 1); var index = 0; var length, step, iterator, result; if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); if (result === BREAK || result === RETURN) return result; } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { result = call(iterator, f, step.value, entries); if (result === BREAK || result === RETURN) return result; } }; exports.BREAK = BREAK; exports.RETURN = RETURN; /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { // call something on iterator step with safe closing on error var anObject = __webpack_require__(7); module.exports = function (iterator, fn, value, entries) { try { return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion) } catch (e) { var ret = iterator['return']; if (ret !== undefined) anObject(ret.call(iterator)); throw e; } }; /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { // check on default Array iterator var Iterators = __webpack_require__(19); var ITERATOR = __webpack_require__(2)('iterator'); var ArrayProto = Array.prototype; module.exports = function (it) { return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); }; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(51); var ITERATOR = __webpack_require__(2)('iterator'); var Iterators = __webpack_require__(19); module.exports = __webpack_require__(0).getIteratorMethod = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; }; /***/ }), /* 82 */ /***/ (function(module, exports) { // fast apply, http://jsperf.lnkit.com/fast-apply/5 module.exports = function (fn, args, that) { var un = that === undefined; switch (args.length) { case 0: return un ? fn() : fn.call(that); case 1: return un ? fn(args[0]) : fn.call(that, args[0]); case 2: return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]); case 3: return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]); case 4: return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]); } return fn.apply(that, args); }; /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var macrotask = __webpack_require__(53).set; var Observer = global.MutationObserver || global.WebKitMutationObserver; var process = global.process; var Promise = global.Promise; var isNode = __webpack_require__(17)(process) == 'process'; module.exports = function () { var head, last, notify; var flush = function () { var parent, fn; if (isNode && (parent = process.domain)) parent.exit(); while (head) { fn = head.fn; head = head.next; try { fn(); } catch (e) { if (head) notify(); else last = undefined; throw e; } } last = undefined; if (parent) parent.enter(); }; // Node.js if (isNode) { notify = function () { process.nextTick(flush); }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 } else if (Observer && !(global.navigator && global.navigator.standalone)) { var toggle = true; var node = document.createTextNode(''); new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new notify = function () { node.data = toggle = !toggle; }; // environments with maybe non-completely correct, but existent Promise } else if (Promise && Promise.resolve) { // Promise.resolve without an argument throws an error in LG WebOS 2 var promise = Promise.resolve(undefined); notify = function () { promise.then(flush); }; // for other environments - macrotask based on: // - setImmediate // - MessageChannel // - window.postMessag // - onreadystatechange // - setTimeout } else { notify = function () { // strange IE + webpack dev server bug - use .call(global) macrotask.call(global, flush); }; } return function (fn) { var task = { fn: fn, next: undefined }; if (last) last.next = task; if (!head) { head = task; notify(); } last = task; }; }; /***/ }), /* 84 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(1); var navigator = global.navigator; module.exports = navigator && navigator.userAgent || ''; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { var hide = __webpack_require__(10); module.exports = function (target, src, safe) { for (var key in src) { if (safe && target[key]) target[key] = src[key]; else hide(target, key, src[key]); } return target; }; /***/ }), /* 86 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(1); var core = __webpack_require__(0); var dP = __webpack_require__(6); var DESCRIPTORS = __webpack_require__(8); var SPECIES = __webpack_require__(2)('species'); module.exports = function (KEY) { var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY]; if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { configurable: true, get: function () { return this; } }); }; /***/ }), /* 87 */ /***/ (function(module, exports, __webpack_require__) { var ITERATOR = __webpack_require__(2)('iterator'); var SAFE_CLOSING = false; try { var riter = [7][ITERATOR](); riter['return'] = function () { SAFE_CLOSING = true; }; // eslint-disable-next-line no-throw-literal Array.from(riter, function () { throw 2; }); } catch (e) { /* empty */ } module.exports = function (exec, skipClosing) { if (!skipClosing && !SAFE_CLOSING) return false; var safe = false; try { var arr = [7]; var iter = arr[ITERATOR](); iter.next = function () { return { done: safe = true }; }; arr[ITERATOR] = function () { return iter; }; exec(arr); } catch (e) { /* empty */ } return safe; }; /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-promise-finally var $export = __webpack_require__(5); var core = __webpack_require__(0); var global = __webpack_require__(1); var speciesConstructor = __webpack_require__(52); var promiseResolve = __webpack_require__(55); $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { var C = speciesConstructor(this, core.Promise || global.Promise); var isFunction = typeof onFinally == 'function'; return this.then( isFunction ? function (x) { return promiseResolve(C, onFinally()).then(function () { return x; }); } : onFinally, isFunction ? function (e) { return promiseResolve(C, onFinally()).then(function () { throw e; }); } : onFinally ); } }); /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-promise-try var $export = __webpack_require__(5); var newPromiseCapability = __webpack_require__(34); var perform = __webpack_require__(54); $export($export.S, 'Promise', { 'try': function (callbackfn) { var promiseCapability = newPromiseCapability.f(this); var result = perform(callbackfn); (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); return promiseCapability.promise; } }); /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(91), __esModule: true }; /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(92); var $Object = __webpack_require__(0).Object; module.exports = function defineProperty(it, key, desc) { return $Object.defineProperty(it, key, desc); }; /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(5); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) $export($export.S + $export.F * !__webpack_require__(8), 'Object', { defineProperty: __webpack_require__(6).f }); /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); var _gumshoe = __webpack_require__(94); var _gumshoe2 = _interopRequireDefault(_gumshoe); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ANALYTICS_ENDPOINT = 'https://info.muxy.io'; var Analytics = function () { function Analytics(uaString, loadPromise) { var _this = this; (0, _classCallCheck3.default)(this, Analytics); this.ready = false; this.uaString = uaString; this.loadPromise = loadPromise; this.user = null; this.gumshoe = (0, _gumshoe2.default)(); this.gumshoe.transport({ name: 'muxy-extension-sdk', send: function send(data, fn) { var d = data; delete d.pageData; delete d.clientUuid; delete d.uuid; delete d.sessionUuid; _this.gumshoe.reqwest({ data: d, url: ANALYTICS_ENDPOINT, method: 'POST', contentType: 'application/x-www-form-urlencoded', crossOrigin: true }, function () { if (fn) { fn(null); } }); }, map: this.mapData.bind(this) }); this.gumshoe({ transport: 'muxy-extension-sdk' }); this.loadPromise.then(function () { _this.ready = true; }); } (0, _createClass3.default)(Analytics, [{ key: 'mapData', value: function mapData(data) { var appName = 'Muxy'; var ip = ''; var channelID = null; var opaqueID = null; var userID = null; var role = null; var game = null; var videoMode = null; var latency = null; var bitrate = null; if (this.user) { ip = this.user.ip; channelID = this.user.channelID; opaqueID = this.user.twitchOpaqueID; userID = !opaqueID || opaqueID[0] !== 'U' ? null : opaqueID; role = this.user.role; game = this.user.game; videoMode = this.user.videoMode; latency = this.user.latency; bitrate = this.user.bitrate; } var pd = data.pageData; pd.ipAddress = ip; var result = { aid: appName, an: appName, cid: opaqueID || data.clientUuid || data.sessionUuid || '00000000-0000-0000-0000-000000000000', dh: pd.hostName, dl: pd.url, dp: pd.path, dr: pd.referer, dt: pd.title, je: pd.javaEnabled, sr: pd.screenResolution, t: 'event', tid: this.uaString, ua: pd.userAgent, uid: userID, uip: ip, ul: pd.language, v: 1, vp: pd.viewportHeight + 'x' + pd.viewportWidth, cd1: channelID, cd2: role, cd3: game, cd4: videoMode, cm2: latency, cm3: bitrate }; if (data.eventName === 'page.view') { result.t = 'pageview'; } else { result.ec = data.eventName; result.ea = data.eventData.name; result.el = data.eventData.label; result.ev = data.eventData.value; } return result; } }, { key: 'sendEvent', value: function sendEvent(category, name) { var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var label = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; if (!this.ready) { throw new Error('muxy.Analytics used before ready'); } var data = { name: name, value: value, label: label }; this.gumshoe.send(category, data); } }, { key: 'pageView', value: function pageView() { if (!this.ready) { throw new Error('muxy.Analytics used before ready'); } this.gumshoe.send('page.view', {}); } }]); return Analytics; }(); exports.default = Analytics; /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _stringify = __webpack_require__(35); var _stringify2 = _interopRequireDefault(_stringify); var _typeof2 = __webpack_require__(56); var _typeof3 = _interopRequireDefault(_typeof2); var _keys = __webpack_require__(39); var _keys2 = _interopRequireDefault(_keys); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } if (!String.prototype.trim) { (function () { var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; String.prototype.trim = function () { return this.replace(rtrim, ''); }; })(); } if (!Array.prototype.reduce) { Array.prototype.reduce = function (callback) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.reduce called on null or undefined'); } if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function'); } var t = Object(this), len = t.length >>> 0, k = 0, value; if (arguments.length == 2) { value = arguments[1]; } else { while (k < len && !k in t) { k++; } if (k >= len) { throw new TypeError('Reduce of empty array with no initial value'); } value = t[k++]; } for (; k < len; k++) { if (k in t) { value = callback(value, t[k], k, t); } } return value; }; } function perfnow() { var perf = window.performance || {}; perf.now = perf.now || perf.mozNow || perf.msNow || perf.oNow || perf.webkitNow || Date.now || function () { return new Date().getTime(); }; return perf; }; function gumshoeFactory() { 'use strict'; var context = {}, queryString, store, undefined; (function contextSetup() { (function (c) { 'use strict'; var queryString = {}; queryString.parse = function (str) { if (typeof str !== 'string') { return {}; } str = str.trim().replace(/^(\?|#)/, ''); if (!str) { return {}; } return str.trim().split('&').reduce(function (ret, param) { var parts = param.replace(/\+/g, ' ').split('='); var key = parts[0]; var val = parts[1]; key = decodeURIComponent(key); val = val === undefined ? null : decodeURIComponent(val); if (!ret.hasOwnProperty(key)) { ret[key] = val; } else if (Array.isArray(ret[key])) { ret[key].push(val); } else { ret[key] = [ret[key], val]; } return ret; }, {}); }; queryString.stringify = function (obj) { return obj ? (0, _keys2.default)(obj).map(function (key) { var val = obj[key]; if (Array.isArray(val)) { return val.map(function (val2) { return encodeURIComponent(key) + '=' + encodeURIComponent(val2); }).join('&'); } return encodeURIComponent(key) + '=' + encodeURIComponent(val); }).join('&') : ''; }; c.queryString = queryString; })(this); !function (name, context, definition) { context[name] = definition(); }('reqwest', this, function () { var win = window, doc = document, httpsRe = /^http/, protocolRe = /(^\w+):\/\//, twoHundo = /^(20\d|1223)$/, byTag = 'getElementsByTagName', readyState = 'readyState', contentType = 'Content-Type', requestedWith = 'X-Requested-With', head = doc[byTag]('head')[0], uniqid = 0, callbackPrefix = 'reqwest_' + +new Date(), lastValue, xmlHttpRequest = 'XMLHttpRequest', xDomainRequest = 'XDomainRequest', noop = function noop() {}, isArray = typeof Array.isArray == 'function' ? Array.isArray : function (a) { return a instanceof Array; }, defaultHeaders = { 'contentType': 'application/x-www-form-urlencoded', 'requestedWith': xmlHttpRequest, 'accept': { '*': 'text/javascript, text/html, application/xml, text/xml, */*', 'xml': 'application/xml, text/xml', 'html': 'text/html', 'text': 'text/plain', 'json': 'application/json, text/javascript', 'js': 'application/javascript, text/javascript' } }, xhr = function xhr(o) { if (o['crossOrigin'] === true) { var xhr = win[xmlHttpRequest] ? new XMLHttpRequest() : null; if (xhr && 'withCredentials' in xhr) { return xhr; } else if (win[xDomainRequest]) { return new XDomainRequest(); } else { throw new Error('Browser does not support cross-origin requests'); } } else if (win[xmlHttpRequest]) { return new XMLHttpRequest(); } else { return new ActiveXObject('Microsoft.XMLHTTP'); } }, globalSetupOptions = { dataFilter: function dataFilter(data) { return data; } }; function succeed(r) { var protocol = protocolRe.exec(r.url); protocol = protocol && protocol[1] || window.location.protocol; return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.responseText; } function handleReadyState(r, success, error) { return function () { if (r._aborted) return error(r.request); if (r._timedOut) return error(r.request, 'Request is aborted: timeout'); if (r.request && r.request[readyState] == 4) { r.request.onreadystatechange = noop; if (succeed(r)) success(r.request);else error(r.request); } }; } function setHeaders(http, o) { var headers = o['headers'] || {}, h; headers['Accept'] = headers['Accept'] || defaultHeaders['accept'][o['type']] || defaultHeaders['accept']['*']; var isAFormData = typeof FormData === 'function' && o['data'] instanceof FormData; if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']; if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']; for (h in headers) { headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h]); } } function setCredentials(http, o) { if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') { http.withCredentials = !!o['withCredentials']; } } function generalCallback(data) { lastValue = data; } function urlappend(url, s) { return url + (/\?/.test(url) ? '&' : '?') + s; } function handleJsonp(o, fn, err, url) { var reqId = uniqid++, cbkey = o['jsonpCallback'] || 'callback', cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId), cbreg = new RegExp('((^|\\?|&)' + cbkey + ')=([^&]+)'), match = url.match(cbreg), script = doc.createElement('script'), loaded = 0, isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1; if (match) { if (match[3] === '?') { url = url.replace(cbreg, '$1=' + cbval); } else { cbval = match[3]; } } else { url = urlappend(url, cbkey + '=' + cbval); } win[cbval] = generalCallback; script.type = 'text/javascript'; script.src = url; script.async = true; if (typeof script.onreadystatechange !== 'undefined' && !isIE10) { script.htmlFor = script.id = '_reqwest_' + reqId; } script.onload = script.onreadystatechange = function () { if (script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded' || loaded) { return false; } script.onload = script.onreadystatechange = null; script.onclick && script.onclick(); fn(lastValue); lastValue = undefined; head.removeChild(script); loaded = 1; }; head.appendChild(script); return { abort: function abort() { script.onload = script.onreadystatechange = null; err({}, 'Request is aborted: timeout', {}); lastValue = undefined; head.removeChild(script); loaded = 1; } }; } function getRequest(fn, err) { var o = this.o, method = (o['method'] || 'GET').toUpperCase(), url = typeof o === 'string' ? o : o['url'], data = o['processData'] !== false && o['data'] && typeof o['data'] !== 'string' ? reqwest.toQueryString(o['data']) : o['data'] || null, http, sendWait = false; if ((o['type'] == 'jsonp' || method == 'GET') && data) { url = urlappend(url, data); data = null; } if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url); http = o.xhr && o.xhr(o) || xhr(o); http.open(method, url, o['async'] === false ? false : true); setHeaders(http, o); setCredentials(http, o); if (win[xDomainRequest] && http instanceof win[xDomainRequest]) { http.onload = fn; http.onerror = err; http.onprogress = function () {}; sendWait = true; } else { http.onreadystatechange = handleReadyState(this, fn, err); } o['before'] && o['before'](http); if (sendWait) { setTimeout(function () { http.send(data); }, 200); } else { http.send(data); } return http; } function Reqwest(o, fn) { this.o = o; this.fn = fn; init.apply(this, arguments); } function setType(header) { if (header.match('json')) return 'json'; if (header.match('javascript')) return 'js'; if (header.match('text')) return 'html'; if (header.match('xml')) return 'xml'; } function init(o, fn) { this.url = typeof o == 'string' ? o : o['url']; this.timeout = null; this._fulfilled = false; this._successHandler = function () {}; this._fulfillmentHandlers = []; this._errorHandlers = []; this._completeHandlers = []; this._erred = false; this._responseArgs = {}; var self = this; fn = fn || function () {}; if (o['timeout']) { this.timeout = setTimeout(function () { timedOut(); }, o['timeout']); } if (o['success']) { this._successHandler = function () { o['success'].apply(o, arguments); }; } if (o['error']) { this._errorHandlers.push(function () { o['error'].apply(o, arguments); }); } if (o['complete']) { this._completeHandlers.push(function () { o['complete'].apply(o, arguments); }); } function complete(resp) { o['timeout'] && clearTimeout(self.timeout); self.timeout = null; while (self._completeHandlers.length > 0) { self._completeHandlers.shift()(resp); } } function success(resp) { var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')); resp = type !== 'jsonp' ? self.request : resp; var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type), r = filteredResponse; try { resp.responseText = r; } catch (e) {} if (r) { switch (type) { case 'json': try { resp = win.JSON.parse(r); } catch (err) { return error(resp, 'Could not parse JSON in response', err); } break; } } self._responseArgs.resp = resp; self._fulfilled = true; fn(resp); self._successHandler(resp); while (self._fulfillmentHandlers.length > 0) { resp = self._fulfillmentHandlers.shift()(resp); } complete(resp); } function timedOut() { self._timedOut = true; if (typeof self.request !== 'undefined' && typeof self.request.abort === 'function') { self.request.abort(); } } function error(resp, msg, t) { resp = self.request; self._responseArgs.resp = resp; self._responseArgs.msg = msg; self._responseArgs.t = t; self._erred = true; while (self._errorHandlers.length > 0) { self._errorHandlers.shift()(resp, msg, t); } complete(resp); } this.request = getRequest.call(this, success, error); } Reqwest.prototype = { abort: function abort() { this._aborted = true; if (typeof this.request !== 'undefined' && typeof this.request.abort === 'function') { this.request.abort(); } }, retry: function retry() { this._aborted = false; this._timedOut = false; init.call(this, this.o, this.fn); }, then: function then(success, fail) { success = success || function () {}; fail = fail || function () {}; if (this._fulfilled) { this._responseArgs.resp = success(this._responseArgs.resp); } else if (this._erred) { fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t); } else { this._fulfillmentHandlers.push(success); this._errorHandlers.push(fail); } return this; }, always: function always(fn) { if (this._fulfilled || this._erred) { fn(this._responseArgs.resp); } else { this._completeHandlers.push(fn); } return this; }, fail: function fail(fn) { if (this._erred) { fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t); } else { this._errorHandlers.push(fn); } return this; }, 'catch': function _catch(fn) { return this.fail(fn); } }; function reqwest(o, fn) { return new Reqwest(o, fn); } function normalize(s) { return s ? s.replace(/\r?\n/g, '\r\n') : ''; } function serial(el, cb) { var n = el.name, t = el.tagName.toLowerCase(), optCb = function optCb(o) { if (o && !o['disabled']) cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text'])); }, ch, ra, val, i; if (el.disabled || !n) return; switch (t) { case 'input': if (!/reset|button|image|file/i.test(el.type)) { ch = /checkbox/i.test(el.type); ra = /radio/i.test(el.type); val = el.value;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val)); } break; case 'textarea': cb(n, normalize(el.value)); break; case 'select': if (el.type.toLowerCase() === 'select-one') { optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null); } else { for (i = 0; el.length && i < el.length; i++) { el.options[i].selected && optCb(el.options[i]); } } break; } } function eachFormElement() { var cb = this, e, i, serializeSubtags = function serializeSubtags(e, tags) { var i, j, fa; for (i = 0; i < tags.length; i++) { fa = e[byTag](tags[i]); for (j = 0; j < fa.length; j++) { serial(fa[j], cb); } } }; for (i = 0; i < arguments.length; i++) { e = arguments[i]; if (/input|select|textarea/i.test(e.tagName)) serial(e, cb); serializeSubtags(e, ['input', 'select', 'textarea']); } } function serializeQueryString() { return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments)); } function serializeHash() { var hash = {}; eachFormElement.apply(function (name, value) { if (name in hash) { hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]]); hash[name].push(value); } else hash[name] = value; }, arguments); return hash; } reqwest.serializeArray = function () { var arr = []; eachFormElement.apply(function (name, value) { arr.push({ name: name, value: value }); }, arguments); return arr; }; reqwest.serialize = function () { if (arguments.length === 0) return ''; var opt, fn, args = Array.prototype.slice.call(arguments, 0); opt = args.pop(); opt && opt.nodeType && args.push(opt) && (opt = null); opt && (opt = opt.type); if (opt == 'map') fn = serializeHash;else if (opt == 'array') fn = reqwest.serializeArray;else fn = serializeQueryString; return fn.apply(null, args); }; reqwest.toQueryString = function (o, trad) { var prefix, i, traditional = trad || false, s = [], enc = encodeURIComponent, add = function add(key, value) { value = 'function' === typeof value ? value() : value == null ? '' : value; s[s.length] = enc(key) + '=' + enc(value); }; if (isArray(o)) { for (i = 0; o && i < o.length; i++) { add(o[i]['name'], o[i]['value']); } } else { for (prefix in o) { if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add); } } return s.join('&').replace(/%20/g, '+'); }; function buildParams(prefix, obj, traditional, add) { var name, i, v, rbracket = /\[\]$/; if (isArray(obj)) { for (i = 0; obj && i < obj.length; i++) { v = obj[i]; if (traditional || rbracket.test(prefix)) { add(prefix, v); } else { buildParams(prefix + '[' + ((typeof v === 'undefined' ? 'undefined' : (0, _typeof3.default)(v)) === 'object' ? i : '') + ']', v, traditional, add); } } } else if (obj && obj.toString() === '[object Object]') { for (name in obj) { buildParams(prefix + '[' + name + ']', obj[name], traditional, add); } } else { add(prefix, obj); } } reqwest.getcallbackPrefix = function () { return callbackPrefix; }; reqwest.compat = function (o, fn) { if (o) { o['type'] && (o['method'] = o['type']) && delete o['type']; o['dataType'] && (o['type'] = o['dataType']); o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']; o['jsonp'] && (o['jsonpCallback'] = o['jsonp']); } return new Reqwest(o, fn); }; reqwest.ajaxSetup = function (options) { options = options || {}; for (var k in options) { globalSetupOptions[k] = options[k]; } }; return reqwest; }); ;(function (window, define) { var _ = { version: "2.3.0", areas: {}, apis: {}, inherit: function inherit(api, o) { for (var p in api) { if (!o.hasOwnProperty(p)) { o[p] = api[p]; } } return o; }, stringify: function stringify(d) { return d === undefined || typeof d === "function" ? d + '' : (0, _stringify2.default)(d); }, parse: function parse(s) { try { return JSON.parse(s); } catch (e) { return s; } }, fn: function fn(name, _fn) { _.storeAPI[name] = _fn; for (var api in _.apis) { _.apis[api][name] = _fn; } }, get: function get(area, key) { return area.getItem(key); }, set: function set(area, key, string) { area.setItem(key, string); }, remove: function remove(area, key) { area.removeItem(key); }, key: function key(area, i) { return area.key(i); }, length: function length(area) { return area.length; }, clear: function clear(area) { area.clear(); }, Store: function Store(id, area, namespace) { var store = _.inherit(_.storeAPI, function (key, data, overwrite) { if (arguments.length === 0) { return store.getAll(); } if (data !== undefined) { return store.set(key, data, overwrite); } if (typeof key === "string") { return store.get(key); } if (!key) { return store.clear(); } return store.setAll(key, data); }); store._id = id; try { var testKey = '_safariPrivate_'; area.setItem(testKey, 'sucks'); store._area = area; area.removeItem(testKey); } catch (e) {} if (!store._area) { store._area = _.inherit(_.storageAPI, { items: {}, name: 'fake' }); } store._ns = namespace || ''; if (!_.areas[id]) { _.areas[id] = store._area; } if (!_.apis[store._ns + store._id]) { _.apis[store._ns + store._id] = store; } return store; }, storeAPI: { area: function area(id, _area) { var store = this[id]; if (!store || !store.area) { store = _.Store(id, _area, this._ns); if (!this[id]) { this[id] = store; } } return store; }, namespace: function namespace(_namespace, noSession) { if (!_namespace) { return this._ns ? this._ns.substring(0, this._ns.length - 1) : ''; } var ns = _namespace, store = this[ns]; if (!store || !store.namespace) { store = _.Store(this._id, this._area, this._ns + ns + '.'); if (!this[ns]) { this[ns] = store; } if (!noSession) { store.area('session', _.areas.session); } } return store; }, isFake: function isFake() { return this._area.name === 'fake'; }, toString: function toString() { return 'store' + (this._ns ? '.' + this.namespace() : '') + '[' + this._id + ']'; }, has: function has(key) { if (this._area.has) { return this._area.has(this._in(key)); } return !!(this._in(key) in this._area); }, size: function size() { return this.keys().length; }, each: function each(fn, and) { for (var i = 0, m = _.length(this._area); i < m; i++) { var key = this._out(_.key(this._area, i)); if (key !== undefined) { if (fn.call(this, key, and || this.get(key)) === false) { break; } } if (m > _.length(this._area)) { m--;i--; } } return and || this; }, keys: function keys() { return this.each(function (k, list) { list.push(k); }, []); }, get: function get(key, alt) { var s = _.get(this._area, this._in(key)); return s !== null ? _.parse(s) : alt || s; }, getAll: function getAll() { return this.each(function (k, all) { all[k] = this.get(k); }, {}); }, set: function set(key, data, overwrite) { var d = this.get(key); if (d != null && overwrite === false) { return data; } return _.set(this._area, this._in(key), _.stringify(data), overwrite) || d; }, setAll: function setAll(data, overwrite) { var changed, val; for (var key in data) { val = data[key]; if (this.set(key, val, overwrite) !== val) { changed = true; } } return changed; }, remove: function remove(key) { var d = this.get(key); _.remove(this._area, this._in(key)); return d; }, clear: function clear() { if (!this._ns) { _.clear(this._area); } else { this.each(function (k) { _.remove(this._area, this._in(k)); }, 1); } return this; }, clearAll: function clearAll() { var area = this._area; for (var id in _.areas) { if (_.areas.hasOwnProperty(id)) { this._area = _.areas[id]; this.clear(); } } this._area = area; return this; }, _in: function _in(k) { if (typeof k !== "string") { k = _.stringify(k); } return this._ns ? this._ns + k : k; }, _out: function _out(k) { return this._ns ? k && k.indexOf(this._ns) === 0 ? k.substring(this._ns.length) : undefined : k; } }, storageAPI: { length: 0, has: function has(k) { return this.items.hasOwnProperty(k); }, key: function key(i) { var c = 0; for (var k in this.items) { if (this.has(k) && i === c++) { return k; } } }, setItem: function setItem(k, v) { if (!this.has(k)) { this.length++; } this.items[k] = v; }, removeItem: function removeItem(k) { if (this.has(k)) { delete this.items[k]; this.length--; } }, getItem: function getItem(k) { return this.has(k) ? this.items[k] : null; }, clear: function clear() { for (var k in this.list) { this.removeItem(k); } }, toString: function toString() { return this.length + ' items in ' + this.name + 'Storage'; } } }; if (window.store) { _.conflict = window.store; } var store = _.Store("local"); store.local = store; store._ = _; store.area("session"); window.store = store; if (typeof define === 'function' && define.amd !== undefined) { define(function () { return store; }); } else if (typeof module !== 'undefined' && module.exports) { module.exports = store; } })(this, this.define); }).call(context); queryString = context.queryString; store = context.store; function extend(obj) { if (!isObject(obj)) { return obj; } var source, prop; for (var i = 1, length = arguments.length; i < length; i++) { source = arguments[i]; for (prop in source) { obj[prop] = source[prop]; } } return obj; } function isArray(obj) { return '[object Array]' === Object.prototype.toString.call(obj); } function isFunction(obj) { return '' + (typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj)) === 'function'; } function isObject(obj) { var type = typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj); return type === 'function' || type === 'object' && !!obj; } function isString(value) { return typeof value == 'string' || value && (typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) == 'object' && Object.prototype.toString.call(value) == '[object String]' || false; } function uuidv4() { var d = perfnow().now(); var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c == 'x' ? r : r & 0x3 | 0x8).toString(16); }); return uuid; } var defaults = { transport: '', queueTimeout: 100 }, localStore = store.namespace('gumshoe'), storage = store.namespace('gumshoe').session, queue = storage('queue') || [], transports = {}; if (!isArray(queue)) { queue = []; } function gumshoe(options) { var clientUuid = localStore('clientUuid'); options = extend({}, defaults, options); if (isString(options.transport)) { options.transport = [options.transport]; } else if (!isArray(options.transport)) { throw 'Gumeshoe: Transport property must be a [String] or [Array].'; } if (!clientUuid) { clientUuid = uuidv4(); localStore({ clientUuid: clientUuid }); } options.clientUuid = clientUuid; session(options.sessionFn); gumshoe.options = options; } function each(obj, iterator, context) { if (obj === null) { return; } if (Array.prototype.forEach && obj.forEach === Array.prototype.forEach) { obj.forEach(iterator, context); } else if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { if (iterator.call(context, obj[i], i, obj) === {}) { return; } } } else { for (var key in obj) { if (obj.hasOwnProperty(key)) { if (iterator.call(context, obj[key], key, obj) === {}) { return; } } } } } function map(obj, iterator, context) { var results = []; if (!obj) { return results; } if (Array.prototype.map && obj.map === Array.prototype.map) { return obj.map(iterator, context); } each(obj, function (value, index, list) { results[results.length] = iterator.call(context, value, index, list); }); return results; } function collectPlugins() { var result, plugins = navigator.plugins || []; result = map(plugins, function (plugin) { var mimeTypes = map(plugin, function (mimeType) { var type = mimeType.type; if (mimeType.suffixes) { type += '~' + mimeType.suffixes; } return type; }); return { description: plugin.description, filename: plugin.filename, mimeTypes: mimeTypes, name: plugin.name }; }); return result; } function collect() { function getViewport() { var e = window, a = 'inner'; if (!('innerWidth' in window)) { a = 'client'; e = document.documentElement || document.body; } return { width: e[a + 'Width'], height: e[a + 'Height'] }; } var viewport = getViewport(), query = queryString.parse(location.search), result = { characterSet: document.characterSet || document.charset || document.inputEncoding || 'Unknown', colorDepth: screen.colorDepth + '', googleClickId: query.gclid || '', hash: window.location.hash, host: window.location.host, hostName: window.location.hostname, ipAddress: '', javaEnabled: navigator.javaEnabled ? navigator.javaEnabled() : false, language: window.navigator.userLanguage || window.navigator.language || 'Unknown', loginKey: query.lk || '', origin: window.location.origin || '', path: window.location.pathname, platform: window.navigator.platform, plugins: collectPlugins(), port: window.location.port || 80, promotionKey: query.pkey || '', protocol: window.location.protocol, queryString: window.location.search, referer: document.referrer, screenAvailHeight: screen.availHeight, screenAvailWidth: screen.availWidth, screenHeight: screen.height, screenOrientationAngle: '', screenOrientationType: '', screenPixelDepth: screen.pixelDepth + '', screenResolution: screen.width + 'x' + screen.height, screenWidth: screen.width, title: document.title, url: window.location.href, userAgent: window.navigator.userAgent, utmCampaign: query.utm_campaign || '', utmContent: query.utm_content || '', utmMedium: query.utm_medium || '', utmSource: query.utm_source || '', utmTerm: query.utm_term || '', viewportHeight: viewport.height, viewportResolution: viewport.width + 'x' + viewport.height, viewportWidth: viewport.width }, intFields = ['port', 'screenAvailHeight', 'screenAvailWidth', 'screenHeight', 'screenOrientationAngle', 'screenWidth', 'viewportHeight', 'viewportWidth'], prop, value; if (result.javaEnabled === undefined) { result.javaEnabled = false; } if (screen.orientation) { result.screenOrientationAngle = parseInt(screen.orientation.angle ? screen.orientation.angle : '0'); result.screenOrientationType = screen.orientation.type ? screen.orientation.type : ''; if (isNaN(result.screenOrientationAngle)) { result.screenOrientationAngle = 0; } } for (var i = 0; i < intFields.length; i++) { prop = intFields[i]; value = parseInt(result[prop]); if (isNaN(value)) { value = 0; } result[prop] = value; } return result; } function session(fn) { function getUtm() { return { campaign: query.utm_campaign || '', medium: query.utm_medium || '', source: query.utm_source || '', utmTerm: query.utm_term || '' }; } var now = new Date().getTime(), query = queryString.parse(location.search), lastUtm = storage('utm') || getUtm(), utm = getUtm(), timestamp, difference; storage('utm', utm); if (!storage('uuid')) { storage('uuid', uuidv4()); storage('timestamp', now); } else { timestamp = storage('timestamp'); difference = now - timestamp; if (fn) { if (fn.call(this, timestamp, difference, query)) { storage('uuid', uuidv4()); } } else if ((0, _stringify2.default)(lastUtm) !== (0, _stringify2.default)(utm) || difference > 1000 * 60 * 30) { storage('uuid', uuidv4()); } } } function send(eventName, eventData) { var pageData = collect(), baseData = { clientUuid: gumshoe.options.clientUuid, eventName: eventName, eventData: eventData || {}, gumshoe: '0.8.1', pageData: pageData, sessionUuid: storage('uuid'), timestamp: new Date().getTime(), timezoneOffset: new Date().getTimezoneOffset(), uuid: uuidv4() }, transportFound = false; session(gumshoe.options.sessionFn); if (gumshoe.options.transport) { for (var i = 0; i < gumshoe.options.transport.length; i++) { var transportName = gumshoe.options.transport[i], transport, data; if (transportName && transports[transportName]) { transportFound = true; transport = transports[transportName]; data = transport.map ? transport.map(baseData) : baseData; data = extend(baseData, data); if (!isString(data.eventData)) { data.eventData = (0, _stringify2.default)(data.eventData); } if (!isString(data.pageData.plugins)) { data.pageData.plugins = (0, _stringify2.default)(data.pageData.plugins); } if (!data.pageData.ipAddress) { data.pageData.ipAddress = ''; } pushEvent(eventName, transportName, data); } else { throw 'Gumshoe: The transport name: ' + transportName + ', doesn\'t map to a valid transport.'; } } } } function nextEvent() { if (!queue.length) { return; } var nevent = queue.shift(), transport = transports[nevent.transportName]; storage('queue', queue); transport.send(nevent.data, function (err, result) { if (err) { console.warn('Gumshoe: Retrying. Error received from transport: ' + nevent.transportName + ', for event: ' + nevent.eventName); queue.push(nevent); } }); setTimeout(nextEvent, gumshoe.options.queueTimeout); } function pushEvent(eventName, transportName, data) { var transport; if (storage.isFake()) { transport = transports[transportName]; transport.send(data); return; } queue.push({ eventName: eventName, transportName: transportName, data: data }); storage('queue', queue); setTimeout(nextEvent, gumshoe.options.queueTimeout); } function transport(tp) { if (!tp.name) { throw 'Gumshoe: Transport [Object] must have a name defined.'; } transports[tp.name] = tp; } gumshoe.version = '0.8.1'; gumshoe.options = {}; gumshoe.extend = extend; gumshoe.reqwest = context.reqwest; gumshoe.send = send; gumshoe.transport = transport; gumshoe.uuid = uuidv4; gumshoe._ = { collect: collect, localStorage: localStore, queryString: queryString, queue: queue, storage: storage, transports: transports }; return gumshoe; } exports.default = gumshoeFactory; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { var core = __webpack_require__(0); var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify }); module.exports = function stringify(it) { // eslint-disable-line no-unused-vars return $JSON.stringify.apply($JSON, arguments); }; /***/ }), /* 96 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(97), __esModule: true }; /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(45); __webpack_require__(50); module.exports = __webpack_require__(36).f('iterator'); /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(99), __esModule: true }; /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(100); __webpack_require__(44); __webpack_require__(106); __webpack_require__(107); module.exports = __webpack_require__(0).Symbol; /***/ }), /* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // ECMAScript 6 symbols shim var global = __webpack_require__(1); var has = __webpack_require__(9); var DESCRIPTORS = __webpack_require__(8); var $export = __webpack_require__(5); var redefine = __webpack_require__(47); var META = __webpack_require__(101).KEY; var $fails = __webpack_require__(13); var shared = __webpack_require__(30); var setToStringTag = __webpack_require__(24); var uid = __webpack_require__(20); var wks = __webpack_require__(2); var wksExt = __webpack_require__(36); var wksDefine = __webpack_require__(37); var enumKeys = __webpack_require__(102); var isArray = __webpack_require__(103); var anObject = __webpack_require__(7); var isObject = __webpack_require__(11); var toIObject = __webpack_require__(12); var toPrimitive = __webpack_require__(33); var createDesc = __webpack_require__(23); var _create = __webpack_require__(48); var gOPNExt = __webpack_require__(104); var $GOPD = __webpack_require__(105); var $DP = __webpack_require__(6); var $keys = __webpack_require__(16); var gOPD = $GOPD.f; var dP = $DP.f; var gOPN = gOPNExt.f; var $Symbol = global.Symbol; var $JSON = global.JSON; var _stringify = $JSON && $JSON.stringify; var PROTOTYPE = 'prototype'; var HIDDEN = wks('_hidden'); var TO_PRIMITIVE = wks('toPrimitive'); var isEnum = {}.propertyIsEnumerable; var SymbolRegistry = shared('symbol-registry'); var AllSymbols = shared('symbols'); var OPSymbols = shared('op-symbols'); var ObjectProto = Object[PROTOTYPE]; var USE_NATIVE = typeof $Symbol == 'function'; var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 var setSymbolDesc = DESCRIPTORS && $fails(function () { return _create(dP({}, 'a', { get: function () { return dP(this, 'a', { value: 7 }).a; } })).a != 7; }) ? function (it, key, D) { var protoDesc = gOPD(ObjectProto, key); if (protoDesc) delete ObjectProto[key]; dP(it, key, D); if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); } : dP; var wrap = function (tag) { var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); sym._k = tag; return sym; }; var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { return typeof it == 'symbol'; } : function (it) { return it instanceof $Symbol; }; var $defineProperty = function defineProperty(it, key, D) { if (it === ObjectProto) $defineProperty(OPSymbols, key, D); anObject(it); key = toPrimitive(key, true); anObject(D); if (has(AllSymbols, key)) { if (!D.enumerable) { if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); it[HIDDEN][key] = true; } else { if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; D = _create(D, { enumerable: createDesc(0, false) }); } return setSymbolDesc(it, key, D); } return dP(it, key, D); }; var $defineProperties = function defineProperties(it, P) { anObject(it); var keys = enumKeys(P = toIObject(P)); var i = 0; var l = keys.length; var key; while (l > i) $defineProperty(it, key = keys[i++], P[key]); return it; }; var $create = function create(it, P) { return P === undefined ? _create(it) : $defineProperties(_create(it), P); }; var $propertyIsEnumerable = function propertyIsEnumerable(key) { var E = isEnum.call(this, key = toPrimitive(key, true)); if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; }; var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { it = toIObject(it); key = toPrimitive(key, true); if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; var D = gOPD(it, key); if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; return D; }; var $getOwnPropertyNames = function getOwnPropertyNames(it) { var names = gOPN(toIObject(it)); var result = []; var i = 0; var key; while (names.length > i) { if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); } return result; }; var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { var IS_OP = it === ObjectProto; var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); var result = []; var i = 0; var key; while (names.length > i) { if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); } return result; }; // 19.4.1.1 Symbol([description]) if (!USE_NATIVE) { $Symbol = function Symbol() { if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); var tag = uid(arguments.length > 0 ? arguments[0] : undefined); var $set = function (value) { if (this === ObjectProto) $set.call(OPSymbols, value); if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; setSymbolDesc(this, tag, createDesc(1, value)); }; if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); return wrap(tag); }; redefine($Symbol[PROTOTYPE], 'toString', function toString() { return this._k; }); $GOPD.f = $getOwnPropertyDescriptor; $DP.f = $defineProperty; __webpack_require__(57).f = gOPNExt.f = $getOwnPropertyNames; __webpack_require__(25).f = $propertyIsEnumerable; __webpack_require__(38).f = $getOwnPropertySymbols; if (DESCRIPTORS && !__webpack_require__(18)) { redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); } wksExt.f = function (name) { return wrap(wks(name)); }; } $export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); for (var es6Symbols = ( // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' ).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); $export($export.S + $export.F * !USE_NATIVE, 'Symbol', { // 19.4.2.1 Symbol.for(key) 'for': function (key) { return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key); }, // 19.4.2.5 Symbol.keyFor(sym) keyFor: function keyFor(sym) { if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; }, useSetter: function () { setter = true; }, useSimple: function () { setter = false; } }); $export($export.S + $export.F * !USE_NATIVE, 'Object', { // 19.1.2.2 Object.create(O [, Properties]) create: $create, // 19.1.2.4 Object.defineProperty(O, P, Attributes) defineProperty: $defineProperty, // 19.1.2.3 Object.defineProperties(O, Properties) defineProperties: $defineProperties, // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) getOwnPropertyDescriptor: $getOwnPropertyDescriptor, // 19.1.2.7 Object.getOwnPropertyNames(O) getOwnPropertyNames: $getOwnPropertyNames, // 19.1.2.8 Object.getOwnPropertySymbols(O) getOwnPropertySymbols: $getOwnPropertySymbols }); // 24.3.2 JSON.stringify(value [, replacer [, space]]) $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { var S = $Symbol(); // MS Edge converts symbol values to JSON as {} // WebKit converts symbol values to JSON as null // V8 throws on boxed symbols return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; })), 'JSON', { stringify: function stringify(it) { var args = [it]; var i = 1; var replacer, $replacer; while (arguments.length > i) args.push(arguments[i++]); $replacer = replacer = args[1]; if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined if (!isArray(replacer)) replacer = function (key, value) { if (typeof $replacer == 'function') value = $replacer.call(this, key, value); if (!isSymbol(value)) return value; }; args[1] = replacer; return _stringify.apply($JSON, args); } }); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) $Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag] setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag] setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag] setToStringTag(global.JSON, 'JSON', true); /***/ }), /* 101 */ /***/ (function(module, exports, __webpack_require__) { var META = __webpack_require__(20)('meta'); var isObject = __webpack_require__(11); var has = __webpack_require__(9); var setDesc = __webpack_require__(6).f; var id = 0; var isExtensible = Object.isExtensible || function () { return true; }; var FREEZE = !__webpack_require__(13)(function () { return isExtensible(Object.preventExtensions({})); }); var setMeta = function (it) { setDesc(it, META, { value: { i: 'O' + ++id, // object ID w: {} // weak collections IDs } }); }; var fastKey = function (it, create) { // return primitive with prefix if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; if (!has(it, META)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return 'F'; // not necessary to add metadata if (!create) return 'E'; // add missing metadata setMeta(it); // return object ID } return it[META].i; }; var getWeak = function (it, create) { if (!has(it, META)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return true; // not necessary to add metadata if (!create) return false; // add missing metadata setMeta(it); // return hash weak collections IDs } return it[META].w; }; // add metadata on freeze-family methods calling var onFreeze = function (it) { if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); return it; }; var meta = module.exports = { KEY: META, NEED: false, fastKey: fastKey, getWeak: getWeak, onFreeze: onFreeze }; /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { // all enumerable object keys, includes symbols var getKeys = __webpack_require__(16); var gOPS = __webpack_require__(38); var pIE = __webpack_require__(25); module.exports = function (it) { var result = getKeys(it); var getSymbols = gOPS.f; if (getSymbols) { var symbols = getSymbols(it); var isEnum = pIE.f; var i = 0; var key; while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); } return result; }; /***/ }), /* 103 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.2 IsArray(argument) var cof = __webpack_require__(17); module.exports = Array.isArray || function isArray(arg) { return cof(arg) == 'Array'; }; /***/ }), /* 104 */ /***/ (function(module, exports, __webpack_require__) { // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var toIObject = __webpack_require__(12); var gOPN = __webpack_require__(57).f; var toString = {}.toString; var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; var getWindowNames = function (it) { try { return gOPN(it); } catch (e) { return windowNames.slice(); } }; module.exports.f = function getOwnPropertyNames(it) { return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); }; /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { var pIE = __webpack_require__(25); var createDesc = __webpack_require__(23); var toIObject = __webpack_require__(12); var toPrimitive = __webpack_require__(33); var has = __webpack_require__(9); var IE8_DOM_DEFINE = __webpack_require__(43); var gOPD = Object.getOwnPropertyDescriptor; exports.f = __webpack_require__(8) ? gOPD : function getOwnPropertyDescriptor(O, P) { O = toIObject(O); P = toPrimitive(P, true); if (IE8_DOM_DEFINE) try { return gOPD(O, P); } catch (e) { /* empty */ } if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); }; /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(37)('asyncIterator'); /***/ }), /* 107 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(37)('observable'); /***/ }), /* 108 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ ;(function(root) { // Detect free variables `exports`. var freeExports = typeof exports == 'object' && exports; // Detect free variable `module`. var freeModule = typeof module == 'object' && module && module.exports == freeExports && module; // Detect free variable `global`, from Node.js or Browserified code, and use // it as `root`. var freeGlobal = typeof global == 'object' && global; if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { root = freeGlobal; } /*--------------------------------------------------------------------------*/ var InvalidCharacterError = function(message) { this.message = message; }; InvalidCharacterError.prototype = new Error; InvalidCharacterError.prototype.name = 'InvalidCharacterError'; var error = function(message) { // Note: the error messages used throughout this file match those used by // the native `atob`/`btoa` implementation in Chromium. throw new InvalidCharacterError(message); }; var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; // http://whatwg.org/html/common-microsyntaxes.html#space-character var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; // `decode` is designed to be fully compatible with `atob` as described in the // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob // The optimized base64-decoding algorithm used is based on @atk’s excellent // implementation. https://gist.github.com/atk/1020396 var decode = function(input) { input = String(input) .replace(REGEX_SPACE_CHARACTERS, ''); var length = input.length; if (length % 4 == 0) { input = input.replace(/==?$/, ''); length = input.length; } if ( length % 4 == 1 || // http://whatwg.org/C#alphanumeric-ascii-characters /[^+a-zA-Z0-9/]/.test(input) ) { error( 'Invalid character: the string to be decoded is not correctly encoded.' ); } var bitCounter = 0; var bitStorage; var buffer; var output = ''; var position = -1; while (++position < length) { buffer = TABLE.indexOf(input.charAt(position)); bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; // Unless this is the first of a group of 4 characters… if (bitCounter++ % 4) { // …convert the first 8 bits to a single ASCII character. output += String.fromCharCode( 0xFF & bitStorage >> (-2 * bitCounter & 6) ); } } return output; }; // `encode` is designed to be fully compatible with `btoa` as described in the // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa var encode = function(input) { input = String(input); if (/[^\0-\xFF]/.test(input)) { // Note: no need to special-case astral symbols here, as surrogates are // matched, and the input is supposed to only contain ASCII anyway. error( 'The string to be encoded contains characters outside of the ' + 'Latin1 range.' ); } var padding = input.length % 3; var output = ''; var position = -1; var a; var b; var c; var d; var buffer; // Make sure any padding is handled outside of the loop. var length = input.length - padding; while (++position < length) { // Read three bytes, i.e. 24 bits. a = input.charCodeAt(position) << 16; b = input.charCodeAt(++position) << 8; c = input.charCodeAt(++position); buffer = a + b + c; // Turn the 24 bits into four chunks of 6 bits each, and append the // matching character for each of them to the output. output += ( TABLE.charAt(buffer >> 18 & 0x3F) + TABLE.charAt(buffer >> 12 & 0x3F) + TABLE.charAt(buffer >> 6 & 0x3F) + TABLE.charAt(buffer & 0x3F) ); } if (padding == 2) { a = input.charCodeAt(position) << 8; b = input.charCodeAt(++position); buffer = a + b; output += ( TABLE.charAt(buffer >> 10) + TABLE.charAt((buffer >> 4) & 0x3F) + TABLE.charAt((buffer << 2) & 0x3F) + '=' ); } else if (padding == 1) { buffer = input.charCodeAt(position); output += ( TABLE.charAt(buffer >> 2) + TABLE.charAt((buffer << 4) & 0x3F) + '==' ); } return output; }; var base64 = { 'encode': encode, 'decode': decode, 'version': '0.1.0' }; // Some AMD build optimizers, like r.js, check for specific condition patterns // like the following: if ( true ) { !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return base64; }).call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else if (freeExports && !freeExports.nodeType) { if (freeModule) { // in Node.js or RingoJS v0.8.0+ freeModule.exports = base64; } else { // in Narwhal or RingoJS v0.7.0- for (var key in base64) { base64.hasOwnProperty(key) && (freeExports[key] = base64[key]); } } } else { // in Rhino or a web browser root.base64 = base64; } }(this)); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(109)(module))) /***/ }), /* 109 */ /***/ (function(module, exports) { module.exports = function(module) { if(!module.webpackPolyfill) { module.deprecate = function() {}; module.paths = []; // module.parent = undefined by default if(!module.children) module.children = []; Object.defineProperty(module, "loaded", { enumerable: true, get: function() { return module.l; } }); Object.defineProperty(module, "id", { enumerable: true, get: function() { return module.i; } }); module.webpackPolyfill = 1; } return module; }; /***/ }), /* 110 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(111), __esModule: true }; /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(112); module.exports = __webpack_require__(0).Object.assign; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.1 Object.assign(target, source) var $export = __webpack_require__(5); $export($export.S + $export.F, 'Object', { assign: __webpack_require__(113) }); /***/ }), /* 113 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 19.1.2.1 Object.assign(target, source, ...) var getKeys = __webpack_require__(16); var gOPS = __webpack_require__(38); var pIE = __webpack_require__(25); var toObject = __webpack_require__(26); var IObject = __webpack_require__(41); var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) module.exports = !$assign || __webpack_require__(13)(function () { var A = {}; var B = {}; // eslint-disable-next-line no-undef var S = Symbol(); var K = 'abcdefghijklmnopqrst'; A[S] = 7; K.split('').forEach(function (k) { B[k] = k; }); return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; }) ? function assign(target, source) { // eslint-disable-line no-unused-vars var T = toObject(target); var aLen = arguments.length; var index = 1; var getSymbols = gOPS.f; var isEnum = pIE.f; while (aLen > index) { var S = IObject(arguments[index++]); var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); var length = keys.length; var j = 0; var key; while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; } return T; } : $assign; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { var trim = __webpack_require__(115) , forEach = __webpack_require__(116) , isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; } module.exports = function (headers) { if (!headers) return {} var result = {} forEach( trim(headers).split('\n') , function (row) { var index = row.indexOf(':') , key = trim(row.slice(0, index)).toLowerCase() , value = trim(row.slice(index + 1)) if (typeof(result[key]) === 'undefined') { result[key] = value } else if (isArray(result[key])) { result[key].push(value) } else { result[key] = [ result[key], value ] } } ) return result } /***/ }), /* 115 */ /***/ (function(module, exports) { exports = module.exports = trim; function trim(str){ return str.replace(/^\s*|\s*$/g, ''); } exports.left = function(str){ return str.replace(/^\s*/, ''); }; exports.right = function(str){ return str.replace(/\s*$/, ''); }; /***/ }), /* 116 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(117) module.exports = forEach var toString = Object.prototype.toString var hasOwnProperty = Object.prototype.hasOwnProperty function forEach(list, iterator, context) { if (!isFunction(iterator)) { throw new TypeError('iterator must be a function') } if (arguments.length < 3) { context = this } if (toString.call(list) === '[object Array]') forEachArray(list, iterator, context) else if (typeof list === 'string') forEachString(list, iterator, context) else forEachObject(list, iterator, context) } function forEachArray(array, iterator, context) { for (var i = 0, len = array.length; i < len; i++) { if (hasOwnProperty.call(array, i)) { iterator.call(context, array[i], i, array) } } } function forEachString(string, iterator, context) { for (var i = 0, len = string.length; i < len; i++) { // no such thing as a sparse string. iterator.call(context, string.charAt(i), i, string) } } function forEachObject(object, iterator, context) { for (var k in object) { if (hasOwnProperty.call(object, k)) { iterator.call(context, object[k], k, object) } } } /***/ }), /* 117 */ /***/ (function(module, exports) { module.exports = isFunction var toString = Object.prototype.toString function isFunction (fn) { var string = toString.call(fn) return string === '[object Function]' || (typeof fn === 'function' && string !== '[object RegExp]') || (typeof window !== 'undefined' && // IE8 and below (fn === window.setTimeout || fn === window.alert || fn === window.confirm || fn === window.prompt)) }; /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = __webpack_require__(14); var _promise2 = _interopRequireDefault(_promise); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); var _xhrPromise = __webpack_require__(59); var _xhrPromise2 = _interopRequireDefault(_xhrPromise); var _util = __webpack_require__(15); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var TwitchClient = function () { function TwitchClient(clientID) { (0, _classCallCheck3.default)(this, TwitchClient); this.extensionId = clientID; this.promise = _promise2.default.resolve(); } (0, _createClass3.default)(TwitchClient, [{ key: 'loaded', value: function loaded() { return this.promise; } }, { key: 'signedTwitchRequest', value: function signedTwitchRequest(method, endpoint, data, JWT) { var headers = { Accept: 'application/vnd.twitchtv.v5+json', 'Client-ID': this.extensionId }; if (JWT) { headers.Authorization = 'Bearer ' + JWT; } return new _promise2.default(function (resolve, reject) { var xhrPromise = new _xhrPromise2.default(); return xhrPromise.send({ method: method, url: 'https://api.twitch.tv/kraken/' + endpoint, headers: headers, data: data }).catch(reject).then(function (resp) { if (resp.status < 400) { resolve(resp.responseText); } reject(resp.responseText); }); }); } }, { key: 'signedTwitchHelixRequest', value: function signedTwitchHelixRequest(method, endpoint, data, JWT) { var headers = { 'Client-ID': this.extensionId }; if (JWT) { headers.Authorization = 'Bearer ' + JWT; } return new _promise2.default(function (resolve, reject) { var xhrPromise = new _xhrPromise2.default(); return xhrPromise.send({ method: method, url: 'https://api.twitch.tv/helix/' + endpoint, headers: headers, data: data }).catch(reject).then(function (resp) { if (resp.status < 400) { resolve(resp.responseText.data); } reject(resp.responseText); }); }); } }, { key: 'getTwitchUsers', value: function getTwitchUsers(usernames) { (0, _util.forceType)(usernames, 'array'); if (usernames.length === 0) { return _promise2.default.resolve([]); } return this.signedTwitchRequest('GET', 'users?login=' + usernames.join(',')); } }, { key: 'getTwitchUsersByID', value: function getTwitchUsersByID(userIDs) { (0, _util.forceType)(userIDs, 'array'); if (userIDs.length === 0) { return _promise2.default.resolve([]); } return this.signedTwitchHelixRequest('GET', 'users?id=' + userIDs.join(',')); } }, { key: 'getUserGoods', value: function getUserGoods(JWT) { return this.signedTwitchRequest('POST', 'commerce/user/goods', {}, JWT); } }, { key: 'updateFulfilledGoods', value: function updateFulfilledGoods(JWT, receipts) { return this.signedTwitchRequest('POST', 'commerce/user/goods/fulfill', receipts, JWT); } }]); return TwitchClient; }(); exports.default = TwitchClient; /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _stringify = __webpack_require__(35); var _stringify2 = _interopRequireDefault(_stringify); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); exports.default = Messenger; var _util = __webpack_require__(15); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Pusher = null; if ((0, _util.CurrentEnvironment)() !== _util.ENVIRONMENTS.SERVER) { Pusher = __webpack_require__(120); } var TwitchMessenger = function () { function TwitchMessenger() { (0, _classCallCheck3.default)(this, TwitchMessenger); this.channelID = ''; } (0, _createClass3.default)(TwitchMessenger, [{ key: 'send', value: function send(id, event, target, body) { var data = body || {}; Twitch.ext.send(target, 'application/json', { event: (0, _util.CurrentEnvironment)().environment + ':' + id + ':' + event, data: data }); } }, { key: 'listen', value: function listen(id, topic, callback) { var cb = function cb(t, datatype, message) { try { var parsed = JSON.parse(message); callback(parsed); } catch (err) {} }; Twitch.ext.listen(topic, cb); return { target: topic, cb: cb }; } }, { key: 'unlisten', value: function unlisten(id, h) { Twitch.ext.unlisten(h.target, h.cb); } }]); return TwitchMessenger; }(); var PusherMessenger = function () { function PusherMessenger(ch, muxy) { (0, _classCallCheck3.default)(this, PusherMessenger); this.client = new Pusher('18c26c0d1c7fafb78ba2', { cluster: 'us2', encrypted: true }); this.muxy = muxy; this.channelID = ''; } (0, _createClass3.default)(PusherMessenger, [{ key: 'send', value: function send(id, event, target, body, client) { var scopedEvent = (0, _util.CurrentEnvironment)().environment + ':' + id + ':' + event; client.signedRequest(id, 'POST', 'pusher_broadcast', (0, _stringify2.default)({ target: target, event: scopedEvent, user_id: this.channelID, data: body })); } }, { key: 'listen', value: function listen(id, topic, callback) { if (!this.channel) { var channelName = 'twitch.pubsub.' + this.extensionID + '.' + this.channelID; this.channel = this.client.subscribe(channelName); } var cb = function cb(message) { try { var parsed = JSON.parse(message.message); callback(parsed); } catch (err) {} }; this.channel.bind(topic, cb); return { target: topic, cb: cb }; } }, { key: 'unlisten', value: function unlisten(id, h) { this.channel.unbind(h.target, h.cb); } }]); return PusherMessenger; }(); var ServerMessenger = function () { function ServerMessenger(ch, muxy) { (0, _classCallCheck3.default)(this, ServerMessenger); this.channelID = ch; this.muxy = muxy; } (0, _createClass3.default)(ServerMessenger, [{ key: 'send', value: function send(id, event, target, body, client) { client.signedRequest(id, 'POST', 'broadcast', (0, _stringify2.default)({ target: target, event: event, user_id: this.channelID, data: body })); } }, { key: 'listen', value: function listen() { console.error('Server-side message receiving is not implemented.'); } }, { key: 'unlisten', value: function unlisten() { console.error('Server-side message receiving is not implemented.'); } }]); return ServerMessenger; }(); function Messenger() { switch ((0, _util.CurrentEnvironment)()) { case _util.ENVIRONMENTS.SANDBOX_DEV: return new PusherMessenger(); case _util.ENVIRONMENTS.SANDBOX_TWITCH: case _util.ENVIRONMENTS.PRODUCTION: return new TwitchMessenger(); case _util.ENVIRONMENTS.SERVER: return new ServerMessenger(); default: console.error('Could not determine execution environment.');} } /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { /*! * Pusher JavaScript Library v4.2.2 * https://pusher.com/ * * Copyright 2017, Pusher * Released under the MIT licence. */ (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["Pusher"] = factory(); else root["Pusher"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var pusher_1 = __webpack_require__(1); module.exports = pusher_1["default"]; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var runtime_1 = __webpack_require__(2); var Collections = __webpack_require__(9); var dispatcher_1 = __webpack_require__(24); var timeline_1 = __webpack_require__(39); var level_1 = __webpack_require__(40); var StrategyBuilder = __webpack_require__(41); var timers_1 = __webpack_require__(12); var defaults_1 = __webpack_require__(5); var DefaultConfig = __webpack_require__(63); var logger_1 = __webpack_require__(8); var factory_1 = __webpack_require__(43); var url_store_1 = __webpack_require__(14); var Pusher = (function () { function Pusher(app_key, options) { var _this = this; checkAppKey(app_key); options = options || {}; if (!options.cluster && !(options.wsHost || options.httpHost)) { var suffix = url_store_1["default"].buildLogSuffix("javascriptQuickStart"); logger_1["default"].warn("You should always specify a cluster when connecting. " + suffix); } this.key = app_key; this.config = Collections.extend(DefaultConfig.getGlobalConfig(), options.cluster ? DefaultConfig.getClusterConfig(options.cluster) : {}, options); this.channels = factory_1["default"].createChannels(); this.global_emitter = new dispatcher_1["default"](); this.sessionID = Math.floor(Math.random() * 1000000000); this.timeline = new timeline_1["default"](this.key, this.sessionID, { cluster: this.config.cluster, features: Pusher.getClientFeatures(), params: this.config.timelineParams || {}, limit: 50, level: level_1["default"].INFO, version: defaults_1["default"].VERSION }); if (!this.config.disableStats) { this.timelineSender = factory_1["default"].createTimelineSender(this.timeline, { host: this.config.statsHost, path: "/timeline/v2/" + runtime_1["default"].TimelineTransport.name }); } var getStrategy = function (options) { var config = Collections.extend({}, _this.config, options); return StrategyBuilder.build(runtime_1["default"].getDefaultStrategy(config), config); }; this.connection = factory_1["default"].createConnectionManager(this.key, Collections.extend({ getStrategy: getStrategy, timeline: this.timeline, activityTimeout: this.config.activity_timeout, pongTimeout: this.config.pong_timeout, unavailableTimeout: this.config.unavailable_timeout }, this.config, { encrypted: this.isEncrypted() })); this.connection.bind('connected', function () { _this.subscribeAll(); if (_this.timelineSender) { _this.timelineSender.send(_this.connection.isEncrypted()); } }); this.connection.bind('message', function (params) { var internal = (params.event.indexOf('pusher_internal:') === 0); if (params.channel) { var channel = _this.channel(params.channel); if (channel) { channel.handleEvent(params.event, params.data); } } if (!internal) { _this.global_emitter.emit(params.event, params.data); } }); this.connection.bind('connecting', function () { _this.channels.disconnect(); }); this.connection.bind('disconnected', function () { _this.channels.disconnect(); }); this.connection.bind('error', function (err) { logger_1["default"].warn('Error', err); }); Pusher.instances.push(this); this.timeline.info({ instances: Pusher.instances.length }); if (Pusher.isReady) { this.connect(); } } Pusher.ready = function () { Pusher.isReady = true; for (var i = 0, l = Pusher.instances.length; i < l; i++) { Pusher.instances[i].connect(); } }; Pusher.log = function (message) { if (Pusher.logToConsole && (window).console && (window).console.log) { (window).console.log(message); } }; Pusher.getClientFeatures = function () { return Collections.keys(Collections.filterObject({ "ws": runtime_1["default"].Transports.ws }, function (t) { return t.isSupported({}); })); }; Pusher.prototype.channel = function (name) { return this.channels.find(name); }; Pusher.prototype.allChannels = function () { return this.channels.all(); }; Pusher.prototype.connect = function () { this.connection.connect(); if (this.timelineSender) { if (!this.timelineSenderTimer) { var encrypted = this.connection.isEncrypted(); var timelineSender = this.timelineSender; this.timelineSenderTimer = new timers_1.PeriodicTimer(60000, function () { timelineSender.send(encrypted); }); } } }; Pusher.prototype.disconnect = function () { this.connection.disconnect(); if (this.timelineSenderTimer) { this.timelineSenderTimer.ensureAborted(); this.timelineSenderTimer = null; } }; Pusher.prototype.bind = function (event_name, callback, context) { this.global_emitter.bind(event_name, callback, context); return this; }; Pusher.prototype.unbind = function (event_name, callback, context) { this.global_emitter.unbind(event_name, callback, context); return this; }; Pusher.prototype.bind_global = function (callback) { this.global_emitter.bind_global(callback); return this; }; Pusher.prototype.unbind_global = function (callback) { this.global_emitter.unbind_global(callback); return this; }; Pusher.prototype.unbind_all = function (callback) { this.global_emitter.unbind_all(); return this; }; Pusher.prototype.subscribeAll = function () { var channelName; for (channelName in this.channels.channels) { if (this.channels.channels.hasOwnProperty(channelName)) { this.subscribe(channelName); } } }; Pusher.prototype.subscribe = function (channel_name) { var channel = this.channels.add(channel_name, this); if (channel.subscriptionPending && channel.subscriptionCancelled) { channel.reinstateSubscription(); } else if (!channel.subscriptionPending && this.connection.state === "connected") { channel.subscribe(); } return channel; }; Pusher.prototype.unsubscribe = function (channel_name) { var channel = this.channels.find(channel_name); if (channel && channel.subscriptionPending) { channel.cancelSubscription(); } else { channel = this.channels.remove(channel_name); if (channel && this.connection.state === "connected") { channel.unsubscribe(); } } }; Pusher.prototype.send_event = function (event_name, data, channel) { return this.connection.send_event(event_name, data, channel); }; Pusher.prototype.isEncrypted = function () { if (runtime_1["default"].getProtocol() === "https:") { return true; } else { return Boolean(this.config.encrypted); } }; Pusher.instances = []; Pusher.isReady = false; Pusher.logToConsole = false; Pusher.Runtime = runtime_1["default"]; Pusher.ScriptReceivers = runtime_1["default"].ScriptReceivers; Pusher.DependenciesReceivers = runtime_1["default"].DependenciesReceivers; Pusher.auth_callbacks = runtime_1["default"].auth_callbacks; return Pusher; }()); exports.__esModule = true; exports["default"] = Pusher; function checkAppKey(key) { if (key === null || key === undefined) { throw "You must pass your app key when you instantiate Pusher."; } } runtime_1["default"].setup(Pusher); /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var dependencies_1 = __webpack_require__(3); var xhr_auth_1 = __webpack_require__(7); var jsonp_auth_1 = __webpack_require__(15); var script_request_1 = __webpack_require__(16); var jsonp_request_1 = __webpack_require__(17); var script_receiver_factory_1 = __webpack_require__(4); var jsonp_timeline_1 = __webpack_require__(18); var transports_1 = __webpack_require__(19); var net_info_1 = __webpack_require__(26); var default_strategy_1 = __webpack_require__(27); var transport_connection_initializer_1 = __webpack_require__(28); var http_1 = __webpack_require__(29); var Runtime = { nextAuthCallbackID: 1, auth_callbacks: {}, ScriptReceivers: script_receiver_factory_1.ScriptReceivers, DependenciesReceivers: dependencies_1.DependenciesReceivers, getDefaultStrategy: default_strategy_1["default"], Transports: transports_1["default"], transportConnectionInitializer: transport_connection_initializer_1["default"], HTTPFactory: http_1["default"], TimelineTransport: jsonp_timeline_1["default"], getXHRAPI: function () { return window.XMLHttpRequest; }, getWebSocketAPI: function () { return window.WebSocket || window.MozWebSocket; }, setup: function (PusherClass) { var _this = this; window.Pusher = PusherClass; var initializeOnDocumentBody = function () { _this.onDocumentBody(PusherClass.ready); }; if (!window.JSON) { dependencies_1.Dependencies.load("json2", {}, initializeOnDocumentBody); } else { initializeOnDocumentBody(); } }, getDocument: function () { return document; }, getProtocol: function () { return this.getDocument().location.protocol; }, getAuthorizers: function () { return { ajax: xhr_auth_1["default"], jsonp: jsonp_auth_1["default"] }; }, onDocumentBody: function (callback) { var _this = this; if (document.body) { callback(); } else { setTimeout(function () { _this.onDocumentBody(callback); }, 0); } }, createJSONPRequest: function (url, data) { return new jsonp_request_1["default"](url, data); }, createScriptRequest: function (src) { return new script_request_1["default"](src); }, getLocalStorage: function () { try { return window.localStorage; } catch (e) { return undefined; } }, createXHR: function () { if (this.getXHRAPI()) { return this.createXMLHttpRequest(); } else { return this.createMicrosoftXHR(); } }, createXMLHttpRequest: function () { var Constructor = this.getXHRAPI(); return new Constructor(); }, createMicrosoftXHR: function () { return new ActiveXObject("Microsoft.XMLHTTP"); }, getNetwork: function () { return net_info_1.Network; }, createWebSocket: function (url) { var Constructor = this.getWebSocketAPI(); return new Constructor(url); }, createSocketRequest: function (method, url) { if (this.isXHRSupported()) { return this.HTTPFactory.createXHR(method, url); } else if (this.isXDRSupported(url.indexOf("https:") === 0)) { return this.HTTPFactory.createXDR(method, url); } else { throw "Cross-origin HTTP requests are not supported"; } }, isXHRSupported: function () { var Constructor = this.getXHRAPI(); return Boolean(Constructor) && (new Constructor()).withCredentials !== undefined; }, isXDRSupported: function (encrypted) { var protocol = encrypted ? "https:" : "http:"; var documentProtocol = this.getProtocol(); return Boolean((window['XDomainRequest'])) && documentProtocol === protocol; }, addUnloadListener: function (listener) { if (window.addEventListener !== undefined) { window.addEventListener("unload", listener, false); } else if (window.attachEvent !== undefined) { window.attachEvent("onunload", listener); } }, removeUnloadListener: function (listener) { if (window.addEventListener !== undefined) { window.removeEventListener("unload", listener, false); } else if (window.detachEvent !== undefined) { window.detachEvent("onunload", listener); } } }; exports.__esModule = true; exports["default"] = Runtime; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var script_receiver_factory_1 = __webpack_require__(4); var defaults_1 = __webpack_require__(5); var dependency_loader_1 = __webpack_require__(6); exports.DependenciesReceivers = new script_receiver_factory_1.ScriptReceiverFactory("_pusher_dependencies", "Pusher.DependenciesReceivers"); exports.Dependencies = new dependency_loader_1["default"]({ cdn_http: defaults_1["default"].cdn_http, cdn_https: defaults_1["default"].cdn_https, version: defaults_1["default"].VERSION, suffix: defaults_1["default"].dependency_suffix, receivers: exports.DependenciesReceivers }); /***/ }), /* 4 */ /***/ (function(module, exports) { "use strict"; var ScriptReceiverFactory = (function () { function ScriptReceiverFactory(prefix, name) { this.lastId = 0; this.prefix = prefix; this.name = name; } ScriptReceiverFactory.prototype.create = function (callback) { this.lastId++; var number = this.lastId; var id = this.prefix + number; var name = this.name + "[" + number + "]"; var called = false; var callbackWrapper = function () { if (!called) { callback.apply(null, arguments); called = true; } }; this[number] = callbackWrapper; return { number: number, id: id, name: name, callback: callbackWrapper }; }; ScriptReceiverFactory.prototype.remove = function (receiver) { delete this[receiver.number]; }; return ScriptReceiverFactory; }()); exports.ScriptReceiverFactory = ScriptReceiverFactory; exports.ScriptReceivers = new ScriptReceiverFactory("_pusher_script_", "Pusher.ScriptReceivers"); /***/ }), /* 5 */ /***/ (function(module, exports) { "use strict"; var Defaults = { VERSION: "4.2.2", PROTOCOL: 7, host: 'ws.pusherapp.com', ws_port: 80, wss_port: 443, ws_path: '', sockjs_host: 'sockjs.pusher.com', sockjs_http_port: 80, sockjs_https_port: 443, sockjs_path: "/pusher", stats_host: 'stats.pusher.com', channel_auth_endpoint: '/pusher/auth', channel_auth_transport: 'ajax', activity_timeout: 120000, pong_timeout: 30000, unavailable_timeout: 10000, cdn_http: 'http://js.pusher.com', cdn_https: 'https://js.pusher.com', dependency_suffix: '' }; exports.__esModule = true; exports["default"] = Defaults; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var script_receiver_factory_1 = __webpack_require__(4); var runtime_1 = __webpack_require__(2); var DependencyLoader = (function () { function DependencyLoader(options) { this.options = options; this.receivers = options.receivers || script_receiver_factory_1.ScriptReceivers; this.loading = {}; } DependencyLoader.prototype.load = function (name, options, callback) { var self = this; if (self.loading[name] && self.loading[name].length > 0) { self.loading[name].push(callback); } else { self.loading[name] = [callback]; var request = runtime_1["default"].createScriptRequest(self.getPath(name, options)); var receiver = self.receivers.create(function (error) { self.receivers.remove(receiver); if (self.loading[name]) { var callbacks = self.loading[name]; delete self.loading[name]; var successCallback = function (wasSuccessful) { if (!wasSuccessful) { request.cleanup(); } }; for (var i = 0; i < callbacks.length; i++) { callbacks[i](error, successCallback); } } }); request.send(receiver); } }; DependencyLoader.prototype.getRoot = function (options) { var cdn; var protocol = runtime_1["default"].getDocument().location.protocol; if ((options && options.encrypted) || protocol === "https:") { cdn = this.options.cdn_https; } else { cdn = this.options.cdn_http; } return cdn.replace(/\/*$/, "") + "/" + this.options.version; }; DependencyLoader.prototype.getPath = function (name, options) { return this.getRoot(options) + '/' + name + this.options.suffix + '.js'; }; ; return DependencyLoader; }()); exports.__esModule = true; exports["default"] = DependencyLoader; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger_1 = __webpack_require__(8); var runtime_1 = __webpack_require__(2); var url_store_1 = __webpack_require__(14); var ajax = function (context, socketId, callback) { var self = this, xhr; xhr = runtime_1["default"].createXHR(); xhr.open("POST", self.options.authEndpoint, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); for (var headerName in this.authOptions.headers) { xhr.setRequestHeader(headerName, this.authOptions.headers[headerName]); } xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { var data, parsed = false; try { data = JSON.parse(xhr.responseText); parsed = true; } catch (e) { callback(true, 'JSON returned from webapp was invalid, yet status code was 200. Data was: ' + xhr.responseText); } if (parsed) { callback(false, data); } } else { var suffix = url_store_1["default"].buildLogSuffix("authenticationEndpoint"); logger_1["default"].warn(("Couldn't retrieve authentication info. " + xhr.status) + ("Clients must be authenticated to join private or presence channels. " + suffix)); callback(true, xhr.status); } } }; xhr.send(this.composeQuery(socketId)); return xhr; }; exports.__esModule = true; exports["default"] = ajax; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var collections_1 = __webpack_require__(9); var pusher_1 = __webpack_require__(1); var Logger = { debug: function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } if (!pusher_1["default"].log) { return; } pusher_1["default"].log(collections_1.stringify.apply(this, arguments)); }, warn: function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } var message = collections_1.stringify.apply(this, arguments); if (pusher_1["default"].log) { pusher_1["default"].log(message); } else if ((window).console) { if ((window).console.warn) { (window).console.warn(message); } else if ((window).console.log) { (window).console.log(message); } } } }; exports.__esModule = true; exports["default"] = Logger; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var base64_1 = __webpack_require__(10); var util_1 = __webpack_require__(11); function extend(target) { var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } for (var i = 0; i < sources.length; i++) { var extensions = sources[i]; for (var property in extensions) { if (extensions[property] && extensions[property].constructor && extensions[property].constructor === Object) { target[property] = extend(target[property] || {}, extensions[property]); } else { target[property] = extensions[property]; } } } return target; } exports.extend = extend; function stringify() { var m = ["Pusher"]; for (var i = 0; i < arguments.length; i++) { if (typeof arguments[i] === "string") { m.push(arguments[i]); } else { m.push(safeJSONStringify(arguments[i])); } } return m.join(" : "); } exports.stringify = stringify; function arrayIndexOf(array, item) { var nativeIndexOf = Array.prototype.indexOf; if (array === null) { return -1; } if (nativeIndexOf && array.indexOf === nativeIndexOf) { return array.indexOf(item); } for (var i = 0, l = array.length; i < l; i++) { if (array[i] === item) { return i; } } return -1; } exports.arrayIndexOf = arrayIndexOf; function objectApply(object, f) { for (var key in object) { if (Object.prototype.hasOwnProperty.call(object, key)) { f(object[key], key, object); } } } exports.objectApply = objectApply; function keys(object) { var keys = []; objectApply(object, function (_, key) { keys.push(key); }); return keys; } exports.keys = keys; function values(object) { var values = []; objectApply(object, function (value) { values.push(value); }); return values; } exports.values = values; function apply(array, f, context) { for (var i = 0; i < array.length; i++) { f.call(context || (window), array[i], i, array); } } exports.apply = apply; function map(array, f) { var result = []; for (var i = 0; i < array.length; i++) { result.push(f(array[i], i, array, result)); } return result; } exports.map = map; function mapObject(object, f) { var result = {}; objectApply(object, function (value, key) { result[key] = f(value); }); return result; } exports.mapObject = mapObject; function filter(array, test) { test = test || function (value) { return !!value; }; var result = []; for (var i = 0; i < array.length; i++) { if (test(array[i], i, array, result)) { result.push(array[i]); } } return result; } exports.filter = filter; function filterObject(object, test) { var result = {}; objectApply(object, function (value, key) { if ((test && test(value, key, object, result)) || Boolean(value)) { result[key] = value; } }); return result; } exports.filterObject = filterObject; function flatten(object) { var result = []; objectApply(object, function (value, key) { result.push([key, value]); }); return result; } exports.flatten = flatten; function any(array, test) { for (var i = 0; i < array.length; i++) { if (test(array[i], i, array)) { return true; } } return false; } exports.any = any; function all(array, test) { for (var i = 0; i < array.length; i++) { if (!test(array[i], i, array)) { return false; } } return true; } exports.all = all; function encodeParamsObject(data) { return mapObject(data, function (value) { if (typeof value === "object") { value = safeJSONStringify(value); } return encodeURIComponent(base64_1["default"](value.toString())); }); } exports.encodeParamsObject = encodeParamsObject; function buildQueryString(data) { var params = filterObject(data, function (value) { return value !== undefined; }); var query = map(flatten(encodeParamsObject(params)), util_1["default"].method("join", "=")).join("&"); return query; } exports.buildQueryString = buildQueryString; function decycleObject(object) { var objects = [], paths = []; return (function derez(value, path) { var i, name, nu; switch (typeof value) { case 'object': if (!value) { return null; } for (i = 0; i < objects.length; i += 1) { if (objects[i] === value) { return { $ref: paths[i] }; } } objects.push(value); paths.push(path); if (Object.prototype.toString.apply(value) === '[object Array]') { nu = []; for (i = 0; i < value.length; i += 1) { nu[i] = derez(value[i], path + '[' + i + ']'); } } else { nu = {}; for (name in value) { if (Object.prototype.hasOwnProperty.call(value, name)) { nu[name] = derez(value[name], path + '[' + JSON.stringify(name) + ']'); } } } return nu; case 'number': case 'string': case 'boolean': return value; } }(object, '$')); } exports.decycleObject = decycleObject; function safeJSONStringify(source) { try { return JSON.stringify(source); } catch (e) { return JSON.stringify(decycleObject(source)); } } exports.safeJSONStringify = safeJSONStringify; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function encode(s) { return btoa(utob(s)); } exports.__esModule = true; exports["default"] = encode; var fromCharCode = String.fromCharCode; var b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var b64tab = {}; for (var i = 0, l = b64chars.length; i < l; i++) { b64tab[b64chars.charAt(i)] = i; } var cb_utob = function (c) { var cc = c.charCodeAt(0); return cc < 0x80 ? c : cc < 0x800 ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f)) : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + fromCharCode(0x80 | (cc & 0x3f)); }; var utob = function (u) { return u.replace(/[^\x00-\x7F]/g, cb_utob); }; var cb_encode = function (ccc) { var padlen = [0, 2, 1][ccc.length % 3]; var ord = ccc.charCodeAt(0) << 16 | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)); var chars = [ b64chars.charAt(ord >>> 18), b64chars.charAt((ord >>> 12) & 63), padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), padlen >= 1 ? '=' : b64chars.charAt(ord & 63) ]; return chars.join(''); }; var btoa = (window).btoa || function (b) { return b.replace(/[\s\S]{1,3}/g, cb_encode); }; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var timers_1 = __webpack_require__(12); var Util = { now: function () { if (Date.now) { return Date.now(); } else { return new Date().valueOf(); } }, defer: function (callback) { return new timers_1.OneOffTimer(0, callback); }, method: function (name) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } var boundArguments = Array.prototype.slice.call(arguments, 1); return function (object) { return object[name].apply(object, boundArguments.concat(arguments)); }; } }; exports.__esModule = true; exports["default"] = Util; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var abstract_timer_1 = __webpack_require__(13); function clearTimeout(timer) { (window).clearTimeout(timer); } function clearInterval(timer) { (window).clearInterval(timer); } var OneOffTimer = (function (_super) { __extends(OneOffTimer, _super); function OneOffTimer(delay, callback) { _super.call(this, setTimeout, clearTimeout, delay, function (timer) { callback(); return null; }); } return OneOffTimer; }(abstract_timer_1["default"])); exports.OneOffTimer = OneOffTimer; var PeriodicTimer = (function (_super) { __extends(PeriodicTimer, _super); function PeriodicTimer(delay, callback) { _super.call(this, setInterval, clearInterval, delay, function (timer) { callback(); return timer; }); } return PeriodicTimer; }(abstract_timer_1["default"])); exports.PeriodicTimer = PeriodicTimer; /***/ }), /* 13 */ /***/ (function(module, exports) { "use strict"; var Timer = (function () { function Timer(set, clear, delay, callback) { var _this = this; this.clear = clear; this.timer = set(function () { if (_this.timer) { _this.timer = callback(_this.timer); } }, delay); } Timer.prototype.isRunning = function () { return this.timer !== null; }; Timer.prototype.ensureAborted = function () { if (this.timer) { this.clear(this.timer); this.timer = null; } }; return Timer; }()); exports.__esModule = true; exports["default"] = Timer; /***/ }), /* 14 */ /***/ (function(module, exports) { "use strict"; var urlStore = { baseUrl: "https://pusher.com", urls: { authenticationEndpoint: { path: "/docs/authenticating_users" }, javascriptQuickStart: { path: "/docs/javascript_quick_start" } } }; var buildLogSuffix = function (key) { var urlPrefix = "See:"; var urlObj = urlStore.urls[key]; if (!urlObj) return ""; var url; if (urlObj.fullUrl) { url = urlObj.fullUrl; } else if (urlObj.path) { url = urlStore.baseUrl + urlObj.path; } if (!url) return ""; return urlPrefix + " " + url; }; exports.__esModule = true; exports["default"] = { buildLogSuffix: buildLogSuffix }; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var logger_1 = __webpack_require__(8); var jsonp = function (context, socketId, callback) { if (this.authOptions.headers !== undefined) { logger_1["default"].warn("Warn", "To send headers with the auth request, you must use AJAX, rather than JSONP."); } var callbackName = context.nextAuthCallbackID.toString(); context.nextAuthCallbackID++; var document = context.getDocument(); var script = document.createElement("script"); context.auth_callbacks[callbackName] = function (data) { callback(false, data); }; var callback_name = "Pusher.auth_callbacks['" + callbackName + "']"; script.src = this.options.authEndpoint + '?callback=' + encodeURIComponent(callback_name) + '&' + this.composeQuery(socketId); var head = document.getElementsByTagName("head")[0] || document.documentElement; head.insertBefore(script, head.firstChild); }; exports.__esModule = true; exports["default"] = jsonp; /***/ }), /* 16 */ /***/ (function(module, exports) { "use strict"; var ScriptRequest = (function () { function ScriptRequest(src) { this.src = src; } ScriptRequest.prototype.send = function (receiver) { var self = this; var errorString = "Error loading " + self.src; self.script = document.createElement("script"); self.script.id = receiver.id; self.script.src = self.src; self.script.type = "text/javascript"; self.script.charset = "UTF-8"; if (self.script.addEventListener) { self.script.onerror = function () { receiver.callback(errorString); }; self.script.onload = function () { receiver.callback(null); }; } else { self.script.onreadystatechange = function () { if (self.script.readyState === 'loaded' || self.script.readyState === 'complete') { receiver.callback(null); } }; } if (self.script.async === undefined && document.attachEvent && /opera/i.test(navigator.userAgent)) { self.errorScript = document.createElement("script"); self.errorScript.id = receiver.id + "_error"; self.errorScript.text = receiver.name + "('" + errorString + "');"; self.script.async = self.errorScript.async = false; } else { self.script.async = true; } var head = document.getElementsByTagName('head')[0]; head.insertBefore(self.script, head.firstChild); if (self.errorScript) { head.insertBefore(self.errorScript, self.script.nextSibling); } }; ScriptRequest.prototype.cleanup = function () { if (this.script) { this.script.onload = this.script.onerror = null; this.script.onreadystatechange = null; } if (this.script && this.script.parentNode) { this.script.parentNode.removeChild(this.script); } if (this.errorScript && this.errorScript.parentNode) { this.errorScript.parentNode.removeChild(this.errorScript); } this.script = null; this.errorScript = null; }; return ScriptRequest; }()); exports.__esModule = true; exports["default"] = ScriptRequest; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var runtime_1 = __webpack_require__(2); var JSONPRequest = (function () { function JSONPRequest(url, data) { this.url = url; this.data = data; } JSONPRequest.prototype.send = function (receiver) { if (this.request) { return; } var query = Collections.buildQueryString(this.data); var url = this.url + "/" + receiver.number + "?" + query; this.request = runtime_1["default"].createScriptRequest(url); this.request.send(receiver); }; JSONPRequest.prototype.cleanup = function () { if (this.request) { this.request.cleanup(); } }; return JSONPRequest; }()); exports.__esModule = true; exports["default"] = JSONPRequest; /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var runtime_1 = __webpack_require__(2); var script_receiver_factory_1 = __webpack_require__(4); var getAgent = function (sender, encrypted) { return function (data, callback) { var scheme = "http" + (encrypted ? "s" : "") + "://"; var url = scheme + (sender.host || sender.options.host) + sender.options.path; var request = runtime_1["default"].createJSONPRequest(url, data); var receiver = runtime_1["default"].ScriptReceivers.create(function (error, result) { script_receiver_factory_1.ScriptReceivers.remove(receiver); request.cleanup(); if (result && result.host) { sender.host = result.host; } if (callback) { callback(error, result); } }); request.send(receiver); }; }; var jsonp = { name: 'jsonp', getAgent: getAgent }; exports.__esModule = true; exports["default"] = jsonp; /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var transports_1 = __webpack_require__(20); var transport_1 = __webpack_require__(22); var URLSchemes = __webpack_require__(21); var runtime_1 = __webpack_require__(2); var dependencies_1 = __webpack_require__(3); var Collections = __webpack_require__(9); var SockJSTransport = new transport_1["default"]({ file: "sockjs", urls: URLSchemes.sockjs, handlesActivityChecks: true, supportsPing: false, isSupported: function () { return true; }, isInitialized: function () { return window.SockJS !== undefined; }, getSocket: function (url, options) { return new window.SockJS(url, null, { js_path: dependencies_1.Dependencies.getPath("sockjs", { encrypted: options.encrypted }), ignore_null_origin: options.ignoreNullOrigin }); }, beforeOpen: function (socket, path) { socket.send(JSON.stringify({ path: path })); } }); var xdrConfiguration = { isSupported: function (environment) { var yes = runtime_1["default"].isXDRSupported(environment.encrypted); return yes; } }; var XDRStreamingTransport = new transport_1["default"](Collections.extend({}, transports_1.streamingConfiguration, xdrConfiguration)); var XDRPollingTransport = new transport_1["default"](Collections.extend({}, transports_1.pollingConfiguration, xdrConfiguration)); transports_1["default"].xdr_streaming = XDRStreamingTransport; transports_1["default"].xdr_polling = XDRPollingTransport; transports_1["default"].sockjs = SockJSTransport; exports.__esModule = true; exports["default"] = transports_1["default"]; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var URLSchemes = __webpack_require__(21); var transport_1 = __webpack_require__(22); var Collections = __webpack_require__(9); var runtime_1 = __webpack_require__(2); var WSTransport = new transport_1["default"]({ urls: URLSchemes.ws, handlesActivityChecks: false, supportsPing: false, isInitialized: function () { return Boolean(runtime_1["default"].getWebSocketAPI()); }, isSupported: function () { return Boolean(runtime_1["default"].getWebSocketAPI()); }, getSocket: function (url) { return runtime_1["default"].createWebSocket(url); } }); var httpConfiguration = { urls: URLSchemes.http, handlesActivityChecks: false, supportsPing: true, isInitialized: function () { return true; } }; exports.streamingConfiguration = Collections.extend({ getSocket: function (url) { return runtime_1["default"].HTTPFactory.createStreamingSocket(url); } }, httpConfiguration); exports.pollingConfiguration = Collections.extend({ getSocket: function (url) { return runtime_1["default"].HTTPFactory.createPollingSocket(url); } }, httpConfiguration); var xhrConfiguration = { isSupported: function () { return runtime_1["default"].isXHRSupported(); } }; var XHRStreamingTransport = new transport_1["default"](Collections.extend({}, exports.streamingConfiguration, xhrConfiguration)); var XHRPollingTransport = new transport_1["default"](Collections.extend({}, exports.pollingConfiguration, xhrConfiguration)); var Transports = { ws: WSTransport, xhr_streaming: XHRStreamingTransport, xhr_polling: XHRPollingTransport }; exports.__esModule = true; exports["default"] = Transports; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var defaults_1 = __webpack_require__(5); function getGenericURL(baseScheme, params, path) { var scheme = baseScheme + (params.encrypted ? "s" : ""); var host = params.encrypted ? params.hostEncrypted : params.hostUnencrypted; return scheme + "://" + host + path; } function getGenericPath(key, queryString) { var path = "/app/" + key; var query = "?protocol=" + defaults_1["default"].PROTOCOL + "&client=js" + "&version=" + defaults_1["default"].VERSION + (queryString ? ("&" + queryString) : ""); return path + query; } exports.ws = { getInitial: function (key, params) { var path = (params.httpPath || "") + getGenericPath(key, "flash=false"); return getGenericURL("ws", params, path); } }; exports.http = { getInitial: function (key, params) { var path = (params.httpPath || "/pusher") + getGenericPath(key); return getGenericURL("http", params, path); } }; exports.sockjs = { getInitial: function (key, params) { return getGenericURL("http", params, params.httpPath || "/pusher"); }, getPath: function (key, params) { return getGenericPath(key); } }; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var transport_connection_1 = __webpack_require__(23); var Transport = (function () { function Transport(hooks) { this.hooks = hooks; } Transport.prototype.isSupported = function (environment) { return this.hooks.isSupported(environment); }; Transport.prototype.createConnection = function (name, priority, key, options) { return new transport_connection_1["default"](this.hooks, name, priority, key, options); }; return Transport; }()); exports.__esModule = true; exports["default"] = Transport; /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var util_1 = __webpack_require__(11); var Collections = __webpack_require__(9); var dispatcher_1 = __webpack_require__(24); var logger_1 = __webpack_require__(8); var runtime_1 = __webpack_require__(2); var TransportConnection = (function (_super) { __extends(TransportConnection, _super); function TransportConnection(hooks, name, priority, key, options) { _super.call(this); this.initialize = runtime_1["default"].transportConnectionInitializer; this.hooks = hooks; this.name = name; this.priority = priority; this.key = key; this.options = options; this.state = "new"; this.timeline = options.timeline; this.activityTimeout = options.activityTimeout; this.id = this.timeline.generateUniqueID(); } TransportConnection.prototype.handlesActivityChecks = function () { return Boolean(this.hooks.handlesActivityChecks); }; TransportConnection.prototype.supportsPing = function () { return Boolean(this.hooks.supportsPing); }; TransportConnection.prototype.connect = function () { var _this = this; if (this.socket || this.state !== "initialized") { return false; } var url = this.hooks.urls.getInitial(this.key, this.options); try { this.socket = this.hooks.getSocket(url, this.options); } catch (e) { util_1["default"].defer(function () { _this.onError(e); _this.changeState("closed"); }); return false; } this.bindListeners(); logger_1["default"].debug("Connecting", { transport: this.name, url: url }); this.changeState("connecting"); return true; }; TransportConnection.prototype.close = function () { if (this.socket) { this.socket.close(); return true; } else { return false; } }; TransportConnection.prototype.send = function (data) { var _this = this; if (this.state === "open") { util_1["default"].defer(function () { if (_this.socket) { _this.socket.send(data); } }); return true; } else { return false; } }; TransportConnection.prototype.ping = function () { if (this.state === "open" && this.supportsPing()) { this.socket.ping(); } }; TransportConnection.prototype.onOpen = function () { if (this.hooks.beforeOpen) { this.hooks.beforeOpen(this.socket, this.hooks.urls.getPath(this.key, this.options)); } this.changeState("open"); this.socket.onopen = undefined; }; TransportConnection.prototype.onError = function (error) { this.emit("error", { type: 'WebSocketError', error: error }); this.timeline.error(this.buildTimelineMessage({ error: error.toString() })); }; TransportConnection.prototype.onClose = function (closeEvent) { if (closeEvent) { this.changeState("closed", { code: closeEvent.code, reason: closeEvent.reason, wasClean: closeEvent.wasClean }); } else { this.changeState("closed"); } this.unbindListeners(); this.socket = undefined; }; TransportConnection.prototype.onMessage = function (message) { this.emit("message", message); }; TransportConnection.prototype.onActivity = function () { this.emit("activity"); }; TransportConnection.prototype.bindListeners = function () { var _this = this; this.socket.onopen = function () { _this.onOpen(); }; this.socket.onerror = function (error) { _this.onError(error); }; this.socket.onclose = function (closeEvent) { _this.onClose(closeEvent); }; this.socket.onmessage = function (message) { _this.onMessage(message); }; if (this.supportsPing()) { this.socket.onactivity = function () { _this.onActivity(); }; } }; TransportConnection.prototype.unbindListeners = function () { if (this.socket) { this.socket.onopen = undefined; this.socket.onerror = undefined; this.socket.onclose = undefined; this.socket.onmessage = undefined; if (this.supportsPing()) { this.socket.onactivity = undefined; } } }; TransportConnection.prototype.changeState = function (state, params) { this.state = state; this.timeline.info(this.buildTimelineMessage({ state: state, params: params })); this.emit(state, params); }; TransportConnection.prototype.buildTimelineMessage = function (message) { return Collections.extend({ cid: this.id }, message); }; return TransportConnection; }(dispatcher_1["default"])); exports.__esModule = true; exports["default"] = TransportConnection; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var callback_registry_1 = __webpack_require__(25); var Dispatcher = (function () { function Dispatcher(failThrough) { this.callbacks = new callback_registry_1["default"](); this.global_callbacks = []; this.failThrough = failThrough; } Dispatcher.prototype.bind = function (eventName, callback, context) { this.callbacks.add(eventName, callback, context); return this; }; Dispatcher.prototype.bind_global = function (callback) { this.global_callbacks.push(callback); return this; }; Dispatcher.prototype.unbind = function (eventName, callback, context) { this.callbacks.remove(eventName, callback, context); return this; }; Dispatcher.prototype.unbind_global = function (callback) { if (!callback) { this.global_callbacks = []; return this; } this.global_callbacks = Collections.filter(this.global_callbacks || [], function (c) { return c !== callback; }); return this; }; Dispatcher.prototype.unbind_all = function () { this.unbind(); this.unbind_global(); return this; }; Dispatcher.prototype.emit = function (eventName, data) { var i; for (i = 0; i < this.global_callbacks.length; i++) { this.global_callbacks[i](eventName, data); } var callbacks = this.callbacks.get(eventName); if (callbacks && callbacks.length > 0) { for (i = 0; i < callbacks.length; i++) { callbacks[i].fn.call(callbacks[i].context || (window), data); } } else if (this.failThrough) { this.failThrough(eventName, data); } return this; }; return Dispatcher; }()); exports.__esModule = true; exports["default"] = Dispatcher; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var CallbackRegistry = (function () { function CallbackRegistry() { this._callbacks = {}; } CallbackRegistry.prototype.get = function (name) { return this._callbacks[prefix(name)]; }; CallbackRegistry.prototype.add = function (name, callback, context) { var prefixedEventName = prefix(name); this._callbacks[prefixedEventName] = this._callbacks[prefixedEventName] || []; this._callbacks[prefixedEventName].push({ fn: callback, context: context }); }; CallbackRegistry.prototype.remove = function (name, callback, context) { if (!name && !callback && !context) { this._callbacks = {}; return; } var names = name ? [prefix(name)] : Collections.keys(this._callbacks); if (callback || context) { this.removeCallback(names, callback, context); } else { this.removeAllCallbacks(names); } }; CallbackRegistry.prototype.removeCallback = function (names, callback, context) { Collections.apply(names, function (name) { this._callbacks[name] = Collections.filter(this._callbacks[name] || [], function (binding) { return (callback && callback !== binding.fn) || (context && context !== binding.context); }); if (this._callbacks[name].length === 0) { delete this._callbacks[name]; } }, this); }; CallbackRegistry.prototype.removeAllCallbacks = function (names) { Collections.apply(names, function (name) { delete this._callbacks[name]; }, this); }; return CallbackRegistry; }()); exports.__esModule = true; exports["default"] = CallbackRegistry; function prefix(name) { return "_" + name; } /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var dispatcher_1 = __webpack_require__(24); var NetInfo = (function (_super) { __extends(NetInfo, _super); function NetInfo() { _super.call(this); var self = this; if (window.addEventListener !== undefined) { window.addEventListener("online", function () { self.emit('online'); }, false); window.addEventListener("offline", function () { self.emit('offline'); }, false); } } NetInfo.prototype.isOnline = function () { if (window.navigator.onLine === undefined) { return true; } else { return window.navigator.onLine; } }; return NetInfo; }(dispatcher_1["default"])); exports.NetInfo = NetInfo; exports.Network = new NetInfo(); /***/ }), /* 27 */ /***/ (function(module, exports) { "use strict"; var getDefaultStrategy = function (config) { var wsStrategy; if (config.encrypted) { wsStrategy = [ ":best_connected_ever", ":ws_loop", [":delayed", 2000, [":http_fallback_loop"]] ]; } else { wsStrategy = [ ":best_connected_ever", ":ws_loop", [":delayed", 2000, [":wss_loop"]], [":delayed", 5000, [":http_fallback_loop"]] ]; } return [ [":def", "ws_options", { hostUnencrypted: config.wsHost + ":" + config.wsPort, hostEncrypted: config.wsHost + ":" + config.wssPort, httpPath: config.wsPath }], [":def", "wss_options", [":extend", ":ws_options", { encrypted: true }]], [":def", "sockjs_options", { hostUnencrypted: config.httpHost + ":" + config.httpPort, hostEncrypted: config.httpHost + ":" + config.httpsPort, httpPath: config.httpPath }], [":def", "timeouts", { loop: true, timeout: 15000, timeoutLimit: 60000 }], [":def", "ws_manager", [":transport_manager", { lives: 2, minPingDelay: 10000, maxPingDelay: config.activity_timeout }]], [":def", "streaming_manager", [":transport_manager", { lives: 2, minPingDelay: 10000, maxPingDelay: config.activity_timeout }]], [":def_transport", "ws", "ws", 3, ":ws_options", ":ws_manager"], [":def_transport", "wss", "ws", 3, ":wss_options", ":ws_manager"], [":def_transport", "sockjs", "sockjs", 1, ":sockjs_options"], [":def_transport", "xhr_streaming", "xhr_streaming", 1, ":sockjs_options", ":streaming_manager"], [":def_transport", "xdr_streaming", "xdr_streaming", 1, ":sockjs_options", ":streaming_manager"], [":def_transport", "xhr_polling", "xhr_polling", 1, ":sockjs_options"], [":def_transport", "xdr_polling", "xdr_polling", 1, ":sockjs_options"], [":def", "ws_loop", [":sequential", ":timeouts", ":ws"]], [":def", "wss_loop", [":sequential", ":timeouts", ":wss"]], [":def", "sockjs_loop", [":sequential", ":timeouts", ":sockjs"]], [":def", "streaming_loop", [":sequential", ":timeouts", [":if", [":is_supported", ":xhr_streaming"], ":xhr_streaming", ":xdr_streaming" ] ]], [":def", "polling_loop", [":sequential", ":timeouts", [":if", [":is_supported", ":xhr_polling"], ":xhr_polling", ":xdr_polling" ] ]], [":def", "http_loop", [":if", [":is_supported", ":streaming_loop"], [ ":best_connected_ever", ":streaming_loop", [":delayed", 4000, [":polling_loop"]] ], [ ":polling_loop" ]]], [":def", "http_fallback_loop", [":if", [":is_supported", ":http_loop"], [ ":http_loop" ], [ ":sockjs_loop" ]] ], [":def", "strategy", [":cached", 1800000, [":first_connected", [":if", [":is_supported", ":ws"], wsStrategy, ":http_fallback_loop" ] ] ] ] ]; }; exports.__esModule = true; exports["default"] = getDefaultStrategy; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var dependencies_1 = __webpack_require__(3); function default_1() { var self = this; self.timeline.info(self.buildTimelineMessage({ transport: self.name + (self.options.encrypted ? "s" : "") })); if (self.hooks.isInitialized()) { self.changeState("initialized"); } else if (self.hooks.file) { self.changeState("initializing"); dependencies_1.Dependencies.load(self.hooks.file, { encrypted: self.options.encrypted }, function (error, callback) { if (self.hooks.isInitialized()) { self.changeState("initialized"); callback(true); } else { if (error) { self.onError(error); } self.onClose(); callback(false); } }); } else { self.onClose(); } } exports.__esModule = true; exports["default"] = default_1; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var http_xdomain_request_1 = __webpack_require__(30); var http_1 = __webpack_require__(32); http_1["default"].createXDR = function (method, url) { return this.createRequest(http_xdomain_request_1["default"], method, url); }; exports.__esModule = true; exports["default"] = http_1["default"]; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Errors = __webpack_require__(31); var hooks = { getRequest: function (socket) { var xdr = new window.XDomainRequest(); xdr.ontimeout = function () { socket.emit("error", new Errors.RequestTimedOut()); socket.close(); }; xdr.onerror = function (e) { socket.emit("error", e); socket.close(); }; xdr.onprogress = function () { if (xdr.responseText && xdr.responseText.length > 0) { socket.onChunk(200, xdr.responseText); } }; xdr.onload = function () { if (xdr.responseText && xdr.responseText.length > 0) { socket.onChunk(200, xdr.responseText); } socket.emit("finished", 200); socket.close(); }; return xdr; }, abortRequest: function (xdr) { xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null; xdr.abort(); } }; exports.__esModule = true; exports["default"] = hooks; /***/ }), /* 31 */ /***/ (function(module, exports) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var BadEventName = (function (_super) { __extends(BadEventName, _super); function BadEventName() { _super.apply(this, arguments); } return BadEventName; }(Error)); exports.BadEventName = BadEventName; var RequestTimedOut = (function (_super) { __extends(RequestTimedOut, _super); function RequestTimedOut() { _super.apply(this, arguments); } return RequestTimedOut; }(Error)); exports.RequestTimedOut = RequestTimedOut; var TransportPriorityTooLow = (function (_super) { __extends(TransportPriorityTooLow, _super); function TransportPriorityTooLow() { _super.apply(this, arguments); } return TransportPriorityTooLow; }(Error)); exports.TransportPriorityTooLow = TransportPriorityTooLow; var TransportClosed = (function (_super) { __extends(TransportClosed, _super); function TransportClosed() { _super.apply(this, arguments); } return TransportClosed; }(Error)); exports.TransportClosed = TransportClosed; var UnsupportedTransport = (function (_super) { __extends(UnsupportedTransport, _super); function UnsupportedTransport() { _super.apply(this, arguments); } return UnsupportedTransport; }(Error)); exports.UnsupportedTransport = UnsupportedTransport; var UnsupportedStrategy = (function (_super) { __extends(UnsupportedStrategy, _super); function UnsupportedStrategy() { _super.apply(this, arguments); } return UnsupportedStrategy; }(Error)); exports.UnsupportedStrategy = UnsupportedStrategy; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var http_request_1 = __webpack_require__(33); var http_socket_1 = __webpack_require__(34); var http_streaming_socket_1 = __webpack_require__(36); var http_polling_socket_1 = __webpack_require__(37); var http_xhr_request_1 = __webpack_require__(38); var HTTP = { createStreamingSocket: function (url) { return this.createSocket(http_streaming_socket_1["default"], url); }, createPollingSocket: function (url) { return this.createSocket(http_polling_socket_1["default"], url); }, createSocket: function (hooks, url) { return new http_socket_1["default"](hooks, url); }, createXHR: function (method, url) { return this.createRequest(http_xhr_request_1["default"], method, url); }, createRequest: function (hooks, method, url) { return new http_request_1["default"](hooks, method, url); } }; exports.__esModule = true; exports["default"] = HTTP; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var runtime_1 = __webpack_require__(2); var dispatcher_1 = __webpack_require__(24); var MAX_BUFFER_LENGTH = 256 * 1024; var HTTPRequest = (function (_super) { __extends(HTTPRequest, _super); function HTTPRequest(hooks, method, url) { _super.call(this); this.hooks = hooks; this.method = method; this.url = url; } HTTPRequest.prototype.start = function (payload) { var _this = this; this.position = 0; this.xhr = this.hooks.getRequest(this); this.unloader = function () { _this.close(); }; runtime_1["default"].addUnloadListener(this.unloader); this.xhr.open(this.method, this.url, true); if (this.xhr.setRequestHeader) { this.xhr.setRequestHeader("Content-Type", "application/json"); } this.xhr.send(payload); }; HTTPRequest.prototype.close = function () { if (this.unloader) { runtime_1["default"].removeUnloadListener(this.unloader); this.unloader = null; } if (this.xhr) { this.hooks.abortRequest(this.xhr); this.xhr = null; } }; HTTPRequest.prototype.onChunk = function (status, data) { while (true) { var chunk = this.advanceBuffer(data); if (chunk) { this.emit("chunk", { status: status, data: chunk }); } else { break; } } if (this.isBufferTooLong(data)) { this.emit("buffer_too_long"); } }; HTTPRequest.prototype.advanceBuffer = function (buffer) { var unreadData = buffer.slice(this.position); var endOfLinePosition = unreadData.indexOf("\n"); if (endOfLinePosition !== -1) { this.position += endOfLinePosition + 1; return unreadData.slice(0, endOfLinePosition); } else { return null; } }; HTTPRequest.prototype.isBufferTooLong = function (buffer) { return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH; }; return HTTPRequest; }(dispatcher_1["default"])); exports.__esModule = true; exports["default"] = HTTPRequest; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var state_1 = __webpack_require__(35); var util_1 = __webpack_require__(11); var runtime_1 = __webpack_require__(2); var autoIncrement = 1; var HTTPSocket = (function () { function HTTPSocket(hooks, url) { this.hooks = hooks; this.session = randomNumber(1000) + "/" + randomString(8); this.location = getLocation(url); this.readyState = state_1["default"].CONNECTING; this.openStream(); } HTTPSocket.prototype.send = function (payload) { return this.sendRaw(JSON.stringify([payload])); }; HTTPSocket.prototype.ping = function () { this.hooks.sendHeartbeat(this); }; HTTPSocket.prototype.close = function (code, reason) { this.onClose(code, reason, true); }; HTTPSocket.prototype.sendRaw = function (payload) { if (this.readyState === state_1["default"].OPEN) { try { runtime_1["default"].createSocketRequest("POST", getUniqueURL(getSendURL(this.location, this.session))).start(payload); return true; } catch (e) { return false; } } else { return false; } }; HTTPSocket.prototype.reconnect = function () { this.closeStream(); this.openStream(); }; ; HTTPSocket.prototype.onClose = function (code, reason, wasClean) { this.closeStream(); this.readyState = state_1["default"].CLOSED; if (this.onclose) { this.onclose({ code: code, reason: reason, wasClean: wasClean }); } }; HTTPSocket.prototype.onChunk = function (chunk) { if (chunk.status !== 200) { return; } if (this.readyState === state_1["default"].OPEN) { this.onActivity(); } var payload; var type = chunk.data.slice(0, 1); switch (type) { case 'o': payload = JSON.parse(chunk.data.slice(1) || '{}'); this.onOpen(payload); break; case 'a': payload = JSON.parse(chunk.data.slice(1) || '[]'); for (var i = 0; i < payload.length; i++) { this.onEvent(payload[i]); } break; case 'm': payload = JSON.parse(chunk.data.slice(1) || 'null'); this.onEvent(payload); break; case 'h': this.hooks.onHeartbeat(this); break; case 'c': payload = JSON.parse(chunk.data.slice(1) || '[]'); this.onClose(payload[0], payload[1], true); break; } }; HTTPSocket.prototype.onOpen = function (options) { if (this.readyState === state_1["default"].CONNECTING) { if (options && options.hostname) { this.location.base = replaceHost(this.location.base, options.hostname); } this.readyState = state_1["default"].OPEN; if (this.onopen) { this.onopen(); } } else { this.onClose(1006, "Server lost session", true); } }; HTTPSocket.prototype.onEvent = function (event) { if (this.readyState === state_1["default"].OPEN && this.onmessage) { this.onmessage({ data: event }); } }; HTTPSocket.prototype.onActivity = function () { if (this.onactivity) { this.onactivity(); } }; HTTPSocket.prototype.onError = function (error) { if (this.onerror) { this.onerror(error); } }; HTTPSocket.prototype.openStream = function () { var _this = this; this.stream = runtime_1["default"].createSocketRequest("POST", getUniqueURL(this.hooks.getReceiveURL(this.location, this.session))); this.stream.bind("chunk", function (chunk) { _this.onChunk(chunk); }); this.stream.bind("finished", function (status) { _this.hooks.onFinished(_this, status); }); this.stream.bind("buffer_too_long", function () { _this.reconnect(); }); try { this.stream.start(); } catch (error) { util_1["default"].defer(function () { _this.onError(error); _this.onClose(1006, "Could not start streaming", false); }); } }; HTTPSocket.prototype.closeStream = function () { if (this.stream) { this.stream.unbind_all(); this.stream.close(); this.stream = null; } }; return HTTPSocket; }()); function getLocation(url) { var parts = /([^\?]*)\/*(\??.*)/.exec(url); return { base: parts[1], queryString: parts[2] }; } function getSendURL(url, session) { return url.base + "/" + session + "/xhr_send"; } function getUniqueURL(url) { var separator = (url.indexOf('?') === -1) ? "?" : "&"; return url + separator + "t=" + (+new Date()) + "&n=" + autoIncrement++; } function replaceHost(url, hostname) { var urlParts = /(https?:\/\/)([^\/:]+)((\/|:)?.*)/.exec(url); return urlParts[1] + hostname + urlParts[3]; } function randomNumber(max) { return Math.floor(Math.random() * max); } function randomString(length) { var result = []; for (var i = 0; i < length; i++) { result.push(randomNumber(32).toString(32)); } return result.join(''); } exports.__esModule = true; exports["default"] = HTTPSocket; /***/ }), /* 35 */ /***/ (function(module, exports) { "use strict"; var State; (function (State) { State[State["CONNECTING"] = 0] = "CONNECTING"; State[State["OPEN"] = 1] = "OPEN"; State[State["CLOSED"] = 3] = "CLOSED"; })(State || (State = {})); exports.__esModule = true; exports["default"] = State; /***/ }), /* 36 */ /***/ (function(module, exports) { "use strict"; var hooks = { getReceiveURL: function (url, session) { return url.base + "/" + session + "/xhr_streaming" + url.queryString; }, onHeartbeat: function (socket) { socket.sendRaw("[]"); }, sendHeartbeat: function (socket) { socket.sendRaw("[]"); }, onFinished: function (socket, status) { socket.onClose(1006, "Connection interrupted (" + status + ")", false); } }; exports.__esModule = true; exports["default"] = hooks; /***/ }), /* 37 */ /***/ (function(module, exports) { "use strict"; var hooks = { getReceiveURL: function (url, session) { return url.base + "/" + session + "/xhr" + url.queryString; }, onHeartbeat: function () { }, sendHeartbeat: function (socket) { socket.sendRaw("[]"); }, onFinished: function (socket, status) { if (status === 200) { socket.reconnect(); } else { socket.onClose(1006, "Connection interrupted (" + status + ")", false); } } }; exports.__esModule = true; exports["default"] = hooks; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var runtime_1 = __webpack_require__(2); var hooks = { getRequest: function (socket) { var Constructor = runtime_1["default"].getXHRAPI(); var xhr = new Constructor(); xhr.onreadystatechange = xhr.onprogress = function () { switch (xhr.readyState) { case 3: if (xhr.responseText && xhr.responseText.length > 0) { socket.onChunk(xhr.status, xhr.responseText); } break; case 4: if (xhr.responseText && xhr.responseText.length > 0) { socket.onChunk(xhr.status, xhr.responseText); } socket.emit("finished", xhr.status); socket.close(); break; } }; return xhr; }, abortRequest: function (xhr) { xhr.onreadystatechange = null; xhr.abort(); } }; exports.__esModule = true; exports["default"] = hooks; /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var util_1 = __webpack_require__(11); var level_1 = __webpack_require__(40); var Timeline = (function () { function Timeline(key, session, options) { this.key = key; this.session = session; this.events = []; this.options = options || {}; this.sent = 0; this.uniqueID = 0; } Timeline.prototype.log = function (level, event) { if (level <= this.options.level) { this.events.push(Collections.extend({}, event, { timestamp: util_1["default"].now() })); if (this.options.limit && this.events.length > this.options.limit) { this.events.shift(); } } }; Timeline.prototype.error = function (event) { this.log(level_1["default"].ERROR, event); }; Timeline.prototype.info = function (event) { this.log(level_1["default"].INFO, event); }; Timeline.prototype.debug = function (event) { this.log(level_1["default"].DEBUG, event); }; Timeline.prototype.isEmpty = function () { return this.events.length === 0; }; Timeline.prototype.send = function (sendfn, callback) { var _this = this; var data = Collections.extend({ session: this.session, bundle: this.sent + 1, key: this.key, lib: "js", version: this.options.version, cluster: this.options.cluster, features: this.options.features, timeline: this.events }, this.options.params); this.events = []; sendfn(data, function (error, result) { if (!error) { _this.sent++; } if (callback) { callback(error, result); } }); return true; }; Timeline.prototype.generateUniqueID = function () { this.uniqueID++; return this.uniqueID; }; return Timeline; }()); exports.__esModule = true; exports["default"] = Timeline; /***/ }), /* 40 */ /***/ (function(module, exports) { "use strict"; var TimelineLevel; (function (TimelineLevel) { TimelineLevel[TimelineLevel["ERROR"] = 3] = "ERROR"; TimelineLevel[TimelineLevel["INFO"] = 6] = "INFO"; TimelineLevel[TimelineLevel["DEBUG"] = 7] = "DEBUG"; })(TimelineLevel || (TimelineLevel = {})); exports.__esModule = true; exports["default"] = TimelineLevel; /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var util_1 = __webpack_require__(11); var transport_manager_1 = __webpack_require__(42); var Errors = __webpack_require__(31); var transport_strategy_1 = __webpack_require__(56); var sequential_strategy_1 = __webpack_require__(57); var best_connected_ever_strategy_1 = __webpack_require__(58); var cached_strategy_1 = __webpack_require__(59); var delayed_strategy_1 = __webpack_require__(60); var if_strategy_1 = __webpack_require__(61); var first_connected_strategy_1 = __webpack_require__(62); var runtime_1 = __webpack_require__(2); var Transports = runtime_1["default"].Transports; exports.build = function (scheme, options) { var context = Collections.extend({}, globalContext, options); return evaluate(scheme, context)[1].strategy; }; var UnsupportedStrategy = { isSupported: function () { return false; }, connect: function (_, callback) { var deferred = util_1["default"].defer(function () { callback(new Errors.UnsupportedStrategy()); }); return { abort: function () { deferred.ensureAborted(); }, forceMinPriority: function () { } }; } }; function returnWithOriginalContext(f) { return function (context) { return [f.apply(this, arguments), context]; }; } var globalContext = { extend: function (context, first, second) { return [Collections.extend({}, first, second), context]; }, def: function (context, name, value) { if (context[name] !== undefined) { throw "Redefining symbol " + name; } context[name] = value; return [undefined, context]; }, def_transport: function (context, name, type, priority, options, manager) { var transportClass = Transports[type]; if (!transportClass) { throw new Errors.UnsupportedTransport(type); } var enabled = (!context.enabledTransports || Collections.arrayIndexOf(context.enabledTransports, name) !== -1) && (!context.disabledTransports || Collections.arrayIndexOf(context.disabledTransports, name) === -1); var transport; if (enabled) { transport = new transport_strategy_1["default"](name, priority, manager ? manager.getAssistant(transportClass) : transportClass, Collections.extend({ key: context.key, encrypted: context.encrypted, timeline: context.timeline, ignoreNullOrigin: context.ignoreNullOrigin }, options)); } else { transport = UnsupportedStrategy; } var newContext = context.def(context, name, transport)[1]; newContext.Transports = context.Transports || {}; newContext.Transports[name] = transport; return [undefined, newContext]; }, transport_manager: returnWithOriginalContext(function (_, options) { return new transport_manager_1["default"](options); }), sequential: returnWithOriginalContext(function (_, options) { var strategies = Array.prototype.slice.call(arguments, 2); return new sequential_strategy_1["default"](strategies, options); }), cached: returnWithOriginalContext(function (context, ttl, strategy) { return new cached_strategy_1["default"](strategy, context.Transports, { ttl: ttl, timeline: context.timeline, encrypted: context.encrypted }); }), first_connected: returnWithOriginalContext(function (_, strategy) { return new first_connected_strategy_1["default"](strategy); }), best_connected_ever: returnWithOriginalContext(function () { var strategies = Array.prototype.slice.call(arguments, 1); return new best_connected_ever_strategy_1["default"](strategies); }), delayed: returnWithOriginalContext(function (_, delay, strategy) { return new delayed_strategy_1["default"](strategy, { delay: delay }); }), "if": returnWithOriginalContext(function (_, test, trueBranch, falseBranch) { return new if_strategy_1["default"](test, trueBranch, falseBranch); }), is_supported: returnWithOriginalContext(function (_, strategy) { return function () { return strategy.isSupported(); }; }) }; function isSymbol(expression) { return (typeof expression === "string") && expression.charAt(0) === ":"; } function getSymbolValue(expression, context) { return context[expression.slice(1)]; } function evaluateListOfExpressions(expressions, context) { if (expressions.length === 0) { return [[], context]; } var head = evaluate(expressions[0], context); var tail = evaluateListOfExpressions(expressions.slice(1), head[1]); return [[head[0]].concat(tail[0]), tail[1]]; } function evaluateString(expression, context) { if (!isSymbol(expression)) { return [expression, context]; } var value = getSymbolValue(expression, context); if (value === undefined) { throw "Undefined symbol " + expression; } return [value, context]; } function evaluateArray(expression, context) { if (isSymbol(expression[0])) { var f = getSymbolValue(expression[0], context); if (expression.length > 1) { if (typeof f !== "function") { throw "Calling non-function " + expression[0]; } var args = [Collections.extend({}, context)].concat(Collections.map(expression.slice(1), function (arg) { return evaluate(arg, Collections.extend({}, context))[0]; })); return f.apply(this, args); } else { return [f, context]; } } else { return evaluateListOfExpressions(expression, context); } } function evaluate(expression, context) { if (typeof expression === "string") { return evaluateString(expression, context); } else if (typeof expression === "object") { if (expression instanceof Array && expression.length > 0) { return evaluateArray(expression, context); } } return [expression, context]; } /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var factory_1 = __webpack_require__(43); var TransportManager = (function () { function TransportManager(options) { this.options = options || {}; this.livesLeft = this.options.lives || Infinity; } TransportManager.prototype.getAssistant = function (transport) { return factory_1["default"].createAssistantToTheTransportManager(this, transport, { minPingDelay: this.options.minPingDelay, maxPingDelay: this.options.maxPingDelay }); }; TransportManager.prototype.isAlive = function () { return this.livesLeft > 0; }; TransportManager.prototype.reportDeath = function () { this.livesLeft -= 1; }; return TransportManager; }()); exports.__esModule = true; exports["default"] = TransportManager; /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var assistant_to_the_transport_manager_1 = __webpack_require__(44); var handshake_1 = __webpack_require__(45); var pusher_authorizer_1 = __webpack_require__(48); var timeline_sender_1 = __webpack_require__(49); var presence_channel_1 = __webpack_require__(50); var private_channel_1 = __webpack_require__(51); var channel_1 = __webpack_require__(52); var connection_manager_1 = __webpack_require__(54); var channels_1 = __webpack_require__(55); var Factory = { createChannels: function () { return new channels_1["default"](); }, createConnectionManager: function (key, options) { return new connection_manager_1["default"](key, options); }, createChannel: function (name, pusher) { return new channel_1["default"](name, pusher); }, createPrivateChannel: function (name, pusher) { return new private_channel_1["default"](name, pusher); }, createPresenceChannel: function (name, pusher) { return new presence_channel_1["default"](name, pusher); }, createTimelineSender: function (timeline, options) { return new timeline_sender_1["default"](timeline, options); }, createAuthorizer: function (channel, options) { if (options.authorizer) { return options.authorizer(channel, options); } return new pusher_authorizer_1["default"](channel, options); }, createHandshake: function (transport, callback) { return new handshake_1["default"](transport, callback); }, createAssistantToTheTransportManager: function (manager, transport, options) { return new assistant_to_the_transport_manager_1["default"](manager, transport, options); } }; exports.__esModule = true; exports["default"] = Factory; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util_1 = __webpack_require__(11); var Collections = __webpack_require__(9); var AssistantToTheTransportManager = (function () { function AssistantToTheTransportManager(manager, transport, options) { this.manager = manager; this.transport = transport; this.minPingDelay = options.minPingDelay; this.maxPingDelay = options.maxPingDelay; this.pingDelay = undefined; } AssistantToTheTransportManager.prototype.createConnection = function (name, priority, key, options) { var _this = this; options = Collections.extend({}, options, { activityTimeout: this.pingDelay }); var connection = this.transport.createConnection(name, priority, key, options); var openTimestamp = null; var onOpen = function () { connection.unbind("open", onOpen); connection.bind("closed", onClosed); openTimestamp = util_1["default"].now(); }; var onClosed = function (closeEvent) { connection.unbind("closed", onClosed); if (closeEvent.code === 1002 || closeEvent.code === 1003) { _this.manager.reportDeath(); } else if (!closeEvent.wasClean && openTimestamp) { var lifespan = util_1["default"].now() - openTimestamp; if (lifespan < 2 * _this.maxPingDelay) { _this.manager.reportDeath(); _this.pingDelay = Math.max(lifespan / 2, _this.minPingDelay); } } }; connection.bind("open", onOpen); return connection; }; AssistantToTheTransportManager.prototype.isSupported = function (environment) { return this.manager.isAlive() && this.transport.isSupported(environment); }; return AssistantToTheTransportManager; }()); exports.__esModule = true; exports["default"] = AssistantToTheTransportManager; /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var Protocol = __webpack_require__(46); var connection_1 = __webpack_require__(47); var Handshake = (function () { function Handshake(transport, callback) { this.transport = transport; this.callback = callback; this.bindListeners(); } Handshake.prototype.close = function () { this.unbindListeners(); this.transport.close(); }; Handshake.prototype.bindListeners = function () { var _this = this; this.onMessage = function (m) { _this.unbindListeners(); var result; try { result = Protocol.processHandshake(m); } catch (e) { _this.finish("error", { error: e }); _this.transport.close(); return; } if (result.action === "connected") { _this.finish("connected", { connection: new connection_1["default"](result.id, _this.transport), activityTimeout: result.activityTimeout }); } else { _this.finish(result.action, { error: result.error }); _this.transport.close(); } }; this.onClosed = function (closeEvent) { _this.unbindListeners(); var action = Protocol.getCloseAction(closeEvent) || "backoff"; var error = Protocol.getCloseError(closeEvent); _this.finish(action, { error: error }); }; this.transport.bind("message", this.onMessage); this.transport.bind("closed", this.onClosed); }; Handshake.prototype.unbindListeners = function () { this.transport.unbind("message", this.onMessage); this.transport.unbind("closed", this.onClosed); }; Handshake.prototype.finish = function (action, params) { this.callback(Collections.extend({ transport: this.transport, action: action }, params)); }; return Handshake; }()); exports.__esModule = true; exports["default"] = Handshake; /***/ }), /* 46 */ /***/ (function(module, exports) { "use strict"; exports.decodeMessage = function (message) { try { var params = JSON.parse(message.data); if (typeof params.data === 'string') { try { params.data = JSON.parse(params.data); } catch (e) { if (!(e instanceof SyntaxError)) { throw e; } } } return params; } catch (e) { throw { type: 'MessageParseError', error: e, data: message.data }; } }; exports.encodeMessage = function (message) { return JSON.stringify(message); }; exports.processHandshake = function (message) { message = exports.decodeMessage(message); if (message.event === "pusher:connection_established") { if (!message.data.activity_timeout) { throw "No activity timeout specified in handshake"; } return { action: "connected", id: message.data.socket_id, activityTimeout: message.data.activity_timeout * 1000 }; } else if (message.event === "pusher:error") { return { action: this.getCloseAction(message.data), error: this.getCloseError(message.data) }; } else { throw "Invalid handshake"; } }; exports.getCloseAction = function (closeEvent) { if (closeEvent.code < 4000) { if (closeEvent.code >= 1002 && closeEvent.code <= 1004) { return "backoff"; } else { return null; } } else if (closeEvent.code === 4000) { return "ssl_only"; } else if (closeEvent.code < 4100) { return "refused"; } else if (closeEvent.code < 4200) { return "backoff"; } else if (closeEvent.code < 4300) { return "retry"; } else { return "refused"; } }; exports.getCloseError = function (closeEvent) { if (closeEvent.code !== 1000 && closeEvent.code !== 1001) { return { type: 'PusherError', data: { code: closeEvent.code, message: closeEvent.reason || closeEvent.message } }; } else { return null; } }; /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var Collections = __webpack_require__(9); var dispatcher_1 = __webpack_require__(24); var Protocol = __webpack_require__(46); var logger_1 = __webpack_require__(8); var Connection = (function (_super) { __extends(Connection, _super); function Connection(id, transport) { _super.call(this); this.id = id; this.transport = transport; this.activityTimeout = transport.activityTimeout; this.bindListeners(); } Connection.prototype.handlesActivityChecks = function () { return this.transport.handlesActivityChecks(); }; Connection.prototype.send = function (data) { return this.transport.send(data); }; Connection.prototype.send_event = function (name, data, channel) { var message = { event: name, data: data }; if (channel) { message.channel = channel; } logger_1["default"].debug('Event sent', message); return this.send(Protocol.encodeMessage(message)); }; Connection.prototype.ping = function () { if (this.transport.supportsPing()) { this.transport.ping(); } else { this.send_event('pusher:ping', {}); } }; Connection.prototype.close = function () { this.transport.close(); }; Connection.prototype.bindListeners = function () { var _this = this; var listeners = { message: function (m) { var message; try { message = Protocol.decodeMessage(m); } catch (e) { _this.emit('error', { type: 'MessageParseError', error: e, data: m.data }); } if (message !== undefined) { logger_1["default"].debug('Event recd', message); switch (message.event) { case 'pusher:error': _this.emit('error', { type: 'PusherError', data: message.data }); break; case 'pusher:ping': _this.emit("ping"); break; case 'pusher:pong': _this.emit("pong"); break; } _this.emit('message', message); } }, activity: function () { _this.emit("activity"); }, error: function (error) { _this.emit("error", { type: "WebSocketError", error: error }); }, closed: function (closeEvent) { unbindListeners(); if (closeEvent && closeEvent.code) { _this.handleCloseEvent(closeEvent); } _this.transport = null; _this.emit("closed"); } }; var unbindListeners = function () { Collections.objectApply(listeners, function (listener, event) { _this.transport.unbind(event, listener); }); }; Collections.objectApply(listeners, function (listener, event) { _this.transport.bind(event, listener); }); }; Connection.prototype.handleCloseEvent = function (closeEvent) { var action = Protocol.getCloseAction(closeEvent); var error = Protocol.getCloseError(closeEvent); if (error) { this.emit('error', error); } if (action) { this.emit(action); } }; return Connection; }(dispatcher_1["default"])); exports.__esModule = true; exports["default"] = Connection; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var runtime_1 = __webpack_require__(2); var PusherAuthorizer = (function () { function PusherAuthorizer(channel, options) { this.channel = channel; var authTransport = options.authTransport; if (typeof runtime_1["default"].getAuthorizers()[authTransport] === "undefined") { throw "'" + authTransport + "' is not a recognized auth transport"; } this.type = authTransport; this.options = options; this.authOptions = (options || {}).auth || {}; } PusherAuthorizer.prototype.composeQuery = function (socketId) { var query = 'socket_id=' + encodeURIComponent(socketId) + '&channel_name=' + encodeURIComponent(this.channel.name); for (var i in this.authOptions.params) { query += "&" + encodeURIComponent(i) + "=" + encodeURIComponent(this.authOptions.params[i]); } return query; }; PusherAuthorizer.prototype.authorize = function (socketId, callback) { PusherAuthorizer.authorizers = PusherAuthorizer.authorizers || runtime_1["default"].getAuthorizers(); return PusherAuthorizer.authorizers[this.type].call(this, runtime_1["default"], socketId, callback); }; return PusherAuthorizer; }()); exports.__esModule = true; exports["default"] = PusherAuthorizer; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var runtime_1 = __webpack_require__(2); var TimelineSender = (function () { function TimelineSender(timeline, options) { this.timeline = timeline; this.options = options || {}; } TimelineSender.prototype.send = function (encrypted, callback) { if (this.timeline.isEmpty()) { return; } this.timeline.send(runtime_1["default"].TimelineTransport.getAgent(this, encrypted), callback); }; return TimelineSender; }()); exports.__esModule = true; exports["default"] = TimelineSender; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var private_channel_1 = __webpack_require__(51); var logger_1 = __webpack_require__(8); var members_1 = __webpack_require__(53); var url_store_1 = __webpack_require__(14); var PresenceChannel = (function (_super) { __extends(PresenceChannel, _super); function PresenceChannel(name, pusher) { _super.call(this, name, pusher); this.members = new members_1["default"](); } PresenceChannel.prototype.authorize = function (socketId, callback) { var _this = this; _super.prototype.authorize.call(this, socketId, function (error, authData) { if (!error) { if (authData.channel_data === undefined) { var suffix = url_store_1["default"].buildLogSuffix("authenticationEndpoint"); logger_1["default"].warn(("Invalid auth response for channel '" + _this.name + "',") + ("expected 'channel_data' field. " + suffix)); callback("Invalid auth response"); return; } var channelData = JSON.parse(authData.channel_data); _this.members.setMyID(channelData.user_id); } callback(error, authData); }); }; PresenceChannel.prototype.handleEvent = function (event, data) { switch (event) { case "pusher_internal:subscription_succeeded": this.subscriptionPending = false; this.subscribed = true; if (this.subscriptionCancelled) { this.pusher.unsubscribe(this.name); } else { this.members.onSubscription(data); this.emit("pusher:subscription_succeeded", this.members); } break; case "pusher_internal:member_added": var addedMember = this.members.addMember(data); this.emit('pusher:member_added', addedMember); break; case "pusher_internal:member_removed": var removedMember = this.members.removeMember(data); if (removedMember) { this.emit('pusher:member_removed', removedMember); } break; default: private_channel_1["default"].prototype.handleEvent.call(this, event, data); } }; PresenceChannel.prototype.disconnect = function () { this.members.reset(); _super.prototype.disconnect.call(this); }; return PresenceChannel; }(private_channel_1["default"])); exports.__esModule = true; exports["default"] = PresenceChannel; /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var factory_1 = __webpack_require__(43); var channel_1 = __webpack_require__(52); var PrivateChannel = (function (_super) { __extends(PrivateChannel, _super); function PrivateChannel() { _super.apply(this, arguments); } PrivateChannel.prototype.authorize = function (socketId, callback) { var authorizer = factory_1["default"].createAuthorizer(this, this.pusher.config); return authorizer.authorize(socketId, callback); }; return PrivateChannel; }(channel_1["default"])); exports.__esModule = true; exports["default"] = PrivateChannel; /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var dispatcher_1 = __webpack_require__(24); var Errors = __webpack_require__(31); var logger_1 = __webpack_require__(8); var Channel = (function (_super) { __extends(Channel, _super); function Channel(name, pusher) { _super.call(this, function (event, data) { logger_1["default"].debug('No callbacks on ' + name + ' for ' + event); }); this.name = name; this.pusher = pusher; this.subscribed = false; this.subscriptionPending = false; this.subscriptionCancelled = false; } Channel.prototype.authorize = function (socketId, callback) { return callback(false, {}); }; Channel.prototype.trigger = function (event, data) { if (event.indexOf("client-") !== 0) { throw new Errors.BadEventName("Event '" + event + "' does not start with 'client-'"); } return this.pusher.send_event(event, data, this.name); }; Channel.prototype.disconnect = function () { this.subscribed = false; this.subscriptionPending = false; }; Channel.prototype.handleEvent = function (event, data) { if (event.indexOf("pusher_internal:") === 0) { if (event === "pusher_internal:subscription_succeeded") { this.subscriptionPending = false; this.subscribed = true; if (this.subscriptionCancelled) { this.pusher.unsubscribe(this.name); } else { this.emit("pusher:subscription_succeeded", data); } } } else { this.emit(event, data); } }; Channel.prototype.subscribe = function () { var _this = this; if (this.subscribed) { return; } this.subscriptionPending = true; this.subscriptionCancelled = false; this.authorize(this.pusher.connection.socket_id, function (error, data) { if (error) { _this.handleEvent('pusher:subscription_error', data); } else { _this.pusher.send_event('pusher:subscribe', { auth: data.auth, channel_data: data.channel_data, channel: _this.name }); } }); }; Channel.prototype.unsubscribe = function () { this.subscribed = false; this.pusher.send_event('pusher:unsubscribe', { channel: this.name }); }; Channel.prototype.cancelSubscription = function () { this.subscriptionCancelled = true; }; Channel.prototype.reinstateSubscription = function () { this.subscriptionCancelled = false; }; return Channel; }(dispatcher_1["default"])); exports.__esModule = true; exports["default"] = Channel; /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var Members = (function () { function Members() { this.reset(); } Members.prototype.get = function (id) { if (Object.prototype.hasOwnProperty.call(this.members, id)) { return { id: id, info: this.members[id] }; } else { return null; } }; Members.prototype.each = function (callback) { var _this = this; Collections.objectApply(this.members, function (member, id) { callback(_this.get(id)); }); }; Members.prototype.setMyID = function (id) { this.myID = id; }; Members.prototype.onSubscription = function (subscriptionData) { this.members = subscriptionData.presence.hash; this.count = subscriptionData.presence.count; this.me = this.get(this.myID); }; Members.prototype.addMember = function (memberData) { if (this.get(memberData.user_id) === null) { this.count++; } this.members[memberData.user_id] = memberData.user_info; return this.get(memberData.user_id); }; Members.prototype.removeMember = function (memberData) { var member = this.get(memberData.user_id); if (member) { delete this.members[memberData.user_id]; this.count--; } return member; }; Members.prototype.reset = function () { this.members = {}; this.count = 0; this.myID = null; this.me = null; }; return Members; }()); exports.__esModule = true; exports["default"] = Members; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var dispatcher_1 = __webpack_require__(24); var timers_1 = __webpack_require__(12); var logger_1 = __webpack_require__(8); var Collections = __webpack_require__(9); var runtime_1 = __webpack_require__(2); var ConnectionManager = (function (_super) { __extends(ConnectionManager, _super); function ConnectionManager(key, options) { var _this = this; _super.call(this); this.key = key; this.options = options || {}; this.state = "initialized"; this.connection = null; this.encrypted = !!options.encrypted; this.timeline = this.options.timeline; this.connectionCallbacks = this.buildConnectionCallbacks(); this.errorCallbacks = this.buildErrorCallbacks(); this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks); var Network = runtime_1["default"].getNetwork(); Network.bind("online", function () { _this.timeline.info({ netinfo: "online" }); if (_this.state === "connecting" || _this.state === "unavailable") { _this.retryIn(0); } }); Network.bind("offline", function () { _this.timeline.info({ netinfo: "offline" }); if (_this.connection) { _this.sendActivityCheck(); } }); this.updateStrategy(); } ConnectionManager.prototype.connect = function () { if (this.connection || this.runner) { return; } if (!this.strategy.isSupported()) { this.updateState("failed"); return; } this.updateState("connecting"); this.startConnecting(); this.setUnavailableTimer(); }; ; ConnectionManager.prototype.send = function (data) { if (this.connection) { return this.connection.send(data); } else { return false; } }; ; ConnectionManager.prototype.send_event = function (name, data, channel) { if (this.connection) { return this.connection.send_event(name, data, channel); } else { return false; } }; ; ConnectionManager.prototype.disconnect = function () { this.disconnectInternally(); this.updateState("disconnected"); }; ; ConnectionManager.prototype.isEncrypted = function () { return this.encrypted; }; ; ConnectionManager.prototype.startConnecting = function () { var _this = this; var callback = function (error, handshake) { if (error) { _this.runner = _this.strategy.connect(0, callback); } else { if (handshake.action === "error") { _this.emit("error", { type: "HandshakeError", error: handshake.error }); _this.timeline.error({ handshakeError: handshake.error }); } else { _this.abortConnecting(); _this.handshakeCallbacks[handshake.action](handshake); } } }; this.runner = this.strategy.connect(0, callback); }; ; ConnectionManager.prototype.abortConnecting = function () { if (this.runner) { this.runner.abort(); this.runner = null; } }; ; ConnectionManager.prototype.disconnectInternally = function () { this.abortConnecting(); this.clearRetryTimer(); this.clearUnavailableTimer(); if (this.connection) { var connection = this.abandonConnection(); connection.close(); } }; ; ConnectionManager.prototype.updateStrategy = function () { this.strategy = this.options.getStrategy({ key: this.key, timeline: this.timeline, encrypted: this.encrypted }); }; ; ConnectionManager.prototype.retryIn = function (delay) { var _this = this; this.timeline.info({ action: "retry", delay: delay }); if (delay > 0) { this.emit("connecting_in", Math.round(delay / 1000)); } this.retryTimer = new timers_1.OneOffTimer(delay || 0, function () { _this.disconnectInternally(); _this.connect(); }); }; ; ConnectionManager.prototype.clearRetryTimer = function () { if (this.retryTimer) { this.retryTimer.ensureAborted(); this.retryTimer = null; } }; ; ConnectionManager.prototype.setUnavailableTimer = function () { var _this = this; this.unavailableTimer = new timers_1.OneOffTimer(this.options.unavailableTimeout, function () { _this.updateState("unavailable"); }); }; ; ConnectionManager.prototype.clearUnavailableTimer = function () { if (this.unavailableTimer) { this.unavailableTimer.ensureAborted(); } }; ; ConnectionManager.prototype.sendActivityCheck = function () { var _this = this; this.stopActivityCheck(); this.connection.ping(); this.activityTimer = new timers_1.OneOffTimer(this.options.pongTimeout, function () { _this.timeline.error({ pong_timed_out: _this.options.pongTimeout }); _this.retryIn(0); }); }; ; ConnectionManager.prototype.resetActivityCheck = function () { var _this = this; this.stopActivityCheck(); if (this.connection && !this.connection.handlesActivityChecks()) { this.activityTimer = new timers_1.OneOffTimer(this.activityTimeout, function () { _this.sendActivityCheck(); }); } }; ; ConnectionManager.prototype.stopActivityCheck = function () { if (this.activityTimer) { this.activityTimer.ensureAborted(); } }; ; ConnectionManager.prototype.buildConnectionCallbacks = function () { var _this = this; return { message: function (message) { _this.resetActivityCheck(); _this.emit('message', message); }, ping: function () { _this.send_event('pusher:pong', {}); }, activity: function () { _this.resetActivityCheck(); }, error: function (error) { _this.emit("error", { type: "WebSocketError", error: error }); }, closed: function () { _this.abandonConnection(); if (_this.shouldRetry()) { _this.retryIn(1000); } } }; }; ; ConnectionManager.prototype.buildHandshakeCallbacks = function (errorCallbacks) { var _this = this; return Collections.extend({}, errorCallbacks, { connected: function (handshake) { _this.activityTimeout = Math.min(_this.options.activityTimeout, handshake.activityTimeout, handshake.connection.activityTimeout || Infinity); _this.clearUnavailableTimer(); _this.setConnection(handshake.connection); _this.socket_id = _this.connection.id; _this.updateState("connected", { socket_id: _this.socket_id }); } }); }; ; ConnectionManager.prototype.buildErrorCallbacks = function () { var _this = this; var withErrorEmitted = function (callback) { return function (result) { if (result.error) { _this.emit("error", { type: "WebSocketError", error: result.error }); } callback(result); }; }; return { ssl_only: withErrorEmitted(function () { _this.encrypted = true; _this.updateStrategy(); _this.retryIn(0); }), refused: withErrorEmitted(function () { _this.disconnect(); }), backoff: withErrorEmitted(function () { _this.retryIn(1000); }), retry: withErrorEmitted(function () { _this.retryIn(0); }) }; }; ; ConnectionManager.prototype.setConnection = function (connection) { this.connection = connection; for (var event in this.connectionCallbacks) { this.connection.bind(event, this.connectionCallbacks[event]); } this.resetActivityCheck(); }; ; ConnectionManager.prototype.abandonConnection = function () { if (!this.connection) { return; } this.stopActivityCheck(); for (var event in this.connectionCallbacks) { this.connection.unbind(event, this.connectionCallbacks[event]); } var connection = this.connection; this.connection = null; return connection; }; ConnectionManager.prototype.updateState = function (newState, data) { var previousState = this.state; this.state = newState; if (previousState !== newState) { var newStateDescription = newState; if (newStateDescription === "connected") { newStateDescription += " with new socket ID " + data.socket_id; } logger_1["default"].debug('State changed', previousState + ' -> ' + newStateDescription); this.timeline.info({ state: newState, params: data }); this.emit('state_change', { previous: previousState, current: newState }); this.emit(newState, data); } }; ConnectionManager.prototype.shouldRetry = function () { return this.state === "connecting" || this.state === "connected"; }; return ConnectionManager; }(dispatcher_1["default"])); exports.__esModule = true; exports["default"] = ConnectionManager; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var factory_1 = __webpack_require__(43); var Channels = (function () { function Channels() { this.channels = {}; } Channels.prototype.add = function (name, pusher) { if (!this.channels[name]) { this.channels[name] = createChannel(name, pusher); } return this.channels[name]; }; Channels.prototype.all = function () { return Collections.values(this.channels); }; Channels.prototype.find = function (name) { return this.channels[name]; }; Channels.prototype.remove = function (name) { var channel = this.channels[name]; delete this.channels[name]; return channel; }; Channels.prototype.disconnect = function () { Collections.objectApply(this.channels, function (channel) { channel.disconnect(); }); }; return Channels; }()); exports.__esModule = true; exports["default"] = Channels; function createChannel(name, pusher) { if (name.indexOf('private-') === 0) { return factory_1["default"].createPrivateChannel(name, pusher); } else if (name.indexOf('presence-') === 0) { return factory_1["default"].createPresenceChannel(name, pusher); } else { return factory_1["default"].createChannel(name, pusher); } } /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var factory_1 = __webpack_require__(43); var util_1 = __webpack_require__(11); var Errors = __webpack_require__(31); var Collections = __webpack_require__(9); var TransportStrategy = (function () { function TransportStrategy(name, priority, transport, options) { this.name = name; this.priority = priority; this.transport = transport; this.options = options || {}; } TransportStrategy.prototype.isSupported = function () { return this.transport.isSupported({ encrypted: this.options.encrypted }); }; TransportStrategy.prototype.connect = function (minPriority, callback) { var _this = this; if (!this.isSupported()) { return failAttempt(new Errors.UnsupportedStrategy(), callback); } else if (this.priority < minPriority) { return failAttempt(new Errors.TransportPriorityTooLow(), callback); } var connected = false; var transport = this.transport.createConnection(this.name, this.priority, this.options.key, this.options); var handshake = null; var onInitialized = function () { transport.unbind("initialized", onInitialized); transport.connect(); }; var onOpen = function () { handshake = factory_1["default"].createHandshake(transport, function (result) { connected = true; unbindListeners(); callback(null, result); }); }; var onError = function (error) { unbindListeners(); callback(error); }; var onClosed = function () { unbindListeners(); var serializedTransport; serializedTransport = Collections.safeJSONStringify(transport); callback(new Errors.TransportClosed(serializedTransport)); }; var unbindListeners = function () { transport.unbind("initialized", onInitialized); transport.unbind("open", onOpen); transport.unbind("error", onError); transport.unbind("closed", onClosed); }; transport.bind("initialized", onInitialized); transport.bind("open", onOpen); transport.bind("error", onError); transport.bind("closed", onClosed); transport.initialize(); return { abort: function () { if (connected) { return; } unbindListeners(); if (handshake) { handshake.close(); } else { transport.close(); } }, forceMinPriority: function (p) { if (connected) { return; } if (_this.priority < p) { if (handshake) { handshake.close(); } else { transport.close(); } } } }; }; return TransportStrategy; }()); exports.__esModule = true; exports["default"] = TransportStrategy; function failAttempt(error, callback) { util_1["default"].defer(function () { callback(error); }); return { abort: function () { }, forceMinPriority: function () { } }; } /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var util_1 = __webpack_require__(11); var timers_1 = __webpack_require__(12); var SequentialStrategy = (function () { function SequentialStrategy(strategies, options) { this.strategies = strategies; this.loop = Boolean(options.loop); this.failFast = Boolean(options.failFast); this.timeout = options.timeout; this.timeoutLimit = options.timeoutLimit; } SequentialStrategy.prototype.isSupported = function () { return Collections.any(this.strategies, util_1["default"].method("isSupported")); }; SequentialStrategy.prototype.connect = function (minPriority, callback) { var _this = this; var strategies = this.strategies; var current = 0; var timeout = this.timeout; var runner = null; var tryNextStrategy = function (error, handshake) { if (handshake) { callback(null, handshake); } else { current = current + 1; if (_this.loop) { current = current % strategies.length; } if (current < strategies.length) { if (timeout) { timeout = timeout * 2; if (_this.timeoutLimit) { timeout = Math.min(timeout, _this.timeoutLimit); } } runner = _this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: _this.failFast }, tryNextStrategy); } else { callback(true); } } }; runner = this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: this.failFast }, tryNextStrategy); return { abort: function () { runner.abort(); }, forceMinPriority: function (p) { minPriority = p; if (runner) { runner.forceMinPriority(p); } } }; }; SequentialStrategy.prototype.tryStrategy = function (strategy, minPriority, options, callback) { var timer = null; var runner = null; if (options.timeout > 0) { timer = new timers_1.OneOffTimer(options.timeout, function () { runner.abort(); callback(true); }); } runner = strategy.connect(minPriority, function (error, handshake) { if (error && timer && timer.isRunning() && !options.failFast) { return; } if (timer) { timer.ensureAborted(); } callback(error, handshake); }); return { abort: function () { if (timer) { timer.ensureAborted(); } runner.abort(); }, forceMinPriority: function (p) { runner.forceMinPriority(p); } }; }; return SequentialStrategy; }()); exports.__esModule = true; exports["default"] = SequentialStrategy; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Collections = __webpack_require__(9); var util_1 = __webpack_require__(11); var BestConnectedEverStrategy = (function () { function BestConnectedEverStrategy(strategies) { this.strategies = strategies; } BestConnectedEverStrategy.prototype.isSupported = function () { return Collections.any(this.strategies, util_1["default"].method("isSupported")); }; BestConnectedEverStrategy.prototype.connect = function (minPriority, callback) { return connect(this.strategies, minPriority, function (i, runners) { return function (error, handshake) { runners[i].error = error; if (error) { if (allRunnersFailed(runners)) { callback(true); } return; } Collections.apply(runners, function (runner) { runner.forceMinPriority(handshake.transport.priority); }); callback(null, handshake); }; }); }; return BestConnectedEverStrategy; }()); exports.__esModule = true; exports["default"] = BestConnectedEverStrategy; function connect(strategies, minPriority, callbackBuilder) { var runners = Collections.map(strategies, function (strategy, i, _, rs) { return strategy.connect(minPriority, callbackBuilder(i, rs)); }); return { abort: function () { Collections.apply(runners, abortRunner); }, forceMinPriority: function (p) { Collections.apply(runners, function (runner) { runner.forceMinPriority(p); }); } }; } function allRunnersFailed(runners) { return Collections.all(runners, function (runner) { return Boolean(runner.error); }); } function abortRunner(runner) { if (!runner.error && !runner.aborted) { runner.abort(); runner.aborted = true; } } /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util_1 = __webpack_require__(11); var runtime_1 = __webpack_require__(2); var sequential_strategy_1 = __webpack_require__(57); var Collections = __webpack_require__(9); var CachedStrategy = (function () { function CachedStrategy(strategy, transports, options) { this.strategy = strategy; this.transports = transports; this.ttl = options.ttl || 1800 * 1000; this.encrypted = options.encrypted; this.timeline = options.timeline; } CachedStrategy.prototype.isSupported = function () { return this.strategy.isSupported(); }; CachedStrategy.prototype.connect = function (minPriority, callback) { var encrypted = this.encrypted; var info = fetchTransportCache(encrypted); var strategies = [this.strategy]; if (info && info.timestamp + this.ttl >= util_1["default"].now()) { var transport = this.transports[info.transport]; if (transport) { this.timeline.info({ cached: true, transport: info.transport, latency: info.latency }); strategies.push(new sequential_strategy_1["default"]([transport], { timeout: info.latency * 2 + 1000, failFast: true })); } } var startTimestamp = util_1["default"].now(); var runner = strategies.pop().connect(minPriority, function cb(error, handshake) { if (error) { flushTransportCache(encrypted); if (strategies.length > 0) { startTimestamp = util_1["default"].now(); runner = strategies.pop().connect(minPriority, cb); } else { callback(error); } } else { storeTransportCache(encrypted, handshake.transport.name, util_1["default"].now() - startTimestamp); callback(null, handshake); } }); return { abort: function () { runner.abort(); }, forceMinPriority: function (p) { minPriority = p; if (runner) { runner.forceMinPriority(p); } } }; }; return CachedStrategy; }()); exports.__esModule = true; exports["default"] = CachedStrategy; function getTransportCacheKey(encrypted) { return "pusherTransport" + (encrypted ? "Encrypted" : "Unencrypted"); } function fetchTransportCache(encrypted) { var storage = runtime_1["default"].getLocalStorage(); if (storage) { try { var serializedCache = storage[getTransportCacheKey(encrypted)]; if (serializedCache) { return JSON.parse(serializedCache); } } catch (e) { flushTransportCache(encrypted); } } return null; } function storeTransportCache(encrypted, transport, latency) { var storage = runtime_1["default"].getLocalStorage(); if (storage) { try { storage[getTransportCacheKey(encrypted)] = Collections.safeJSONStringify({ timestamp: util_1["default"].now(), transport: transport, latency: latency }); } catch (e) { } } } function flushTransportCache(encrypted) { var storage = runtime_1["default"].getLocalStorage(); if (storage) { try { delete storage[getTransportCacheKey(encrypted)]; } catch (e) { } } } /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var timers_1 = __webpack_require__(12); var DelayedStrategy = (function () { function DelayedStrategy(strategy, _a) { var number = _a.delay; this.strategy = strategy; this.options = { delay: number }; } DelayedStrategy.prototype.isSupported = function () { return this.strategy.isSupported(); }; DelayedStrategy.prototype.connect = function (minPriority, callback) { var strategy = this.strategy; var runner; var timer = new timers_1.OneOffTimer(this.options.delay, function () { runner = strategy.connect(minPriority, callback); }); return { abort: function () { timer.ensureAborted(); if (runner) { runner.abort(); } }, forceMinPriority: function (p) { minPriority = p; if (runner) { runner.forceMinPriority(p); } } }; }; return DelayedStrategy; }()); exports.__esModule = true; exports["default"] = DelayedStrategy; /***/ }), /* 61 */ /***/ (function(module, exports) { "use strict"; var IfStrategy = (function () { function IfStrategy(test, trueBranch, falseBranch) { this.test = test; this.trueBranch = trueBranch; this.falseBranch = falseBranch; } IfStrategy.prototype.isSupported = function () { var branch = this.test() ? this.trueBranch : this.falseBranch; return branch.isSupported(); }; IfStrategy.prototype.connect = function (minPriority, callback) { var branch = this.test() ? this.trueBranch : this.falseBranch; return branch.connect(minPriority, callback); }; return IfStrategy; }()); exports.__esModule = true; exports["default"] = IfStrategy; /***/ }), /* 62 */ /***/ (function(module, exports) { "use strict"; var FirstConnectedStrategy = (function () { function FirstConnectedStrategy(strategy) { this.strategy = strategy; } FirstConnectedStrategy.prototype.isSupported = function () { return this.strategy.isSupported(); }; FirstConnectedStrategy.prototype.connect = function (minPriority, callback) { var runner = this.strategy.connect(minPriority, function (error, handshake) { if (handshake) { runner.abort(); } callback(error, handshake); }); return runner; }; return FirstConnectedStrategy; }()); exports.__esModule = true; exports["default"] = FirstConnectedStrategy; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var defaults_1 = __webpack_require__(5); exports.getGlobalConfig = function () { return { wsHost: defaults_1["default"].host, wsPort: defaults_1["default"].ws_port, wssPort: defaults_1["default"].wss_port, wsPath: defaults_1["default"].ws_path, httpHost: defaults_1["default"].sockjs_host, httpPort: defaults_1["default"].sockjs_http_port, httpsPort: defaults_1["default"].sockjs_https_port, httpPath: defaults_1["default"].sockjs_path, statsHost: defaults_1["default"].stats_host, authEndpoint: defaults_1["default"].channel_auth_endpoint, authTransport: defaults_1["default"].channel_auth_transport, activity_timeout: defaults_1["default"].activity_timeout, pong_timeout: defaults_1["default"].pong_timeout, unavailable_timeout: defaults_1["default"].unavailable_timeout }; }; exports.getClusterConfig = function (clusterName) { return { wsHost: "ws-" + clusterName + ".pusher.com", httpHost: "sockjs-" + clusterName + ".pusher.com" }; }; /***/ }) /******/ ]) }); ; /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = __webpack_require__(14); var _promise2 = _interopRequireDefault(_promise); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); var _util = __webpack_require__(15); var _twitchExt = __webpack_require__(60); var _twitchExt2 = _interopRequireDefault(_twitchExt); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var SDK = function () { function SDK(identifier, client, user, messenger, analytics, loadPromise, SKUs) { (0, _classCallCheck3.default)(this, SDK); this.loadPromise = loadPromise; this.identifier = identifier; this.client = client; this.messenger = messenger; this.analytics = analytics; this.user = user; this.SKUs = SKUs; } (0, _createClass3.default)(SDK, [{ key: 'loaded', value: function loaded() { return this.loadPromise; } }, { key: 'getAccumulateData', value: function getAccumulateData(accumulationID, start) { (0, _util.forceType)(accumulationID, 'string'); return this.client.getAccumulation(this.identifier, accumulationID, start); } }, { key: 'getAccumulation', value: function getAccumulation(accumulationID, start) { return this.getAccumulateData(accumulationID, start); } }, { key: 'accumulate', value: function accumulate(accumulationID, data) { (0, _util.forceType)(accumulationID, 'string'); return this.client.accumulate(this.identifier, accumulationID, data); } }, { key: 'getVoteData', value: function getVoteData(voteID) { (0, _util.forceType)(voteID, 'string'); return this.client.getVotes(this.identifier, voteID); } }, { key: 'vote', value: function vote(voteID, value) { (0, _util.forceType)(voteID, 'string'); (0, _util.forceType)(value, 'number'); return this.client.vote(this.identifier, voteID, { value: value }); } }, { key: 'getRankData', value: function getRankData(rankID) { var _this = this; (0, _util.forceType)(rankID, 'string'); return new _promise2.default(function (accept, reject) { _this.client.getRank(_this.identifier, rankID).then(function (data) { accept(data.data); }).catch(reject); }); } }, { key: 'rank', value: function rank(rankID, value) { (0, _util.forceType)(rankID, 'string'); (0, _util.forceType)(value, 'string'); return this.client.rank(this.identifier, rankID, { key: value }); } }, { key: 'clearRankData', value: function clearRankData(rankID) { (0, _util.forceType)(rankID, 'string'); return this.client.deleteRank(this.identifier, rankID); } }, { key: 'getRankingData', value: function getRankingData(rankID) { return this.getRankData(rankID); } }, { key: 'clearRanking', value: function clearRanking(rankID) { return this.clearRanking(rankID); } }, { key: 'setViewerState', value: function setViewerState(state) { return this.client.setViewerState(this.identifier, state); } }, { key: 'setExtensionViewerState', value: function setExtensionViewerState(state) { return this.client.setExtensionViewerState(this.identifier, state); } }, { key: 'setChannelState', value: function setChannelState(state) { return this.client.setChannelState(this.identifier, state); } }, { key: 'getAllState', value: function getAllState() { return this.client.getState(this.identifier); } }, { key: 'getJSONStore', value: function getJSONStore(key) { if (key) { (0, _util.forceType)(key, 'string'); } return this.client.getJSONStore(this.identifier, key); } }, { key: 'validateCode', value: function validateCode(pin) { (0, _util.forceType)(pin, 'string'); return this.client.validateCode(this.identifier, pin); } }, { key: 'pinTokenExists', value: function pinTokenExists() { return this.client.pinTokenExists(this.identifier); } }, { key: 'revokeAllPINCodes', value: function revokeAllPINCodes() { return this.client.revokeAllPINCodes(this.identifier); } }, { key: 'send', value: function send(event, userID, data) { (0, _util.forceType)(event, 'string'); var target = 'broadcast'; var realData = data; if (!data) { realData = userID; } else { target = 'whisper-' + userID; } this.messenger.send(this.identifier, event, target, realData, this.client); } }, { key: 'listen', value: function listen(inEvent, inUserID, inCallback) { var _this2 = this; var realEvent = (0, _util.CurrentEnvironment)().environment + ':' + this.identifier + ':' + inEvent; var l = 'broadcast'; var callback = inCallback; if (callback) { l = 'whisper-' + inUserID; } else { callback = inUserID; } var cb = function cb(msg) { try { if ((0, _util.CurrentEnvironment)().environment === 'production') { if ((0, _util.eventPatternMatch)(msg.event, _this2.identifier + ':' + inEvent)) { var truncatedEvent = msg.event.split(':').slice(1).join(':'); callback(msg.data, truncatedEvent); return; } } if ((0, _util.eventPatternMatch)(msg.event, realEvent)) { var _truncatedEvent = msg.event.split(':').slice(2).join(':'); callback(msg.data, _truncatedEvent); } } catch (err) { (0, _util.consolePrint)(err, { type: 'error' }); } }; return this.messenger.listen(this.identifier, l, cb); } }, { key: 'unlisten', value: function unlisten(handle) { return this.messenger.unlisten(this.identifier, handle); } }, { key: 'sendAnalyticsEvent', value: function sendAnalyticsEvent(name) { var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; this.analytics.sendEvent(this.identifier, name, value, label); } }, { key: 'beginPurchase', value: function beginPurchase(sku) { if (this.SKUs.length === 0) { throw new Error('beginPurchase() cannot be used unless SKUs are provided.'); } (0, _util.forceType)(sku, 'string'); return _twitchExt2.default.beginPurchase(sku); } }, { key: 'getPrices', value: function getPrices() { if (this.SKUs.length === 0) { throw new Error('getPrices() cannot be used unless SKUs are provided.'); } return new _promise2.default(function (resolve) { _twitchExt2.default.getPrices(function (prices) { resolve(prices); }); }); } }, { key: 'onReloadEntitlements', value: function onReloadEntitlements(cb) { if (this.SKUs.length === 0) { throw new Error('onReloadEntitlements() cannot be used unless SKUs are provided.'); } return _twitchExt2.default.onReloadEntitlements(cb); } }]); return SDK; }(); exports.default = SDK; /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = __webpack_require__(3); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = __webpack_require__(4); var _createClass3 = _interopRequireDefault(_createClass2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var User = function () { (0, _createClass3.default)(User, null, [{ key: 'Roles', get: function get() { return { Viewer: 'viewer', Broadcaster: 'broadcaster', Moderator: 'moderator' }; } }, { key: 'VideoModes', get: function get() { return { Default: 'default', Fullscreen: 'fullscreen', Theatre: 'theatre' }; } }]); function User(auth) { (0, _classCallCheck3.default)(this, User); this.channelID = auth.channelId; this.twitchJWT = auth.token; this.twitchOpaqueID = auth.userId; this.twitchID = null; this.registeredWithMuxy = false; this.muxyID = null; this.visualizationID = ''; this.role = User.Roles.Viewer; this.ip = ''; this.game = ''; this.videoMode = User.VideoModes.Default; this.bitrate = null; this.latency = null; this.buffer = null; this.extractJWTInfo(auth.token); } (0, _createClass3.default)(User, [{ key: 'extractJWTInfo', value: function extractJWTInfo(jwt) { try { var splitToken = jwt.split('.'); if (splitToken.length === 3) { var token = JSON.parse(window.atob(splitToken[1])); this.role = token.role; if (token.user_id) { this.twitchID = token.user_id; } } } catch (err) {} } }, { key: 'anonymous', value: function anonymous() { return !this.twitchOpaqueID || this.twitchOpaqueID[0] !== 'U'; } }, { key: 'updateAuth', value: function updateAuth(auth) { this.twitchJWT = auth.token; this.extractJWTInfo(auth.token); } }]); return User; }(); exports.default = User; /***/ }), /* 123 */ /***/ (function(module, exports) { module.exports = {"name":"@muxy/extensions-js","author":"Muxy, Inc.","version":"1.1.0","description":"Provides easy access to Muxy's powerful backend architecture for Twitch extensions.","license":"ISC","main":"dist/muxy-extensions.js","module":"src/index.js","repository":"https://github.com/muxy/extensions-js","scripts":{"dev":"./node_modules/webpack-dev-server/bin/webpack-dev-server.js","build":"webpack","test":"NODE_ENV=testing karma start","test:watch":"NODE_ENV=testing karma start","docs":"esdoc","prepublish":"npm run build"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^7.1.2","babel-plugin-istanbul":"^4.1.4","babel-plugin-lodash":"^3.2.11","babel-plugin-transform-es2015-shorthand-properties":"^6.24.1","babel-plugin-transform-runtime":"^6.23.0","babel-preset-es2015":"^6.24.1","babel-preset-stage-2":"^6.24.1","chai":"^4.1.2","esdoc":"^1.0.1","esdoc-ecmascript-proposal-plugin":"^1.0.0","esdoc-node":"^1.0.2","esdoc-publish-html-plugin":"^1.1.0","esdoc-standard-plugin":"^1.0.0","eslint":"^4.5.0","eslint-config-airbnb":"^15.1.0","eslint-config-airbnb-base":"^11.3.2","eslint-friendly-formatter":"^3.0.0","eslint-loader":"^1.9.0","eslint-plugin-import":"^2.7.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-react":"^7.3.0","karma":"^1.7.1","karma-babel-preprocessor":"^6.0.1","karma-chai":"^0.1.0","karma-chai-as-promised":"^0.1.2","karma-chrome-launcher":"^2.2.0","karma-mocha":"^1.3.0","karma-mocha-reporter":"^2.2.4","karma-sinon":"^1.0.5","karma-webpack":"^2.0.4","lodash":"^4.17.4","mocha":"^3.5.3","prettier":"^1.6.1","sinon":"^3.2.1","webpack":"^3.5.5","webpack-dev-server":"^2.7.1"},"dependencies":{"base-64":"^0.1.0","parse-headers":"^2.0.1","pusher-js":"^4.1.0"}} /***/ }) /******/ ]); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBhOTRkMjIwYTdmZDg2Y2FlYzE3NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VpZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3BlcmZvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3RhdGUtY2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYnMveGhyLXByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3R3aXRjaC1leHQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9tdXh5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2Zvci1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ludm9rZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FuYWx5dGljcy5qcyIsIndlYnBhY2s6Ly8vLi9saWJzL2d1bXNob2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2UtNjQvYmFzZTY0LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYXJzZS1oZWFkZXJzL3BhcnNlLWhlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RyaW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pcy1mdW5jdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdHdpdGNoLWNsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVzc2VuZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wdXNoZXItanMvZGlzdC93ZWIvcHVzaGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZS5qc29uIl0sIm5hbWVzIjpbIlByb2R1Y3Rpb25FbnZpcm9ubWVudCIsImVudmlyb25tZW50IiwiU2FuZGJveERldkVudmlyb25tZW50IiwiU2FuZGJveFR3aXRjaEVudmlyb25tZW50IiwiU2VydmVyRW52aXJvbm1lbnQiLCJUZXN0aW5nRW52aXJvbm1lbnQiLCJFTlZJUk9OTUVOVFMiLCJQUk9EVUNUSU9OIiwiU0FOREJPWF9ERVYiLCJTQU5EQk9YX1RXSVRDSCIsIlNFUlZFUiIsIlRFU1RJTkciLCJVdGlsIiwiZXJyIiwicmVqZWN0IiwibGluZXMiLCJNYXRoIiwibWF4IiwiYXBwbHkiLCJtYXAiLCJ4IiwibGVuZ3RoIiwiY29udGVudFdpZHRoIiwid2lkZXN0TGluZSIsImludHJvIiwicmVwZWF0Iiwib3V0IiwicHVzaCIsImZvckVhY2giLCJwYWRkaW5nUmlnaHQiLCJsaW5lIiwiaXNOb3RDaGlsZFdpbmRvdyIsIndpbmRvdyIsIm9wZW5lciIsIndpbmRvd1RvcCIsInRvcCIsIndpbmRvd1BhcmVudCIsInBhcmVudCIsImhhc1dpbmRvd0FuY2VzdG9ycyIsIm92ZXJyaWRlV2luZG93IiwidldpbmRvdyIsIm1vZHVsZSIsImV4cG9ydHMiLCJpc1dpbmRvd0ZyYW1lZCIsImxvY2F0aW9uIiwib3JpZ2luIiwiaW5kZXhPZiIsImRvY3VtZW50IiwicmVmZXJyZXIiLCJ0ZXN0aW5nIiwiY29uc29sZVByaW50IiwidG9TdHJpbmciLCJ0eXBlIiwib3B0aW9ucyIsImN1cnJlbnRFbnZpcm9ubWVudCIsIkVudmlyb25tZW50cyIsIlByb2R1Y3Rpb24iLCJzdHlsZSIsImxpbmVBcnIiLCJBcnJheSIsImlzQXJyYXkiLCJzcGxpdCIsImJveGVkIiwiYXNjaWlCb3giLCJTZXJ2ZXIiLCJjb25zb2xlIiwiY2FsbCIsImpvaW4iLCJpbnB1dCIsInBhdHRlcm4iLCJpbnB1dFBhcnRzIiwicGF0dGVyblBhcnRzIiwiaSIsInZhbHVlIiwidHlwZXMiLCJjb25jYXQiLCJ0eXBlU3RyaW5nIiwiVHlwZUVycm9yIiwiU2FuZGJveERldiIsIlNhbmRib3hUd2l0Y2giLCJUZXN0aW5nIiwiZm9yY2VUeXBlIiwiZXZlbnRQYXR0ZXJuTWF0Y2giLCJDdXJyZW50RW52aXJvbm1lbnQiLCJlcnJvclByb21pc2UiLCJBUElfVVJMIiwiU0FOREJPWF9VUkwiLCJTRVJWRVJfVVJMIiwiU2VydmVyU3RhdGUiLCJBVVRIRU5USUNBVElPTiIsIlVTRVIiLCJWSUVXRVIiLCJFWFRFTlNJT05fVklFV0VSIiwiQ0hBTk5FTCIsIkVYVEVOU0lPTiIsIkFMTCIsIlN0YXRlQ2xpZW50IiwiZ2V0U3RhdGUiLCJpZGVudGlmaWVyIiwic3Vic3RhdGUiLCJzaWduZWRSZXF1ZXN0IiwicG9zdFN0YXRlIiwiZGF0YSIsImdldFVzZXJJbmZvIiwiZ2V0Vmlld2VyU3RhdGUiLCJnZXRFeHRlbnNpb25WaWV3ZXJTdGF0ZSIsImdldENoYW5uZWxTdGF0ZSIsImdldEV4dGVuc2lvblN0YXRlIiwic2V0Vmlld2VyU3RhdGUiLCJzdGF0ZSIsInNldEV4dGVuc2lvblZpZXdlclN0YXRlIiwic2V0Q2hhbm5lbFN0YXRlIiwiZ2V0QWNjdW11bGF0aW9uIiwiaWQiLCJzdGFydCIsImFjY3VtdWxhdGUiLCJ2b3RlIiwiZ2V0Vm90ZXMiLCJyYW5rIiwiZ2V0UmFuayIsImRlbGV0ZVJhbmsiLCJnZXRKU09OU3RvcmUiLCJ2YWxpZGF0ZUNvZGUiLCJjb2RlIiwicGluIiwicGluVG9rZW5FeGlzdHMiLCJyZXZva2VBbGxQSU5Db2RlcyIsInRva2VuIiwiZXh0ZW5zaW9uSUQiLCJtZXRob2QiLCJlbmRwb2ludCIsInZhbGlkYXRlSldUIiwicmVzb2x2ZSIsInhoclByb21pc2UiLCJYTUxIdHRwUmVxdWVzdFByb21pc2UiLCJzZW5kIiwidXJsIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJjYXRjaCIsInRoZW4iLCJyZXNwIiwic3RhdHVzIiwicmVzcG9uc2VUZXh0Iiwic3BsaXRUb2tlbiIsInRrIiwiSlNPTiIsInBhcnNlIiwiYmFzZTY0IiwiZGVjb2RlIiwiZXhwIiwibm93IiwiRGF0ZSIsInZhbHVlT2YiLCJ0ZXN0RXh0ZW5zaW9uSUQiLCJjaGFubmVsSUQiLCJyb2xlIiwiYXBwX2lkIiwiY2hhbm5lbF9pZCIsImF1dGgiLCJjbGllbnRJZCIsImNoYW5uZWxJZCIsInVzZXJJZCIsImVudiIsIlBhcnNlSGVhZGVycyIsInJlcXVpcmUiLCJERUZBVUxUX0NPTlRFTlRfVFlQRSIsInByb3RvdHlwZSIsImRlZmF1bHRzIiwiYXN5bmMiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwid2l0aENyZWRlbnRpYWxzIiwiX3RoaXMiLCJlIiwiaGVhZGVyIiwicmVmIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJfaGFuZGxlRXJyb3IiLCJfeGhyIiwib25sb2FkIiwiX2RldGFjaFdpbmRvd1VubG9hZCIsIl9nZXRSZXNwb25zZVRleHQiLCJfZXJyb3IiLCJfZ2V0UmVzcG9uc2VVcmwiLCJzdGF0dXNUZXh0IiwiX2dldEhlYWRlcnMiLCJvbmVycm9yIiwib250aW1lb3V0Iiwib25hYm9ydCIsIl9hdHRhY2hXaW5kb3dVbmxvYWQiLCJvcGVuIiwiY29uc3RydWN0b3IiLCJzZXRSZXF1ZXN0SGVhZGVyIiwiZ2V0WEhSIiwiX3VubG9hZEhhbmRsZXIiLCJfaGFuZGxlV2luZG93VW5sb2FkIiwiYmluZCIsImF0dGFjaEV2ZW50IiwiZGV0YWNoRXZlbnQiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJnZXRSZXNwb25zZUhlYWRlciIsInJlc3BvbnNlVVJMIiwidGVzdCIsInJlYXNvbiIsImFib3J0IiwiVEVTVF9BVVRIX1RJTUVPVVRfTVMiLCJDT05URVhUX0NBTExCQUNLX1RJTUVPVVQiLCJFeHQiLCJjYiIsIkNsaWVudCIsImZldGNoVGVzdEF1dGgiLCJ0ZXN0Q2hhbm5lbElEIiwidGVzdEpXVFJvbGUiLCJzZXRJbnRlcnZhbCIsInRpbWVyIiwic2V0VGltZW91dCIsIlR3aXRjaCIsImV4dCIsIm9uQXV0aG9yaXplZCIsImNsZWFyVGltZW91dCIsInNldHVwT25Db250ZXh0Q2FsbGJhY2siLCJsYXN0Q29udGV4dENhbGwiLCJvbkNvbnRleHQiLCJkaWZmIiwiZ2V0VGltZSIsImNvbnRleHQiLCJza3UiLCJwdXJjaGFzZXMiLCJiZWdpblB1cmNoYXNlIiwiZ2V0UHJpY2VzIiwicHJpY2VzIiwib25SZWxvYWRFbnRpdGxlbWVudHMiLCJNdXh5IiwiUGFja2FnZUNvbmZpZyIsInNldHVwQ2FsbGVkIiwidHdpdGNoQ2xpZW50SUQiLCJTREtDbGllbnRzIiwiY2xpZW50IiwibWVzc2VuZ2VyIiwiTWVzc2VuZ2VyIiwiY2FjaGVkVHdpdGNoQ2xpZW50IiwiYW5hbHl0aWNzIiwidXNlciIsImxvYWRQcm9taXNlIiwibG9hZFJlc29sdmUiLCJsb2FkUmVqZWN0IiwiU0tVcyIsInNldEVudmlyb25tZW50IiwidXBkYXRlQXV0aCIsInJlc29sdmVQcm9taXNlIiwia2V5cyIsIm9uRmlyc3RBdXRoIiwiVXNlciIsImlwIiwidXNlcmluZm8iLCJpcF9hZGRyZXNzIiwicmVnaXN0ZXJlZFdpdGhNdXh5IiwicmVnaXN0ZXJlZCIsInZpc3VhbGl6YXRpb25JRCIsInZpc3VhbGl6YXRpb25faWQiLCJ1cGRhdGVVc2VyQ29udGV4dFNldHRpbmdzIiwiaXNGdWxsU2NyZWVuIiwidmlkZW9Nb2RlIiwiaXNUaGVhdHJlTW9kZSIsImdhbWUiLCJiaXRyYXRlIiwicm91bmQiLCJsYXRlbmN5IiwiaGxzTGF0ZW5jeUJyb2FkY2FzdGVyIiwiYnVmZmVyIiwiYnVmZmVyU2l6ZSIsInNlbmRFdmVudCIsIkVycm9yIiwiY2xpZW50SUQiLCJUd2l0Y2hDbGllbnQiLCJ1YVN0cmluZyIsIkFuYWx5dGljcyIsInF1aWV0IiwicHJpbnRJbmZvIiwiU0RLSW5mb1RleHQiLCJ2ZXJzaW9uIiwiZ2V0RnVsbFllYXIiLCJhdXRob3IiLCJyZXBvc2l0b3J5IiwibXh5IiwiU0RLIiwiTmV3U0RLIiwid2F0Y2hpbmdBdXRoIiwid2F0Y2hBdXRoIiwiTmV3VHdpdGNoQ2xpZW50IiwiQU5BTFlUSUNTX0VORFBPSU5UIiwicmVhZHkiLCJndW1zaG9lIiwidHJhbnNwb3J0IiwibmFtZSIsImZuIiwiZCIsInBhZ2VEYXRhIiwiY2xpZW50VXVpZCIsInV1aWQiLCJzZXNzaW9uVXVpZCIsInJlcXdlc3QiLCJjb250ZW50VHlwZSIsImNyb3NzT3JpZ2luIiwibWFwRGF0YSIsImFwcE5hbWUiLCJvcGFxdWVJRCIsInVzZXJJRCIsInR3aXRjaE9wYXF1ZUlEIiwicGQiLCJpcEFkZHJlc3MiLCJyZXN1bHQiLCJhaWQiLCJhbiIsImNpZCIsImRoIiwiaG9zdE5hbWUiLCJkbCIsImRwIiwicGF0aCIsImRyIiwicmVmZXJlciIsImR0IiwidGl0bGUiLCJqZSIsImphdmFFbmFibGVkIiwic3IiLCJzY3JlZW5SZXNvbHV0aW9uIiwidCIsInRpZCIsInVhIiwidXNlckFnZW50IiwidWlkIiwidWlwIiwidWwiLCJsYW5ndWFnZSIsInYiLCJ2cCIsInZpZXdwb3J0SGVpZ2h0Iiwidmlld3BvcnRXaWR0aCIsImNkMSIsImNkMiIsImNkMyIsImNkNCIsImNtMiIsImNtMyIsImV2ZW50TmFtZSIsImVjIiwiZWEiLCJldmVudERhdGEiLCJlbCIsImxhYmVsIiwiZXYiLCJjYXRlZ29yeSIsIlN0cmluZyIsInRyaW0iLCJydHJpbSIsInJlcGxhY2UiLCJyZWR1Y2UiLCJjYWxsYmFjayIsIk9iamVjdCIsImxlbiIsImsiLCJhcmd1bWVudHMiLCJwZXJmbm93IiwicGVyZiIsInBlcmZvcm1hbmNlIiwibW96Tm93IiwibXNOb3ciLCJvTm93Iiwid2Via2l0Tm93IiwiZ3Vtc2hvZUZhY3RvcnkiLCJxdWVyeVN0cmluZyIsInN0b3JlIiwidW5kZWZpbmVkIiwiY29udGV4dFNldHVwIiwiYyIsInN0ciIsInJldCIsInBhcmFtIiwicGFydHMiLCJrZXkiLCJ2YWwiLCJkZWNvZGVVUklDb21wb25lbnQiLCJoYXNPd25Qcm9wZXJ0eSIsInN0cmluZ2lmeSIsIm9iaiIsInZhbDIiLCJlbmNvZGVVUklDb21wb25lbnQiLCJkZWZpbml0aW9uIiwid2luIiwiZG9jIiwiaHR0cHNSZSIsInByb3RvY29sUmUiLCJ0d29IdW5kbyIsImJ5VGFnIiwicmVhZHlTdGF0ZSIsInJlcXVlc3RlZFdpdGgiLCJoZWFkIiwidW5pcWlkIiwiY2FsbGJhY2tQcmVmaXgiLCJsYXN0VmFsdWUiLCJ4bWxIdHRwUmVxdWVzdCIsInhEb21haW5SZXF1ZXN0Iiwibm9vcCIsImEiLCJkZWZhdWx0SGVhZGVycyIsIm8iLCJYRG9tYWluUmVxdWVzdCIsIkFjdGl2ZVhPYmplY3QiLCJnbG9iYWxTZXR1cE9wdGlvbnMiLCJkYXRhRmlsdGVyIiwic3VjY2VlZCIsInIiLCJwcm90b2NvbCIsImV4ZWMiLCJyZXF1ZXN0IiwiaGFuZGxlUmVhZHlTdGF0ZSIsInN1Y2Nlc3MiLCJlcnJvciIsIl9hYm9ydGVkIiwiX3RpbWVkT3V0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwic2V0SGVhZGVycyIsImh0dHAiLCJoIiwiaXNBRm9ybURhdGEiLCJGb3JtRGF0YSIsInNldENyZWRlbnRpYWxzIiwiZ2VuZXJhbENhbGxiYWNrIiwidXJsYXBwZW5kIiwicyIsImhhbmRsZUpzb25wIiwicmVxSWQiLCJjYmtleSIsImNidmFsIiwiZ2V0Y2FsbGJhY2tQcmVmaXgiLCJjYnJlZyIsIlJlZ0V4cCIsIm1hdGNoIiwic2NyaXB0IiwiY3JlYXRlRWxlbWVudCIsImxvYWRlZCIsImlzSUUxMCIsIm5hdmlnYXRvciIsInNyYyIsImh0bWxGb3IiLCJvbmNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImdldFJlcXVlc3QiLCJ0b1VwcGVyQ2FzZSIsInRvUXVlcnlTdHJpbmciLCJzZW5kV2FpdCIsIm9ucHJvZ3Jlc3MiLCJSZXF3ZXN0IiwiaW5pdCIsInNldFR5cGUiLCJ0aW1lb3V0IiwiX2Z1bGZpbGxlZCIsIl9zdWNjZXNzSGFuZGxlciIsIl9mdWxmaWxsbWVudEhhbmRsZXJzIiwiX2Vycm9ySGFuZGxlcnMiLCJfY29tcGxldGVIYW5kbGVycyIsIl9lcnJlZCIsIl9yZXNwb25zZUFyZ3MiLCJzZWxmIiwidGltZWRPdXQiLCJjb21wbGV0ZSIsInNoaWZ0IiwiZmlsdGVyZWRSZXNwb25zZSIsIm1zZyIsInJldHJ5IiwiZmFpbCIsImFsd2F5cyIsIm5vcm1hbGl6ZSIsInNlcmlhbCIsIm4iLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJvcHRDYiIsImNoIiwicmEiLCJkaXNhYmxlZCIsImNoZWNrZWQiLCJzZWxlY3RlZEluZGV4Iiwic2VsZWN0ZWQiLCJlYWNoRm9ybUVsZW1lbnQiLCJzZXJpYWxpemVTdWJ0YWdzIiwidGFncyIsImoiLCJmYSIsInNlcmlhbGl6ZVF1ZXJ5U3RyaW5nIiwic2VyaWFsaXplQXJyYXkiLCJzZXJpYWxpemVIYXNoIiwiaGFzaCIsImFyciIsInNlcmlhbGl6ZSIsIm9wdCIsImFyZ3MiLCJzbGljZSIsInBvcCIsIm5vZGVUeXBlIiwidHJhZCIsInByZWZpeCIsInRyYWRpdGlvbmFsIiwiZW5jIiwiYWRkIiwiYnVpbGRQYXJhbXMiLCJyYnJhY2tldCIsImNvbXBhdCIsImFqYXhTZXR1cCIsImRlZmluZSIsIl8iLCJhcmVhcyIsImFwaXMiLCJpbmhlcml0IiwiYXBpIiwicCIsInN0b3JlQVBJIiwiZ2V0IiwiYXJlYSIsImdldEl0ZW0iLCJzZXQiLCJzdHJpbmciLCJzZXRJdGVtIiwicmVtb3ZlIiwicmVtb3ZlSXRlbSIsImNsZWFyIiwiU3RvcmUiLCJuYW1lc3BhY2UiLCJvdmVyd3JpdGUiLCJnZXRBbGwiLCJzZXRBbGwiLCJfaWQiLCJ0ZXN0S2V5IiwiX2FyZWEiLCJzdG9yYWdlQVBJIiwiaXRlbXMiLCJfbnMiLCJub1Nlc3Npb24iLCJzdWJzdHJpbmciLCJucyIsInNlc3Npb24iLCJpc0Zha2UiLCJoYXMiLCJfaW4iLCJzaXplIiwiZWFjaCIsImFuZCIsIm0iLCJfb3V0IiwibGlzdCIsImFsdCIsImFsbCIsImNoYW5nZWQiLCJjbGVhckFsbCIsImNvbmZsaWN0IiwibG9jYWwiLCJhbWQiLCJleHRlbmQiLCJpc09iamVjdCIsInNvdXJjZSIsInByb3AiLCJpc0Z1bmN0aW9uIiwiaXNTdHJpbmciLCJ1dWlkdjQiLCJyYW5kb20iLCJmbG9vciIsInF1ZXVlVGltZW91dCIsImxvY2FsU3RvcmUiLCJzdG9yYWdlIiwicXVldWUiLCJ0cmFuc3BvcnRzIiwic2Vzc2lvbkZuIiwiaXRlcmF0b3IiLCJsIiwicmVzdWx0cyIsImluZGV4IiwiY29sbGVjdFBsdWdpbnMiLCJwbHVnaW5zIiwicGx1Z2luIiwibWltZVR5cGVzIiwibWltZVR5cGUiLCJzdWZmaXhlcyIsImRlc2NyaXB0aW9uIiwiZmlsZW5hbWUiLCJjb2xsZWN0IiwiZ2V0Vmlld3BvcnQiLCJkb2N1bWVudEVsZW1lbnQiLCJib2R5Iiwid2lkdGgiLCJoZWlnaHQiLCJ2aWV3cG9ydCIsInF1ZXJ5Iiwic2VhcmNoIiwiY2hhcmFjdGVyU2V0IiwiY2hhcnNldCIsImlucHV0RW5jb2RpbmciLCJjb2xvckRlcHRoIiwic2NyZWVuIiwiZ29vZ2xlQ2xpY2tJZCIsImdjbGlkIiwiaG9zdCIsImhvc3RuYW1lIiwidXNlckxhbmd1YWdlIiwibG9naW5LZXkiLCJsayIsInBhdGhuYW1lIiwicGxhdGZvcm0iLCJwb3J0IiwicHJvbW90aW9uS2V5IiwicGtleSIsInNjcmVlbkF2YWlsSGVpZ2h0IiwiYXZhaWxIZWlnaHQiLCJzY3JlZW5BdmFpbFdpZHRoIiwiYXZhaWxXaWR0aCIsInNjcmVlbkhlaWdodCIsInNjcmVlbk9yaWVudGF0aW9uQW5nbGUiLCJzY3JlZW5PcmllbnRhdGlvblR5cGUiLCJzY3JlZW5QaXhlbERlcHRoIiwicGl4ZWxEZXB0aCIsInNjcmVlbldpZHRoIiwiaHJlZiIsInV0bUNhbXBhaWduIiwidXRtX2NhbXBhaWduIiwidXRtQ29udGVudCIsInV0bV9jb250ZW50IiwidXRtTWVkaXVtIiwidXRtX21lZGl1bSIsInV0bVNvdXJjZSIsInV0bV9zb3VyY2UiLCJ1dG1UZXJtIiwidXRtX3Rlcm0iLCJ2aWV3cG9ydFJlc29sdXRpb24iLCJpbnRGaWVsZHMiLCJvcmllbnRhdGlvbiIsInBhcnNlSW50IiwiYW5nbGUiLCJpc05hTiIsImdldFV0bSIsImNhbXBhaWduIiwibWVkaXVtIiwibGFzdFV0bSIsInV0bSIsInRpbWVzdGFtcCIsImRpZmZlcmVuY2UiLCJiYXNlRGF0YSIsInRpbWV6b25lT2Zmc2V0IiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJ0cmFuc3BvcnRGb3VuZCIsInRyYW5zcG9ydE5hbWUiLCJwdXNoRXZlbnQiLCJuZXh0RXZlbnQiLCJuZXZlbnQiLCJ3YXJuIiwidHAiLCJsb2NhbFN0b3JhZ2UiLCJleHRlbnNpb25JZCIsInByb21pc2UiLCJKV1QiLCJBY2NlcHQiLCJ1c2VybmFtZXMiLCJzaWduZWRUd2l0Y2hSZXF1ZXN0IiwidXNlcklEcyIsInNpZ25lZFR3aXRjaEhlbGl4UmVxdWVzdCIsInJlY2VpcHRzIiwiUHVzaGVyIiwiVHdpdGNoTWVzc2VuZ2VyIiwiZXZlbnQiLCJ0YXJnZXQiLCJ0b3BpYyIsImRhdGF0eXBlIiwibWVzc2FnZSIsInBhcnNlZCIsImxpc3RlbiIsInVubGlzdGVuIiwiUHVzaGVyTWVzc2VuZ2VyIiwibXV4eSIsImNsdXN0ZXIiLCJlbmNyeXB0ZWQiLCJzY29wZWRFdmVudCIsInVzZXJfaWQiLCJjaGFubmVsIiwiY2hhbm5lbE5hbWUiLCJzdWJzY3JpYmUiLCJ1bmJpbmQiLCJTZXJ2ZXJNZXNzZW5nZXIiLCJhY2N1bXVsYXRpb25JRCIsImdldEFjY3VtdWxhdGVEYXRhIiwidm90ZUlEIiwicmFua0lEIiwiYWNjZXB0IiwiZ2V0UmFua0RhdGEiLCJjbGVhclJhbmtpbmciLCJyZWFsRGF0YSIsImluRXZlbnQiLCJpblVzZXJJRCIsImluQ2FsbGJhY2siLCJyZWFsRXZlbnQiLCJ0cnVuY2F0ZWRFdmVudCIsImhhbmRsZSIsIlZpZXdlciIsIkJyb2FkY2FzdGVyIiwiTW9kZXJhdG9yIiwiRGVmYXVsdCIsIkZ1bGxzY3JlZW4iLCJUaGVhdHJlIiwidHdpdGNoSldUIiwidHdpdGNoSUQiLCJtdXh5SUQiLCJSb2xlcyIsIlZpZGVvTW9kZXMiLCJleHRyYWN0SldUSW5mbyIsImp3dCIsImF0b2IiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNB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O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFBQTtBQUNILEVBQUU7QUFDRixtQkFBbUI7QUFDbkI7QUFDQSxHQUFHLE9BQU87QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTztBQUNUO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7Ozs7QUNwS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsaUJBQWlCO0FBQ2pCLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7OztBQUd2QixPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFVBQVU7QUFDVixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQSxFQUFFO0FBQ0Ysb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxvQ0FBb0M7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFVBQVUscUNBQXFDO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxzQ0FBc0M7QUFDeEM7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsNkRBQTZELGVBQWU7QUFDNUUsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QywyREFBMkQ7QUFDM0QsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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MENBQTBDO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxzQ0FBc0MsdUNBQXVDO0FBQzdFLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0NBQWdDO0FBQ2pFLHdDQUF3Qyw2Q0FBNkM7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDZCQUE2QixFQUFFO0FBQy9CLHdDQUF3QztBQUN4QztBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRiw2Q0FBNkM7QUFDaEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLDRDQUE0QztBQUNsSDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLENBQUM7QUFDRCxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdGxJQTs7QUFDQTs7Ozs7O0lBbUJxQnRJLEc7QUFFbkIsZUFBWTdMLFVBQVosRUFBd0I2SSxNQUF4QixFQUFnQ0ssSUFBaEMsRUFBc0NKLFNBQXRDLEVBQWlERyxTQUFqRCxFQUE0REUsV0FBNUQsRUFBeUVHLElBQXpFLEVBQStFO0FBQUE7O0FBRTdFLFNBQUtILFdBQUwsR0FBbUJBLFdBQW5COztBQU9BLFNBQUtuSixVQUFMLEdBQWtCQSxVQUFsQjs7QUFRQSxTQUFLNkksTUFBTCxHQUFjQSxNQUFkOztBQVFBLFNBQUtDLFNBQUwsR0FBaUJBLFNBQWpCOztBQVFBLFNBQUtHLFNBQUwsR0FBaUJBLFNBQWpCOztBQU9BLFNBQUtDLElBQUwsR0FBWUEsSUFBWjs7QUFPQSxTQUFLSSxJQUFMLEdBQVlBLElBQVo7QUFDRDs7Ozs2QkFpQlE7QUFDUCxhQUFPLEtBQUtILFdBQVo7QUFDRDs7O3NDQWlEaUI2YixjLEVBQWdCaGtCLEssRUFBTztBQUN2QywyQkFBVWdrQixjQUFWLEVBQTBCLFFBQTFCO0FBQ0EsYUFBTyxLQUFLbmMsTUFBTCxDQUFZL0gsZUFBWixDQUE0QixLQUFLZCxVQUFqQyxFQUE2Q2dsQixjQUE3QyxFQUE2RGhrQixLQUE3RCxDQUFQO0FBQ0Q7OztvQ0FLZWdrQixjLEVBQWdCaGtCLEssRUFBTztBQUNyQyxhQUFPLEtBQUtpa0IsaUJBQUwsQ0FBdUJELGNBQXZCLEVBQXVDaGtCLEtBQXZDLENBQVA7QUFDRDs7OytCQW9CVWdrQixjLEVBQWdCNWtCLEksRUFBTTtBQUMvQiwyQkFBVTRrQixjQUFWLEVBQTBCLFFBQTFCO0FBQ0EsYUFBTyxLQUFLbmMsTUFBTCxDQUFZNUgsVUFBWixDQUF1QixLQUFLakIsVUFBNUIsRUFBd0NnbEIsY0FBeEMsRUFBd0Q1a0IsSUFBeEQsQ0FBUDtBQUNEOzs7Z0NBc0NXOGtCLE0sRUFBUTtBQUNsQiwyQkFBVUEsTUFBVixFQUFrQixRQUFsQjtBQUNBLGFBQU8sS0FBS3JjLE1BQUwsQ0FBWTFILFFBQVosQ0FBcUIsS0FBS25CLFVBQTFCLEVBQXNDa2xCLE1BQXRDLENBQVA7QUFDRDs7O3lCQW1CSUEsTSxFQUFRM21CLEssRUFBTztBQUNsQiwyQkFBVTJtQixNQUFWLEVBQWtCLFFBQWxCO0FBQ0EsMkJBQVUzbUIsS0FBVixFQUFpQixRQUFqQjs7QUFFQSxhQUFPLEtBQUtzSyxNQUFMLENBQVkzSCxJQUFaLENBQWlCLEtBQUtsQixVQUF0QixFQUFrQ2tsQixNQUFsQyxFQUEwQyxFQUFFM21CLFlBQUYsRUFBMUMsQ0FBUDtBQUNEOzs7Z0NBb0NXNG1CLE0sRUFBUTtBQUFBOztBQUNsQiwyQkFBVUEsTUFBVixFQUFrQixRQUFsQjtBQUNBLGFBQU8sc0JBQVksVUFBQ0MsTUFBRCxFQUFTeHFCLE1BQVQsRUFBb0I7QUFDckMsY0FBS2lPLE1BQUwsQ0FDR3hILE9BREgsQ0FDVyxNQUFLckIsVUFEaEIsRUFDNEJtbEIsTUFENUIsRUFFR3ppQixJQUZILENBRVEsZ0JBQVE7QUFDWjBpQixpQkFBT2hsQixLQUFLQSxJQUFaO0FBQ0QsU0FKSCxFQUtHcUMsS0FMSCxDQUtTN0gsTUFMVDtBQU1ELE9BUE0sQ0FBUDtBQVFEOzs7eUJBaUJJdXFCLE0sRUFBUTVtQixLLEVBQU87QUFDbEIsMkJBQVU0bUIsTUFBVixFQUFrQixRQUFsQjtBQUNBLDJCQUFVNW1CLEtBQVYsRUFBaUIsUUFBakI7O0FBRUEsYUFBTyxLQUFLc0ssTUFBTCxDQUFZekgsSUFBWixDQUFpQixLQUFLcEIsVUFBdEIsRUFBa0NtbEIsTUFBbEMsRUFBMEMsRUFBRXRULEtBQUt0VCxLQUFQLEVBQTFDLENBQVA7QUFDRDs7O2tDQWdCYTRtQixNLEVBQVE7QUFDcEIsMkJBQVVBLE1BQVYsRUFBa0IsUUFBbEI7QUFDQSxhQUFPLEtBQUt0YyxNQUFMLENBQVl2SCxVQUFaLENBQXVCLEtBQUt0QixVQUE1QixFQUF3Q21sQixNQUF4QyxDQUFQO0FBQ0Q7OzttQ0FLY0EsTSxFQUFRO0FBQ3JCLGFBQU8sS0FBS0UsV0FBTCxDQUFpQkYsTUFBakIsQ0FBUDtBQUNEOzs7aUNBS1lBLE0sRUFBUTtBQUNuQixhQUFPLEtBQUtHLFlBQUwsQ0FBa0JILE1BQWxCLENBQVA7QUFDRDs7O21DQTJCY3hrQixLLEVBQU87QUFDcEIsYUFBTyxLQUFLa0ksTUFBTCxDQUFZbkksY0FBWixDQUEyQixLQUFLVixVQUFoQyxFQUE0Q1csS0FBNUMsQ0FBUDtBQUNEOzs7NENBc0J1QkEsSyxFQUFPO0FBQzdCLGFBQU8sS0FBS2tJLE1BQUwsQ0FBWWpJLHVCQUFaLENBQW9DLEtBQUtaLFVBQXpDLEVBQXFEVyxLQUFyRCxDQUFQO0FBQ0Q7OztvQ0F5QmVBLEssRUFBTztBQUNyQixhQUFPLEtBQUtrSSxNQUFMLENBQVloSSxlQUFaLENBQTRCLEtBQUtiLFVBQWpDLEVBQTZDVyxLQUE3QyxDQUFQO0FBQ0Q7OztrQ0FrQ2E7QUFDWixhQUFPLEtBQUtrSSxNQUFMLENBQVk5SSxRQUFaLENBQXFCLEtBQUtDLFVBQTFCLENBQVA7QUFDRDs7O2lDQXNDWTZSLEcsRUFBSztBQUNoQixVQUFJQSxHQUFKLEVBQVM7QUFDUCw2QkFBVUEsR0FBVixFQUFlLFFBQWY7QUFDRDs7QUFFRCxhQUFPLEtBQUtoSixNQUFMLENBQVl0SCxZQUFaLENBQXlCLEtBQUt2QixVQUE5QixFQUEwQzZSLEdBQTFDLENBQVA7QUFDRDs7O2lDQTRCWW5RLEcsRUFBSztBQUNoQiwyQkFBVUEsR0FBVixFQUFlLFFBQWY7QUFDQSxhQUFPLEtBQUttSCxNQUFMLENBQVlySCxZQUFaLENBQXlCLEtBQUt4QixVQUE5QixFQUEwQzBCLEdBQTFDLENBQVA7QUFDRDs7O3FDQXVCZ0I7QUFDZixhQUFPLEtBQUttSCxNQUFMLENBQVlsSCxjQUFaLENBQTJCLEtBQUszQixVQUFoQyxDQUFQO0FBQ0Q7Ozt3Q0FrQm1CO0FBQ2xCLGFBQU8sS0FBSzZJLE1BQUwsQ0FBWWpILGlCQUFaLENBQThCLEtBQUs1QixVQUFuQyxDQUFQO0FBQ0Q7Ozt5QkE0Qkk2akIsSyxFQUFPMVcsTSxFQUFRL00sSSxFQUFNO0FBQ3hCLDJCQUFVeWpCLEtBQVYsRUFBaUIsUUFBakI7QUFDQSxVQUFJQyxTQUFTLFdBQWI7QUFDQSxVQUFJeUIsV0FBV25sQixJQUFmOztBQUVBLFVBQUksQ0FBQ0EsSUFBTCxFQUFXO0FBQ1RtbEIsbUJBQVdwWSxNQUFYO0FBQ0QsT0FGRCxNQUVPO0FBQ0wyVyw4QkFBb0IzVyxNQUFwQjtBQUNEOztBQUVELFdBQUtyRSxTQUFMLENBQWV6RyxJQUFmLENBQW9CLEtBQUtyQyxVQUF6QixFQUFxQzZqQixLQUFyQyxFQUE0Q0MsTUFBNUMsRUFBb0R5QixRQUFwRCxFQUE4RCxLQUFLMWMsTUFBbkU7QUFDRDs7OzJCQWdDTTJjLE8sRUFBU0MsUSxFQUFVQyxVLEVBQVk7QUFBQTs7QUFDcEMsVUFBTUMsWUFBZSxnQ0FBcUI1ckIsV0FBcEMsU0FBbUQsS0FBS2lHLFVBQXhELFNBQXNFd2xCLE9BQTVFOztBQUVBLFVBQUl4SCxJQUFJLFdBQVI7QUFDQSxVQUFJek4sV0FBV21WLFVBQWY7QUFDQSxVQUFJblYsUUFBSixFQUFjO0FBQ1p5Tix5QkFBZXlILFFBQWY7QUFDRCxPQUZELE1BRU87QUFDTGxWLG1CQUFXa1YsUUFBWDtBQUNEOztBQUVELFVBQU16ZSxLQUFLLFNBQUxBLEVBQUssTUFBTztBQUNoQixZQUFJO0FBRUYsY0FBSSxnQ0FBcUJqTixXQUFyQixLQUFxQyxZQUF6QyxFQUF1RDtBQUNyRCxnQkFBSSw2QkFBa0J3ZCxJQUFJc00sS0FBdEIsRUFBZ0MsT0FBSzdqQixVQUFyQyxTQUFtRHdsQixPQUFuRCxDQUFKLEVBQW1FO0FBQ2pFLGtCQUFNSSxpQkFBaUJyTyxJQUFJc00sS0FBSixDQUNwQmxtQixLQURvQixDQUNkLEdBRGMsRUFFcEJ5YixLQUZvQixDQUVkLENBRmMsRUFHcEJuYixJQUhvQixDQUdmLEdBSGUsQ0FBdkI7QUFJQXNTLHVCQUFTZ0gsSUFBSW5YLElBQWIsRUFBbUJ3bEIsY0FBbkI7QUFDQTtBQUNEO0FBQ0Y7O0FBRUQsY0FBSSw2QkFBa0JyTyxJQUFJc00sS0FBdEIsRUFBNkI4QixTQUE3QixDQUFKLEVBQTZDO0FBRzNDLGdCQUFNQyxrQkFBaUJyTyxJQUFJc00sS0FBSixDQUNwQmxtQixLQURvQixDQUNkLEdBRGMsRUFFcEJ5YixLQUZvQixDQUVkLENBRmMsRUFHcEJuYixJQUhvQixDQUdmLEdBSGUsQ0FBdkI7QUFJQXNTLHFCQUFTZ0gsSUFBSW5YLElBQWIsRUFBbUJ3bEIsZUFBbkI7QUFDRDtBQUNGLFNBdEJELENBc0JFLE9BQU9qckIsR0FBUCxFQUFZO0FBRVosa0NBQWFBLEdBQWIsRUFBa0IsRUFBRXVDLE1BQU0sT0FBUixFQUFsQjtBQUNEO0FBQ0YsT0EzQkQ7O0FBNkJBLGFBQU8sS0FBSzRMLFNBQUwsQ0FBZXFiLE1BQWYsQ0FBc0IsS0FBS25rQixVQUEzQixFQUF1Q2dlLENBQXZDLEVBQTBDaFgsRUFBMUMsQ0FBUDtBQUNEOzs7NkJBU1E2ZSxNLEVBQVE7QUFDZixhQUFPLEtBQUsvYyxTQUFMLENBQWVzYixRQUFmLENBQXdCLEtBQUtwa0IsVUFBN0IsRUFBeUM2bEIsTUFBekMsQ0FBUDtBQUNEOzs7dUNBZ0JrQnZaLEksRUFBNkI7QUFBQSxVQUF2Qi9OLEtBQXVCLHVFQUFmLENBQWU7QUFBQSxVQUFad1IsS0FBWSx1RUFBSixFQUFJOztBQUM5QyxXQUFLOUcsU0FBTCxDQUFlOEIsU0FBZixDQUF5QixLQUFLL0ssVUFBOUIsRUFBMENzTSxJQUExQyxFQUFnRC9OLEtBQWhELEVBQXVEd1IsS0FBdkQ7QUFDRDs7O2tDQVdhN0gsRyxFQUFLO0FBQ2pCLFVBQUksS0FBS29CLElBQUwsQ0FBVW5PLE1BQVYsS0FBcUIsQ0FBekIsRUFBNEI7QUFDMUIsY0FBTSxJQUFJNlAsS0FBSixDQUFVLDBEQUFWLENBQU47QUFDRDtBQUNELDJCQUFVOUMsR0FBVixFQUFlLFFBQWY7QUFDQSxhQUFPbkIsb0JBQUlxQixhQUFKLENBQWtCRixHQUFsQixDQUFQO0FBQ0Q7OztnQ0FTVztBQUNWLFVBQUksS0FBS29CLElBQUwsQ0FBVW5PLE1BQVYsS0FBcUIsQ0FBekIsRUFBNEI7QUFDMUIsY0FBTSxJQUFJNlAsS0FBSixDQUFVLHNEQUFWLENBQU47QUFDRDtBQUNELGFBQU8sc0JBQVksbUJBQVc7QUFDNUJqRSw0QkFBSXNCLFNBQUosQ0FBYyxrQkFBVTtBQUN0Qm5HLGtCQUFRb0csTUFBUjtBQUNELFNBRkQ7QUFHRCxPQUpNLENBQVA7QUFLRDs7O3lDQVFvQnRCLEUsRUFBSTtBQUN2QixVQUFJLEtBQUtzQyxJQUFMLENBQVVuTyxNQUFWLEtBQXFCLENBQXpCLEVBQTRCO0FBQzFCLGNBQU0sSUFBSTZQLEtBQUosQ0FBVSxpRUFBVixDQUFOO0FBQ0Q7QUFDRCxhQUFPakUsb0JBQUl3QixvQkFBSixDQUF5QnZCLEVBQXpCLENBQVA7QUFDRDs7Ozs7a0JBdnVCa0I2RSxHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ2hCQWpDLEk7Ozt3QkFTQTtBQUNqQixhQUFPO0FBQ0xrYyxnQkFBUSxRQURIO0FBRUxDLHFCQUFhLGFBRlI7QUFHTEMsbUJBQVc7QUFITixPQUFQO0FBS0Q7Ozt3QkFTdUI7QUFDdEIsYUFBTztBQUNMQyxpQkFBUyxTQURKO0FBRUxDLG9CQUFZLFlBRlA7QUFHTEMsaUJBQVM7QUFISixPQUFQO0FBS0Q7OztBQU1ELGdCQUFZdGlCLElBQVosRUFBa0I7QUFBQTs7QUFPaEIsU0FBS0osU0FBTCxHQUFpQkksS0FBS0UsU0FBdEI7O0FBUUEsU0FBS3FpQixTQUFMLEdBQWlCdmlCLEtBQUtoQyxLQUF0Qjs7QUFTQSxTQUFLdUwsY0FBTCxHQUFzQnZKLEtBQUtHLE1BQTNCOztBQVVBLFNBQUtxaUIsUUFBTCxHQUFnQixJQUFoQjs7QUFRQSxTQUFLcmMsa0JBQUwsR0FBMEIsS0FBMUI7O0FBU0EsU0FBS3NjLE1BQUwsR0FBYyxJQUFkOztBQVdBLFNBQUtwYyxlQUFMLEdBQXVCLEVBQXZCOztBQVFBLFNBQUt4RyxJQUFMLEdBQVlrRyxLQUFLMmMsS0FBTCxDQUFXVCxNQUF2Qjs7QUFRQSxTQUFLamMsRUFBTCxHQUFVLEVBQVY7O0FBUUEsU0FBS1csSUFBTCxHQUFZLEVBQVo7O0FBUUEsU0FBS0YsU0FBTCxHQUFpQlYsS0FBSzRjLFVBQUwsQ0FBZ0JQLE9BQWpDOztBQVFBLFNBQUt4YixPQUFMLEdBQWUsSUFBZjs7QUFRQSxTQUFLRSxPQUFMLEdBQWUsSUFBZjs7QUFRQSxTQUFLRSxNQUFMLEdBQWMsSUFBZDs7QUFJQSxTQUFLNGIsY0FBTCxDQUFvQjVpQixLQUFLaEMsS0FBekI7QUFDRDs7OzttQ0FRYzZrQixHLEVBQUs7QUFDbEIsVUFBSTtBQUNGLFlBQU01akIsYUFBYTRqQixJQUFJL29CLEtBQUosQ0FBVSxHQUFWLENBQW5CO0FBQ0EsWUFBSW1GLFdBQVczSCxNQUFYLEtBQXNCLENBQTFCLEVBQTZCO0FBQzNCLGNBQU0wRyxRQUFRbUIsS0FBS0MsS0FBTCxDQUFXbkgsT0FBTzZxQixJQUFQLENBQVk3akIsV0FBVyxDQUFYLENBQVosQ0FBWCxDQUFkO0FBQ0EsZUFBS1ksSUFBTCxHQUFZN0IsTUFBTTZCLElBQWxCO0FBQ0EsY0FBSTdCLE1BQU02aUIsT0FBVixFQUFtQjtBQUNqQixpQkFBSzJCLFFBQUwsR0FBZ0J4a0IsTUFBTTZpQixPQUF0QjtBQUNEO0FBQ0Y7QUFDRixPQVRELENBU0UsT0FBTy9wQixHQUFQLEVBQVksQ0FFYjtBQUNGOzs7Z0NBWVc7QUFDVixhQUFPLENBQUMsS0FBS3lTLGNBQU4sSUFBd0IsS0FBS0EsY0FBTCxDQUFvQixDQUFwQixNQUEyQixHQUExRDtBQUNEOzs7K0JBUVV2SixJLEVBQU07QUFDZixXQUFLdWlCLFNBQUwsR0FBaUJ2aUIsS0FBS2hDLEtBQXRCO0FBQ0EsV0FBSzRrQixjQUFMLENBQW9CNWlCLEtBQUtoQyxLQUF6QjtBQUNEOzs7OztrQkE3TWtCK0gsSTs7Ozs7O0FDSnJCLGtCQUFrQixrVEFBa1Qsb05BQW9OLG9CQUFvQixta0NBQW1rQyxpQkFBaUIsa0UiLCJmaWxlIjoibXV4eS1leHRlbnNpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJNdXh5XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIk11eHlcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiTXV4eVwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNjEpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGE5NGQyMjBhN2ZkODZjYWVjMTc2IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS42JyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzXG4vLyBtb2R1bGUgaWQgPSA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIElTX1dSQVAgPSB0eXBlICYgJGV4cG9ydC5XO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV07XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIga2V5LCBvd24sIG91dDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAob3duICYmIGhhcyhleHBvcnRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uIChDKSB7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEMoKTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYgKElTX1BST1RPKSB7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYgKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0pIGhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hhcy5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWlvYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ZhaWxzLmpzXG4vLyBtb2R1bGUgaWQgPSAxM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLyoqXG4gKiBHbG9iYWwgZW52aXJvbm1lbnQgb2JqZWN0cy4gVGhpcyBlbnN1cmVzIHRoYXQgY29tcGFyaXNvbnMgYXJlIHRydWUgYmV0d2VlblxuICogb2JqZWN0IHBvaW50ZXJzLiBGb3IgZXhhbXBsZTogRU5WSVJPTk1FTlRTLlRFU1RJTkcgPT09IFV0aWwuRW52aXJvbm1lbnRzLlRlc3RpbmdcbiAqXG4gKiBAc2luY2UgMS4wLjNcbiAqL1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgUHJvZHVjdGlvbkVudmlyb25tZW50ID0geyBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nIH07XG4vKiogQGlnbm9yZSAqLyBjb25zdCBTYW5kYm94RGV2RW52aXJvbm1lbnQgPSB7IGVudmlyb25tZW50OiAnc2FuZGJveCcgfTtcbi8qKiBAaWdub3JlICovIGNvbnN0IFNhbmRib3hUd2l0Y2hFbnZpcm9ubWVudCA9IHsgZW52aXJvbm1lbnQ6ICdzYW5kYm94JyB9O1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgU2VydmVyRW52aXJvbm1lbnQgPSB7IGVudmlyb25tZW50OiAnc2VydmVyJyB9O1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgVGVzdGluZ0Vudmlyb25tZW50ID0geyBlbnZpcm9ubWVudDogJ3Rlc3RpbmcnIH07XG5cbi8qKlxuICogUG9zc2libGUgcnVudGltZSBlbnZpcm9ubWVudHMgZm9yIHRoZSBTREsuXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVXRpbC5FbnZpcm9ubWVudHN9IGluc3RlYWQuXG4gKi9cbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCBFTlZJUk9OTUVOVFMgPSB7XG4gIFBST0RVQ1RJT046IFByb2R1Y3Rpb25FbnZpcm9ubWVudCxcbiAgU0FOREJPWF9ERVY6IFNhbmRib3hEZXZFbnZpcm9ubWVudCxcbiAgU0FOREJPWF9UV0lUQ0g6IFNhbmRib3hUd2l0Y2hFbnZpcm9ubWVudCxcbiAgU0VSVkVSOiBTZXJ2ZXJFbnZpcm9ubWVudCxcbiAgVEVTVElORzogVGVzdGluZ0Vudmlyb25tZW50XG59O1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzdGF0aWMgdXRpbGl0eSBmdW5jdGlvbnMsIGF2YWlsYWJsZSBhdCB7QGxpbmsgTXV4eS5VdGlsfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYSA9ICdhIHN0cmluZyc7XG4gKiBNdXh5LlV0aWwuZm9yY2VUeXBlKGEsICdzdHJpbmcnKTtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbCB7XG4gIC8qKlxuICAgKiBQb3NzaWJsZSBydW50aW1lIGVudmlyb25tZW50cyBmb3IgdGhlIGxpYnJhcnkuIFVzZWQgdG8gZGVmaW5lIGF2YWlsYWJsZVxuICAgKiBiZWhhdmlvciBhbmQgc2VydmljZXMuXG4gICAqXG4gICAqIEBzaW5jZSAxLjAuM1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBFbnZpcm9ubWVudHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFByb2R1Y3Rpb246IFByb2R1Y3Rpb25FbnZpcm9ubWVudCxcbiAgICAgIFNhbmRib3hEZXY6IFNhbmRib3hEZXZFbnZpcm9ubWVudCxcbiAgICAgIFNhbmRib3hUd2l0Y2g6IFNhbmRib3hUd2l0Y2hFbnZpcm9ubWVudCxcbiAgICAgIFNlcnZlcjogU2VydmVyRW52aXJvbm1lbnQsXG4gICAgICBUZXN0aW5nOiBUZXN0aW5nRW52aXJvbm1lbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgc3RyaW5nIGVycm9yIHJlc3BvbnNlIGluIGFuIChpbW1lZGlhdGVseSByZWplY3RlZCkgcHJvbWlzZS5cbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnIgLSBBIHN0cmluZyBlcnJvciB0aGF0IHRoZSBwcm9taXNlIHdpbGwgcmVqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBJbW1lZGlhdGVseSByZWplY3RzIHRoZSByZXR1cm5lZCBQcm9taXNlLlxuICAgKi9cbiAgc3RhdGljIGVycm9yUHJvbWlzZShlcnIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgbGluZSBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuXG4gICAqXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKiBAaWdub3JlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGxpbmVzIC0gQW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICovXG4gIHN0YXRpYyB3aWRlc3RMaW5lKGxpbmVzKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIGxpbmVzLm1hcCh4ID0+IHgubGVuZ3RoKSk7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSBib3ggYXJvdW5kIHRoZSBsaW5lcyBvZiB0ZXh0IHByb3ZpZGVkLlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQGlnbm9yZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsaW5lcyAtIEFuIGFycmF5IG9mIHN0cmluZ3MgdG8gc3Vycm91bmQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGBsaW5lc2Agb2YgdGV4dCBzdXJyb3VuZGVkXG4gICAqIGluIGFuIEFTQ0lJIGJveCBhcnQuXG4gICAqL1xuICBzdGF0aWMgYXNjaWlCb3gobGluZXMpIHtcbiAgICBjb25zdCBjb250ZW50V2lkdGggPSBVdGlsLndpZGVzdExpbmUobGluZXMpO1xuXG4gICAgY29uc3QgaW50cm8gPSBgJHsnICcucmVwZWF0KGNvbnRlbnRXaWR0aCAvIDIpffCfpopgO1xuXG4gICAgY29uc3Qgb3V0ID0gW2ludHJvXTtcbiAgICBvdXQucHVzaChg4pSMJHsn4pSAJy5yZXBlYXQoY29udGVudFdpZHRoICsgMil94pSQYCk7XG5cbiAgICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gJyAnLnJlcGVhdChjb250ZW50V2lkdGggLSBsaW5lLmxlbmd0aCk7XG4gICAgICBvdXQucHVzaChgfCAke2xpbmV9JHtwYWRkaW5nUmlnaHR9IHxgKTtcbiAgICB9KTtcblxuICAgIG91dC5wdXNoKGDilJQkeyfilIAnLnJlcGVhdChjb250ZW50V2lkdGggKyAyKX3ilJhgKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCB3aW5kb3cgb2JqZWN0IGlzIHJ1bm5pbmcgaW4gYW4gaWZyYW1lLlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3RhdGljIGlzV2luZG93RnJhbWVkKCkge1xuICAgIGNvbnN0IGlzTm90Q2hpbGRXaW5kb3cgPSAhd2luZG93Lm9wZW5lcjtcblxuICAgIC8vIENhbm5vdCBjb21wYXJlIFdpbmRvd1Byb3h5IG9iamVjdHMgd2l0aCA9PT0vIT09XG4gICAgY29uc3Qgd2luZG93VG9wID0gd2luZG93LnRvcCAmJiB3aW5kb3cgIT0gd2luZG93LnRvcDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBjb25zdCB3aW5kb3dQYXJlbnQgPSB3aW5kb3cucGFyZW50ICYmIHdpbmRvdyAhPSB3aW5kb3cucGFyZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGNvbnN0IGhhc1dpbmRvd0FuY2VzdG9ycyA9ICEhKHdpbmRvd1RvcCB8fCB3aW5kb3dQYXJlbnQpO1xuXG4gICAgcmV0dXJuIGlzTm90Q2hpbGRXaW5kb3cgJiYgaGFzV2luZG93QW5jZXN0b3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIGN1cnJlbnRFbnZpcm9ubWVudCB1c2VzIHRoZSBob3N0bmFtZSBhbmQgYXZhaWxhYmxlIGluZm8gdG8gZGV0ZXJtaW5lIGluIHdoYXRcbiAgICogZW52aXJvbm1lbnQgdGhlIFNESyBpcyBydW5uaW5nLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBpbiB7QGxpbmsgVXRpbC5FbnZpcm9ubWVudHN9LlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudFxuICAgKiBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudEVudmlyb25tZW50KG92ZXJyaWRlV2luZG93KSB7XG4gICAgbGV0IHZXaW5kb3c7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2V2luZG93ID0gd2luZG93O1xuICAgIH1cbiAgICBpZiAob3ZlcnJpZGVXaW5kb3cpIHtcbiAgICAgIHZXaW5kb3cgPSBvdmVycmlkZVdpbmRvdztcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vZGVKUyBtb2R1bGUgc3lzdGVtLCBhc3N1bWUgc2VydmVyLlxuICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzICYmIHR5cGVvZiB2V2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gRU5WSVJPTk1FTlRTLlNFUlZFUjtcbiAgICAgIH1cblxuICAgICAgLy8gTm90IGluIGFuIGlmcmFtZSwgYXNzdW1lIHNhbmRib3ggZGV2LlxuICAgICAgaWYgKCFVdGlsLmlzV2luZG93RnJhbWVkKCkpIHtcbiAgICAgICAgcmV0dXJuIEVOVklST05NRU5UUy5TQU5EQk9YX0RFVjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZGVkIGZyb20gVHdpdGNoJ3MgQ0ROLCBhc3N1bWUgcHJvZHVjdGlvbi5cbiAgICAgIGlmICh2V2luZG93LmxvY2F0aW9uLm9yaWdpbi5pbmRleE9mKCcuZXh0LXR3aXRjaC50dicpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gRU5WSVJPTk1FTlRTLlBST0RVQ1RJT047XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdCBvbiBUd2l0Y2ggYnV0IHdpdGggdGhlaXIgcmVmZXJyZXIsIGFzc3VtZSBzYW5kYm94IHR3aXRjaC5cbiAgICAgIGlmICh2V2luZG93LmRvY3VtZW50LnJlZmVycmVyICYmIHZXaW5kb3cuZG9jdW1lbnQucmVmZXJyZXIuaW5kZXhPZigndHdpdGNoLnR2JykgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBFTlZJUk9OTUVOVFMuU0FOREJPWF9UV0lUQ0g7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cGxpY2l0eSBzZXQgdGVzdGluZyB2YXJpYWJsZSwgYXNzdW1lIHRlc3RpbmcuXG4gICAgICBpZiAodldpbmRvdy50ZXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBFTlZJUk9OTUVOVFMuVEVTVElORztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIFV0aWwuY29uc29sZVByaW50KGVyci50b1N0cmluZygpLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCwgYXNzdW1lIHdlJ3JlIHJ1bm5pbmcgaW4gc2FuZGJveCBkZXYgZW52aXJvbm1lbnQuXG4gICAgcmV0dXJuIEVOVklST05NRU5UUy5TQU5EQk9YX0RFVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBjb25zb2xlUHJpbnQgcHJpbnRzIGVhY2ggbGluZSBvZiB0ZXh0IHdpdGggb3B0aW9uYWwgZ2xvYmFsIHNldHRpbmdzIGFuZCBwZXItbGluZVxuICAgKiBjb25zb2xlIGZsYWdzLlxuICAgKlxuICAgKiAqKk5PVEU6KiogVHdpdGNoJ3MgQ1NQIGVuZm9yY2VtZW50IGRpc2FsbG93cyBwcmludGluZyB0byBjb25zb2xlLiBUaGlzIGZ1bmN0aW9uXG4gICAqIHdpbGwgbm90IHByaW50IGFueXRoaW5nIHRvIHRoZSBjb25zb2xlIGlmIGl0IGlzIHJ1bm5pbmcgaW4gcHJvZHVjdGlvbiBtb2RlLlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQHB1YmxpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gbGluZXMgLSBBIHNpbmdsZSBzdHJpbmcgdG8gb3V0cHV0LCBvciBhbiBhcnJheSBvZiBsaW5lc1xuICAgKiBvZiB0ZXh0LiBJZiBsaW5lcyBpcyBhbiBhcnJheSwgZWFjaCBsaW5lIHdpbGwgYXBwZWFyIG9uIGl0cyBvd24gbGluZS4gSWYgbGluZXMgaXNcbiAgICogYSBzaW5nbGUgc3RyaW5nLCBpdCB3aWxsIGJlIHNwbGl0IG9uICdcXG4nLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdD99IG9wdGlvbnMgLSBBbiBvYmplY3QgY29udGFpbmluZyBnbG9iYWwgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmJveGVkIC0gSWYgdHJ1ZSwgc3Vycm91bmRzIHRoZSBvdXRwdXQgaW4gYW4gQVNDSUkgYXJ0IGJveC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc3R5bGUgLSBBIENTUyBzdHlsZSBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBjb25zb2xlIGNhbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgLSBUaGUgdHlwZSBvZiBwcmludCBjb21tYW5kLiBNYXkgYmUgb25lIG9mOlxuICAgKiBbJ2xvZycsICdlcnJvcicsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nXSwgYWx0aG91Z2ggYnJvd3NlciBzdXBwb3J0IG1heSBub3QgYmVcbiAgICogYXZhaWxhYmxlIGZvciBhbGwuIERlZmF1bHRzIHRvICdsb2cnLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zb2xlUHJpbnQoJ0hlbGxvIFdvcmxkJyk7XG4gICAqICBIZWxsbyBXb3JsZFxuICAgKlxuICAgKiBjb25zb2xlUHJpbnQoJ1RoaXMgaXMgYSBib3gnLCB7IGJveGVkOiB0cnVlIH0pO1xuICAgKiAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqICB8IFRoaXMgaXMgYSBib3ggfFxuICAgKiAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqL1xuICBzdGF0aWMgY29uc29sZVByaW50KGxpbmVzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWxpbmVzIHx8IFV0aWwuY3VycmVudEVudmlyb25tZW50KCkgPT09IFV0aWwuRW52aXJvbm1lbnRzLlByb2R1Y3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc3R5bGUgPSAnZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsnO1xuICAgIGxldCBsaW5lQXJyID0gQXJyYXkuaXNBcnJheShsaW5lcykgPyBsaW5lcyA6IGxpbmVzLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlIHx8ICdsb2cnO1xuXG4gICAgaWYgKG9wdGlvbnMuYm94ZWQpIHtcbiAgICAgIGxpbmVBcnIgPSBVdGlsLmFzY2lpQm94KGxpbmVBcnIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgICBzdHlsZSArPSBvcHRpb25zLnN0eWxlO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmN1cnJlbnRFbnZpcm9ubWVudCgpID09PSBVdGlsLkVudmlyb25tZW50cy5TZXJ2ZXIpIHtcbiAgICAgIGNvbnNvbGVbdHlwZV0uY2FsbCh0aGlzLCBsaW5lQXJyLmpvaW4oJ1xcbicpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGVbdHlwZV0uY2FsbCh0aGlzLCBgJWMke2xpbmVBcnIuam9pbignXFxuJyl9YCwgc3R5bGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWF0Y2hlcyBhbiBpbnB1dCBldmVudCBuYW1lIHdpdGggYSBwYXR0ZXJuLiBBbiBldmVudCBuYW1lIGlzIGEgOiBkZWxpbWl0ZWRcbiAgICogbGlzdCBvZiB0ZXJtcywgd2hpbGUgYSBwYXR0ZXJuIGlzIGEgOiBkZWxpbWl0ZWQgbGlzdCBvZiB0ZXJtcywgd2l0aCBhblxuICAgKiBvcHRpb25hbCAqIGluc3RlYWQgb2YgYSB0ZXJtLiAnKicgd2lsbCBtYXRjaCBhbnkgdGVybS5cbiAgICpcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqIEBwcml2YXRlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIEFuIGlucHV0IGV2ZW50IG5hbWUsIDogZGVsaW1pdGVkLlxuICAgKiBBbGxvd2VkIGNoYXJhY3RlcnMgYXJlIGFscGhhLW51bWVyaWMgYW5kIF9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gLSBBIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdCwgOiBkZWxpbWl0ZWQuXG4gICAqIEFsbG93ZWQgY2hhcmFjdGVycyBhcmUgYWxwaGEtbnVtZXJpYyBhbmQgXyBhbmQgKlxuICAgKlxuICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBpbnB1dCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RhdGljIGV2ZW50UGF0dGVybk1hdGNoKGlucHV0LCBwYXR0ZXJuKSB7XG4gICAgY29uc3QgaW5wdXRQYXJ0cyA9IGlucHV0LnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdCgnOicpO1xuXG4gICAgaWYgKGlucHV0UGFydHMubGVuZ3RoICE9PSBwYXR0ZXJuUGFydHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoaW5wdXRQYXJ0c1tpXSAhPT0gcGF0dGVyblBhcnRzW2ldICYmIHBhdHRlcm5QYXJ0c1tpXSAhPT0gJyonKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHZhcmlhYmxlIGFuZCBhIEphdmFzY3JpcHQgVHlwZSBpZGVudGlmaWVyIGFuZCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAgICogaWYgdGhlIHZhcmlhYmxlJ3MgdHlwZSBpcyBub3QgaW4gdGhlIHByb3ZpZGVkIHR5cGUgbGlzdC4gSWYgdGhlIHR5cGUgY2hlY2tcbiAgICogcGFzc2VzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB3aXRob3V0IGVycm9yLiBBcyBhIGNvbnZlbmllbmNlLCB0aGUgdHlwZSBtYXlcbiAgICogYWxzbyBiZSBhbiBhcnJheSBvZiB0eXBlcy5cbiAgICpcbiAgICogQWNjZXB0YWJsZSB0eXBlczpcbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3R5cGVvZlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQHB1YmxpY1xuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBBbnkgSmF2YVNjcmlwdCB2YXJpYWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBIHNpbmdsZSB0eXBlIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgbXVsdGlwbGUgdHlwZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gVGhyb3dzIGlmIHR5cGVvZiB2YWx1ZSBpcyBub3QgaW4gdGhlIHR5cGUgbGlzdC5cbiAgICovXG4gIHN0YXRpYyBmb3JjZVR5cGUodmFsdWUsIHR5cGUpIHtcbiAgICBjb25zdCB0eXBlcyA9IFtdLmNvbmNhdCh0eXBlKTtcbiAgICBjb25zdCB0eXBlU3RyaW5nID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgaWYgKHR5cGVzLmluZGV4T2YodHlwZVN0cmluZykgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBleHBlY3RlZCAnJHt0eXBlU3RyaW5nfScgdG8gYmUgb25lIG9mIFske3R5cGVzfV1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IGNvbnNvbGVQcmludCA9IFV0aWwuY29uc29sZVByaW50O1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IGZvcmNlVHlwZSA9IFV0aWwuZm9yY2VUeXBlO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IGV2ZW50UGF0dGVybk1hdGNoID0gVXRpbC5ldmVudFBhdHRlcm5NYXRjaDtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCBDdXJyZW50RW52aXJvbm1lbnQgPSBVdGlsLmN1cnJlbnRFbnZpcm9ubWVudDtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCBlcnJvclByb21pc2UgPSBVdGlsLmVycm9yUHJvbWlzZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlsLmpzIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19saWJyYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VpZC5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzXG4vLyBtb2R1bGUgaWQgPSAyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RlZmluZWQuanNcbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qc1xuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1xuLy8gbW9kdWxlIGlkID0gMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanNcbi8vIG1vZHVsZSBpZCA9IDM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWV4dC5qc1xuLy8gbW9kdWxlIGlkID0gMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKSBkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7IHZhbHVlOiB3a3NFeHQuZihuYW1lKSB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzXG4vLyBtb2R1bGUgaWQgPSAzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5c1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3Qva2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1xuLy8gbW9kdWxlIGlkID0gNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lvYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzXG4vLyBtb2R1bGUgaWQgPSA0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19odG1sLmpzXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190YXNrLmpzXG4vLyBtb2R1bGUgaWQgPSA1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcGVyZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cbnZhciBfc3ltYm9sID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9pdGVyYXRvcjIuZGVmYXVsdCA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiaW1wb3J0IGJhc2U2NCBmcm9tICdiYXNlLTY0JztcbmltcG9ydCBYTUxIdHRwUmVxdWVzdFByb21pc2UgZnJvbSAnLi4vbGlicy94aHItcHJvbWlzZSc7XG5cbmltcG9ydCB7IEVOVklST05NRU5UUywgZXJyb3JQcm9taXNlIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBNdXh5IHByb2R1Y3Rpb24gQVBJIFVSTC5cbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgQVBJX1VSTCA9ICdodHRwczovL2FwaS5tdXh5LmlvJztcblxuLyoqXG4gKiBNdXh5IHNhbmRib3ggQVBJIFVSTC5cbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgU0FOREJPWF9VUkwgPSAnaHR0cHM6Ly9zYW5kYm94LmFwaS5tdXh5LmlvJztcblxuLyoqXG4gKiBBUEkgVVJMIHRvIHVzZSBmb3IgYmFja2VuZCByZXF1ZXN0cy4gVXNlcyBwcm9kdWN0aW9uIEFQSSBiZSBkZWZhdWx0LCBidXRcbiAqIGNhbiBiZSB1cGRhdGVkIHVzaW5nIHtAbGluayBzZXRFbnZpcm9ubWVudH0uXG4gKiBAaWdub3JlXG4gKi9cbmxldCBTRVJWRVJfVVJMID0gQVBJX1VSTDtcblxuLyoqXG4gKiBTZXJ2ZXJTdGF0ZSBlbnVtIG1hcHMgdGhlIHN1YnNldHMgb2Ygc3RhdGUgcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIgdG9cbiAqIHRoZWlyIHJlc3BlY3RpdmUgZW5kcG9pbnRzLlxuICogQGlnbm9yZVxuICovXG5jb25zdCBTZXJ2ZXJTdGF0ZSA9IHtcbiAgQVVUSEVOVElDQVRJT046ICdhdXRoZW50aWNhdGlvbicsXG4gIFVTRVI6ICd1c2VyX2luZm8nLFxuICBWSUVXRVI6ICd2aWV3ZXJfc3RhdGUnLFxuICBFWFRFTlNJT05fVklFV0VSOiAnZXh0ZW5zaW9uX3ZpZXdlcl9zdGF0ZScsXG4gIENIQU5ORUw6ICdjaGFubmVsX3N0YXRlJyxcbiAgRVhURU5TSU9OOiAnZXh0ZW5zaW9uX3N0YXRlJyxcbiAgQUxMOiAnYWxsX3N0YXRlJ1xufTtcblxuLyoqXG4gKiBXcmFwcyBhbGwgZXh0ZW5zaW9uIGJhY2tlbmQgYWNjZXNzb3IgYW5kIG11dGF0b3IgZW5kcG9pbnRzIGluIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy5cbiAqXG4gKiBTaG91bGQgbm90IG5vcm1hbGx5IGJlIGNyZWF0ZWQgZGlyZWN0bHksIGluc3RlYWQgYW4gaW5zdGFuY2UgaXMgbWFkZSBhdmFpbGFibGVcbiAqIGFuZCBuYW1lc3BhY2VkIGFwcHJvcHJpYXRlbHkgd2hlbiB1c2luZyB7QGxpbmsgTXV4eS5TREt9LlxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNkayA9IG5ldyBNdXh5LlNESygpO1xuICogc2RrLmdldEFsbFN0YXRlKCkudGhlbigoc3RhdGUpID0+IHtcbiAqICAgY29uc29sZS5sb2coc3RhdGUpO1xuICogfSk7XG4gKi9cbmNsYXNzIFN0YXRlQ2xpZW50IHtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHN0YXRpYyBmZXRjaFRlc3RBdXRoKHRlc3RFeHRlbnNpb25JRCwgY2hhbm5lbElELCByb2xlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHhoclByb21pc2UgPSBuZXcgWE1MSHR0cFJlcXVlc3RQcm9taXNlKCk7XG4gICAgICB4aHJQcm9taXNlXG4gICAgICAgIC5zZW5kKHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICB1cmw6IGAke1NBTkRCT1hfVVJMfS92MS9lL2F1dGh0b2tlbmAsXG4gICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgYXBwX2lkOiB0ZXN0RXh0ZW5zaW9uSUQsXG4gICAgICAgICAgICBjaGFubmVsX2lkOiBjaGFubmVsSUQsXG4gICAgICAgICAgICByb2xlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdClcbiAgICAgICAgLnRoZW4ocmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AgJiYgcmVzcC5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgQVBJIFNlcnZlciB2YXJpYWJsZSB0byBwb2ludCB0byB0ZXN0XG4gICAgICAgICAgICBTRVJWRVJfVVJMID0gU0FOREJPWF9VUkw7XG5cbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSByZXNwLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIC8vIHR3aXRjaCB1c2VzIGxvd2VyY2FzZSBkXG4gICAgICAgICAgICBhdXRoLmNsaWVudElkID0gdGVzdEV4dGVuc2lvbklEO1xuICAgICAgICAgICAgYXV0aC5jaGFubmVsSWQgPSBjaGFubmVsSUQ7XG4gICAgICAgICAgICBhdXRoLnVzZXJJZCA9ICdUMTIzNDU2NzgnO1xuICAgICAgICAgICAgcmVzb2x2ZShhdXRoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHN0YXRpYyBzZXRFbnZpcm9ubWVudChlbnYpIHtcbiAgICBpZiAoZW52ID09PSBFTlZJUk9OTUVOVFMuU0FOREJPWF9ERVYgfHwgZW52ID09PSBFTlZJUk9OTUVOVFMuU0FOREJPWF9UV0lUQ0gpIHtcbiAgICAgIFNFUlZFUl9VUkwgPSBTQU5EQk9YX1VSTDtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICB1cGRhdGVBdXRoKHRva2VuKSB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIHNpZ25lZFJlcXVlc3QgY2hlY2tzIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEpXVCBhbmQgd3JhcHMgYSBzdGFuZGFyZCBBSkFYXG4gICAqIHJlcXVlc3QgdG8gdGhlIEVCUyB3aXRoIHZhbGlkIGF1dGggY3JlZGVudGlhbHMuc1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBzaWduZWRSZXF1ZXN0KGV4dGVuc2lvbklELCBtZXRob2QsIGVuZHBvaW50LCBkYXRhKSB7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlSldUKCkpIHtcbiAgICAgIHJldHVybiBlcnJvclByb21pc2UoJ1lvdXIgYXV0aGVudGljYXRpb24gdG9rZW4gaGFzIGV4cGlyZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHhoclByb21pc2UgPSBuZXcgWE1MSHR0cFJlcXVlc3RQcm9taXNlKCk7XG4gICAgICB4aHJQcm9taXNlXG4gICAgICAgIC5zZW5kKHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgdXJsOiBgJHtTRVJWRVJfVVJMfS92MS9lLyR7ZW5kcG9pbnR9YCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgJHtleHRlbnNpb25JRH0gJHt0aGlzLnRva2VufWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdClcbiAgICAgICAgLnRoZW4ocmVzcCA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyZXNwLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHJlc3AucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcC5yZXNwb25zZVRleHQpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KHJlc3AucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChgU2VydmVyIHJldHVybmVkIHN0YXR1cyAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZUpXVCBlbnN1cmVzIHRoYXQgdGhlIGN1cnJlbnQgSldUIGlzIHZhbGlkIGFuZCBub3QgZXhwaXJlZC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgdmFsaWRhdGVKV1QoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwbGl0VG9rZW4gPSB0aGlzLnRva2VuLnNwbGl0KCcuJyk7XG4gICAgICBpZiAoc3BsaXRUb2tlbi5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ayA9IEpTT04ucGFyc2UoYmFzZTY0LmRlY29kZShzcGxpdFRva2VuWzFdKSk7XG4gICAgICBpZiAoIXRrLmV4cCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xuICAgICAgaWYgKHRrLmV4cCA8IG5vdyAvIDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0U3RhdGUgcmVxdWVzdHMgYSBzdWJzZXQgb2Ygc3RhdGUgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIgYW5kIHNldHMgdGhlXG4gICAqIGxvY2FsIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBzdGF0ZSB0byB0aGUgcmVzcG9uc2UuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldFN0YXRlID0gKGlkZW50aWZpZXIsIHN1YnN0YXRlKSA9PlxuICAgIHRoaXMuc2lnbmVkUmVxdWVzdChpZGVudGlmaWVyLCAnR0VUJywgc3Vic3RhdGUgfHwgU2VydmVyU3RhdGUuQUxMKTtcblxuICAvKipcbiAgICogcG9zdFN0YXRlIHNlbmRzIGRhdGEgdG8gdGhlIGNvcnJlbnQgRUJTIHN1YnN0YXRlIGVuZHBvaW50IGZvciBwZXJzaXN0ZW5jZS5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcG9zdFN0YXRlID0gKGlkZW50aWZpZXIsIHN1YnN0YXRlLCBkYXRhKSA9PlxuICAgIHRoaXMuc2lnbmVkUmVxdWVzdChpZGVudGlmaWVyLCAnUE9TVCcsIHN1YnN0YXRlIHx8IFNlcnZlclN0YXRlLkFMTCwgZGF0YSk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZ2V0VXNlckluZm8gPSBpZGVudGlmaWVyID0+IHRoaXMuZ2V0U3RhdGUoaWRlbnRpZmllciwgU2VydmVyU3RhdGUuVVNFUik7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZ2V0Vmlld2VyU3RhdGUgPSBpZGVudGlmaWVyID0+IHRoaXMuZ2V0U3RhdGUoaWRlbnRpZmllciwgU2VydmVyU3RhdGUuVklFV0VSKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBnZXRFeHRlbnNpb25WaWV3ZXJTdGF0ZSA9IGlkZW50aWZpZXIgPT4gdGhpcy5nZXRTdGF0ZShpZGVudGlmaWVyLCBTZXJ2ZXJTdGF0ZS5FWFRFTlNJT05fVklFV0VSKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBnZXRDaGFubmVsU3RhdGUgPSBpZGVudGlmaWVyID0+IHRoaXMuZ2V0U3RhdGUoaWRlbnRpZmllciwgU2VydmVyU3RhdGUuQ0hBTk5FTCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZ2V0RXh0ZW5zaW9uU3RhdGUgPSBpZGVudGlmaWVyID0+IHRoaXMuZ2V0U3RhdGUoaWRlbnRpZmllciwgU2VydmVyU3RhdGUuRVhURU5TSU9OKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBzZXRWaWV3ZXJTdGF0ZSA9IChpZGVudGlmaWVyLCBzdGF0ZSkgPT5cbiAgICB0aGlzLnBvc3RTdGF0ZShpZGVudGlmaWVyLCBTZXJ2ZXJTdGF0ZS5WSUVXRVIsIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgc2V0RXh0ZW5zaW9uVmlld2VyU3RhdGUgPSAoaWRlbnRpZmllciwgc3RhdGUpID0+XG4gICAgdGhpcy5wb3N0U3RhdGUoaWRlbnRpZmllciwgU2VydmVyU3RhdGUuRVhURU5TSU9OX1ZJRVdFUiwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBzZXRDaGFubmVsU3RhdGUgPSAoaWRlbnRpZmllciwgc3RhdGUpID0+XG4gICAgdGhpcy5wb3N0U3RhdGUoaWRlbnRpZmllciwgU2VydmVyU3RhdGUuQ0hBTk5FTCwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBnZXRBY2N1bXVsYXRpb24gPSAoaWRlbnRpZmllciwgaWQsIHN0YXJ0KSA9PlxuICAgIHRoaXMuc2lnbmVkUmVxdWVzdChpZGVudGlmaWVyLCAnR0VUJywgYGFjY3VtdWxhdGU/aWQ9JHtpZCB8fCAnZGVmYXVsdCd9JnN0YXJ0PSR7c3RhcnR9YCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgYWNjdW11bGF0ZSA9IChpZGVudGlmaWVyLCBpZCwgZGF0YSkgPT5cbiAgICB0aGlzLnNpZ25lZFJlcXVlc3QoXG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgJ1BPU1QnLFxuICAgICAgYGFjY3VtdWxhdGU/aWQ9JHtpZCB8fCAnZGVmYXVsdCd9YCxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICB2b3RlID0gKGlkZW50aWZpZXIsIGlkLCBkYXRhKSA9PlxuICAgIHRoaXMuc2lnbmVkUmVxdWVzdChpZGVudGlmaWVyLCAnUE9TVCcsIGB2b3RlP2lkPSR7aWQgfHwgJ2RlZmF1bHQnfWAsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBnZXRWb3RlcyA9IChpZGVudGlmaWVyLCBpZCkgPT5cbiAgICB0aGlzLnNpZ25lZFJlcXVlc3QoaWRlbnRpZmllciwgJ0dFVCcsIGB2b3RlP2lkPSR7aWQgfHwgJ2RlZmF1bHQnfWApO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHJhbmsgPSAoaWRlbnRpZmllciwgaWQsIGRhdGEpID0+XG4gICAgdGhpcy5zaWduZWRSZXF1ZXN0KGlkZW50aWZpZXIsICdQT1NUJywgYHJhbms/aWQ9JHtpZCB8fCAnZGVmYXVsdCd9YCwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIGdldFJhbmsgPSAoaWRlbnRpZmllciwgaWQpID0+XG4gICAgdGhpcy5zaWduZWRSZXF1ZXN0KGlkZW50aWZpZXIsICdHRVQnLCBgcmFuaz9pZD0ke2lkIHx8ICdkZWZhdWx0J31gKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBkZWxldGVSYW5rID0gaWRlbnRpZmllciA9PiB0aGlzLnNpZ25lZFJlcXVlc3QoaWRlbnRpZmllciwgJ0RFTEVURScsICdyYW5rJyk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgZ2V0SlNPTlN0b3JlID0gKGlkZW50aWZpZXIsIGlkKSA9PlxuICAgIHRoaXMuc2lnbmVkUmVxdWVzdChpZGVudGlmaWVyLCAnR0VUJywgYGpzb25fc3RvcmU/aWQ9JHtpZCB8fCAnZGVmYXVsdCd9YCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgdmFsaWRhdGVDb2RlID0gKGlkZW50aWZpZXIsIGNvZGUpID0+XG4gICAgdGhpcy5zaWduZWRSZXF1ZXN0KGlkZW50aWZpZXIsICdQT1NUJywgJ3ZhbGlkYXRlX3BpbicsIEpTT04uc3RyaW5naWZ5KHsgcGluOiBjb2RlIH0pKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwaW5Ub2tlbkV4aXN0cyA9IGlkZW50aWZpZXIgPT4gdGhpcy5zaWduZWRSZXF1ZXN0KGlkZW50aWZpZXIsICdHRVQnLCAncGluX3Rva2VuX2V4aXN0cycpO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHJldm9rZUFsbFBJTkNvZGVzID0gaWRlbnRpZmllciA9PiB0aGlzLnNpZ25lZFJlcXVlc3QoaWRlbnRpZmllciwgJ0RFTEVURScsICdwaW4nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGVDbGllbnQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3RhdGUtY2xpZW50LmpzIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLypcbiAqIENvcHlyaWdodCAyMDE1IFNjb3R0IEJyYWR5XG4gKiBNSVQgTGljZW5zZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0YnJhZHkveGhyLXByb21pc2UvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG52YXIgUGFyc2VIZWFkZXJzLCBYTUxIdHRwUmVxdWVzdFByb21pc2U7XG5cblBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJ3BhcnNlLWhlYWRlcnMnKTtcblxuLypcbiAqIE1vZHVsZSB0byB3cmFwIGFuIFhNTEh0dHBSZXF1ZXN0IGluIGEgcHJvbWlzZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFhNTEh0dHBSZXF1ZXN0UHJvbWlzZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWE1MSHR0cFJlcXVlc3RQcm9taXNlKCkge31cblxuICBYTUxIdHRwUmVxdWVzdFByb21pc2UuREVGQVVMVF9DT05URU5UX1RZUEUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JztcblxuICAvKlxuICAgKiBYTUxIdHRwUmVxdWVzdFByb21pc2Uuc2VuZChvcHRpb25zKSAtPiBQcm9taXNlXG4gICAqIC0gb3B0aW9ucyAoT2JqZWN0KTogVVJMLCBtZXRob2QsIGRhdGEsIGV0Yy5cbiAgICpcbiAgICogQ3JlYXRlIHRoZSBYSFIgb2JqZWN0IGFuZCB3aXJlIHVwIGV2ZW50IGhhbmRsZXJzIHRvIHVzZSBhIHByb21pc2UuXG4gICAqL1xuXG4gIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgZGVmYXVsdHM7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBkZWZhdWx0cyA9IHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICBhc3luYzogdHJ1ZSxcbiAgICAgIHVzZXJuYW1lOiBudWxsLFxuICAgICAgcGFzc3dvcmQ6IG51bGwsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlXG4gICAgfTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShcbiAgICAgIChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgdmFyIGUsIGhlYWRlciwgcmVmLCB2YWx1ZSwgeGhyO1xuICAgICAgICAgIGlmICghWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAgICAgICAgIF90aGlzLl9oYW5kbGVFcnJvcignYnJvd3NlcicsIHJlamVjdCwgbnVsbCwgXCJicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnVybCAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy51cmwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBfdGhpcy5faGFuZGxlRXJyb3IoJ3VybCcsIHJlamVjdCwgbnVsbCwgJ1VSTCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlcicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfdGhpcy5feGhyID0geGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIF90aGlzLl9kZXRhY2hXaW5kb3dVbmxvYWQoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IF90aGlzLl9nZXRSZXNwb25zZVRleHQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgICAgICBfdGhpcy5faGFuZGxlRXJyb3IoJ3BhcnNlJywgcmVqZWN0LCBudWxsLCAnaW52YWxpZCBKU09OIHJlc3BvbnNlJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdXJsOiBfdGhpcy5fZ2V0UmVzcG9uc2VVcmwoKSxcbiAgICAgICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0OiByZXNwb25zZVRleHQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IF90aGlzLl9nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICAgIHhocjogeGhyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2hhbmRsZUVycm9yKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2hhbmRsZUVycm9yKCd0aW1lb3V0JywgcmVqZWN0KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2hhbmRsZUVycm9yKCdhYm9ydCcsIHJlamVjdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfdGhpcy5fYXR0YWNoV2luZG93VW5sb2FkKCk7XG4gICAgICAgICAgeGhyLm9wZW4ob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0aW9ucy5kYXRhICE9IG51bGwgJiYgIW9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10pIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBfdGhpcy5jb25zdHJ1Y3Rvci5ERUZBVUxUX0NPTlRFTlRfVFlQRTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVmID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgICAgICAgIGZvciAoaGVhZGVyIGluIHJlZikge1xuICAgICAgICAgICAgdmFsdWUgPSByZWZbaGVhZGVyXTtcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHhoci5zZW5kKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgICBlID0gX2Vycm9yO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9oYW5kbGVFcnJvcignc2VuZCcsIHJlamVjdCwgbnVsbCwgZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKVxuICAgICk7XG4gIH07XG5cbiAgLypcbiAgICogWE1MSHR0cFJlcXVlc3RQcm9taXNlLmdldFhIUigpIC0+IFhNTEh0dHBSZXF1ZXN0XG4gICAqL1xuXG4gIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5wcm90b3R5cGUuZ2V0WEhSID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3hocjtcbiAgfTtcblxuICAvKlxuICAgKiBYTUxIdHRwUmVxdWVzdFByb21pc2UuX2F0dGFjaFdpbmRvd1VubG9hZCgpXG4gICAqXG4gICAqIEZpeCBmb3IgSUUgOSBhbmQgSUUgMTBcbiAgICogSW50ZXJuZXQgRXhwbG9yZXIgZnJlZXplcyB3aGVuIHlvdSBjbG9zZSBhIHdlYnBhZ2UgZHVyaW5nIGFuIFhIUiByZXF1ZXN0XG4gICAqIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzI4NTY3NDZcbiAgICpcbiAgICovXG5cbiAgWE1MSHR0cFJlcXVlc3RQcm9taXNlLnByb3RvdHlwZS5fYXR0YWNoV2luZG93VW5sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdW5sb2FkSGFuZGxlciA9IHRoaXMuX2hhbmRsZVdpbmRvd1VubG9hZC5iaW5kKHRoaXMpO1xuICAgIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpIHtcbiAgICAgIHJldHVybiB3aW5kb3cuYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgdGhpcy5fdW5sb2FkSGFuZGxlcik7XG4gICAgfVxuICB9O1xuXG4gIC8qXG4gICAqIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5fZGV0YWNoV2luZG93VW5sb2FkKClcbiAgICovXG5cbiAgWE1MSHR0cFJlcXVlc3RQcm9taXNlLnByb3RvdHlwZS5fZGV0YWNoV2luZG93VW5sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHdpbmRvdy5kZXRhY2hFdmVudCkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5kZXRhY2hFdmVudCgnb251bmxvYWQnLCB0aGlzLl91bmxvYWRIYW5kbGVyKTtcbiAgICB9XG4gIH07XG5cbiAgLypcbiAgICogWE1MSHR0cFJlcXVlc3RQcm9taXNlLl9nZXRIZWFkZXJzKCkgLT4gT2JqZWN0XG4gICAqL1xuXG4gIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5wcm90b3R5cGUuX2dldEhlYWRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gUGFyc2VIZWFkZXJzKHRoaXMuX3hoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIH07XG5cbiAgLypcbiAgICogWE1MSHR0cFJlcXVlc3RQcm9taXNlLl9nZXRSZXNwb25zZVRleHQoKSAtPiBNaXhlZFxuICAgKlxuICAgKiBQYXJzZXMgcmVzcG9uc2UgdGV4dCBKU09OIGlmIHByZXNlbnQuXG4gICAqL1xuXG4gIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5wcm90b3R5cGUuX2dldFJlc3BvbnNlVGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXNwb25zZVRleHQ7XG4gICAgcmVzcG9uc2VUZXh0ID0gdHlwZW9mIHRoaXMuX3hoci5yZXNwb25zZVRleHQgPT09ICdzdHJpbmcnID8gdGhpcy5feGhyLnJlc3BvbnNlVGV4dCA6ICcnO1xuICAgIHN3aXRjaCAoKHRoaXMuX3hoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1UeXBlJykgfHwgJycpLnNwbGl0KCc7JylbMF0pIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgY2FzZSAndGV4dC9qYXZhc2NyaXB0JzpcbiAgICAgICAgcmVzcG9uc2VUZXh0ID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQgKyAnJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZVRleHQ7XG4gIH07XG5cbiAgLypcbiAgICogWE1MSHR0cFJlcXVlc3RQcm9taXNlLl9nZXRSZXNwb25zZVVybCgpIC0+IFN0cmluZ1xuICAgKlxuICAgKiBBY3R1YWwgcmVzcG9uc2UgVVJMIGFmdGVyIGZvbGxvd2luZyByZWRpcmVjdHMuXG4gICAqL1xuXG4gIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5wcm90b3R5cGUuX2dldFJlc3BvbnNlVXJsID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3hoci5yZXNwb25zZVVSTCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5feGhyLnJlc3BvbnNlVVJMO1xuICAgIH1cbiAgICBpZiAoL15YLVJlcXVlc3QtVVJMOi9tLnRlc3QodGhpcy5feGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3hoci5nZXRSZXNwb25zZUhlYWRlcignWC1SZXF1ZXN0LVVSTCcpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLypcbiAgICogWE1MSHR0cFJlcXVlc3RQcm9taXNlLl9oYW5kbGVFcnJvcihyZWFzb24sIHJlamVjdCwgc3RhdHVzLCBzdGF0dXNUZXh0KVxuICAgKiAtIHJlYXNvbiAoU3RyaW5nKVxuICAgKiAtIHJlamVjdCAoRnVuY3Rpb24pXG4gICAqIC0gc3RhdHVzIChTdHJpbmcpXG4gICAqIC0gc3RhdHVzVGV4dCAoU3RyaW5nKVxuICAgKi9cblxuICBYTUxIdHRwUmVxdWVzdFByb21pc2UucHJvdG90eXBlLl9oYW5kbGVFcnJvciA9IGZ1bmN0aW9uKHJlYXNvbiwgcmVqZWN0LCBzdGF0dXMsIHN0YXR1c1RleHQpIHtcbiAgICB0aGlzLl9kZXRhY2hXaW5kb3dVbmxvYWQoKTtcbiAgICByZXR1cm4gcmVqZWN0KHtcbiAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgc3RhdHVzOiBzdGF0dXMgfHwgdGhpcy5feGhyLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHQgfHwgdGhpcy5feGhyLnN0YXR1c1RleHQsXG4gICAgICB4aHI6IHRoaXMuX3hoclxuICAgIH0pO1xuICB9O1xuXG4gIC8qXG4gICAqIFhNTEh0dHBSZXF1ZXN0UHJvbWlzZS5faGFuZGxlV2luZG93VW5sb2FkKClcbiAgICovXG5cbiAgWE1MSHR0cFJlcXVlc3RQcm9taXNlLnByb3RvdHlwZS5faGFuZGxlV2luZG93VW5sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3hoci5hYm9ydCgpO1xuICB9O1xuXG4gIHJldHVybiBYTUxIdHRwUmVxdWVzdFByb21pc2U7XG59KSgpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbGlicy94aHItcHJvbWlzZS5qcyIsImltcG9ydCB7IEVOVklST05NRU5UUywgQ3VycmVudEVudmlyb25tZW50LCBjb25zb2xlUHJpbnQgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IENsaWVudCBmcm9tICcuL3N0YXRlLWNsaWVudCc7XG5cbi8vIDI1IG1pbnV0ZXMgYmV0d2VlbiB1cGRhdGVzIG9mIHRoZSB0ZXN0aW5nIGF1dGggdG9rZW4uXG5jb25zdCBURVNUX0FVVEhfVElNRU9VVF9NUyA9IDI1ICogNjAgKiAxMDAwO1xuXG4vLyBPbmx5IHByb2Nlc3MgY29udGV4dCBjYWxsYmFja3Mgb25jZSBldmVyeSAzMCBzZWNvbmRzLlxuY29uc3QgQ09OVEVYVF9DQUxMQkFDS19USU1FT1VUID0gMzAgKiAxMDAwO1xuXG4vLyBXcmFwcGVyIGFyb3VuZCBnbG9iYWwgVHdpdGNoIGV4dGVuc2lvbiBvYmplY3QuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHQge1xuICBzdGF0aWMgZmV0Y2hUZXN0QXV0aChjYikge1xuICAgIENsaWVudC5mZXRjaFRlc3RBdXRoKEV4dC5leHRlbnNpb25JRCwgRXh0LnRlc3RDaGFubmVsSUQsIEV4dC50ZXN0SldUUm9sZSlcbiAgICAgIC50aGVuKGF1dGggPT4ge1xuICAgICAgICBjYihhdXRoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goY2IpO1xuICB9XG5cbiAgc3RhdGljIG9uQXV0aG9yaXplZChjYikge1xuICAgIHN3aXRjaCAoQ3VycmVudEVudmlyb25tZW50KCkpIHtcbiAgICAgIGNhc2UgRU5WSVJPTk1FTlRTLlNBTkRCT1hfREVWOlxuICAgICAgICBFeHQuZmV0Y2hUZXN0QXV0aChjYik7XG4gICAgICAgIHNldEludGVydmFsKEV4dC5mZXRjaFRlc3RBdXRoLCBURVNUX0FVVEhfVElNRU9VVF9NUywgY2IpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFTlZJUk9OTUVOVFMuU0FOREJPWF9UV0lUQ0g6XG4gICAgICBjYXNlIEVOVklST05NRU5UUy5QUk9EVUNUSU9OOiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChjYiwgMTAwMCAqIDE1KTtcbiAgICAgICAgd2luZG93LlR3aXRjaC5leHQub25BdXRob3JpemVkKGF1dGggPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgY2IoYXV0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlUHJpbnQoYE5vIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgZm9yICR7Q3VycmVudEVudmlyb25tZW50KCl9YCwge1xuICAgICAgICAgIHR5cGU6ICdlcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG9uQ29udGV4dChjYikge1xuICAgIHN3aXRjaCAoQ3VycmVudEVudmlyb25tZW50KCkpIHtcbiAgICAgIGNhc2UgRU5WSVJPTk1FTlRTLlNBTkRCT1hfVFdJVENIOlxuICAgICAgY2FzZSBFTlZJUk9OTUVOVFMuUFJPRFVDVElPTjpcbiAgICAgICAgKGZ1bmN0aW9uIHNldHVwT25Db250ZXh0Q2FsbGJhY2soKSB7XG4gICAgICAgICAgLy8gVHdpdGNoIGN1cnJlbnRseSAoMjAxNy0wOC0yNSkgaGFzIGFuIGlzc3VlIHdoZXJlIGNlcnRhaW4gYnJvd3NlciBtaXMtY29uZmlndXJhdGlvbnNcbiAgICAgICAgICAvLyAobGlrZSBoYXZpbmcgaW5jb3JyZWN0IHN5c3RlbSB0aW1lL3RpbWV6b25lIHNldHRpbmdzKSB3aWxsIGNhdXNlIHRoZSBvbkNvbnRleHQgY2FsbGJhY2tcbiAgICAgICAgICAvLyBmdW5jdGlvbiB0byBmaXJlIHJlcGVhdGVkbHkgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gVG8gZGVhbCB3aXRoIHRoaXMgaXNzdWUsIHdlXG4gICAgICAgICAgLy8gdGhyb3R0bGUgdGhlIG9uQ29udGV4dCBjYWxsYmFja3MuXG4gICAgICAgICAgbGV0IGxhc3RDb250ZXh0Q2FsbCA9IDA7XG5cbiAgICAgICAgICB3aW5kb3cuVHdpdGNoLmV4dC5vbkNvbnRleHQoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayB0aGUgbGFzdCB0aW1lIHRoZSBhdXRoIGNhbGxiYWNrIHdhcyBjYWxsZWQgYW5kIHJlc3RyaWN0LlxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbGFzdENvbnRleHRDYWxsO1xuICAgICAgICAgICAgaWYgKGRpZmYgPCBDT05URVhUX0NBTExCQUNLX1RJTUVPVVQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdENvbnRleHRDYWxsID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIGNiKGNvbnRleHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYmVnaW5QdXJjaGFzZShza3UpIHtcbiAgICBzd2l0Y2ggKEN1cnJlbnRFbnZpcm9ubWVudCgpKSB7XG4gICAgICBjYXNlIEVOVklST05NRU5UUy5TQU5EQk9YX1RXSVRDSDpcbiAgICAgIGNhc2UgRU5WSVJPTk1FTlRTLlBST0RVQ1RJT046XG4gICAgICAgIHdpbmRvdy5Ud2l0Y2guZXh0LnB1cmNoYXNlcy5iZWdpblB1cmNoYXNlKHNrdSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlUHJpbnQoYGJlZ2luUHVyY2hhc2Ugbm90IHN1cHBvcnRlZCBmb3IgJHtDdXJyZW50RW52aXJvbm1lbnQoKX1gLCB7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJpY2VzKGNiKSB7XG4gICAgc3dpdGNoIChDdXJyZW50RW52aXJvbm1lbnQoKSkge1xuICAgICAgY2FzZSBFTlZJUk9OTUVOVFMuU0FOREJPWF9UV0lUQ0g6XG4gICAgICBjYXNlIEVOVklST05NRU5UUy5QUk9EVUNUSU9OOlxuICAgICAgICB3aW5kb3cuVHdpdGNoLmV4dC5wdXJjaGFzZXMuZ2V0UHJpY2VzKClcbiAgICAgICAgICAudGhlbihwcmljZXMgPT4ge1xuICAgICAgICAgICAgY2IocHJpY2VzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChjYik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlUHJpbnQoYGdldFByaWNlcyBub3Qgc3VwcG9ydGVkIGZvciAke0N1cnJlbnRFbnZpcm9ubWVudCgpfWAsIHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvblJlbG9hZEVudGl0bGVtZW50cyhjYikge1xuICAgIHN3aXRjaCAoQ3VycmVudEVudmlyb25tZW50KCkpIHtcbiAgICAgIGNhc2UgRU5WSVJPTk1FTlRTLlNBTkRCT1hfVFdJVENIOlxuICAgICAgY2FzZSBFTlZJUk9OTUVOVFMuUFJPRFVDVElPTjpcbiAgICAgICAgd2luZG93LlR3aXRjaC5leHQucHVyY2hhc2VzLm9uUmVsb2FkRW50aXRsZW1lbnRzKGNiKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGVQcmludChgb25SZWxvYWRFbnRpdGxlbWVudHMgbm90IHN1cHBvcnRlZCBmb3IgJHtDdXJyZW50RW52aXJvbm1lbnQoKX1gLCB7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90d2l0Y2gtZXh0LmpzIiwiaW1wb3J0IE11eHkgZnJvbSAnLi9tdXh5JztcblxubW9kdWxlLmV4cG9ydHMgPSBNdXh5O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2luZGV4LmpzIiwiaW1wb3J0IEFuYWx5dGljcyBmcm9tICcuL2FuYWx5dGljcyc7XG5pbXBvcnQgU3RhdGVDbGllbnQgZnJvbSAnLi9zdGF0ZS1jbGllbnQnO1xuaW1wb3J0IEV4dCBmcm9tICcuL3R3aXRjaC1leHQnO1xuaW1wb3J0IFR3aXRjaENsaWVudCBmcm9tICcuL3R3aXRjaC1jbGllbnQnO1xuaW1wb3J0IE1lc3NlbmdlciBmcm9tICcuL21lc3Nlbmdlcic7XG5pbXBvcnQgU0RLIGZyb20gJy4vc2RrJztcbmltcG9ydCBVc2VyIGZyb20gJy4vdXNlcic7XG5pbXBvcnQgVXRpbCBmcm9tICcuL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBQYWNrYWdlQ29uZmlnIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbi8qKlxuICogVGhlIG1haW4gZXh0ZW5zaW9uIGVudHJ5IGludGVyZmFjZSwgYXZhaWxhYmxlIGFzIHRoZSBnbG9iYWwgYE11eHlgIG9iamVjdC5cbiAqXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgZW52aXJvbm1lbnQgZGV0ZWN0aW9uLCBkYXRhIGhhcm5lc3MgY29sbGVjdGlvbiBhbmQgdXBkYXRlcyAoZm9yXG4gKiBhdXRoZW50aWNhdGlvbiBhbmQgYmFja2VuZCBjb21tdW5pY2F0aW9uKSBhbmQgU0RLIGluc3RhbmNlIGNyZWF0aW9uLlxuICpcbiAqIE9uIGltcG9ydCBvciBpbmNsdXNpb24gaW4gYW4gSFRNTCBmaWxlLCBhIHNpbmdsZXRvbiBvYmplY3Qgd2lsbCBiZSBnbG9iYWxseSBhY2Nlc3NpYmxlXG4gKiBhcyBgTXV4eWAuXG4gKi9cbmNsYXNzIE11eHkge1xuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3Igc2luZ2xldG9uIHVzZSBvbmx5LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBhY2Nlc3NvciBmb3IgdXNlcnMgb2YgdGhlIE11eHkgbGlicmFyeSwgbWFrZXMgdGhlIHV0aWwgZnVuY3Rpb25zIGFjY2Vzc2libGVcbiAgICAgKiBmcm9tIGBNdXh5LlV0aWwuPHdoYXRldmVyPmAuIEZ1bGwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgdXRpbC5qcyBmaWxlLlxuICAgICAqXG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHRoaXMuVXRpbCA9IFV0aWw7XG5cbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdXNlZCB0byBzaWduYWwgd2hlbiB7QGxpbmsgc2V0dXB9IGhhcyBiZWVuIGNhbGxlZC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlXG4gICAgICogYW5kIG9ubHkgb25jZSBiZWZvcmUgU0RLIG9iamVjdHMgbWF5IGJlIGNyZWF0ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5zZXR1cENhbGxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFR3aXRjaCBDaGFubmVsIElEIHRvIHVzZSBmb3IgdGVzdGluZy4gVGhpcyB3aWxsIGRldGVybWluZSB3aG8gdGhlIHZpZXdlciBhbmQvb3JcbiAgICAgKiBicm9hZGNhc3RlciBhcHBlYXJzIGFzIHdoZW4gdGVzdGluZyB0aGUgZXh0ZW5zaW9uLlxuICAgICAqXG4gICAgICogQ2hhbmdlcyB0byB0aGlzIHZhbHVlIG11c3QgYmUgbWFkZSBiZWZvcmUgY2FsbGluZyB7QGxpbmsgU0RLfS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGVzdENoYW5uZWxJRCA9ICcyMzE2MTM1Nyc7XG5cbiAgICAvKipcbiAgICAgKiBSb2xlIGZvciB0aGUgY3VycmVudCB1c2VyIGluIHRoZSBzYW5kYm94IGVudmlyb25tZW50LiBNYXkgYmUgb25lIG9mIHtAbGluayBVc2VyLlJvbGVzfS5cbiAgICAgKlxuICAgICAqIENoYW5nZXMgdG8gdGhpcyB2YWx1ZSBtdXN0IGJlIG1hZGUgYmVmb3JlIGNhbGxpbmcge0BsaW5rIFNES30uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRlc3RKV1RSb2xlID0gJ3ZpZXdlcic7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgVHdpdGNoIENsaWVudElEIGFzIHJldHVybmVkIGZyb20gdGhlIGF1dGggY2FsbGJhY2suIFRoaXMgaXMgdXNlZCBmb3IgYWxsXG4gICAgICogcmVxdWVzdHMgdG8gVHdpdGNoJ3MgQVBJLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50d2l0Y2hDbGllbnRJRCA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgY2FjaGUgZm9yIGNyZWF0ZWQge0BsaW5rIFNES30gY2xpZW50IG9iamVjdHMgbWFwcGVkIHRvIFNESyBpZC5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuU0RLQ2xpZW50cyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwge0BsaW5rIFN0YXRlQ2xpZW50fS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7U3RhdGVDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgU3RhdGVDbGllbnQoKTtcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIHtAbGluayBNZXNzZW5nZXJ9LlxuICAgICAqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEB0eXBlIHtNZXNzZW5nZXJ9XG4gICAgICovXG4gICAgdGhpcy5tZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKCk7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCB7QGxpbmsgVHdpdGNoQ2xpZW50fS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7VHdpdGNoQ2xpZW50fS5cbiAgICAgKi9cbiAgICB0aGlzLmNhY2hlZFR3aXRjaENsaWVudCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCB7QGxpbmsgQW5hbHl0aWNzfS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7QW5hbHl0aWNzfS5cbiAgICAgKi9cbiAgICB0aGlzLmFuYWx5dGljcyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBjYWNoaW5nIGZvciBtb3N0IHJlY2VudCBjb250ZXh0IGNhbGxiYWNrIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuY29udGV4dCA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHtAbGluayBVc2VyfS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7VXNlcn1cbiAgICAgKi9cbiAgICB0aGlzLnVzZXIgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB0byByZXNvbHZlIG9uY2UgdGhlIE11eHkgc2luZ2xldG9uIGlzIGZ1bGwgbG9hZGVkIGFuZCByZWFkeVxuICAgICAqIHRvIGJlIHVzZWQuIFVzZSB0aGUge0BzZWUgbG9hZGVkfSBtZXRob2QgaW5zdGVhZCBvZiBhY2Nlc3NpbmcgZGlyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAaWdub3JlXG4gICAgICogQHR5cGUge1Byb21pc2V9XG4gICAgICovXG4gICAgdGhpcy5sb2FkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8qKiBAaWdub3JlICovXG4gICAgICB0aGlzLmxvYWRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIC8qKiBAaWdub3JlICovXG4gICAgICB0aGlzLmxvYWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIFNLVXMgYW5kIHByb2R1Y3QgbWV0YWRhdGEgdGhhdCBpcyB1c2VkIGZvciBtb25ldGl6YXRpb24gcHVycG9zZXNcbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuU0tVcyA9IFtdO1xuXG4gICAgU3RhdGVDbGllbnQuc2V0RW52aXJvbm1lbnQoVXRpbC5jdXJyZW50RW52aXJvbm1lbnQoKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpbnRzIHRvIGNvbnNvbGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGlicmFyeSdzIGN1cnJlbnQgdmVyc2lvbiBhbmRcbiAgICogZW52aXJvbm1lbnQgaW5mby4gVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBsaWJyYXJ5IGlzXG4gICAqIHNldHVwLCB1bmxlc3MgdGhlIGBxdWlldGAgcGFyYW1ldGVyIGlzIHBhc3NlZCB0byB7QGxpbmsgc2V0dXB9LlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQHB1YmxpY1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNdXh5LnByaW50SW5mbygpO1xuICAgKiDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICogfCBNdXh5IEV4dGVuc2lvbnMgU0RLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IHYxLjAuMCDCqSAyMDE3IE11eHksIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IGh0dHBzOi8vZ2l0aHViLmNvbS9tdXh5L2V4dGVuc2lvbnMtanMgICAgICAgICAgICB8XG4gICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBSdW5uaW5nIGluIHNhbmRib3ggZW52aXJvbm1lbnQgb3V0c2lkZSBvZiBUd2l0Y2ggfFxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICovXG4gIHN0YXRpYyBwcmludEluZm8oKSB7XG4gICAgY29uc3QgU0RLSW5mb1RleHQgPSBbXG4gICAgICAnTXV4eSBFeHRlbnNpb25zIFNESycsXG4gICAgICBgdiR7UGFja2FnZUNvbmZpZy52ZXJzaW9ufSDCqSAke25ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKX0gJHtQYWNrYWdlQ29uZmlnLmF1dGhvcn1gLFxuICAgICAgUGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5LFxuICAgICAgJydcbiAgICBdO1xuXG4gICAgc3dpdGNoIChVdGlsLmN1cnJlbnRFbnZpcm9ubWVudCgpLmVudmlyb25tZW50KSB7XG4gICAgICBjYXNlIFV0aWwuRW52aXJvbm1lbnRzLlRlc3RpbmcuZW52aXJvbm1lbnQ6XG4gICAgICAgIFNES0luZm9UZXh0LnB1c2goJ1J1bm5pbmcgaW4gdGVzdGluZyBlbnZpcm9ubWVudCBvdXRzaWRlIG9mIFR3aXRjaCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVXRpbC5FbnZpcm9ubWVudHMuU2FuZGJveERldi5lbnZpcm9ubWVudDpcbiAgICAgICAgU0RLSW5mb1RleHQucHVzaCgnUnVubmluZyBpbiBzYW5kYm94IGVudmlyb25tZW50IG91dHNpZGUgb2YgVHdpdGNoJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVdGlsLkVudmlyb25tZW50cy5TYW5kYm94VHdpdGNoLmVudmlyb25tZW50OlxuICAgICAgICBTREtJbmZvVGV4dC5wdXNoKCdSdW5uaW5nIGluIHNhbmRib3ggZW52aXJvbm1lbnQgb24gVHdpdGNoJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVdGlsLkVudmlyb25tZW50cy5Qcm9kdWN0aW9uLmVudmlyb25tZW50OlxuICAgICAgICBTREtJbmZvVGV4dC5wdXNoKCdSdW5uaW5nIG9uIHByb2R1Y3Rpb24nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFV0aWwuRW52aXJvbm1lbnRzLlNlcnZlci5lbnZpcm9ubWVudDpcbiAgICAgICAgU0RLSW5mb1RleHQucHVzaCgnUnVubmluZyBvbiBhIE5vZGVKUyBzZXJ2ZXInKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBTREtJbmZvVGV4dC5wdXNoKCdDb3VsZCBub3QgZGV0ZXJtaW5lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4nKTtcbiAgICB9XG5cbiAgICBVdGlsLmNvbnNvbGVQcmludChTREtJbmZvVGV4dCwgeyBib3hlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhlIHtAbGluayBzZXR1cH0gaXMgY2FsbGVkIHRvIHN0YXJ0IHdhdGNoaW5nIHRoZSBhdXRoXG4gICAqIGFuZCBjb250ZXh0IGNhbGxiYWNrcyBhbmQgdXBkYXRpbmcgdmFsdWVzIGF1dG9tYXRpY2FsbHkuIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgKiBub3Qgbm9ybWFsbHkgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQGlnbm9yZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uSUQgLSBUaGUgVHdpdGNoIEV4dGVuc2lvbiBDbGllbnQgSUQgdG8gdXNlIGZvciBhbGxcbiAgICogVHdpdGNoIEFQSSByZXF1ZXN0cy5cbiAgICovXG4gIHdhdGNoQXV0aChleHRlbnNpb25JRCkge1xuICAgIEV4dC5leHRlbnNpb25JRCA9IGV4dGVuc2lvbklEO1xuICAgIEV4dC50ZXN0Q2hhbm5lbElEID0gdGhpcy50ZXN0Q2hhbm5lbElEO1xuICAgIEV4dC50ZXN0SldUUm9sZSA9IHRoaXMudGVzdEpXVFJvbGU7XG5cbiAgICAvLyBBdXRoIGNhbGxiYWNrIGhhbmRsZXJcbiAgICBFeHQub25BdXRob3JpemVkKGF1dGggPT4ge1xuICAgICAgaWYgKCFhdXRoKSB7XG4gICAgICAgIHRoaXMubG9hZFJlamVjdCgnUmVjZWl2ZWQgaW52YWxpZCBhdXRob3JpemF0aW9uIGZyb20gVHdpdGNoJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy50d2l0Y2hDbGllbnRJRCA9IGF1dGguY2xpZW50SWQ7XG4gICAgICB0aGlzLm1lc3Nlbmdlci5leHRlbnNpb25JRCA9IGF1dGguY2xpZW50SWQ7XG4gICAgICB0aGlzLm1lc3Nlbmdlci5jaGFubmVsSUQgPSBhdXRoLmNoYW5uZWxJZDtcbiAgICAgIHRoaXMuY2xpZW50LnVwZGF0ZUF1dGgoYXV0aC50b2tlbik7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVQcm9taXNlID0gdXNlciA9PiB7XG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XG5cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuU0RLQ2xpZW50cyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIHRoaXMuU0RLQ2xpZW50c1trZXlzW2ldXS51c2VyID0gdGhpcy51c2VyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYW5hbHl0aWNzKSB7XG4gICAgICAgICAgdGhpcy5hbmFseXRpY3MudXNlciA9IHRoaXMudXNlcjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25GaXJzdEF1dGggPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xpZW50LmdldFVzZXJJbmZvKGV4dGVuc2lvbklEKVxuICAgICAgICAgIC50aGVuKHVzZXJpbmZvID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcihhdXRoKTtcbiAgICAgICAgICAgIHVzZXIuaXAgPSB1c2VyaW5mby5pcF9hZGRyZXNzO1xuICAgICAgICAgICAgdXNlci5yZWdpc3RlcmVkV2l0aE11eHkgPSB1c2VyaW5mby5yZWdpc3RlcmVkIHx8IGZhbHNlO1xuICAgICAgICAgICAgdXNlci52aXN1YWxpemF0aW9uSUQgPSB1c2VyaW5mby52aXN1YWxpemF0aW9uX2lkIHx8ICcnO1xuXG4gICAgICAgICAgICB1cGRhdGVVc2VyQ29udGV4dFNldHRpbmdzLmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHVzZXIpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzb2x2ZSgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgdGhpcy51c2VyLnVwZGF0ZUF1dGgoYXV0aCk7XG4gICAgICAgIHJlc29sdmVQcm9taXNlKHRoaXMudXNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkZpcnN0QXV0aCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29udGV4dCBjYWxsYmFjayBoYW5kbGVyXG4gICAgZnVuY3Rpb24gdXBkYXRlVXNlckNvbnRleHRTZXR0aW5ncygpIHtcbiAgICAgIGlmICghdGhpcy51c2VyIHx8ICF0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgVmlkZW8gTW9kZVxuICAgICAgaWYgKHRoaXMuY29udGV4dC5pc0Z1bGxTY3JlZW4pIHtcbiAgICAgICAgdGhpcy51c2VyLnZpZGVvTW9kZSA9ICdmdWxsc2NyZWVuJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZXh0LmlzVGhlYXRyZU1vZGUpIHtcbiAgICAgICAgdGhpcy51c2VyLnZpZGVvTW9kZSA9ICd0aGVhdHJlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlci52aWRlb01vZGUgPSAnZGVmYXVsdCc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXNlci5nYW1lID0gdGhpcy5jb250ZXh0LmdhbWU7XG4gICAgICB0aGlzLnVzZXIuYml0cmF0ZSA9IE1hdGgucm91bmQodGhpcy5jb250ZXh0LmJpdHJhdGUgfHwgMCk7XG4gICAgICB0aGlzLnVzZXIubGF0ZW5jeSA9IHRoaXMuY29udGV4dC5obHNMYXRlbmN5QnJvYWRjYXN0ZXI7XG4gICAgICB0aGlzLnVzZXIuYnVmZmVyID0gdGhpcy5jb250ZXh0LmJ1ZmZlclNpemU7XG5cbiAgICAgIC8vIElmIGJ1ZmZlciBzaXplIGdvZXMgdG8gMCwgc2VuZCBhbiBhbmFseXRpY3MgZXZlbnQgdGhhdFxuICAgICAgLy8gdGhpcyB1c2VyJ3MgdmlkZW8gaXMgYnVmZmVyaW5nLlxuICAgICAgaWYgKHRoaXMuY29udGV4dC5idWZmZXJTaXplIDwgMSAmJiB0aGlzLmFuYWx5dGljcykge1xuICAgICAgICB0aGlzLmFuYWx5dGljcy5zZW5kRXZlbnQoJ3ZpZGVvJywgJ2J1ZmZlcicsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEV4dC5vbkNvbnRleHQoY29udGV4dCA9PiB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHVwZGF0ZVVzZXJDb250ZXh0U2V0dGluZ3MuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5kYXRvcnkgU0RLIHNldHVwIGNhbGwuIE11c3QgYmUgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSB0byBlc3RhYmxpc2ggdGhlIEV4dGVuc2lvblxuICAgKiBlbnZpcm9ubWVudCBhbmQgY2xpZW50IElEIHRvIHVzZS5cbiAgICpcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqIEBwdWJsaWNcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY2xpZW50SUQgLSBUaGUgRXh0ZW5zaW9uIENsaWVudCBJRCBhcyBwcm92aWRlZCBieSBUd2l0Y2guXG4gICAqIEBzaW5jZSAxLjAuNFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZz99IG9wdGlvbnMudWFTdHJpbmcgLSBBbiBvcHRpb25hbCBHb29nbGUgQW5hbHl0aWNzIFVBX1N0cmluZyB0byBzZW5kXG4gICAqIGV2ZW50cyB0by5cbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj99IG9wdGlvbnMucXVpZXQgLSBJZiB0cnVlLCB3aWxsIG5vdCBwcmludCBsaWJyYXJ5IGluZm9ybWF0aW9uIHRvIHRoZVxuICAgKiBjb25zb2xlLiBUaGlzIGlzIGFsd2F5cyB0cnVlIHdoZW4gcnVubmluZyBpbiBwcm9kdWN0aW9uLlxuICAgKiBAc2luY2UgMS4wLjNcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgc2V0dXAoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgb3IgaWYgbm9cbiAgICogRXh0ZW5zaW9uIENsaWVudCBJRCBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogTXV4eS5zZXR1cCh7XG4gICAqICAgY2xpZW50SUQ6IDx5b3VyIGV4dGVuc2lvbiBjbGllbnQgaWQ+XG4gICAqIH0pO1xuICAgKi9cbiAgc2V0dXAob3B0aW9ucykge1xuICAgIGlmICh0aGlzLnNldHVwQ2FsbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011eHkuc2V0dXAoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLmV4dGVuc2lvbklEICYmICFvcHRpb25zLmNsaWVudElEKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXh5LnNldHVwKCkgd2FzIGNhbGxlZCB3aXRob3V0IGFuIEV4dGVuc2lvbiBDbGllbnQgSUQnKTtcbiAgICB9XG5cbiAgICB0aGlzLnR3aXRjaENsaWVudElEID0gb3B0aW9ucy5jbGllbnRJRCB8fCBvcHRpb25zLmV4dGVuc2lvbklEO1xuICAgIHRoaXMuY2FjaGVkVHdpdGNoQ2xpZW50ID0gbmV3IFR3aXRjaENsaWVudCh0aGlzLnR3aXRjaENsaWVudElEKTtcblxuICAgIGlmIChvcHRpb25zLnVhU3RyaW5nKSB7XG4gICAgICB0aGlzLmFuYWx5dGljcyA9IG5ldyBBbmFseXRpY3Mob3B0aW9ucy51YVN0cmluZywgdGhpcy5sb2FkUHJvbWlzZSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBNdXh5LnByaW50SW5mbygpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXBDYWxsZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2ZXJzaW9uIG9mIHRoZSBNdXh5IFNESyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKiBAcHVibGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gaWQgLSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBvciBhcHAuIElmIG9taXR0ZWQsIHRoZVxuICAgKiBleHRlbnNpb24gY2xpZW50IGlkIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgY2FsbGVkIGJlZm9yZSB7QGxpbmsgTXV4eS5zZXR1cH0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtTREt9IEFuIGluc3RhbmNlIG9mIHRoZSBTREsgY2xhc3MuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHNkayA9IG5ldyBNdXh5LlNESygpO1xuICAgKiBzZGsubG9hZGVkKCkudGhlbigoKSA9PiB7XG4gICAqICAgc2RrLnNlbmQoJ0hlbGxvIFdvcmxkJyk7XG4gICAqIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKGVycik7XG4gICAqIH0pO1xuICAgKi9cbiAgU0RLKGlkKSB7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdHdpdGNoIGNsaWVudCB0byB1c2UuIENhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgdGhlIGxvYWRlZCBwcm9taXNlIHJlc29sdmVzLlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQHB1YmxpY1xuICAgKlxuICAgKiBAcmV0dXJucyB7VHdpdGNoQ2xpZW50fSBBbiBpbnN0YW5jZSBvZiB0aGUgVHdpdGNoQ2xpZW50IGNsYXNzLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBjYWxsZWQgYmVmb3JlIHtAbGluayBNdXh5LnNldHVwfS5cbiAgICovXG4gIFR3aXRjaENsaWVudCgpIHsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG59XG5cbi8qKlxuICogR2xvYmFsIE11eHkgc2luZ2xldG9uIG9iamVjdC5cbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgbXh5ID0gbmV3IE11eHkoKTtcblxuLy8gQ29uc3RydWN0b3JzIGZvciBzdWItb2JqZWN0cyBhcmUgYWRkZWQgdG8gdGhlIHNpbmdsZXRvbiBzbyB0aGF0IHVzaW5nIHRoZSBgbmV3YFxuLy8gb3BlcmF0b3IgZG9lc24ndCBtZXNzIHdpdGggdGhlIG14eSBzaW5nbGV0b24gc2NvcGUuIE9ubHkgYXBwbGllcyB0byBTREssIFR3aXRjaENsaWVudFxuLy8gYW5kIEFuYWx5dGljcyBpZiB3ZSBldmVyIGFkZCB0aGF0IGZ1bmN0aW9uYWxpdHkuXG5cbi8qKiBAaWdub3JlICovXG5teHkuU0RLID0gZnVuY3Rpb24gTmV3U0RLKGlkKSB7XG4gIGlmICghbXh5LnNldHVwQ2FsbGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXh5LnNldHVwKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IFNESyBpbnN0YW5jZScpO1xuICB9XG5cbiAgY29uc3QgaWRlbnRpZmllciA9IGlkIHx8IG14eS50d2l0Y2hDbGllbnRJRDtcbiAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoIW14eS53YXRjaGluZ0F1dGgpIHtcbiAgICBteHkud2F0Y2hpbmdBdXRoID0gdHJ1ZTtcbiAgICBteHkud2F0Y2hBdXRoKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgaWYgKCFteHkuU0RLQ2xpZW50c1tpZGVudGlmaWVyXSkge1xuICAgIG14eS5TREtDbGllbnRzW2lkZW50aWZpZXJdID0gbmV3IFNESyhcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBteHkuY2xpZW50LFxuICAgICAgbXh5LnVzZXIsXG4gICAgICBteHkubWVzc2VuZ2VyLFxuICAgICAgbXh5LmFuYWx5dGljcyxcbiAgICAgIG14eS5sb2FkUHJvbWlzZSxcbiAgICAgIG14eS5TS1VzXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBteHkuU0RLQ2xpZW50c1tpZGVudGlmaWVyXTtcbn07XG5cbi8qKiBAaWdub3JlICovXG5teHkuVHdpdGNoQ2xpZW50ID0gZnVuY3Rpb24gTmV3VHdpdGNoQ2xpZW50KCkge1xuICBpZiAoIW14eS5zZXR1cENhbGxlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXV4eS5zZXR1cCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBUd2l0Y2hDbGllbnQgaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHJldHVybiBteHkuY2FjaGVkVHdpdGNoQ2xpZW50O1xufTtcblxuLyoqXG4gKiBPbmx5IGV4cG9ydCB0aGUgTXV4eSBzaW5nbGV0b24gdG8gYXZvaWQgY3JlYXRpb24gb2YgY29tcGV0aW5nL2NvbmZsaWN0aW5nIGluc3RhbmNlcy5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgbXh5O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL211eHkuanMiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmtleXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXMuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgna2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gJGtleXModG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSA2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzXG4vLyBtb2R1bGUgaWQgPSA2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA2NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1zYXAuanNcbi8vIG1vZHVsZSBpZCA9IDY3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3N0cmluZy1hdC5qc1xuLy8gbW9kdWxlIGlkID0gNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwcy5qc1xuLy8gbW9kdWxlIGlkID0gNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ3BvLmpzXG4vLyBtb2R1bGUgaWQgPSA3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4vLyBtb2R1bGUgaWQgPSA3NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qc1xuLy8gbW9kdWxlIGlkID0gNzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4IHx8ICcnO1xudmFyICRQcm9taXNlID0gZ2xvYmFsW1BST01JU0VdO1xudmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIEludGVybmFsLCBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIE93blByb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9ICRQcm9taXNlLnJlc29sdmUoMSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICAgIH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZVxuICAgICAgLy8gdjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgICAvLyB3ZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgICAgJiYgdjguaW5kZXhPZignNi42JykgIT09IDBcbiAgICAgICYmIHVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvNjYnKSA9PT0gLTE7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gbWF5IHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpIG9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgdW5oYW5kbGVkID0gaXNVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgdmFyIHJlc3VsdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZiAodW5oYW5kbGVkKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmICh1bmhhbmRsZWQgJiYgcmVzdWx0LmUpIHRocm93IHJlc3VsdC52O1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICByZXR1cm4gcHJvbWlzZS5faCAhPT0gMSAmJiAocHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jKS5sZW5ndGggPT09IDA7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoTElCUkFSWSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5wcm9taXNlLmpzXG4vLyBtb2R1bGUgaWQgPSA3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSA3N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZm9yLW9mLmpzXG4vLyBtb2R1bGUgaWQgPSA3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY2FsbC5qc1xuLy8gbW9kdWxlIGlkID0gNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzXG4vLyBtb2R1bGUgaWQgPSA4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXG4vLyBtb2R1bGUgaWQgPSA4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pbnZva2UuanNcbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWljcm90YXNrLmpzXG4vLyBtb2R1bGUgaWQgPSA4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VzZXItYWdlbnQuanNcbi8vIG1vZHVsZSBpZCA9IDg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgaWYgKHNhZmUgJiYgdGFyZ2V0W2tleV0pIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgZWxzZSBoaWRlKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIH0gcmV0dXJuIHRhcmdldDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSA4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanNcbi8vIG1vZHVsZSBpZCA9IDg3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qc1xuLy8gbW9kdWxlIGlkID0gODhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanNcbi8vIG1vZHVsZSBpZCA9IDg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpIHtcbiAgcmV0dXJuICRPYmplY3QuZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDkxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzXG4vLyBtb2R1bGUgaWQgPSA5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsImltcG9ydCBndW1zaG9lRmFjdG9yeSBmcm9tICcuLi9saWJzL2d1bXNob2UnO1xuXG4vKipcbiAqIFRoZSBhbmFseXRpY3MgY29sbGVjdGlvbiBlbmRwb2ludC5cbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgQU5BTFlUSUNTX0VORFBPSU5UID0gJ2h0dHBzOi8vaW5mby5tdXh5LmlvJztcblxuLyoqXG4gKiBUaGUgQW5hbHl0aWNzIGNsYXNzIGFsbG93cyBmb3Igc2VuZGluZyBldmVudHMgYW5kIG1ldHJpY3MgdG8gR29vZ2xlIEFuYWx5dGljc1xuICogd2l0aCBhIGdpdmVuIFVBX1NUUklORy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5hbHl0aWNzIHtcbiAgY29uc3RydWN0b3IodWFTdHJpbmcsIGxvYWRQcm9taXNlKSB7XG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMudWFTdHJpbmcgPSB1YVN0cmluZztcbiAgICB0aGlzLmxvYWRQcm9taXNlID0gbG9hZFByb21pc2U7XG4gICAgdGhpcy51c2VyID0gbnVsbDtcblxuICAgIHRoaXMuZ3Vtc2hvZSA9IGd1bXNob2VGYWN0b3J5KCk7XG4gICAgdGhpcy5ndW1zaG9lLnRyYW5zcG9ydCh7XG4gICAgICBuYW1lOiAnbXV4eS1leHRlbnNpb24tc2RrJyxcbiAgICAgIHNlbmQ6IChkYXRhLCBmbikgPT4ge1xuICAgICAgICBjb25zdCBkID0gZGF0YTtcbiAgICAgICAgLy8gUmVtb3ZlIHN0dWZmIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBzZW5kIHVwXG4gICAgICAgIGRlbGV0ZSBkLnBhZ2VEYXRhO1xuICAgICAgICBkZWxldGUgZC5jbGllbnRVdWlkO1xuICAgICAgICBkZWxldGUgZC51dWlkO1xuICAgICAgICBkZWxldGUgZC5zZXNzaW9uVXVpZDtcbiAgICAgICAgdGhpcy5ndW1zaG9lLnJlcXdlc3QoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YTogZCxcbiAgICAgICAgICAgIHVybDogQU5BTFlUSUNTX0VORFBPSU5ULFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgICBjcm9zc09yaWdpbjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICAgIGZuKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBtYXA6IHRoaXMubWFwRGF0YS5iaW5kKHRoaXMpXG4gICAgfSk7XG5cbiAgICB0aGlzLmd1bXNob2UoeyB0cmFuc3BvcnQ6ICdtdXh5LWV4dGVuc2lvbi1zZGsnIH0pO1xuXG4gICAgdGhpcy5sb2FkUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIG1hcCBldmVudCBkYXRhIHRvIEdBIGZvcm1hdC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1hcERhdGEoZGF0YSkge1xuICAgIGNvbnN0IGFwcE5hbWUgPSAnTXV4eSc7XG5cbiAgICBsZXQgaXAgPSAnPHVua25vd24gaXA+JztcbiAgICBsZXQgY2hhbm5lbElEID0gbnVsbDtcbiAgICBsZXQgb3BhcXVlSUQgPSBudWxsO1xuICAgIGxldCB1c2VySUQgPSBudWxsO1xuICAgIGxldCByb2xlID0gbnVsbDtcbiAgICBsZXQgZ2FtZSA9IG51bGw7XG4gICAgbGV0IHZpZGVvTW9kZSA9IG51bGw7XG4gICAgbGV0IGxhdGVuY3kgPSBudWxsO1xuICAgIGxldCBiaXRyYXRlID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgIGlwID0gdGhpcy51c2VyLmlwO1xuICAgICAgY2hhbm5lbElEID0gdGhpcy51c2VyLmNoYW5uZWxJRDtcbiAgICAgIG9wYXF1ZUlEID0gdGhpcy51c2VyLnR3aXRjaE9wYXF1ZUlEO1xuICAgICAgdXNlcklEID0gIW9wYXF1ZUlEIHx8IG9wYXF1ZUlEWzBdICE9PSAnVScgPyBudWxsIDogb3BhcXVlSUQ7XG4gICAgICByb2xlID0gdGhpcy51c2VyLnJvbGU7XG4gICAgICBnYW1lID0gdGhpcy51c2VyLmdhbWU7XG4gICAgICB2aWRlb01vZGUgPSB0aGlzLnVzZXIudmlkZW9Nb2RlO1xuICAgICAgbGF0ZW5jeSA9IHRoaXMudXNlci5sYXRlbmN5O1xuICAgICAgYml0cmF0ZSA9IHRoaXMudXNlci5iaXRyYXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHBkID0gZGF0YS5wYWdlRGF0YTtcbiAgICBwZC5pcEFkZHJlc3MgPSBpcDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGFpZDogYXBwTmFtZSxcbiAgICAgIGFuOiBhcHBOYW1lLFxuICAgICAgY2lkOlxuICAgICAgICBvcGFxdWVJRCB8fCBkYXRhLmNsaWVudFV1aWQgfHwgZGF0YS5zZXNzaW9uVXVpZCB8fCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJyxcbiAgICAgIGRoOiBwZC5ob3N0TmFtZSxcbiAgICAgIGRsOiBwZC51cmwsXG4gICAgICBkcDogcGQucGF0aCxcbiAgICAgIGRyOiBwZC5yZWZlcmVyLFxuICAgICAgZHQ6IHBkLnRpdGxlLFxuICAgICAgamU6IHBkLmphdmFFbmFibGVkLFxuICAgICAgc3I6IHBkLnNjcmVlblJlc29sdXRpb24sXG4gICAgICB0OiAnZXZlbnQnLFxuICAgICAgdGlkOiB0aGlzLnVhU3RyaW5nLFxuICAgICAgdWE6IHBkLnVzZXJBZ2VudCxcbiAgICAgIHVpZDogdXNlcklELFxuICAgICAgdWlwOiBpcCxcbiAgICAgIHVsOiBwZC5sYW5ndWFnZSxcbiAgICAgIHY6IDEsXG4gICAgICB2cDogYCR7cGQudmlld3BvcnRIZWlnaHR9eCR7cGQudmlld3BvcnRXaWR0aH1gLFxuICAgICAgY2QxOiBjaGFubmVsSUQsXG4gICAgICBjZDI6IHJvbGUsXG4gICAgICBjZDM6IGdhbWUsXG4gICAgICBjZDQ6IHZpZGVvTW9kZSxcbiAgICAgIGNtMjogbGF0ZW5jeSxcbiAgICAgIGNtMzogYml0cmF0ZVxuICAgIH07XG5cbiAgICBpZiAoZGF0YS5ldmVudE5hbWUgPT09ICdwYWdlLnZpZXcnKSB7XG4gICAgICByZXN1bHQudCA9ICdwYWdldmlldyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5lYyA9IGRhdGEuZXZlbnROYW1lO1xuICAgICAgcmVzdWx0LmVhID0gZGF0YS5ldmVudERhdGEubmFtZTtcbiAgICAgIHJlc3VsdC5lbCA9IGRhdGEuZXZlbnREYXRhLmxhYmVsO1xuICAgICAgcmVzdWx0LmV2ID0gZGF0YS5ldmVudERhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhbiBhcmJpdHJhcnkgZXZlbiB0byBHb29nbGUgQW5hbHl0aWNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgLSBUaGUgaGlnaC1sZXZlbCBjYXRlZ29yeSB0byBjb2xsZWN0IHRoaXMgZXZlbnQgdW5kZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSAtIChvcHRpb25hbCkgQSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGV2ZW50IChkZWZhdWx0cyB0byAxKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gKG9wdGlvbmFsKSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIGV2ZW50LlxuICAgKi9cbiAgc2VuZEV2ZW50KGNhdGVnb3J5LCBuYW1lLCB2YWx1ZSA9IDEsIGxhYmVsID0gJycpIHtcbiAgICBpZiAoIXRoaXMucmVhZHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXV4eS5BbmFseXRpY3MgdXNlZCBiZWZvcmUgcmVhZHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0geyBuYW1lLCB2YWx1ZSwgbGFiZWwgfTtcbiAgICB0aGlzLmd1bXNob2Uuc2VuZChjYXRlZ29yeSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBzaW1wbGUgcGFnZSB2aWV3IGV2ZW50IHRvIEdvb2dsZSBBbmFseXRpY3MuXG4gICAqL1xuICBwYWdlVmlldygpIHtcbiAgICBpZiAoIXRoaXMucmVhZHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXV4eS5BbmFseXRpY3MgdXNlZCBiZWZvcmUgcmVhZHknKTtcbiAgICB9XG5cbiAgICB0aGlzLmd1bXNob2Uuc2VuZCgncGFnZS52aWV3Jywge30pO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvYW5hbHl0aWNzLmpzIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gcG9seWZpbGwgZm9yIFN0cmluZy5wcm90b3R5cGUudHJpbSBmb3IgSUU4XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvVHJpbVxuaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0pIHtcbiAgKGZ1bmN0aW9uKCkge1xuICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxuICAgIHZhciBydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZztcbiAgICBTdHJpbmcucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgICB9O1xuICB9KSgpO1xufVxuXG4vLyBQcm9kdWN0aW9uIHN0ZXBzIG9mIEVDTUEtMjYyLCBFZGl0aW9uIDUsIDE1LjQuNC4yMVxuLy8gUmVmZXJlbmNlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4yMVxuaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7XG4gIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgPSBmdW5jdGlvbihjYWxsYmFjayAvKiwgaW5pdGlhbFZhbHVlKi8pIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLnJlZHVjZSBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjYWxsYmFjayArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdmFyIHQgPSBPYmplY3QodGhpcyksIGxlbiA9IHQubGVuZ3RoID4+PiAwLCBrID0gMCwgdmFsdWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChrIDwgbGVuICYmICEgayBpbiB0KSB7XG4gICAgICAgIGsrKztcbiAgICAgIH1cbiAgICAgIGlmIChrID49IGxlbikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHRbaysrXTtcbiAgICB9XG4gICAgZm9yICg7IGsgPCBsZW47IGsrKykge1xuICAgICAgaWYgKGsgaW4gdCkge1xuICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrKHZhbHVlLCB0W2tdLCBrLCB0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufVxuXG4vKipcbiAqIEBmaWxlIHBlcmZub3cgaXMgYSAwLjE0IGtiIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cgaGlnaCByZXNvbHV0aW9uIHRpbWVyIHBvbHlmaWxsIHdpdGggRGF0ZSBmYWxsYmFja1xuICogQGF1dGhvciBEYW5pZWwgTGFtYiA8ZGxhbWIub3Blbi5zb3VyY2VAZ21haWwuY29tPlxuICovXG5mdW5jdGlvbiBwZXJmbm93KCkge1xuICB2YXIgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZSB8fCB7fTtcbiAgcGVyZi5ub3cgPSBwZXJmLm5vdyB8fFxuICAgIHBlcmYubW96Tm93IHx8XG4gICAgcGVyZi5tc05vdyB8fFxuICAgIHBlcmYub05vdyB8fFxuICAgIHBlcmYud2Via2l0Tm93IHx8XG4gICAgLy8gZmFsbGJhY2sgdG8gRGF0ZVxuICAgIERhdGUubm93IHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9O1xuXG4gIHJldHVybiBwZXJmO1xufTtcblxuZnVuY3Rpb24gZ3Vtc2hvZUZhY3RvcnkoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyB3ZSBuZWVkIHJlcXdlc3QgYW5kIHN0b3JlMiAoYW5kIGFueSBvdGhlciBmdXR1cmUgZGVwcylcbiAgLy8gdG8gYmUgc29sZWx5IHdpdGhpbiBvdXIgY29udGV4dCwgc28gYXMgdGhleSBkb24ndCBsZWFrIGFuZCBjb25mbGljdFxuICAvLyB3aXRoIG90aGVyIHZlcnNpb25zIG9mIHRoZSBzYW1lIGxpYnMgc2l0ZXMgbWF5IGJlIGxvYWRpbmcuXG4gIC8vIHNvIHdlJ2xsIHByb3ZpZGUgb3VyIG93biBjb250ZXh0LlxuICAvLyByb290Ll9ndW1zaG9lIGlzIG9ubHkgYXZhaWxhYmxlIGluIHNwZWNzXG4gIHZhciBjb250ZXh0ID0ge30sXG4gICAgcXVlcnlTdHJpbmcsXG4gICAgc3RvcmUsXG4gICAgLypqc2hpbnQgLVcwMjQgKi9cbiAgICB1bmRlZmluZWQ7XG5cbiAgLy8gY2FsbCBjb250ZXh0U2V0dXAgd2l0aCAnY29udGV4dCcgYXMgJ3RoaXMnIHNvIGFsbCBsaWJzIGF0dGFjaFxuICAvLyB0byBvdXIgY29udGV4dCB2YXJpYWJsZS5cbiAgKGZ1bmN0aW9uIGNvbnRleHRTZXR1cCgpIHtcbiAgICAvKiFcblx0ICAgIHF1ZXJ5LXN0cmluZ1xuXHQgICAgUGFyc2UgYW5kIHN0cmluZ2lmeSBVUkwgcXVlcnkgc3RyaW5nc1xuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmdcblx0ICAgIGJ5IFNpbmRyZSBTb3JodXNcblx0ICAgIE1JVCBMaWNlbnNlXG4gICAgKi9cbiAgICAoZnVuY3Rpb24gKGMpIHtcblx0ICAgICd1c2Ugc3RyaWN0JztcbiAgICAgIHZhciBxdWVyeVN0cmluZyA9IHt9O1xuXG4gICAgICBxdWVyeVN0cmluZy5wYXJzZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKC9eKFxcP3wjKS8sICcnKTtcblxuICAgICAgICBpZiAoIXN0cikge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHIudHJpbSgpLnNwbGl0KCcmJykucmVkdWNlKGZ1bmN0aW9uIChyZXQsIHBhcmFtKSB7XG4gICAgICAgICAgdmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcbiAgICAgICAgICB2YXIga2V5ID0gcGFydHNbMF07XG4gICAgICAgICAgdmFyIHZhbCA9IHBhcnRzWzFdO1xuXG4gICAgICAgICAga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgICAgLy8gbWlzc2luZyBgPWAgc2hvdWxkIGJlIGBudWxsYDpcbiAgICAgICAgICAvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXG4gICAgICAgICAgdmFsID0gdmFsID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XG5cbiAgICAgICAgICBpZiAoIXJldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICByZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmV0W2tleV0pKSB7XG4gICAgICAgICAgICByZXRba2V5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gW3JldFtrZXldLCB2YWxdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXJ5U3RyaW5nLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/IE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLm1hcChmdW5jdGlvbiAodmFsMikge1xuICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsMik7XG4gICAgICAgICAgICB9KS5qb2luKCcmJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCk7XG4gICAgICAgIH0pLmpvaW4oJyYnKSA6ICcnO1xuICAgICAgfTtcblxuICAgICAgYy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nO1xuICAgIH0pKHRoaXMpO1xuXG5cbiAgICAvKiFcbiAgICAgKiBSZXF3ZXN0ISBBIGdlbmVyYWwgcHVycG9zZSBYSFIgY29ubmVjdGlvbiBtYW5hZ2VyXG4gICAgICogbGljZW5zZSBNSVQgKGMpIER1c3RpbiBEaWF6IDIwMTRcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZGVkL3JlcXdlc3RcbiAgICAgKi9cblxuICAgICFmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICAgICAgY29udGV4dFtuYW1lXSA9IGRlZmluaXRpb24oKVxuICAgIH0oJ3JlcXdlc3QnLCB0aGlzLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciB3aW4gPSB3aW5kb3dcbiAgICAgICAgLCBkb2MgPSBkb2N1bWVudFxuICAgICAgICAsIGh0dHBzUmUgPSAvXmh0dHAvXG4gICAgICAgICwgcHJvdG9jb2xSZSA9IC8oXlxcdyspOlxcL1xcLy9cbiAgICAgICAgLCB0d29IdW5kbyA9IC9eKDIwXFxkfDEyMjMpJC8gLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwMDQ2OTcyL21zaWUtcmV0dXJucy1zdGF0dXMtY29kZS1vZi0xMjIzLWZvci1hamF4LXJlcXVlc3RcbiAgICAgICAgLCBieVRhZyA9ICdnZXRFbGVtZW50c0J5VGFnTmFtZSdcbiAgICAgICAgLCByZWFkeVN0YXRlID0gJ3JlYWR5U3RhdGUnXG4gICAgICAgICwgY29udGVudFR5cGUgPSAnQ29udGVudC1UeXBlJ1xuICAgICAgICAsIHJlcXVlc3RlZFdpdGggPSAnWC1SZXF1ZXN0ZWQtV2l0aCdcbiAgICAgICAgLCBoZWFkID0gZG9jW2J5VGFnXSgnaGVhZCcpWzBdXG4gICAgICAgICwgdW5pcWlkID0gMFxuICAgICAgICAsIGNhbGxiYWNrUHJlZml4ID0gJ3JlcXdlc3RfJyArICgrbmV3IERhdGUoKSlcbiAgICAgICAgLCBsYXN0VmFsdWUgLy8gZGF0YSBzdG9yZWQgYnkgdGhlIG1vc3QgcmVjZW50IEpTT05QIGNhbGxiYWNrXG4gICAgICAgICwgeG1sSHR0cFJlcXVlc3QgPSAnWE1MSHR0cFJlcXVlc3QnXG4gICAgICAgICwgeERvbWFpblJlcXVlc3QgPSAnWERvbWFpblJlcXVlc3QnXG4gICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG5cbiAgICAgICAgLCBpc0FycmF5ID0gdHlwZW9mIEFycmF5LmlzQXJyYXkgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgLCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICAgICAgICAgICwgJ3JlcXVlc3RlZFdpdGgnOiB4bWxIdHRwUmVxdWVzdFxuICAgICAgICAgICAgLCAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgJyonOiAgJ3RleHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonXG4gICAgICAgICAgICAgICAgLCAneG1sJzogICdhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sJ1xuICAgICAgICAgICAgICAgICwgJ2h0bWwnOiAndGV4dC9odG1sJ1xuICAgICAgICAgICAgICAgICwgJ3RleHQnOiAndGV4dC9wbGFpbidcbiAgICAgICAgICAgICAgICAsICdqc29uJzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCdcbiAgICAgICAgICAgICAgICAsICdqcyc6ICAgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQsIHRleHQvamF2YXNjcmlwdCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAsIHhociA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgIC8vIGlzIGl0IHgtZG9tYWluXG4gICAgICAgICAgICBpZiAob1snY3Jvc3NPcmlnaW4nXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB2YXIgeGhyID0gd2luW3htbEh0dHBSZXF1ZXN0XSA/IG5ldyBYTUxIdHRwUmVxdWVzdCgpIDogbnVsbFxuICAgICAgICAgICAgICBpZiAoeGhyICYmICd3aXRoQ3JlZGVudGlhbHMnIGluIHhocikge1xuICAgICAgICAgICAgICAgIHJldHVybiB4aHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5beERvbWFpblJlcXVlc3RdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRG9tYWluUmVxdWVzdCgpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5beG1sSHR0cFJlcXVlc3RdKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAsIGdsb2JhbFNldHVwT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGRhdGFGaWx0ZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzdWNjZWVkKHIpIHtcbiAgICAgICAgdmFyIHByb3RvY29sID0gcHJvdG9jb2xSZS5leGVjKHIudXJsKTtcbiAgICAgICAgcHJvdG9jb2wgPSAocHJvdG9jb2wgJiYgcHJvdG9jb2xbMV0pIHx8IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgICAgcmV0dXJuIGh0dHBzUmUudGVzdChwcm90b2NvbCkgPyB0d29IdW5kby50ZXN0KHIucmVxdWVzdC5zdGF0dXMpIDogISFyLnJlcXVlc3QucmVzcG9uc2VUZXh0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVSZWFkeVN0YXRlKHIsIHN1Y2Nlc3MsIGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gdXNlIF9hYm9ydGVkIHRvIG1pdGlnYXRlIGFnYWluc3QgSUUgZXJyIGMwMGMwMjNmXG4gICAgICAgICAgLy8gKGNhbid0IHJlYWQgcHJvcHMgb24gYWJvcnRlZCByZXF1ZXN0IG9iamVjdHMpXG4gICAgICAgICAgaWYgKHIuX2Fib3J0ZWQpIHJldHVybiBlcnJvcihyLnJlcXVlc3QpXG4gICAgICAgICAgaWYgKHIuX3RpbWVkT3V0KSByZXR1cm4gZXJyb3Ioci5yZXF1ZXN0LCAnUmVxdWVzdCBpcyBhYm9ydGVkOiB0aW1lb3V0JylcbiAgICAgICAgICBpZiAoci5yZXF1ZXN0ICYmIHIucmVxdWVzdFtyZWFkeVN0YXRlXSA9PSA0KSB7XG4gICAgICAgICAgICByLnJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gbm9vcFxuICAgICAgICAgICAgaWYgKHN1Y2NlZWQocikpIHN1Y2Nlc3Moci5yZXF1ZXN0KVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBlcnJvcihyLnJlcXVlc3QpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldEhlYWRlcnMoaHR0cCwgbykge1xuICAgICAgICB2YXIgaGVhZGVycyA9IG9bJ2hlYWRlcnMnXSB8fCB7fVxuICAgICAgICAgICwgaFxuXG4gICAgICAgIGhlYWRlcnNbJ0FjY2VwdCddID0gaGVhZGVyc1snQWNjZXB0J11cbiAgICAgICAgICB8fCBkZWZhdWx0SGVhZGVyc1snYWNjZXB0J11bb1sndHlwZSddXVxuICAgICAgICAgIHx8IGRlZmF1bHRIZWFkZXJzWydhY2NlcHQnXVsnKiddXG5cbiAgICAgICAgdmFyIGlzQUZvcm1EYXRhID0gdHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIChvWydkYXRhJ10gaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG4gICAgICAgIC8vIGJyZWFrcyBjcm9zcy1vcmlnaW4gcmVxdWVzdHMgd2l0aCBsZWdhY3kgYnJvd3NlcnNcbiAgICAgICAgaWYgKCFvWydjcm9zc09yaWdpbiddICYmICFoZWFkZXJzW3JlcXVlc3RlZFdpdGhdKSBoZWFkZXJzW3JlcXVlc3RlZFdpdGhdID0gZGVmYXVsdEhlYWRlcnNbJ3JlcXVlc3RlZFdpdGgnXVxuICAgICAgICBpZiAoIWhlYWRlcnNbY29udGVudFR5cGVdICYmICFpc0FGb3JtRGF0YSkgaGVhZGVyc1tjb250ZW50VHlwZV0gPSBvWydjb250ZW50VHlwZSddIHx8IGRlZmF1bHRIZWFkZXJzWydjb250ZW50VHlwZSddXG4gICAgICAgIGZvciAoaCBpbiBoZWFkZXJzKVxuICAgICAgICAgIGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaCkgJiYgJ3NldFJlcXVlc3RIZWFkZXInIGluIGh0dHAgJiYgaHR0cC5zZXRSZXF1ZXN0SGVhZGVyKGgsIGhlYWRlcnNbaF0pXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldENyZWRlbnRpYWxzKGh0dHAsIG8pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvWyd3aXRoQ3JlZGVudGlhbHMnXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGh0dHAud2l0aENyZWRlbnRpYWxzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGh0dHAud2l0aENyZWRlbnRpYWxzID0gISFvWyd3aXRoQ3JlZGVudGlhbHMnXVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdlbmVyYWxDYWxsYmFjayhkYXRhKSB7XG4gICAgICAgIGxhc3RWYWx1ZSA9IGRhdGFcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXJsYXBwZW5kICh1cmwsIHMpIHtcbiAgICAgICAgcmV0dXJuIHVybCArICgvXFw/Ly50ZXN0KHVybCkgPyAnJicgOiAnPycpICsgc1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVKc29ucChvLCBmbiwgZXJyLCB1cmwpIHtcbiAgICAgICAgdmFyIHJlcUlkID0gdW5pcWlkKytcbiAgICAgICAgICAsIGNia2V5ID0gb1snanNvbnBDYWxsYmFjayddIHx8ICdjYWxsYmFjaycgLy8gdGhlICdjYWxsYmFjaycga2V5XG4gICAgICAgICAgLCBjYnZhbCA9IG9bJ2pzb25wQ2FsbGJhY2tOYW1lJ10gfHwgcmVxd2VzdC5nZXRjYWxsYmFja1ByZWZpeChyZXFJZClcbiAgICAgICAgICAsIGNicmVnID0gbmV3IFJlZ0V4cCgnKChefFxcXFw/fCYpJyArIGNia2V5ICsgJyk9KFteJl0rKScpXG4gICAgICAgICAgLCBtYXRjaCA9IHVybC5tYXRjaChjYnJlZylcbiAgICAgICAgICAsIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgICAgICAgICwgbG9hZGVkID0gMFxuICAgICAgICAgICwgaXNJRTEwID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFIDEwLjAnKSAhPT0gLTFcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBpZiAobWF0Y2hbM10gPT09ICc/Jykge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoY2JyZWcsICckMT0nICsgY2J2YWwpIC8vIHdpbGRjYXJkIGNhbGxiYWNrIGZ1bmMgbmFtZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYnZhbCA9IG1hdGNoWzNdIC8vIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmMgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmwgPSB1cmxhcHBlbmQodXJsLCBjYmtleSArICc9JyArIGNidmFsKSAvLyBubyBjYWxsYmFjayBkZXRhaWxzLCBhZGQgJ2VtXG4gICAgICAgIH1cblxuICAgICAgICB3aW5bY2J2YWxdID0gZ2VuZXJhbENhbGxiYWNrXG5cbiAgICAgICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0J1xuICAgICAgICBzY3JpcHQuc3JjID0gdXJsXG4gICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWVcbiAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNJRTEwKSB7XG4gICAgICAgICAgLy8gbmVlZCB0aGlzIGZvciBJRSBkdWUgdG8gb3V0LW9mLW9yZGVyIG9ucmVhZHlzdGF0ZWNoYW5nZSgpLCBiaW5kaW5nIHNjcmlwdFxuICAgICAgICAgIC8vIGV4ZWN1dGlvbiB0byBhbiBldmVudCBsaXN0ZW5lciBnaXZlcyB1cyBjb250cm9sIG92ZXIgd2hlbiB0aGUgc2NyaXB0XG4gICAgICAgICAgLy8gaXMgZXhlY3V0ZWQuIFNlZSBodHRwOi8vamF1Ym91cmcubmV0LzIwMTAvMDcvbG9hZGluZy1zY3JpcHQtYXMtb25jbGljay1oYW5kbGVyLW9mLmh0bWxcbiAgICAgICAgICBzY3JpcHQuaHRtbEZvciA9IHNjcmlwdC5pZCA9ICdfcmVxd2VzdF8nICsgcmVxSWRcbiAgICAgICAgfVxuXG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICgoc2NyaXB0W3JlYWR5U3RhdGVdICYmIHNjcmlwdFtyZWFkeVN0YXRlXSAhPT0gJ2NvbXBsZXRlJyAmJiBzY3JpcHRbcmVhZHlTdGF0ZV0gIT09ICdsb2FkZWQnKSB8fCBsb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGxcbiAgICAgICAgICBzY3JpcHQub25jbGljayAmJiBzY3JpcHQub25jbGljaygpXG4gICAgICAgICAgLy8gQ2FsbCB0aGUgdXNlciBjYWxsYmFjayB3aXRoIHRoZSBsYXN0IHZhbHVlIHN0b3JlZCBhbmQgY2xlYW4gdXAgdmFsdWVzIGFuZCBzY3JpcHRzLlxuICAgICAgICAgIGZuKGxhc3RWYWx1ZSlcbiAgICAgICAgICBsYXN0VmFsdWUgPSB1bmRlZmluZWRcbiAgICAgICAgICBoZWFkLnJlbW92ZUNoaWxkKHNjcmlwdClcbiAgICAgICAgICBsb2FkZWQgPSAxXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIHNjcmlwdCB0byB0aGUgRE9NIGhlYWRcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpXG5cbiAgICAgICAgLy8gRW5hYmxlIEpTT05QIHRpbWVvdXRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsXG4gICAgICAgICAgICBlcnIoe30sICdSZXF1ZXN0IGlzIGFib3J0ZWQ6IHRpbWVvdXQnLCB7fSlcbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpXG4gICAgICAgICAgICBsb2FkZWQgPSAxXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldFJlcXVlc3QoZm4sIGVycikge1xuICAgICAgICB2YXIgbyA9IHRoaXMub1xuICAgICAgICAgICwgbWV0aG9kID0gKG9bJ21ldGhvZCddIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgLCB1cmwgPSB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyBvIDogb1sndXJsJ11cbiAgICAgICAgICAvLyBjb252ZXJ0IG5vbi1zdHJpbmcgb2JqZWN0cyB0byBxdWVyeS1zdHJpbmcgZm9ybSB1bmxlc3Mgb1sncHJvY2Vzc0RhdGEnXSBpcyBmYWxzZVxuICAgICAgICAgICwgZGF0YSA9IChvWydwcm9jZXNzRGF0YSddICE9PSBmYWxzZSAmJiBvWydkYXRhJ10gJiYgdHlwZW9mIG9bJ2RhdGEnXSAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICA/IHJlcXdlc3QudG9RdWVyeVN0cmluZyhvWydkYXRhJ10pXG4gICAgICAgICAgICA6IChvWydkYXRhJ10gfHwgbnVsbClcbiAgICAgICAgICAsIGh0dHBcbiAgICAgICAgICAsIHNlbmRXYWl0ID0gZmFsc2VcblxuICAgICAgICAvLyBpZiB3ZSdyZSB3b3JraW5nIG9uIGEgR0VUIHJlcXVlc3QgYW5kIHdlIGhhdmUgZGF0YSB0aGVuIHdlIHNob3VsZCBhcHBlbmRcbiAgICAgICAgLy8gcXVlcnkgc3RyaW5nIHRvIGVuZCBvZiBVUkwgYW5kIG5vdCBwb3N0IGRhdGFcbiAgICAgICAgaWYgKChvWyd0eXBlJ10gPT0gJ2pzb25wJyB8fCBtZXRob2QgPT0gJ0dFVCcpICYmIGRhdGEpIHtcbiAgICAgICAgICB1cmwgPSB1cmxhcHBlbmQodXJsLCBkYXRhKVxuICAgICAgICAgIGRhdGEgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob1sndHlwZSddID09ICdqc29ucCcpIHJldHVybiBoYW5kbGVKc29ucChvLCBmbiwgZXJyLCB1cmwpXG5cbiAgICAgICAgLy8gZ2V0IHRoZSB4aHIgZnJvbSB0aGUgZmFjdG9yeSBpZiBwYXNzZWRcbiAgICAgICAgLy8gaWYgdGhlIGZhY3RvcnkgcmV0dXJucyBudWxsLCBmYWxsLWJhY2sgdG8gb3Vyc1xuICAgICAgICBodHRwID0gKG8ueGhyICYmIG8ueGhyKG8pKSB8fCB4aHIobylcblxuICAgICAgICBodHRwLm9wZW4obWV0aG9kLCB1cmwsIG9bJ2FzeW5jJ10gPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlKVxuICAgICAgICBzZXRIZWFkZXJzKGh0dHAsIG8pXG4gICAgICAgIHNldENyZWRlbnRpYWxzKGh0dHAsIG8pXG4gICAgICAgIGlmICh3aW5beERvbWFpblJlcXVlc3RdICYmIGh0dHAgaW5zdGFuY2VvZiB3aW5beERvbWFpblJlcXVlc3RdKSB7XG4gICAgICAgICAgICBodHRwLm9ubG9hZCA9IGZuXG4gICAgICAgICAgICBodHRwLm9uZXJyb3IgPSBlcnJcbiAgICAgICAgICAgIC8vIE5PVEU6IHNlZVxuICAgICAgICAgICAgLy8gaHR0cDovL3NvY2lhbC5tc2RuLm1pY3Jvc29mdC5jb20vRm9ydW1zL2VuLVVTL2lld2ViZGV2ZWxvcG1lbnQvdGhyZWFkLzMwZWYzYWRkLTc2N2MtNDQzNi1iOGE5LWYxY2ExOWI0ODEyZVxuICAgICAgICAgICAgaHR0cC5vbnByb2dyZXNzID0gZnVuY3Rpb24oKSB7fVxuICAgICAgICAgICAgc2VuZFdhaXQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVSZWFkeVN0YXRlKHRoaXMsIGZuLCBlcnIpXG4gICAgICAgIH1cbiAgICAgICAgb1snYmVmb3JlJ10gJiYgb1snYmVmb3JlJ10oaHR0cClcbiAgICAgICAgaWYgKHNlbmRXYWl0KSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBodHRwLnNlbmQoZGF0YSlcbiAgICAgICAgICB9LCAyMDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cC5zZW5kKGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0dHBcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gUmVxd2VzdChvLCBmbikge1xuICAgICAgICB0aGlzLm8gPSBvXG4gICAgICAgIHRoaXMuZm4gPSBmblxuXG4gICAgICAgIGluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzZXRUeXBlKGhlYWRlcikge1xuICAgICAgICAvLyBqc29uLCBqYXZhc2NyaXB0LCB0ZXh0L3BsYWluLCB0ZXh0L2h0bWwsIHhtbFxuICAgICAgICBpZiAoaGVhZGVyLm1hdGNoKCdqc29uJykpIHJldHVybiAnanNvbidcbiAgICAgICAgaWYgKGhlYWRlci5tYXRjaCgnamF2YXNjcmlwdCcpKSByZXR1cm4gJ2pzJ1xuICAgICAgICBpZiAoaGVhZGVyLm1hdGNoKCd0ZXh0JykpIHJldHVybiAnaHRtbCdcbiAgICAgICAgaWYgKGhlYWRlci5tYXRjaCgneG1sJykpIHJldHVybiAneG1sJ1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbml0KG8sIGZuKSB7XG5cbiAgICAgICAgdGhpcy51cmwgPSB0eXBlb2YgbyA9PSAnc3RyaW5nJyA/IG8gOiBvWyd1cmwnXVxuICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG5cbiAgICAgICAgLy8gd2hldGhlciByZXF1ZXN0IGhhcyBiZWVuIGZ1bGZpbGxlZCBmb3IgcHVycG9zZVxuICAgICAgICAvLyBvZiB0cmFja2luZyB0aGUgUHJvbWlzZXNcbiAgICAgICAgdGhpcy5fZnVsZmlsbGVkID0gZmFsc2VcbiAgICAgICAgLy8gc3VjY2VzcyBoYW5kbGVyc1xuICAgICAgICB0aGlzLl9zdWNjZXNzSGFuZGxlciA9IGZ1bmN0aW9uKCl7fVxuICAgICAgICB0aGlzLl9mdWxmaWxsbWVudEhhbmRsZXJzID0gW11cbiAgICAgICAgLy8gZXJyb3IgaGFuZGxlcnNcbiAgICAgICAgdGhpcy5fZXJyb3JIYW5kbGVycyA9IFtdXG4gICAgICAgIC8vIGNvbXBsZXRlIChib3RoIHN1Y2Nlc3MgYW5kIGZhaWwpIGhhbmRsZXJzXG4gICAgICAgIHRoaXMuX2NvbXBsZXRlSGFuZGxlcnMgPSBbXVxuICAgICAgICB0aGlzLl9lcnJlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlQXJncyA9IHt9XG5cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgICAgICAgZm4gPSBmbiB8fCBmdW5jdGlvbiAoKSB7fVxuXG4gICAgICAgIGlmIChvWyd0aW1lb3V0J10pIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRpbWVkT3V0KClcbiAgICAgICAgICB9LCBvWyd0aW1lb3V0J10pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob1snc3VjY2VzcyddKSB7XG4gICAgICAgICAgdGhpcy5fc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvWydzdWNjZXNzJ10uYXBwbHkobywgYXJndW1lbnRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvWydlcnJvciddKSB7XG4gICAgICAgICAgdGhpcy5fZXJyb3JIYW5kbGVycy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG9bJ2Vycm9yJ10uYXBwbHkobywgYXJndW1lbnRzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob1snY29tcGxldGUnXSkge1xuICAgICAgICAgIHRoaXMuX2NvbXBsZXRlSGFuZGxlcnMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvWydjb21wbGV0ZSddLmFwcGx5KG8sIGFyZ3VtZW50cylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY29tcGxldGUgKHJlc3ApIHtcbiAgICAgICAgICBvWyd0aW1lb3V0J10gJiYgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dClcbiAgICAgICAgICBzZWxmLnRpbWVvdXQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKHNlbGYuX2NvbXBsZXRlSGFuZGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VsZi5fY29tcGxldGVIYW5kbGVycy5zaGlmdCgpKHJlc3ApXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc3VjY2VzcyAocmVzcCkge1xuICAgICAgICAgIHZhciB0eXBlID0gb1sndHlwZSddIHx8IHJlc3AgJiYgc2V0VHlwZShyZXNwLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKSkgLy8gcmVzcCBjYW4gYmUgdW5kZWZpbmVkIGluIElFXG4gICAgICAgICAgcmVzcCA9ICh0eXBlICE9PSAnanNvbnAnKSA/IHNlbGYucmVxdWVzdCA6IHJlc3BcbiAgICAgICAgICAvLyB1c2UgZ2xvYmFsIGRhdGEgZmlsdGVyIG9uIHJlc3BvbnNlIHRleHRcbiAgICAgICAgICB2YXIgZmlsdGVyZWRSZXNwb25zZSA9IGdsb2JhbFNldHVwT3B0aW9ucy5kYXRhRmlsdGVyKHJlc3AucmVzcG9uc2VUZXh0LCB0eXBlKVxuICAgICAgICAgICAgLCByID0gZmlsdGVyZWRSZXNwb25zZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwLnJlc3BvbnNlVGV4dCA9IHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBhc3NpZ24gdGhpcyBpbiBJRTw9OCwganVzdCBpZ25vcmVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzcCA9IHdpbi5KU09OLnBhcnNlKHIpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IocmVzcCwgJ0NvdWxkIG5vdCBwYXJzZSBKU09OIGluIHJlc3BvbnNlJywgZXJyKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX3Jlc3BvbnNlQXJncy5yZXNwID0gcmVzcFxuICAgICAgICAgIHNlbGYuX2Z1bGZpbGxlZCA9IHRydWVcbiAgICAgICAgICBmbihyZXNwKVxuICAgICAgICAgIHNlbGYuX3N1Y2Nlc3NIYW5kbGVyKHJlc3ApXG4gICAgICAgICAgd2hpbGUgKHNlbGYuX2Z1bGZpbGxtZW50SGFuZGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzcCA9IHNlbGYuX2Z1bGZpbGxtZW50SGFuZGxlcnMuc2hpZnQoKShyZXNwKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbXBsZXRlKHJlc3ApXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0aW1lZE91dCgpIHtcbiAgICAgICAgICBzZWxmLl90aW1lZE91dCA9IHRydWVcbiAgICAgICAgICBpZih0eXBlb2Ygc2VsZi5yZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2VsZi5yZXF1ZXN0LmFib3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzZWxmLnJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlcnJvcihyZXNwLCBtc2csIHQpIHtcbiAgICAgICAgICByZXNwID0gc2VsZi5yZXF1ZXN0XG4gICAgICAgICAgc2VsZi5fcmVzcG9uc2VBcmdzLnJlc3AgPSByZXNwXG4gICAgICAgICAgc2VsZi5fcmVzcG9uc2VBcmdzLm1zZyA9IG1zZ1xuICAgICAgICAgIHNlbGYuX3Jlc3BvbnNlQXJncy50ID0gdFxuICAgICAgICAgIHNlbGYuX2VycmVkID0gdHJ1ZVxuICAgICAgICAgIHdoaWxlIChzZWxmLl9lcnJvckhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNlbGYuX2Vycm9ySGFuZGxlcnMuc2hpZnQoKShyZXNwLCBtc2csIHQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXBsZXRlKHJlc3ApXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3QgPSBnZXRSZXF1ZXN0LmNhbGwodGhpcywgc3VjY2VzcywgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIFJlcXdlc3QucHJvdG90eXBlID0ge1xuICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX2Fib3J0ZWQgPSB0cnVlXG4gICAgICAgICAgaWYodHlwZW9mIHRoaXMucmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRoaXMucmVxdWVzdC5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICwgcmV0cnk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9hYm9ydGVkPWZhbHNlO1xuICAgICAgICAgIHRoaXMuX3RpbWVkT3V0PWZhbHNlO1xuICAgICAgICAgIGluaXQuY2FsbCh0aGlzLCB0aGlzLm8sIHRoaXMuZm4pXG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogU21hbGwgZGV2aWF0aW9uIGZyb20gdGhlIFByb21pc2VzIEEgQ29tbW9uSnMgc3BlY2lmaWNhdGlvblxuICAgICAgICAgKiBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Qcm9taXNlcy9BXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgdGhlbmAgd2lsbCBleGVjdXRlIHVwb24gc3VjY2Vzc2Z1bCByZXF1ZXN0c1xuICAgICAgICAgKi9cbiAgICAgICwgdGhlbjogZnVuY3Rpb24gKHN1Y2Nlc3MsIGZhaWwpIHtcbiAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyB8fCBmdW5jdGlvbiAoKSB7fVxuICAgICAgICAgIGZhaWwgPSBmYWlsIHx8IGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICAgaWYgKHRoaXMuX2Z1bGZpbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBcmdzLnJlc3AgPSBzdWNjZXNzKHRoaXMuX3Jlc3BvbnNlQXJncy5yZXNwKVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZXJyZWQpIHtcbiAgICAgICAgICAgIGZhaWwodGhpcy5fcmVzcG9uc2VBcmdzLnJlc3AsIHRoaXMuX3Jlc3BvbnNlQXJncy5tc2csIHRoaXMuX3Jlc3BvbnNlQXJncy50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxmaWxsbWVudEhhbmRsZXJzLnB1c2goc3VjY2VzcylcbiAgICAgICAgICAgIHRoaXMuX2Vycm9ySGFuZGxlcnMucHVzaChmYWlsKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGBhbHdheXNgIHdpbGwgZXhlY3V0ZSB3aGV0aGVyIHRoZSByZXF1ZXN0IHN1Y2NlZWRzIG9yIGZhaWxzXG4gICAgICAgICAqL1xuICAgICAgLCBhbHdheXM6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIGlmICh0aGlzLl9mdWxmaWxsZWQgfHwgdGhpcy5fZXJyZWQpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuX3Jlc3BvbnNlQXJncy5yZXNwKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb21wbGV0ZUhhbmRsZXJzLnB1c2goZm4pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogYGZhaWxgIHdpbGwgZXhlY3V0ZSB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzXG4gICAgICAgICAqL1xuICAgICAgLCBmYWlsOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICBpZiAodGhpcy5fZXJyZWQpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuX3Jlc3BvbnNlQXJncy5yZXNwLCB0aGlzLl9yZXNwb25zZUFyZ3MubXNnLCB0aGlzLl9yZXNwb25zZUFyZ3MudClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JIYW5kbGVycy5wdXNoKGZuKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgICAsICdjYXRjaCc6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhaWwoZm4pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVxd2VzdChvLCBmbikge1xuICAgICAgICByZXR1cm4gbmV3IFJlcXdlc3QobywgZm4pXG4gICAgICB9XG5cbiAgICAgIC8vIG5vcm1hbGl6ZSBuZXdsaW5lIHZhcmlhbnRzIGFjY29yZGluZyB0byBzcGVjIC0+IENSTEZcbiAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzKSB7XG4gICAgICAgIHJldHVybiBzID8gcy5yZXBsYWNlKC9cXHI/XFxuL2csICdcXHJcXG4nKSA6ICcnXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNlcmlhbChlbCwgY2IpIHtcbiAgICAgICAgdmFyIG4gPSBlbC5uYW1lXG4gICAgICAgICAgLCB0ID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLCBvcHRDYiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAgIC8vIElFIGdpdmVzIHZhbHVlPVwiXCIgZXZlbiB3aGVyZSB0aGVyZSBpcyBubyB2YWx1ZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgLy8gJ3NwZWNpZmllZCcgcmVmOiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1Db3JlL2NvcmUuaHRtbCNJRC04NjI1MjkyNzNcbiAgICAgICAgICAgICAgaWYgKG8gJiYgIW9bJ2Rpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgY2Iobiwgbm9ybWFsaXplKG9bJ2F0dHJpYnV0ZXMnXVsndmFsdWUnXSAmJiBvWydhdHRyaWJ1dGVzJ11bJ3ZhbHVlJ11bJ3NwZWNpZmllZCddID8gb1sndmFsdWUnXSA6IG9bJ3RleHQnXSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLCBjaCwgcmEsIHZhbCwgaVxuXG4gICAgICAgIC8vIGRvbid0IHNlcmlhbGl6ZSBlbGVtZW50cyB0aGF0IGFyZSBkaXNhYmxlZCBvciB3aXRob3V0IGEgbmFtZVxuICAgICAgICBpZiAoZWwuZGlzYWJsZWQgfHwgIW4pIHJldHVyblxuXG4gICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgICAgaWYgKCEvcmVzZXR8YnV0dG9ufGltYWdlfGZpbGUvaS50ZXN0KGVsLnR5cGUpKSB7XG4gICAgICAgICAgICBjaCA9IC9jaGVja2JveC9pLnRlc3QoZWwudHlwZSlcbiAgICAgICAgICAgIHJhID0gL3JhZGlvL2kudGVzdChlbC50eXBlKVxuICAgICAgICAgICAgdmFsID0gZWwudmFsdWVcbiAgICAgICAgICAgIC8vIFdlYktpdCBnaXZlcyB1cyBcIlwiIGluc3RlYWQgb2YgXCJvblwiIGlmIGEgY2hlY2tib3ggaGFzIG5vIHZhbHVlLCBzbyBjb3JyZWN0IGl0IGhlcmVcbiAgICAgICAgICAgIDsoIShjaCB8fCByYSkgfHwgZWwuY2hlY2tlZCkgJiYgY2Iobiwgbm9ybWFsaXplKGNoICYmIHZhbCA9PT0gJycgPyAnb24nIDogdmFsKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICAgIGNiKG4sIG5vcm1hbGl6ZShlbC52YWx1ZSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICBpZiAoZWwudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnc2VsZWN0LW9uZScpIHtcbiAgICAgICAgICAgIG9wdENiKGVsLnNlbGVjdGVkSW5kZXggPj0gMCA/IGVsLm9wdGlvbnNbZWwuc2VsZWN0ZWRJbmRleF0gOiBudWxsKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBlbC5sZW5ndGggJiYgaSA8IGVsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGVsLm9wdGlvbnNbaV0uc2VsZWN0ZWQgJiYgb3B0Q2IoZWwub3B0aW9uc1tpXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb2xsZWN0IHVwIGFsbCBmb3JtIGVsZW1lbnRzIGZvdW5kIGZyb20gdGhlIHBhc3NlZCBhcmd1bWVudCBlbGVtZW50cyBhbGxcbiAgICAgIC8vIHRoZSB3YXkgZG93biB0byBjaGlsZCBlbGVtZW50czsgcGFzcyBhICc8Zm9ybT4nIG9yIGZvcm0gZmllbGRzLlxuICAgICAgLy8gY2FsbGVkIHdpdGggJ3RoaXMnPWNhbGxiYWNrIHRvIHVzZSBmb3Igc2VyaWFsKCkgb24gZWFjaCBlbGVtZW50XG4gICAgICBmdW5jdGlvbiBlYWNoRm9ybUVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBjYiA9IHRoaXNcbiAgICAgICAgICAsIGUsIGlcbiAgICAgICAgICAsIHNlcmlhbGl6ZVN1YnRhZ3MgPSBmdW5jdGlvbiAoZSwgdGFncykge1xuICAgICAgICAgICAgICB2YXIgaSwgaiwgZmFcbiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBmYSA9IGVbYnlUYWddKHRhZ3NbaV0pXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZhLmxlbmd0aDsgaisrKSBzZXJpYWwoZmFbal0sIGNiKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGUgPSBhcmd1bWVudHNbaV1cbiAgICAgICAgICBpZiAoL2lucHV0fHNlbGVjdHx0ZXh0YXJlYS9pLnRlc3QoZS50YWdOYW1lKSkgc2VyaWFsKGUsIGNiKVxuICAgICAgICAgIHNlcmlhbGl6ZVN1YnRhZ3MoZSwgWyAnaW5wdXQnLCAnc2VsZWN0JywgJ3RleHRhcmVhJyBdKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YW5kYXJkIHF1ZXJ5IHN0cmluZyBzdHlsZSBzZXJpYWxpemF0aW9uXG4gICAgICBmdW5jdGlvbiBzZXJpYWxpemVRdWVyeVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHJlcXdlc3QudG9RdWVyeVN0cmluZyhyZXF3ZXN0LnNlcmlhbGl6ZUFycmF5LmFwcGx5KG51bGwsIGFyZ3VtZW50cykpXG4gICAgICB9XG5cbiAgICAgIC8vIHsgJ25hbWUnOiAndmFsdWUnLCAuLi4gfSBzdHlsZSBzZXJpYWxpemF0aW9uXG4gICAgICBmdW5jdGlvbiBzZXJpYWxpemVIYXNoKCkge1xuICAgICAgICB2YXIgaGFzaCA9IHt9XG4gICAgICAgIGVhY2hGb3JtRWxlbWVudC5hcHBseShmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAobmFtZSBpbiBoYXNoKSB7XG4gICAgICAgICAgICBoYXNoW25hbWVdICYmICFpc0FycmF5KGhhc2hbbmFtZV0pICYmIChoYXNoW25hbWVdID0gW2hhc2hbbmFtZV1dKVxuICAgICAgICAgICAgaGFzaFtuYW1lXS5wdXNoKHZhbHVlKVxuICAgICAgICAgIH0gZWxzZSBoYXNoW25hbWVdID0gdmFsdWVcbiAgICAgICAgfSwgYXJndW1lbnRzKVxuICAgICAgICByZXR1cm4gaGFzaFxuICAgICAgfVxuXG4gICAgICAvLyBbIHsgbmFtZTogJ25hbWUnLCB2YWx1ZTogJ3ZhbHVlJyB9LCAuLi4gXSBzdHlsZSBzZXJpYWxpemF0aW9uXG4gICAgICByZXF3ZXN0LnNlcmlhbGl6ZUFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyID0gW11cbiAgICAgICAgZWFjaEZvcm1FbGVtZW50LmFwcGx5KGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgIGFyci5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9KVxuICAgICAgICB9LCBhcmd1bWVudHMpXG4gICAgICAgIHJldHVybiBhcnJcbiAgICAgIH1cblxuICAgICAgcmVxd2VzdC5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgICAgICAgdmFyIG9wdCwgZm5cbiAgICAgICAgICAsIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApXG5cbiAgICAgICAgb3B0ID0gYXJncy5wb3AoKVxuICAgICAgICBvcHQgJiYgb3B0Lm5vZGVUeXBlICYmIGFyZ3MucHVzaChvcHQpICYmIChvcHQgPSBudWxsKVxuICAgICAgICBvcHQgJiYgKG9wdCA9IG9wdC50eXBlKVxuXG4gICAgICAgIGlmIChvcHQgPT0gJ21hcCcpIGZuID0gc2VyaWFsaXplSGFzaFxuICAgICAgICBlbHNlIGlmIChvcHQgPT0gJ2FycmF5JykgZm4gPSByZXF3ZXN0LnNlcmlhbGl6ZUFycmF5XG4gICAgICAgIGVsc2UgZm4gPSBzZXJpYWxpemVRdWVyeVN0cmluZ1xuXG4gICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBhcmdzKVxuICAgICAgfVxuXG4gICAgICByZXF3ZXN0LnRvUXVlcnlTdHJpbmcgPSBmdW5jdGlvbiAobywgdHJhZCkge1xuICAgICAgICB2YXIgcHJlZml4LCBpXG4gICAgICAgICAgLCB0cmFkaXRpb25hbCA9IHRyYWQgfHwgZmFsc2VcbiAgICAgICAgICAsIHMgPSBbXVxuICAgICAgICAgICwgZW5jID0gZW5jb2RlVVJJQ29tcG9uZW50XG4gICAgICAgICAgLCBhZGQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcbiAgICAgICAgICAgICAgdmFsdWUgPSAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHZhbHVlKSA/IHZhbHVlKCkgOiAodmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWUpXG4gICAgICAgICAgICAgIHNbcy5sZW5ndGhdID0gZW5jKGtleSkgKyAnPScgKyBlbmModmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG4gICAgICAgIGlmIChpc0FycmF5KG8pKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgbyAmJiBpIDwgby5sZW5ndGg7IGkrKykgYWRkKG9baV1bJ25hbWUnXSwgb1tpXVsndmFsdWUnXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuICAgICAgICAgIC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuICAgICAgICAgIGZvciAocHJlZml4IGluIG8pIHtcbiAgICAgICAgICAgIGlmIChvLmhhc093blByb3BlcnR5KHByZWZpeCkpIGJ1aWxkUGFyYW1zKHByZWZpeCwgb1twcmVmaXhdLCB0cmFkaXRpb25hbCwgYWRkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwYWNlcyBzaG91bGQgYmUgKyBhY2NvcmRpbmcgdG8gc3BlY1xuICAgICAgICByZXR1cm4gcy5qb2luKCcmJykucmVwbGFjZSgvJTIwL2csICcrJylcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYnVpbGRQYXJhbXMocHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQpIHtcbiAgICAgICAgdmFyIG5hbWUsIGksIHZcbiAgICAgICAgICAsIHJicmFja2V0ID0gL1xcW1xcXSQvXG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuICAgICAgICAgIGZvciAoaSA9IDA7IG9iaiAmJiBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2ID0gb2JqW2ldXG4gICAgICAgICAgICBpZiAodHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgIC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cbiAgICAgICAgICAgICAgYWRkKHByZWZpeCwgdilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJ1aWxkUGFyYW1zKHByZWZpeCArICdbJyArICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBpIDogJycpICsgJ10nLCB2LCB0cmFkaXRpb25hbCwgYWRkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvYmogJiYgb2JqLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgLy8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuICAgICAgICAgIGZvciAobmFtZSBpbiBvYmopIHtcbiAgICAgICAgICAgIGJ1aWxkUGFyYW1zKHByZWZpeCArICdbJyArIG5hbWUgKyAnXScsIG9ialtuYW1lXSwgdHJhZGl0aW9uYWwsIGFkZClcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG4gICAgICAgICAgYWRkKHByZWZpeCwgb2JqKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlcXdlc3QuZ2V0Y2FsbGJhY2tQcmVmaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFja1ByZWZpeFxuICAgICAgfVxuXG4gICAgICAvLyBqUXVlcnkgYW5kIFplcHRvIGNvbXBhdGliaWxpdHksIGRpZmZlcmVuY2VzIGNhbiBiZSByZW1hcHBlZCBoZXJlIHNvIHlvdSBjYW4gY2FsbFxuICAgICAgLy8gLmFqYXguY29tcGF0KG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgcmVxd2VzdC5jb21wYXQgPSBmdW5jdGlvbiAobywgZm4pIHtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICBvWyd0eXBlJ10gJiYgKG9bJ21ldGhvZCddID0gb1sndHlwZSddKSAmJiBkZWxldGUgb1sndHlwZSddXG4gICAgICAgICAgb1snZGF0YVR5cGUnXSAmJiAob1sndHlwZSddID0gb1snZGF0YVR5cGUnXSlcbiAgICAgICAgICBvWydqc29ucENhbGxiYWNrJ10gJiYgKG9bJ2pzb25wQ2FsbGJhY2tOYW1lJ10gPSBvWydqc29ucENhbGxiYWNrJ10pICYmIGRlbGV0ZSBvWydqc29ucENhbGxiYWNrJ11cbiAgICAgICAgICBvWydqc29ucCddICYmIChvWydqc29ucENhbGxiYWNrJ10gPSBvWydqc29ucCddKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVxd2VzdChvLCBmbilcbiAgICAgIH1cblxuICAgICAgcmVxd2VzdC5hamF4U2V0dXAgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgICAgICBmb3IgKHZhciBrIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBnbG9iYWxTZXR1cE9wdGlvbnNba10gPSBvcHRpb25zW2tdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcXdlc3RcbiAgICB9KTtcblxuXG4gICAgLyohIHN0b3JlMiAtIHYyLjMuMCAtIDIwMTUtMDUtMjJcbiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTmF0aGFuIEJ1Ym5hOyBMaWNlbnNlZCBNSVQsIEdQTCAqL1xuICAgIDsoZnVuY3Rpb24od2luZG93LCBkZWZpbmUpIHtcbiAgICAgICAgdmFyIF8gPSB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBcIjIuMy4wXCIsXG4gICAgICAgICAgICBhcmVhczoge30sXG4gICAgICAgICAgICBhcGlzOiB7fSxcblxuICAgICAgICAgICAgLy8gdXRpbGl0aWVzXG4gICAgICAgICAgICBpbmhlcml0OiBmdW5jdGlvbihhcGksIG8pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwIGluIGFwaSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW8uaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9bcF0gPSBhcGlbcF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgZCA9PT0gXCJmdW5jdGlvblwiID8gZCsnJyA6IEpTT04uc3RyaW5naWZ5KGQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaXQgZG9lc24ndCBwYXJzZSwgcmV0dXJuIGFzIGlzXG4gICAgICAgICAgICAgICAgdHJ5eyByZXR1cm4gSlNPTi5wYXJzZShzKTsgfWNhdGNoKGUpeyByZXR1cm4gczsgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gZXh0ZW5zaW9uIGhvb2tzXG4gICAgICAgICAgICBmbjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICAgICAgICAgICAgICBfLnN0b3JlQVBJW25hbWVdID0gZm47XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYXBpIGluIF8uYXBpcykge1xuICAgICAgICAgICAgICAgICAgICBfLmFwaXNbYXBpXVtuYW1lXSA9IGZuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKGFyZWEsIGtleSl7IHJldHVybiBhcmVhLmdldEl0ZW0oa2V5KTsgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24oYXJlYSwga2V5LCBzdHJpbmcpeyBhcmVhLnNldEl0ZW0oa2V5LCBzdHJpbmcpOyB9LFxuICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbihhcmVhLCBrZXkpeyBhcmVhLnJlbW92ZUl0ZW0oa2V5KTsgfSxcbiAgICAgICAgICAgIGtleTogZnVuY3Rpb24oYXJlYSwgaSl7IHJldHVybiBhcmVhLmtleShpKTsgfSxcbiAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24oYXJlYSl7IHJldHVybiBhcmVhLmxlbmd0aDsgfSxcbiAgICAgICAgICAgIGNsZWFyOiBmdW5jdGlvbihhcmVhKXsgYXJlYS5jbGVhcigpOyB9LFxuXG4gICAgICAgICAgICAvLyBjb3JlIGZ1bmN0aW9uc1xuICAgICAgICAgICAgU3RvcmU6IGZ1bmN0aW9uKGlkLCBhcmVhLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSBfLmluaGVyaXQoXy5zdG9yZUFQSSwgZnVuY3Rpb24oa2V5LCBkYXRhLCBvdmVyd3JpdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApeyByZXR1cm4gc3RvcmUuZ2V0QWxsKCk7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCl7IHJldHVybiBzdG9yZS5zZXQoa2V5LCBkYXRhLCBvdmVyd3JpdGUpOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKXsgcmV0dXJuIHN0b3JlLmdldChrZXkpOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5KXsgcmV0dXJuIHN0b3JlLmNsZWFyKCk7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnNldEFsbChrZXksIGRhdGEpOy8vIG92ZXJ3cml0ZT1kYXRhLCBkYXRhPWtleVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0b3JlLl9pZCA9IGlkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0S2V5ID0gJ19zYWZhcmlQcml2YXRlXyc7XG4gICAgICAgICAgICAgICAgICAgIGFyZWEuc2V0SXRlbSh0ZXN0S2V5LCAnc3Vja3MnKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuX2FyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICBhcmVhLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICBpZiAoIXN0b3JlLl9hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLl9hcmVhID0gXy5pbmhlcml0KF8uc3RvcmFnZUFQSSwgeyBpdGVtczoge30sIG5hbWU6ICdmYWtlJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RvcmUuX25zID0gbmFtZXNwYWNlIHx8ICcnO1xuICAgICAgICAgICAgICAgIGlmICghXy5hcmVhc1tpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgXy5hcmVhc1tpZF0gPSBzdG9yZS5fYXJlYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFfLmFwaXNbc3RvcmUuX25zK3N0b3JlLl9pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgXy5hcGlzW3N0b3JlLl9ucytzdG9yZS5faWRdID0gc3RvcmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdG9yZUFQSToge1xuICAgICAgICAgICAgICAgIC8vIGFkbWluIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAgIGFyZWE6IGZ1bmN0aW9uKGlkLCBhcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRoaXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3JlIHx8ICFzdG9yZS5hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF8uU3RvcmUoaWQsIGFyZWEsIHRoaXMuX25zKTsvL25ldyBhcmVhLXNwZWNpZmljIGFwaSBpbiB0aGlzIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzW2lkXSl7IHRoaXNbaWRdID0gc3RvcmU7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IGZ1bmN0aW9uKG5hbWVzcGFjZSwgbm9TZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ucyA/IHRoaXMuX25zLnN1YnN0cmluZygwLHRoaXMuX25zLmxlbmd0aC0xKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBucyA9IG5hbWVzcGFjZSwgc3RvcmUgPSB0aGlzW25zXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9yZSB8fCAhc3RvcmUubmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF8uU3RvcmUodGhpcy5faWQsIHRoaXMuX2FyZWEsIHRoaXMuX25zK25zKycuJyk7Ly9uZXcgbmFtZXNwYWNlZCBhcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpc1tuc10peyB0aGlzW25zXSA9IHN0b3JlOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vU2Vzc2lvbil7IHN0b3JlLmFyZWEoJ3Nlc3Npb24nLCBfLmFyZWFzLnNlc3Npb24pOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXNGYWtlOiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy5fYXJlYS5uYW1lID09PSAnZmFrZSc7IH0sXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0b3JlJysodGhpcy5fbnM/Jy4nK3RoaXMubmFtZXNwYWNlKCk6JycpKydbJyt0aGlzLl9pZCsnXSc7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIHN0b3JhZ2UgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FyZWEuaGFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXJlYS5oYXModGhpcy5faW4oa2V5KSk7Ly9leHRlbnNpb24gaG9va1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhISh0aGlzLl9pbihrZXkpIGluIHRoaXMuX2FyZWEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2l6ZTogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMua2V5cygpLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICBlYWNoOiBmdW5jdGlvbihmbiwgYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbT1fLmxlbmd0aCh0aGlzLl9hcmVhKTsgaTxtOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9vdXQoXy5rZXkodGhpcy5fYXJlYSwgaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywga2V5LCBhbmQgfHwgdGhpcy5nZXQoa2V5KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtID4gXy5sZW5ndGgodGhpcy5fYXJlYSkpIHsgbS0tOyBpLS07IH0vLyBpbiBjYXNlIG9mIHJlbW92ZUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5kIHx8IHRoaXM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBrZXlzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihrLCBsaXN0KXsgbGlzdC5wdXNoKGspOyB9LCBbXSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSwgYWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzID0gXy5nZXQodGhpcy5fYXJlYSwgdGhpcy5faW4oa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzICE9PSBudWxsID8gXy5wYXJzZShzKSA6IGFsdCB8fCBzOy8vIHN1cHBvcnQgYWx0IGZvciBlYXN5IGRlZmF1bHQgbWdtdFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0QWxsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihrLCBhbGwpeyBhbGxba10gPSB0aGlzLmdldChrKTsgfSwge30pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihrZXksIGRhdGEsIG92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkICE9IG51bGwgJiYgb3ZlcndyaXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uc2V0KHRoaXMuX2FyZWEsIHRoaXMuX2luKGtleSksIF8uc3RyaW5naWZ5KGRhdGEpLCBvdmVyd3JpdGUpIHx8IGQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRBbGw6IGZ1bmN0aW9uKGRhdGEsIG92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhbmdlZCwgdmFsO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0KGtleSwgdmFsLCBvdmVyd3JpdGUpICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgXy5yZW1vdmUodGhpcy5fYXJlYSwgdGhpcy5faW4oa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmNsZWFyKHRoaXMuX2FyZWEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGspeyBfLnJlbW92ZSh0aGlzLl9hcmVhLCB0aGlzLl9pbihrKSk7IH0sIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xlYXJBbGw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJlYSA9IHRoaXMuX2FyZWE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIF8uYXJlYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLmFyZWFzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FyZWEgPSBfLmFyZWFzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCB1c2UgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgX2luOiBmdW5jdGlvbihrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgayAhPT0gXCJzdHJpbmdcIil7IGsgPSBfLnN0cmluZ2lmeShrKTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbnMgPyB0aGlzLl9ucyArIGsgOiBrO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX291dDogZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbnMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgayAmJiBrLmluZGV4T2YodGhpcy5fbnMpID09PSAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLnN1YnN0cmluZyh0aGlzLl9ucy5sZW5ndGgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgOiAvLyBzbyBlYWNoKCkga25vd3MgdG8gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LC8vIGVuZCBfLnN0b3JlQVBJXG4gICAgICAgICAgICBzdG9yYWdlQVBJOiB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgICAgICAgIGhhczogZnVuY3Rpb24oayl7IHJldHVybiB0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGspOyB9LFxuICAgICAgICAgICAgICAgIGtleTogZnVuY3Rpb24oaSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5pdGVtcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXMoaykgJiYgaSA9PT0gYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldEl0ZW06IGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhcyhrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2tdID0gdjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW06IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzKGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5pdGVtc1trXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldEl0ZW06IGZ1bmN0aW9uKGspeyByZXR1cm4gdGhpcy5oYXMoaykgPyB0aGlzLml0ZW1zW2tdIDogbnVsbDsgfSxcbiAgICAgICAgICAgICAgICBjbGVhcjogZnVuY3Rpb24oKXsgZm9yICh2YXIgayBpbiB0aGlzLmxpc3QpeyB0aGlzLnJlbW92ZUl0ZW0oayk7IH0gfSxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMubGVuZ3RoKycgaXRlbXMgaW4gJyt0aGlzLm5hbWUrJ1N0b3JhZ2UnOyB9XG4gICAgICAgICAgICB9Ly8gZW5kIF8uc3RvcmFnZUFQSVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHNldHVwIHRoZSBwcmltYXJ5IHN0b3JlIGZuXG4gICAgICAgIGlmICh3aW5kb3cuc3RvcmUpeyBfLmNvbmZsaWN0ID0gd2luZG93LnN0b3JlOyB9XG4gICAgICAgIHZhciBzdG9yZSA9XG4gICAgICAgICAgICAvLyBzYWZlbHkgc2V0IHRoaXMgdXAgKHRocm93cyBlcnJvciBpbiBJRTEwLzMyYml0IG1vZGUgZm9yIGxvY2FsIGZpbGVzKVxuICAgICAgICAgICAgXy5TdG9yZShcImxvY2FsXCIpO1xuICAgICAgICBzdG9yZS5sb2NhbCA9IHN0b3JlOy8vIGZvciBjb21wbGV0ZW5lc3NcbiAgICAgICAgc3RvcmUuXyA9IF87Ly8gZm9yIGV4dGVuZGVycyBhbmQgZGVidWdnZXJzLi4uXG4gICAgICAgIC8vIHNhZmVseSBzZXR1cCBzdG9yZS5zZXNzaW9uICh0aHJvd3MgZXhjZXB0aW9uIGluIEZGIGZvciBmaWxlOi8vLyB1cmxzKVxuICAgICAgICBzdG9yZS5hcmVhKFwic2Vzc2lvblwiKTtcblxuICAgICAgICAvL0V4cG9zZSBzdG9yZSB0byB0aGUgZ2xvYmFsIG9iamVjdFxuICAgICAgICB3aW5kb3cuc3RvcmUgPSBzdG9yZTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4gICAgICAgIH1cblxuICAgIH0pKHRoaXMsIHRoaXMuZGVmaW5lKTtcbiAgfSkuY2FsbChjb250ZXh0KTtcblxuICBxdWVyeVN0cmluZyA9IGNvbnRleHQucXVlcnlTdHJpbmc7XG4gIHN0b3JlID0gY29udGV4dC5zdG9yZTtcblxuICBmdW5jdGlvbiBleHRlbmQgKG9iaikge1xuICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgdmFyIHNvdXJjZSwgcHJvcDtcbiAgICBmb3IgKHZhciBpID0gMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgIG9ialtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQXJyYXkgKG9iaikge1xuICAgIHJldHVybiAnW29iamVjdCBBcnJheV0nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiAoJycgKyB0eXBlb2Ygb2JqKSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZSA9PT0gJ29iamVjdCcgJiYgISFvYmo7XG4gIH1cblxuICBmdW5jdGlvbiBpc1N0cmluZyAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8ICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gJ1tvYmplY3QgU3RyaW5nXScpIHx8IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gdXVpZHY0ICgpe1xuICAgIHZhciBkID0gcGVyZm5vdygpLm5vdygpO1xuICAgIHZhciB1dWlkID0gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XG4gICAgICB2YXIgciA9IChkICsgTWF0aC5yYW5kb20oKSoxNiklMTYgfCAwO1xuICAgICAgZCA9IE1hdGguZmxvb3IoZC8xNik7XG4gICAgICByZXR1cm4gKGM9PSd4JyA/IHIgOiAociYweDN8MHg4KSkudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xuICAgIHJldHVybiB1dWlkO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgdHJhbnNwb3J0OiAnJyxcbiAgICAgIHF1ZXVlVGltZW91dDogMTAwXG4gICAgfSxcbiAgICBsb2NhbFN0b3JlID0gc3RvcmUubmFtZXNwYWNlKCdndW1zaG9lJyksXG4gICAgc3RvcmFnZSA9IHN0b3JlLm5hbWVzcGFjZSgnZ3Vtc2hvZScpLnNlc3Npb24sXG4gICAgcXVldWUgPSBzdG9yYWdlKCdxdWV1ZScpIHx8IFtdLFxuICAgIHRyYW5zcG9ydHMgPSB7fTtcblxuICBpZiAoIWlzQXJyYXkocXVldWUpKSB7XG4gICAgcXVldWUgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGd1bXNob2UgKG9wdGlvbnMpIHtcbiAgICB2YXIgY2xpZW50VXVpZCA9IGxvY2FsU3RvcmUoJ2NsaWVudFV1aWQnKTtcblxuICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGFsd2F5cyBlbnN1cmUgb3B0aW9ucy50cmFuc3BvcnQgaXMgYW4gYXJyYXkuXG4gICAgaWYgKGlzU3RyaW5nKG9wdGlvbnMudHJhbnNwb3J0KSkge1xuICAgICAgb3B0aW9ucy50cmFuc3BvcnQgPSBbb3B0aW9ucy50cmFuc3BvcnRdO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNBcnJheShvcHRpb25zLnRyYW5zcG9ydCkpIHtcbiAgICAgIHRocm93ICdHdW1lc2hvZTogVHJhbnNwb3J0IHByb3BlcnR5IG11c3QgYmUgYSBbU3RyaW5nXSBvciBbQXJyYXldLic7XG4gICAgfVxuXG4gICAgLy8gc3RvcmUgYSBjbGllbnQgaWQgdG8gaWRlbnRpZnkgYSBjbGllbnQgbG9uZy10ZXJtLiBHb29nbGUgQW5hbHl0aWNzIHVzZXNcbiAgICAvLyB0aGUgdmFsdWUsIGNvbWJpbmVkIHdpdGggb3RoZXIgZmFjdG9ycywgdG8gZGV0ZXJtaW5lIHVuaXF1ZSB1c2Vycy4gd2VcbiAgICAvLyBkdXBsaWNhdGUgdGhlIHNhbWUga2luZCBvZiB2YWx1ZSB0byBhc3Npc3QgR0EuXG4gICAgaWYgKCFjbGllbnRVdWlkKSB7XG4gICAgICBjbGllbnRVdWlkID0gdXVpZHY0KCk7XG4gICAgICBsb2NhbFN0b3JlKHsgY2xpZW50VXVpZDogY2xpZW50VXVpZCB9KTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmNsaWVudFV1aWQgPSBjbGllbnRVdWlkO1xuXG4gICAgc2Vzc2lvbihvcHRpb25zLnNlc3Npb25Gbik7XG5cbiAgICBndW1zaG9lLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgZnVuY3Rpb24gZWFjaCAob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmZvckVhY2ggJiYgb2JqLmZvckVhY2ggPT09IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSB7XG4gICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopID09PSB7fSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKSA9PT0ge30pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYXAgKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5wcm90b3R5cGUubWFwICYmIG9iai5tYXAgPT09IEFycmF5LnByb3RvdHlwZS5tYXApIHtcbiAgICAgIHJldHVybiBvYmoubWFwKGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoXSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdFBsdWdpbnMgKCkge1xuICAgIHZhciByZXN1bHQsXG4gICAgICBwbHVnaW5zID0gbmF2aWdhdG9yLnBsdWdpbnMgfHwgW107XG5cbiAgICByZXN1bHQgPSBtYXAocGx1Z2lucywgZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgdmFyIG1pbWVUeXBlcyA9IG1hcChwbHVnaW4sIGZ1bmN0aW9uIChtaW1lVHlwZSkge1xuICAgICAgICB2YXIgdHlwZSA9IG1pbWVUeXBlLnR5cGU7XG5cbiAgICAgICAgaWYgKG1pbWVUeXBlLnN1ZmZpeGVzKSB7XG4gICAgICAgICAgdHlwZSArPSAnficgKyBtaW1lVHlwZS5zdWZmaXhlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBwbHVnaW4uZGVzY3JpcHRpb24sXG4gICAgICAgIGZpbGVuYW1lOiBwbHVnaW4uZmlsZW5hbWUsXG4gICAgICAgIG1pbWVUeXBlczogbWltZVR5cGVzLFxuICAgICAgICBuYW1lOiBwbHVnaW4ubmFtZVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb2xsZWN0ICgpIHtcblxuICAgIGZ1bmN0aW9uIGdldFZpZXdwb3J0KCkge1xuICAgICAgdmFyIGUgPSB3aW5kb3csIGEgPSAnaW5uZXInO1xuICAgICAgaWYgKCEoJ2lubmVyV2lkdGgnIGluIHdpbmRvdyApKSB7XG4gICAgICAgIGEgPSAnY2xpZW50JztcbiAgICAgICAgZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgd2lkdGggOiBlWyBhKydXaWR0aCcgXSAsIGhlaWdodCA6IGVbIGErJ0hlaWdodCcgXSB9O1xuICAgIH1cblxuICAgIHZhciB2aWV3cG9ydCA9IGdldFZpZXdwb3J0KCksXG4gICAgICBxdWVyeSA9IHF1ZXJ5U3RyaW5nLnBhcnNlKGxvY2F0aW9uLnNlYXJjaCksXG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIC8vIHV0bWNzIENoYXJhY3RlciBzZXQgKGUuZy4gSVNPLTg4NTktMSlcbiAgICAgICAgY2hhcmFjdGVyU2V0OiBkb2N1bWVudC5jaGFyYWN0ZXJTZXQgfHwgZG9jdW1lbnQuY2hhcnNldCB8fCBkb2N1bWVudC5pbnB1dEVuY29kaW5nIHx8ICdVbmtub3duJyxcblxuICAgICAgICAvLyB1dG1zYyBTY3JlZW4gY29sb3VyIGRlcHRoIChlLmcuIDI0LWJpdClcbiAgICAgICAgY29sb3JEZXB0aDogc2NyZWVuLmNvbG9yRGVwdGggKyAnJyxcblxuICAgICAgICAvLyBnY2xpZCBHY2xpZCBpcyBhIGdsb2JhbGx5IHVuaXF1ZSB0cmFja2luZyBwYXJhbWV0ZXIgKEdvb2dsZSBDbGljayBJZGVudGlmaWVyKVxuICAgICAgICBnb29nbGVDbGlja0lkOiBxdWVyeS5nY2xpZCB8fCAnJyxcblxuICAgICAgICBoYXNoOiB3aW5kb3cubG9jYXRpb24uaGFzaCxcbiAgICAgICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3QsXG5cbiAgICAgICAgLy8gdXRtaG4gSG9zdG5hbWVcbiAgICAgICAgaG9zdE5hbWU6IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcblxuICAgICAgICAvLyB1dG1pcCBJUCBhZGRyZXNzXG4gICAgICAgIGlwQWRkcmVzczogJycsXG5cbiAgICAgICAgLy8gdXRtamUgSmF2YSBlbmFibGVkP1xuICAgICAgICBqYXZhRW5hYmxlZDogbmF2aWdhdG9yLmphdmFFbmFibGVkID8gbmF2aWdhdG9yLmphdmFFbmFibGVkKCkgOiBmYWxzZSxcblxuICAgICAgICAvLyB1dG11bCBMYW5ndWFnZSBjb2RlIChlLmcuIGVuLXVzKVxuICAgICAgICBsYW5ndWFnZTogd2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2UgfHwgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSB8fCAnVW5rbm93bicsXG5cbiAgICAgICAgLy8gbG9naW4ga2V5OiA/bGs9XG4gICAgICAgIGxvZ2luS2V5OiBxdWVyeS5sayB8fCAnJyxcblxuICAgICAgICAvLyBJRTkgZG9lc24ndCBzdXBwb3J0IHRoaXNcbiAgICAgICAgb3JpZ2luOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luIHx8ICcnLFxuXG4gICAgICAgIC8vIHV0bXAgIFBhZ2UgcGF0aFxuICAgICAgICBwYXRoOiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHBsYXRmb3JtOiB3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtLFxuICAgICAgICBwbHVnaW5zOiBjb2xsZWN0UGx1Z2lucygpLFxuICAgICAgICBwb3J0OiB3aW5kb3cubG9jYXRpb24ucG9ydCB8fCA4MCxcbiAgICAgICAgLy8gcHJvbW90aW9uYWwga2V5OiBwa2V5XG4gICAgICAgIHByb21vdGlvbktleTogcXVlcnkucGtleSB8fCAnJyxcbiAgICAgICAgcHJvdG9jb2w6IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCxcblxuICAgICAgICBxdWVyeVN0cmluZzogd2luZG93LmxvY2F0aW9uLnNlYXJjaCxcblxuICAgICAgICAvLyB1dG1yICBGdWxsIHJlZmVycmFsIFVSTFxuICAgICAgICByZWZlcmVyOiBkb2N1bWVudC5yZWZlcnJlcixcblxuICAgICAgICBzY3JlZW5BdmFpbEhlaWdodDogc2NyZWVuLmF2YWlsSGVpZ2h0LFxuICAgICAgICBzY3JlZW5BdmFpbFdpZHRoOiBzY3JlZW4uYXZhaWxXaWR0aCxcbiAgICAgICAgc2NyZWVuSGVpZ2h0OiBzY3JlZW4uaGVpZ2h0LFxuICAgICAgICBzY3JlZW5PcmllbnRhdGlvbkFuZ2xlOiAnJyxcbiAgICAgICAgc2NyZWVuT3JpZW50YXRpb25UeXBlOiAnJyxcbiAgICAgICAgc2NyZWVuUGl4ZWxEZXB0aDogc2NyZWVuLnBpeGVsRGVwdGggKyAnJyxcbiAgICAgICAgLy8gdXRtc3IgU2NyZWVuIHJlc29sdXRpb25cbiAgICAgICAgc2NyZWVuUmVzb2x1dGlvbjogc2NyZWVuLndpZHRoICsgJ3gnICsgc2NyZWVuLmhlaWdodCxcbiAgICAgICAgc2NyZWVuV2lkdGg6IHNjcmVlbi53aWR0aCxcblxuICAgICAgICAvLyB1dG1kdCBQYWdlIHRpdGxlXG4gICAgICAgIHRpdGxlOiBkb2N1bWVudC50aXRsZSxcblxuICAgICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgICB1c2VyQWdlbnQ6IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgICB1dG1DYW1wYWlnbjogcXVlcnkudXRtX2NhbXBhaWduIHx8ICcnLFxuICAgICAgICB1dG1Db250ZW50OiBxdWVyeS51dG1fY29udGVudCB8fCAnJyxcbiAgICAgICAgdXRtTWVkaXVtOiBxdWVyeS51dG1fbWVkaXVtIHx8ICcnLFxuICAgICAgICB1dG1Tb3VyY2U6IHF1ZXJ5LnV0bV9zb3VyY2UgfHwgJycsXG4gICAgICAgIHV0bVRlcm06IHF1ZXJ5LnV0bV90ZXJtIHx8ICcnLFxuXG4gICAgICAgIC8vIHV0bXZwIFZpZXdwb3J0IHJlc29sdXRpb25cbiAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICAgICAgdmlld3BvcnRSZXNvbHV0aW9uOiB2aWV3cG9ydC53aWR0aCArICd4JyArIHZpZXdwb3J0LmhlaWdodCxcbiAgICAgICAgdmlld3BvcnRXaWR0aDogdmlld3BvcnQud2lkdGhcbiAgICAgIH0sXG5cbiAgICAgIGludEZpZWxkcyA9IFtcbiAgICAgICAgJ3BvcnQnLCAnc2NyZWVuQXZhaWxIZWlnaHQnLCAnc2NyZWVuQXZhaWxXaWR0aCcsICdzY3JlZW5IZWlnaHQnLFxuICAgICAgICAnc2NyZWVuT3JpZW50YXRpb25BbmdsZScsICdzY3JlZW5XaWR0aCcsICd2aWV3cG9ydEhlaWdodCcsICd2aWV3cG9ydFdpZHRoJ1xuICAgICAgXSxcbiAgICAgIHByb3AsXG4gICAgICB2YWx1ZTtcblxuICAgIC8vIHNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCBuYXZpZ2F0b3IuamF2YUVuYWJsZWQoKSwgaXQncyBhbHdheXMgdW5kZWZpbmVkLlxuICAgIGlmIChyZXN1bHQuamF2YUVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmphdmFFbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSUUgOCwgOSBkb24ndCBzdXBwb3J0IHRoaXMuIFlheS5cbiAgICBpZiAoc2NyZWVuLm9yaWVudGF0aW9uKSB7XG4gICAgICByZXN1bHQuc2NyZWVuT3JpZW50YXRpb25BbmdsZSA9IHBhcnNlSW50KHNjcmVlbi5vcmllbnRhdGlvbi5hbmdsZSA/IHNjcmVlbi5vcmllbnRhdGlvbi5hbmdsZSA6ICcwJyk7XG4gICAgICByZXN1bHQuc2NyZWVuT3JpZW50YXRpb25UeXBlID0gc2NyZWVuLm9yaWVudGF0aW9uLnR5cGUgPyBzY3JlZW4ub3JpZW50YXRpb24udHlwZSA6ICcnO1xuXG4gICAgICBpZiAoaXNOYU4ocmVzdWx0LnNjcmVlbk9yaWVudGF0aW9uQW5nbGUpKSB7XG4gICAgICAgIHJlc3VsdC5zY3JlZW5PcmllbnRhdGlvbkFuZ2xlID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIGludHNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludEZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgcHJvcCA9IGludEZpZWxkc1tpXTtcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQocmVzdWx0W3Byb3BdKTtcblxuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBzZXNzaW9uXG4gICAqXG4gICAqIEBub3RlXG4gICAqIEd1bXNob2UgU2Vzc2lvbiBSdWxlc1xuICAgKlxuICAgKiAgR2VuZXJhdGUgYSBuZXcgU2Vzc2lvbiBJRCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjcml0ZXJpYSBhcmUgbWV0OlxuICAgKlxuICAgKiAgMS4gVXNlciBvcGVucyBuZXcgdGFiIG9yIHdpbmRvdyAoYnJvd3NlciBkZWZhdWx0IGJlaGF2aW9yKVxuICAgKiAgMi4gVXNlciBoYXMgYmVlbiBpbmFjdGl2ZSBsb25nZXIgdGhhbiAzMCBtaW51dGVzXG4gICAqICAzLiBVc2VyIGhhcyB2aXNpdGVkIHdpdGhpbmluIHRoZSBzYW1lIHNlc3Npb24sIGJ1dCBhIFVUTVxuICAgKiAgICAgcXVlcnkgc3RyaW5nIHBhcmFtZXRlciBoYXMgY2hhbmdlZC5cbiAgICovXG4gIGZ1bmN0aW9uIHNlc3Npb24gKGZuKSB7XG5cbiAgICAvLyByZXR1cm5zIGEgc2ltcGxlIG9iamVjdCBjb250YWluaW5nIHV0bSBwYXJhbWV0ZXJzXG4gICAgZnVuY3Rpb24gZ2V0VXRtICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbXBhaWduOiBxdWVyeS51dG1fY2FtcGFpZ24gfHwgJycsXG4gICAgICAgIG1lZGl1bTogcXVlcnkudXRtX21lZGl1bSB8fCAnJyxcbiAgICAgICAgc291cmNlOiBxdWVyeS51dG1fc291cmNlIHx8ICcnLFxuICAgICAgICB1dG1UZXJtOiBxdWVyeS51dG1fdGVybSB8fCAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSxcbiAgICAgIHF1ZXJ5ID0gcXVlcnlTdHJpbmcucGFyc2UobG9jYXRpb24uc2VhcmNoKSxcbiAgICAgIGxhc3RVdG0gPSBzdG9yYWdlKCd1dG0nKSB8fCBnZXRVdG0oKSxcbiAgICAgIHV0bSA9IGdldFV0bSgpLFxuICAgICAgdGltZXN0YW1wLFxuICAgICAgZGlmZmVyZW5jZTtcblxuICAgIC8vIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHV0bSBwYXJhbWV0ZXJzXG4gICAgc3RvcmFnZSgndXRtJywgdXRtKTtcblxuICAgIC8vIHNldCBhIHNlc3Npb24gYmFzZWQgdXVpZFxuICAgIGlmICghc3RvcmFnZSgndXVpZCcpKSB7XG4gICAgICBzdG9yYWdlKCd1dWlkJywgdXVpZHY0KCkpO1xuICAgICAgc3RvcmFnZSgndGltZXN0YW1wJywgbm93KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aW1lc3RhbXAgPSBzdG9yYWdlKCd0aW1lc3RhbXAnKTtcbiAgICAgIGRpZmZlcmVuY2UgPSBub3cgLSB0aW1lc3RhbXA7XG5cbiAgICAgIGlmIChmbikge1xuICAgICAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gICAgICAgIGlmIChmbi5jYWxsKHRoaXMsIHRpbWVzdGFtcCwgZGlmZmVyZW5jZSwgcXVlcnkpKSB7XG4gICAgICAgICAgc3RvcmFnZSgndXVpZCcsIHV1aWR2NCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkobGFzdFV0bSkgIT09IEpTT04uc3RyaW5naWZ5KHV0bSkgfHwgZGlmZmVyZW5jZSA+ICgxMDAwICogNjAgKiAzMCkpIHtcbiAgICAgICAgc3RvcmFnZSgndXVpZCcsIHV1aWR2NCgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZW5kKGV2ZW50TmFtZSwgZXZlbnREYXRhKSB7XG4gICAgdmFyIHBhZ2VEYXRhID0gY29sbGVjdCgpLFxuICAgICAgYmFzZURhdGEgPSB7XG4gICAgICAgIGNsaWVudFV1aWQ6IGd1bXNob2Uub3B0aW9ucy5jbGllbnRVdWlkLFxuICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnREYXRhOiBldmVudERhdGEgfHwge30sXG4gICAgICAgIGd1bXNob2U6ICcwLjguMScsXG4gICAgICAgIHBhZ2VEYXRhOiBwYWdlRGF0YSxcbiAgICAgICAgc2Vzc2lvblV1aWQ6IHN0b3JhZ2UoJ3V1aWQnKSxcbiAgICAgICAgdGltZXN0YW1wOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpLFxuICAgICAgICB0aW1lem9uZU9mZnNldDogKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAgICAgIHV1aWQ6IHV1aWR2NCgpXG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0Rm91bmQgPSBmYWxzZTtcblxuICAgIC8vIHNpbmNlIHdlJ3JlIGRlYWxpbmcgd2l0aCB0aW1lb3V0cyBub3csIHdlIG5lZWQgdG8gcmVhc3NlcnQgdGhlXG4gICAgLy8gc2Vzc2lvbiBJRCBmb3IgZWFjaCBldmVudCBzZW50LlxuICAgIHNlc3Npb24oZ3Vtc2hvZS5vcHRpb25zLnNlc3Npb25Gbik7XG5cbiAgICBpZiAoZ3Vtc2hvZS5vcHRpb25zLnRyYW5zcG9ydCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndW1zaG9lLm9wdGlvbnMudHJhbnNwb3J0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc3BvcnROYW1lID0gZ3Vtc2hvZS5vcHRpb25zLnRyYW5zcG9ydFtpXSxcbiAgICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgICAgZGF0YTtcblxuICAgICAgICBpZiAodHJhbnNwb3J0TmFtZSAmJiB0cmFuc3BvcnRzW3RyYW5zcG9ydE5hbWVdKSB7XG4gICAgICAgICAgdHJhbnNwb3J0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgIHRyYW5zcG9ydCA9IHRyYW5zcG9ydHNbdHJhbnNwb3J0TmFtZV07XG5cbiAgICAgICAgICAvLyBhbGxvdyBlYWNoIHRyYW5zcG9ydCB0byBleHRlbmQgdGhlIGRhdGEgd2l0aCBtb3JlIGluZm9ybWF0aW9uXG4gICAgICAgICAgLy8gb3IgdHJhbnNmb3JtIGl0IGhvdyB0aGV5J2QgbGlrZS4gdHJhbnNwb3J0cyBjYW5ub3QgaG93ZXZlcixcbiAgICAgICAgICAvLyBtb2RpZnkgZXZlbnREYXRhIHNlbnQgZnJvbSB0aGUgY2xpZW50LlxuICAgICAgICAgIGRhdGEgPSB0cmFuc3BvcnQubWFwID8gdHJhbnNwb3J0Lm1hcChiYXNlRGF0YSkgOiBiYXNlRGF0YTtcblxuICAgICAgICAgIC8vIGV4dGVuZCBvdXIgZGF0YSB3aXRoIHdoYXRldmVyIGNhbWUgYmFjayBmcm9tIHRoZSB0cmFuc3BvcnRcbiAgICAgICAgICBkYXRhID0gZXh0ZW5kKGJhc2VEYXRhLCBkYXRhKTtcblxuICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzLiBndW1zaG9lIHNob3VsZG4ndCBjYXJlIHdoYXQgZm9ybWF0IHRoaXMgaXMgaW5cbiAgICAgICAgICBpZiAoIWlzU3RyaW5nKGRhdGEuZXZlbnREYXRhKSkge1xuICAgICAgICAgICAgZGF0YS5ldmVudERhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhLmV2ZW50RGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMuIGd1bXNob2Ugc2hvdWxkbid0IGNhcmUgd2hhdCBmb3JtYXQgdGhpcyBpcyBpblxuICAgICAgICAgIGlmICghaXNTdHJpbmcoZGF0YS5wYWdlRGF0YS5wbHVnaW5zKSkge1xuICAgICAgICAgICAgZGF0YS5wYWdlRGF0YS5wbHVnaW5zID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5wYWdlRGF0YS5wbHVnaW5zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcy4gdGVtcG9yYXJ5IGJ1Z2ZpeCBmb3IgYXBwc1xuICAgICAgICAgIGlmICghZGF0YS5wYWdlRGF0YS5pcEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGRhdGEucGFnZURhdGEuaXBBZGRyZXNzID0gJzx1bmtub3duPic7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaEV2ZW50KGV2ZW50TmFtZSwgdHJhbnNwb3J0TmFtZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhyb3cgJ0d1bXNob2U6IFRoZSB0cmFuc3BvcnQgbmFtZTogJyArIHRyYW5zcG9ydE5hbWUgKyAnLCBkb2VzblxcJ3QgbWFwIHRvIGEgdmFsaWQgdHJhbnNwb3J0Lic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKmlmICghdHJhbnNwb3J0Rm91bmQpIHtcbiAgICAgIHRocm93ICdHdW1zaG9lOiBObyB2YWxpZCB0cmFuc3BvcnRzIHdlcmUgZm91bmQuJztcbiAgICB9Ki9cbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHRFdmVudCAoKSB7XG5cbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGdyYW5iIHRoZSBuZXh0IGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQuXG4gICAgdmFyIG5ldmVudCA9IHF1ZXVlLnNoaWZ0KCksXG4gICAgICB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW25ldmVudC50cmFuc3BvcnROYW1lXTtcblxuICAgIHN0b3JhZ2UoJ3F1ZXVlJywgcXVldWUpO1xuICAgIHRyYW5zcG9ydC5zZW5kKG5ldmVudC5kYXRhLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgIC8vIHdlIGNhcmUgaWYgYW4gZXJyb3Igd2FzIHRocm93biwgY3JlYXRlZCwgb3IgY2FwdHVyZWRcbiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBhZGQgdGhlIGl0ZW0gYmFjayBpbnRvIHRoZSBxdWV1ZVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0d1bXNob2U6IFJldHJ5aW5nLiBFcnJvciByZWNlaXZlZCBmcm9tIHRyYW5zcG9ydDogJyArIG5ldmVudC50cmFuc3BvcnROYW1lICsgJywgZm9yIGV2ZW50OiAnICsgbmV2ZW50LmV2ZW50TmFtZSk7XG4gICAgICAgIHF1ZXVlLnB1c2gobmV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQobmV4dEV2ZW50LCBndW1zaG9lLm9wdGlvbnMucXVldWVUaW1lb3V0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2hFdmVudCAoZXZlbnROYW1lLCB0cmFuc3BvcnROYW1lLCBkYXRhKSB7XG4gICAgdmFyIHRyYW5zcG9ydDtcblxuICAgIC8vIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGZha2Ugc3RvcmFnZSBvYmplY3RcbiAgICAvLyAoZWcuIHNlc3Npb25TdG9yYWdlIGlzbid0IGF2YWlsYWJsZSkgdGhlbiBkb24ndFxuICAgIC8vIGV2ZW4gYm90aGVyIHF1ZXVlaW5nIHRoZSBkYXRhLlxuICAgIGlmIChzdG9yYWdlLmlzRmFrZSgpKSB7XG4gICAgICB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW3RyYW5zcG9ydE5hbWVdO1xuICAgICAgdHJhbnNwb3J0LnNlbmQoZGF0YSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhZGQgdGhlIGV2ZW50IGRhdGEgdG8gdGhlIHF1ZXVlXG4gICAgcXVldWUucHVzaCh7XG4gICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSxcbiAgICAgIHRyYW5zcG9ydE5hbWU6IHRyYW5zcG9ydE5hbWUsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG5cbiAgICAvLyBwdXQgb3VyIG5ld2x5IG1vZGlmaWVkIHF1ZXVlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIHN0b3JhZ2UoJ3F1ZXVlJywgcXVldWUpO1xuXG4gICAgc2V0VGltZW91dChuZXh0RXZlbnQsIGd1bXNob2Uub3B0aW9ucy5xdWV1ZVRpbWVvdXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNwb3J0ICh0cCkge1xuICAgIGlmICghdHAubmFtZSkge1xuICAgICAgdGhyb3cgJ0d1bXNob2U6IFRyYW5zcG9ydCBbT2JqZWN0XSBtdXN0IGhhdmUgYSBuYW1lIGRlZmluZWQuJztcbiAgICB9XG5cbiAgICB0cmFuc3BvcnRzW3RwLm5hbWVdID0gdHA7XG4gIH1cblxuICAvLyBzZXR1cCBzb21lIHN0YXRpYyBwcm9wZXJ0aWVzXG4gIGd1bXNob2UudmVyc2lvbiA9ICcwLjguMSc7XG4gIGd1bXNob2Uub3B0aW9ucyA9IHt9O1xuXG4gIC8vIHNldHVwIHNvbWUgc3RhdGljIG1ldGhvZHNcbiAgZ3Vtc2hvZS5leHRlbmQgPSBleHRlbmQ7XG4gIGd1bXNob2UucmVxd2VzdCA9IGNvbnRleHQucmVxd2VzdDtcbiAgZ3Vtc2hvZS5zZW5kID0gc2VuZDtcbiAgZ3Vtc2hvZS50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gIGd1bXNob2UudXVpZCA9IHV1aWR2NDtcblxuICAvLyBzZXR1cCBzb21lIGludGVybmFsIHN0dWZmIGZvciBhY2Nlc3NcbiAgZ3Vtc2hvZS5fID0ge1xuICAgIGNvbGxlY3Q6IGNvbGxlY3QsXG4gICAgbG9jYWxTdG9yYWdlOiBsb2NhbFN0b3JlLFxuICAgIHF1ZXJ5U3RyaW5nOiBxdWVyeVN0cmluZyxcbiAgICBxdWV1ZTogcXVldWUsXG4gICAgc3RvcmFnZTogc3RvcmFnZSxcbiAgICB0cmFuc3BvcnRzOiB0cmFuc3BvcnRzXG4gIH07XG5cbiAgcmV0dXJuIGd1bXNob2U7XG5cbiAgLypcbiAgaWYgKHJvb3QuZ3Vtc2hvZSkge1xuICAgIGlmIChyb290Lmd1bXNob2UucmVhZHkpIHtcbiAgICAgIHJvb3QuZ3Vtc2hvZS5yZWFkeSA9IGd1bXNob2UucmVhZHkgPSByb290Lmd1bXNob2UucmVhZHk7XG4gICAgICByb290Lmd1bXNob2UgPSBndW1zaG9lO1xuXG4gICAgICBpZiAoIWlzRnVuY3Rpb24ocm9vdC5ndW1zaG9lLnJlYWR5LnJlc29sdmUpKSB7XG4gICAgICAgIHRocm93ICdHdW1zaG9lOiBndW1zaG9lLnJlYWR5IHdhcyBwcmVkZWZpbmVkLCBidXQgaXMgbm90IGEgUHJvbWlzZS9BIGRlZmVycmVkLic7XG4gICAgICB9XG5cbiAgICAgIHJvb3QuZ3Vtc2hvZS5yZWFkeS5yZXNvbHZlKCk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHJvb3QuZ3Vtc2hvZSA9IGd1bXNob2U7XG4gIH1cbiAgKi9cblxufVxuXG5leHBvcnQgZGVmYXVsdCBndW1zaG9lRmFjdG9yeTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2xpYnMvZ3Vtc2hvZS5qcyIsInZhciBjb3JlID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpO1xudmFyICRKU09OID0gY29yZS5KU09OIHx8IChjb3JlLkpTT04gPSB7IHN0cmluZ2lmeTogSlNPTi5zdHJpbmdpZnkgfSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiAkSlNPTi5zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3VtZW50cyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5LmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX3drcy1leHQnKS5mKCdpdGVyYXRvcicpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qc1xuLy8gbW9kdWxlIGlkID0gOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN5bWJvbDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIE1FVEEgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciB3a3NEZWZpbmUgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBfY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdPUE5FeHQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKTtcbnZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUEQgPSAkR09QRC5mO1xudmFyIGRQID0gJERQLmY7XG52YXIgZ09QTiA9IGdPUE5FeHQuZjtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IGdsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciBVU0VfTkFUSVZFID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcbnZhciBRT2JqZWN0ID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmVhdGUoZFAoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZFAodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKGl0LCBrZXksIEQpIHtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmIChwcm90b0Rlc2MpIGRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBkUChpdCwga2V5LCBEKTtcbiAgaWYgKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pIGRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCkge1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvKSAkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUQuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXMoaXQsIEhJRERFTikpIGRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSBpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHsgZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCkge1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSk7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGwgPiBpKSAkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKSB7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KSB7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICBpdCA9IHRvSU9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIEQgPSBnT1BEKGl0LCBrZXkpO1xuICBpZiAoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSBELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHZhciBuYW1lcyA9IGdPUE4odG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICB2YXIgSVNfT1AgPSBpdCA9PT0gT2JqZWN0UHJvdG87XG4gIHZhciBuYW1lcyA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSkgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8pICRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmIChoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBzZXR0ZXIpIHNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldCB9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICAkR09QRC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJERQLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSkge1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgU3ltYm9sOiAkU3ltYm9sIH0pO1xuXG5mb3IgKHZhciBlczZTeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGogPSAwOyBlczZTeW1ib2xzLmxlbmd0aCA+IGo7KXdrcyhlczZTeW1ib2xzW2orK10pO1xuXG5mb3IgKHZhciB3ZWxsS25vd25TeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIHdrc0RlZmluZSh3ZWxsS25vd25TeW1ib2xzW2srK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICAgIGZvciAodmFyIGtleSBpbiBTeW1ib2xSZWdpc3RyeSkgaWYgKFN5bWJvbFJlZ2lzdHJ5W2tleV0gPT09IHN5bSkgcmV0dXJuIGtleTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8ICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHsgYTogUyB9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHtcbiAgICB2YXIgYXJncyA9IFtpdF07XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICAkcmVwbGFjZXIgPSByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgJHJlcGxhY2VyID09ICdmdW5jdGlvbicpIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdIHx8IHJlcXVpcmUoJy4vX2hpZGUnKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zeW1ib2wuanNcbi8vIG1vZHVsZSBpZCA9IDEwMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBnZXRLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gcElFLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0ta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDEwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4odG9JT2JqZWN0KGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qc1xuLy8gbW9kdWxlIGlkID0gMTA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanNcbi8vIG1vZHVsZSBpZCA9IDEwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnYXN5bmNJdGVyYXRvcicpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdvYnNlcnZhYmxlJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8qISBodHRwOi8vbXRocy5iZS9iYXNlNjQgdjAuMS4wIGJ5IEBtYXRoaWFzIHwgTUlUIGxpY2Vuc2UgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlcyBgZXhwb3J0c2AuXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHM7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuXG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHRtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cyAmJiBtb2R1bGU7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAsIGZyb20gTm9kZS5qcyBvciBCcm93c2VyaWZpZWQgY29kZSwgYW5kIHVzZVxuXHQvLyBpdCBhcyBgcm9vdGAuXG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIEludmFsaWRDaGFyYWN0ZXJFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHR9O1xuXHRJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yO1xuXHRJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnSW52YWxpZENoYXJhY3RlckVycm9yJztcblxuXHR2YXIgZXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0Ly8gTm90ZTogdGhlIGVycm9yIG1lc3NhZ2VzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGZpbGUgbWF0Y2ggdGhvc2UgdXNlZCBieVxuXHRcdC8vIHRoZSBuYXRpdmUgYGF0b2JgL2BidG9hYCBpbXBsZW1lbnRhdGlvbiBpbiBDaHJvbWl1bS5cblx0XHR0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckVycm9yKG1lc3NhZ2UpO1xuXHR9O1xuXG5cdHZhciBUQUJMRSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblx0Ly8gaHR0cDovL3doYXR3Zy5vcmcvaHRtbC9jb21tb24tbWljcm9zeW50YXhlcy5odG1sI3NwYWNlLWNoYXJhY3RlclxuXHR2YXIgUkVHRVhfU1BBQ0VfQ0hBUkFDVEVSUyA9IC9bXFx0XFxuXFxmXFxyIF0vZztcblxuXHQvLyBgZGVjb2RlYCBpcyBkZXNpZ25lZCB0byBiZSBmdWxseSBjb21wYXRpYmxlIHdpdGggYGF0b2JgIGFzIGRlc2NyaWJlZCBpbiB0aGVcblx0Ly8gSFRNTCBTdGFuZGFyZC4gaHR0cDovL3doYXR3Zy5vcmcvaHRtbC93ZWJhcHBhcGlzLmh0bWwjZG9tLXdpbmRvd2Jhc2U2NC1hdG9iXG5cdC8vIFRoZSBvcHRpbWl6ZWQgYmFzZTY0LWRlY29kaW5nIGFsZ29yaXRobSB1c2VkIGlzIGJhc2VkIG9uIEBhdGvigJlzIGV4Y2VsbGVudFxuXHQvLyBpbXBsZW1lbnRhdGlvbi4gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vYXRrLzEwMjAzOTZcblx0dmFyIGRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0aW5wdXQgPSBTdHJpbmcoaW5wdXQpXG5cdFx0XHQucmVwbGFjZShSRUdFWF9TUEFDRV9DSEFSQUNURVJTLCAnJyk7XG5cdFx0dmFyIGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0XHRpZiAobGVuZ3RoICUgNCA9PSAwKSB7XG5cdFx0XHRpbnB1dCA9IGlucHV0LnJlcGxhY2UoLz09PyQvLCAnJyk7XG5cdFx0XHRsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdGxlbmd0aCAlIDQgPT0gMSB8fFxuXHRcdFx0Ly8gaHR0cDovL3doYXR3Zy5vcmcvQyNhbHBoYW51bWVyaWMtYXNjaWktY2hhcmFjdGVyc1xuXHRcdFx0L1teK2EtekEtWjAtOS9dLy50ZXN0KGlucHV0KVxuXHRcdCkge1xuXHRcdFx0ZXJyb3IoXG5cdFx0XHRcdCdJbnZhbGlkIGNoYXJhY3RlcjogdGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4nXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR2YXIgYml0Q291bnRlciA9IDA7XG5cdFx0dmFyIGJpdFN0b3JhZ2U7XG5cdFx0dmFyIGJ1ZmZlcjtcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0dmFyIHBvc2l0aW9uID0gLTE7XG5cdFx0d2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHtcblx0XHRcdGJ1ZmZlciA9IFRBQkxFLmluZGV4T2YoaW5wdXQuY2hhckF0KHBvc2l0aW9uKSk7XG5cdFx0XHRiaXRTdG9yYWdlID0gYml0Q291bnRlciAlIDQgPyBiaXRTdG9yYWdlICogNjQgKyBidWZmZXIgOiBidWZmZXI7XG5cdFx0XHQvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCBvZiA0IGNoYXJhY3RlcnPigKZcblx0XHRcdGlmIChiaXRDb3VudGVyKysgJSA0KSB7XG5cdFx0XHRcdC8vIOKApmNvbnZlcnQgdGhlIGZpcnN0IDggYml0cyB0byBhIHNpbmdsZSBBU0NJSSBjaGFyYWN0ZXIuXG5cdFx0XHRcdG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuXHRcdFx0XHRcdDB4RkYgJiBiaXRTdG9yYWdlID4+ICgtMiAqIGJpdENvdW50ZXIgJiA2KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9O1xuXG5cdC8vIGBlbmNvZGVgIGlzIGRlc2lnbmVkIHRvIGJlIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBgYnRvYWAgYXMgZGVzY3JpYmVkIGluIHRoZVxuXHQvLyBIVE1MIFN0YW5kYXJkOiBodHRwOi8vd2hhdHdnLm9yZy9odG1sL3dlYmFwcGFwaXMuaHRtbCNkb20td2luZG93YmFzZTY0LWJ0b2Fcblx0dmFyIGVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0aW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuXHRcdGlmICgvW15cXDAtXFx4RkZdLy50ZXN0KGlucHV0KSkge1xuXHRcdFx0Ly8gTm90ZTogbm8gbmVlZCB0byBzcGVjaWFsLWNhc2UgYXN0cmFsIHN5bWJvbHMgaGVyZSwgYXMgc3Vycm9nYXRlcyBhcmVcblx0XHRcdC8vIG1hdGNoZWQsIGFuZCB0aGUgaW5wdXQgaXMgc3VwcG9zZWQgdG8gb25seSBjb250YWluIEFTQ0lJIGFueXdheS5cblx0XHRcdGVycm9yKFxuXHRcdFx0XHQnVGhlIHN0cmluZyB0byBiZSBlbmNvZGVkIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZSBvZiB0aGUgJyArXG5cdFx0XHRcdCdMYXRpbjEgcmFuZ2UuJ1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0dmFyIHBhZGRpbmcgPSBpbnB1dC5sZW5ndGggJSAzO1xuXHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHR2YXIgcG9zaXRpb24gPSAtMTtcblx0XHR2YXIgYTtcblx0XHR2YXIgYjtcblx0XHR2YXIgYztcblx0XHR2YXIgZDtcblx0XHR2YXIgYnVmZmVyO1xuXHRcdC8vIE1ha2Ugc3VyZSBhbnkgcGFkZGluZyBpcyBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIGxvb3AuXG5cdFx0dmFyIGxlbmd0aCA9IGlucHV0Lmxlbmd0aCAtIHBhZGRpbmc7XG5cblx0XHR3aGlsZSAoKytwb3NpdGlvbiA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gUmVhZCB0aHJlZSBieXRlcywgaS5lLiAyNCBiaXRzLlxuXHRcdFx0YSA9IGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24pIDw8IDE2O1xuXHRcdFx0YiA9IGlucHV0LmNoYXJDb2RlQXQoKytwb3NpdGlvbikgPDwgODtcblx0XHRcdGMgPSBpbnB1dC5jaGFyQ29kZUF0KCsrcG9zaXRpb24pO1xuXHRcdFx0YnVmZmVyID0gYSArIGIgKyBjO1xuXHRcdFx0Ly8gVHVybiB0aGUgMjQgYml0cyBpbnRvIGZvdXIgY2h1bmtzIG9mIDYgYml0cyBlYWNoLCBhbmQgYXBwZW5kIHRoZVxuXHRcdFx0Ly8gbWF0Y2hpbmcgY2hhcmFjdGVyIGZvciBlYWNoIG9mIHRoZW0gdG8gdGhlIG91dHB1dC5cblx0XHRcdG91dHB1dCArPSAoXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMTggJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMTIgJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gNiAmIDB4M0YpICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciAmIDB4M0YpXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChwYWRkaW5nID09IDIpIHtcblx0XHRcdGEgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKSA8PCA4O1xuXHRcdFx0YiA9IGlucHV0LmNoYXJDb2RlQXQoKytwb3NpdGlvbik7XG5cdFx0XHRidWZmZXIgPSBhICsgYjtcblx0XHRcdG91dHB1dCArPSAoXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMTApICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KChidWZmZXIgPj4gNCkgJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdCgoYnVmZmVyIDw8IDIpICYgMHgzRikgK1xuXHRcdFx0XHQnPSdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChwYWRkaW5nID09IDEpIHtcblx0XHRcdGJ1ZmZlciA9IGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xuXHRcdFx0b3V0cHV0ICs9IChcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciA+PiAyKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdCgoYnVmZmVyIDw8IDQpICYgMHgzRikgK1xuXHRcdFx0XHQnPT0nXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH07XG5cblx0dmFyIGJhc2U2NCA9IHtcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCdkZWNvZGUnOiBkZWNvZGUsXG5cdFx0J3ZlcnNpb24nOiAnMC4xLjAnXG5cdH07XG5cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gYmFzZTY0O1xuXHRcdH0pO1xuXHR9XHRlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiAhZnJlZUV4cG9ydHMubm9kZVR5cGUpIHtcblx0XHRpZiAoZnJlZU1vZHVsZSkgeyAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gYmFzZTY0O1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gYmFzZTY0KSB7XG5cdFx0XHRcdGJhc2U2NC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gYmFzZTY0W2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHsgLy8gaW4gUmhpbm8gb3IgYSB3ZWIgYnJvd3NlclxuXHRcdHJvb3QuYmFzZTY0ID0gYmFzZTY0O1xuXHR9XG5cbn0odGhpcykpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFzZS02NC9iYXNlNjQuanNcbi8vIG1vZHVsZSBpZCA9IDEwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XHJcblx0aWYoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcclxuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0bW9kdWxlLnBhdGhzID0gW107XHJcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdGlmKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xyXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0fVxyXG5cdHJldHVybiBtb2R1bGU7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMTA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ25cIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnbi5qc1xuLy8gbW9kdWxlIGlkID0gMTEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmFzc2lnbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7IGFzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDExMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgUyA9IFN5bWJvbCgpO1xuICB2YXIgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICB3aGlsZSAoYUxlbiA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikgaWYgKGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpIFRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1hc3NpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDExM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciB0cmltID0gcmVxdWlyZSgndHJpbScpXG4gICwgZm9yRWFjaCA9IHJlcXVpcmUoJ2Zvci1lYWNoJylcbiAgLCBpc0FycmF5ID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gIGlmICghaGVhZGVycylcbiAgICByZXR1cm4ge31cblxuICB2YXIgcmVzdWx0ID0ge31cblxuICBmb3JFYWNoKFxuICAgICAgdHJpbShoZWFkZXJzKS5zcGxpdCgnXFxuJylcbiAgICAsIGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcm93LmluZGV4T2YoJzonKVxuICAgICAgICAgICwga2V5ID0gdHJpbShyb3cuc2xpY2UoMCwgaW5kZXgpKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLCB2YWx1ZSA9IHRyaW0ocm93LnNsaWNlKGluZGV4ICsgMSkpXG5cbiAgICAgICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmVzdWx0W2tleV0pKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IFsgcmVzdWx0W2tleV0sIHZhbHVlIF1cbiAgICAgICAgfVxuICAgICAgfVxuICApXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvcGFyc2UtaGVhZGVycy5qc1xuLy8gbW9kdWxlIGlkID0gMTE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvdHJpbS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCdpcy1mdW5jdGlvbicpXG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaFxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbmZ1bmN0aW9uIGZvckVhY2gobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oaXRlcmF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzXG4gICAgfVxuICAgIFxuICAgIGlmICh0b1N0cmluZy5jYWxsKGxpc3QpID09PSAnW29iamVjdCBBcnJheV0nKVxuICAgICAgICBmb3JFYWNoQXJyYXkobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG4gICAgZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKVxuICAgICAgICBmb3JFYWNoU3RyaW5nKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2VcbiAgICAgICAgZm9yRWFjaE9iamVjdChsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbn1cblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgaSkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgYXJyYXlbaV0sIGksIGFycmF5KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgYSBzcGFyc2Ugc3RyaW5nLlxuICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgaykpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqZWN0W2tdLCBrLCBvYmplY3QpXG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHN0cmluZyA9IHRvU3RyaW5nLmNhbGwoZm4pXG4gIHJldHVybiBzdHJpbmcgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHxcbiAgICAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHN0cmluZyAhPT0gJ1tvYmplY3QgUmVnRXhwXScpIHx8XG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgIC8vIElFOCBhbmQgYmVsb3dcbiAgICAgKGZuID09PSB3aW5kb3cuc2V0VGltZW91dCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5hbGVydCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5jb25maXJtIHx8XG4gICAgICBmbiA9PT0gd2luZG93LnByb21wdCkpXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaXMtZnVuY3Rpb24vaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsImltcG9ydCBYTUxIdHRwUmVxdWVzdFByb21pc2UgZnJvbSAnLi4vbGlicy94aHItcHJvbWlzZSc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIEEgc2luZ2xlIHVzZXIgb2JqZWN0IGFzIGZyb20ge0BsaW5rIGdldFR3aXRjaFVzZXJzfS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUd2l0Y2hVc2VyXG5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBfaWQgLSBUaGUgVHdpdGNoIElEIG9mIHRoZSB1c2VyLiBVbml2ZXJzYWxseSB1bmlxdWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmlvIC0gQSBkZXNjcmlwdGlvbiBvZiB0aGUgdXNlciBwcm92aWRlZCBieSB0aGUgdXNlci4gTWF5IGJlIGVtcHR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0ZWRfYXQgLSBBIHRpbWVzdGFtcCBvZiB0aGUgdXNlciBhY2NvdW50IGNyZWF0aW9uIHRpbWUgaW4gSVNPIDg2MDFcbiAqIGZvcm1hdDogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlfbmFtZSAtIEEgdXNlciBmb3JtYXR0ZWQgdmVyc2lvbiBvZiB0aGVpciB1c2VybmFtZSBmb3IgZGlzcGxheS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2dvIC0gQSBVUkwgdG8gYSBUd2l0Y2gtaG9zdGVkIHZlcnNpb24gb2YgdGhpcyB1c2VyJ3MgbG9nby5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVXNlcidzIHVzZXJuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBUaGUgdXNlcidzIFwidHlwZVwiIG9uIFR3aXRjaC5cbiAqIE9uZSBvZiBbXCJ1c2VyXCIsIFwiYWZmaWxpYXRlXCIsIFwicGFydG5lclwiXS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cGRhdGVkX2F0IC0gQSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgdGltZSB0aGUgdXNlciBpbmZvcm1hdGlvbiB3YXNcbiAqIHVwZGF0ZWQgaW4gSVNPIDg2MDEgZm9ybWF0LlxuICovXG5cbi8qKlxuICogQSBzaW5nbGUgdXNlciBvYmplY3QgYXMgZnJvbSB7QGxpbmsgZ2V0VHdpdGNoVXNlcnNCeUlEfS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIZWxpeFR3aXRjaFVzZXJcblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gVGhlIFR3aXRjaCBJRCBvZiB0aGUgdXNlci4gVW5pdmVyc2FsbHkgdW5pcXVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ2luIC0gVGhlIHVzZXIncyBsb2dpbiBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb24gLSBUaGUgdXNlcidzIGNoYW5uZWwgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5X25hbWUgLSBBIHVzZXIgZm9ybWF0dGVkIHZlcnNpb24gb2YgdGhlaXIgdXNlcm5hbWUgZm9yIGRpc3BsYXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZmlsZV9pbWFnZV91cmwgLSBBIFVSTCB0byBhIFR3aXRjaC1ob3N0ZWQgdmVyc2lvbiBvZiB0aGlzIHVzZXIncyBhdmF0YXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2ZmbGluZV9pbWFnZV91cmwgLSBBIFVSTCB0byBhIFR3aXRjaC1ob3N0ZWQgdmVyc2lvbiBvZiB0aGlzIHVzZXIncyBvZmZsaW5lXG4gKiBiYWNrZ3JvdW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBUaGUgdXNlcidzIFwidHlwZVwiIG9uIFR3aXRjaC5cbiAqIE9uZSBvZiBbXCJzdGFmZlwiLCBcImFkbWluXCIsIFwiZ2xvYmFsX21vZFwiLCBcIlwiXS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBicm9hZGNhc3Rlcl90eXBlIC0gVGhlIHVzZXIncyBicm9hZGNhc3RlciB0eXBlIG9uIFR3aXRjaC5cbiAqIE9uZSBvZiBbXCJwYXJ0bmVyXCIsIFwiYWZmaWxpYXRlXCIsIFwiXCJdLlxuICogQHByb3BlcnR5IHtpbnR9IHZpZXdfY291bnQgLSBUaGUgdXNlcidzIHRvdGFsIHZpZXcgY291bnQuXG4gKi9cblxuLyoqXG4gKiBBIHNpbmdsZSBnb29kIG9iamVjdCBhcyBmcm9tIHtAbGluayBnZXRVc2VyR29vZHN9LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvbkdvb2RcblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5leHRfaW5zdHJ1Y3Rpb24gLSBUaGUgbmV4dCBpbnN0cnVjdGlvbiAoYWN0aW9uKSBmb3IgdGhlIHB1cmNoYXNlLiBDYW4gYmU6XG4gKiAgIC0gXCJOT09QXCIgLSBObyBhY3Rpb24gaXMgbmVlZGVkLCB0aGUgZ29vZCB3YXMgZnVsbGZpbGxlZC5cbiAqICAgLSBcIkZVTEZJTExcIiAtIEZ1bGZpbGwgdGhlIHB1cmNoYXNlLCB0aGVuIGNhbGwgdGhlIFR3aXRjaCBlbnRpdGxlbWVudCBzeXN0ZW0gdG8gaW5kaWNhdGVcbiAqICAgICBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIGZ1bGxmaWxsbWVudC5cbiAqICAgLSBcIlJFVk9LRVwiIC0gVW53aW5kIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWNlaXB0X2lkIC0gQW4gSUQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcHVyY2hhc2UgdHJhbnNhY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2t1IC0gVGhlIFNLVSBmb3IgdGhlIGRpZ2l0YWwgZ29vZC5cbiAqL1xuXG4vKipcbiAqIEEgcmVjZWlwdCBkZXRhaWxpbmcgd2hpY2ggZ29vZCdzIGZ1bGZpbGxtZW50IHN0YXR1cyBuZWVkcyB0byBiZSBzZXQuIFVzZWQgYXMgYSBwYXJhbWV0ZXIgZm9yXG4gKiB7QGxpbmsgdXBkYXRlRnVsZmlsbGVkR29vZHN9LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlY2VpcHRcblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZ1bGZpbGxtZW50X2FkZHJlc3MgLSBUd2l0Y2ggVXNlciBJRFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlY2VpcHRfaWQgLSBSZWNlaXB0IElEIGZvciB0aGUgZGlnaXRhbCBnb29kLCByZXR1cm5lZCBieSB7QGxpbmsgZ2V0VXNlckdvb2RzfVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxhc3RfaW5zdHJ1Y3Rpb24gLSBUaGUgbGFzdCB0aGluZyB5b3UgZGlkLiBDb3JyZXNwb25kcyB0byB0aGUgXCJuZXh0XG4gKiBpbnN0cnVjdGlvblwiIGZvciB0aGUgcHVyY2hhc2UgcmV0dXJuZWQgYnkge0BsaW5rIGdldFVzZXJHb29kc30uIFZhbHVlIHZhbHVlOiBgRlVMRklMTGAuXG4gKi9cblxuLyoqXG4gKiBQcm92aWRlcyBhIGNvbnZlbmllbnQgaW50ZXJmYWNlIGZvciBUd2l0Y2ggQVBJIHJlcXVlc3RzIHdpdGggYW4gYXV0b21hdGljYWxseSBzZXQgYW5kIHVwZGF0ZWRcbiAqIGV4dGVuc2lvbiBjbGllbnQgaWQuXG4gKlxuICogU2hvdWxkIG5vdCBub3JtYWxseSBiZSBjcmVhdGVkIGRpcmVjdGx5LCBpbnN0ZWFkIGFuIGluc3RhbmNlIGlzIG1hZGUgYXZhaWxhYmxlXG4gKiBhbmQgbmFtZXNwYWNlZCBhcHByb3ByaWF0ZWx5IHdoZW4gdXNpbmcge0BsaW5rIE11eHkuVHdpdGNoQ2xpZW50fS5cbiAqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0d2l0Y2hDbGllbnQgPSBuZXcgTXV4eS5Ud2l0Y2hDbGllbnQoKTtcbiAqIHR3aXRjaENsaWVudC5nZXRBbGxTdGF0ZSgpLnRoZW4oKHN0YXRlKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKHN0YXRlKTtcbiAqIH0pO1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUd2l0Y2hDbGllbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFR3aXRjaENsaWVudCBib3VuZCB0byB0aGUgcHJvdmlkZWQgY2xpZW50IElELlxuICAgKlxuICAgKiBQcmVmZXIge0BsaW5rIE11eHkuVHdpdGNoQ2xpZW50fSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICogQGlnbm9yZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xpZW50SUQgLSBBIHZhbGlkIFR3aXRjaCBFeHRlbnNpb24gQ2xpZW50IElELlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2xpZW50SUQpIHtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHRoaXMuZXh0ZW5zaW9uSWQgPSBjbGllbnRJRDtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHRoaXMucHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSBvbmNlIHRoZSBUd2l0Y2hDbGllbnQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAqXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKiBAcHVibGljXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBUd2l0Y2hDbGllbnQgaXMgcmVhZHkgZm9yIHVzZS5cbiAgICovXG4gIGxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGFuIEFKQVggcmVxdWVzdCB0byBUd2l0Y2gncyBrcmFrZW4gQVBJLiBVc2VkIGludGVybmFsbHkgYnkgdGhlIEFQSVxuICAgKiBjb252ZW5pZW5jZSBtZXRob2RzLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBBSkFYIHJlcXVlc3QgbWV0aG9kLCBlLmcuIFwiUE9TVFwiLCBcIkdFVFwiLCBldGMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmRwb2ludCAtIFRoZSBUd2l0Y2gga3Jha2VuIEFQSSBlbmRwb2ludC5cbiAgICogQHBhcmFtIHtzdHJpbmc/fSBkYXRhIC0gQSBzdHJpbmctZW5jb2RlZCBKU09OIHBheWxvYWQgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gSldUIC0gU2lnbmVkIEpXVCwgYWNjZXNzaWJsZSBmcm9tIHNkay51c2VyLnR3aXRjaEpXVC5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgd2l0aCB0aGUgQUpBWCBwYXlsb2FkIG9uIHJlc3BvbnNlIDwgNDAwLlxuICAgKiBSZWplY3RzIG90aGVyd2lzZS5cbiAgICovXG4gIHNpZ25lZFR3aXRjaFJlcXVlc3QobWV0aG9kLCBlbmRwb2ludCwgZGF0YSwgSldUKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL3ZuZC50d2l0Y2h0di52NStqc29uJyxcbiAgICAgICdDbGllbnQtSUQnOiB0aGlzLmV4dGVuc2lvbklkXG4gICAgfTtcblxuICAgIGlmIChKV1QpIHtcbiAgICAgIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHtKV1R9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgeGhyUHJvbWlzZSA9IG5ldyBYTUxIdHRwUmVxdWVzdFByb21pc2UoKTtcbiAgICAgIHJldHVybiB4aHJQcm9taXNlXG4gICAgICAgIC5zZW5kKHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkudHdpdGNoLnR2L2tyYWtlbi8ke2VuZHBvaW50fWAsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgIC50aGVuKHJlc3AgPT4ge1xuICAgICAgICAgIGlmIChyZXNwLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVqZWN0KHJlc3AucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYW4gQUpBWCByZXF1ZXN0IHRvIFR3aXRjaCdzIGhlbGl4IEFQSS4gVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBUElcbiAgICogY29udmVuaWVuY2UgbWV0aG9kcy5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBBSkFYIHJlcXVlc3QgbWV0aG9kLCBlLmcuIFwiUE9TVFwiLCBcIkdFVFwiLCBldGMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmRwb2ludCAtIFRoZSBUd2l0Y2ggaGVsaXggQVBJIGVuZHBvaW50LlxuICAgKiBAcGFyYW0ge3N0cmluZz99IGRhdGEgLSBBIHN0cmluZy1lbmNvZGVkIEpTT04gcGF5bG9hZCB0byBzZW5kIHdpdGggdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBKV1QgLSBTaWduZWQgSldULCBhY2Nlc3NpYmxlIGZyb20gc2RrLnVzZXIudHdpdGNoSldULlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyB3aXRoIHRoZSBBSkFYIHBheWxvYWQgb24gcmVzcG9uc2UgPCA0MDAuXG4gICAqIFJlamVjdHMgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc2lnbmVkVHdpdGNoSGVsaXhSZXF1ZXN0KG1ldGhvZCwgZW5kcG9pbnQsIGRhdGEsIEpXVCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnQ2xpZW50LUlEJzogdGhpcy5leHRlbnNpb25JZFxuICAgIH07XG5cbiAgICBpZiAoSldUKSB7XG4gICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7SldUfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHhoclByb21pc2UgPSBuZXcgWE1MSHR0cFJlcXVlc3RQcm9taXNlKCk7XG4gICAgICByZXR1cm4geGhyUHJvbWlzZVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLnR3aXRjaC50di9oZWxpeC8ke2VuZHBvaW50fWAsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgIC50aGVuKHJlc3AgPT4ge1xuICAgICAgICAgIGlmIChyZXNwLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwLnJlc3BvbnNlVGV4dC5kYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZWplY3QocmVzcC5yZXNwb25zZVRleHQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBUd2l0Y2ggVXNlciBvYmplY3RzIGZvciBhIGdpdmVuIGxpc3Qgb2YgdXNlcm5hbWVzLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2lsbCB0aHJvdyBhbiBlcnJvciBpZiB1c2VycyBpcyBub3QgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHtbXXN0cmluZ30gdXNlcm5hbWVzIC0gQSBsaXN0IG9mIHVzZXJuYW1lcyB0byBsb29rdXAgb24gVHdpdGNoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFtdVHdpdGNoVXNlcj59IFJlc29sdmVzIHdpdGggYSBsaXN0IG9mIHtAbGluayBUd2l0Y2hVc2VyfVxuICAgKiBvYmplY3RzIGZvciBlYWNoIG9mIHRoZSB1c2VybmFtZXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHR3aXRjaENsaWVudC5nZXRUd2l0Y2hVc2VycyhbJ211eHknXSwgKHJlc3BvbnNlKSA9PiB7XG4gICAqICBjb25zb2xlLmxvZyhyZXNwb25zZS51c2Vyc1swXS5kaXNwbGF5X25hbWUpO1xuICAgKiB9KTtcbiAgICovXG4gIGdldFR3aXRjaFVzZXJzKHVzZXJuYW1lcykge1xuICAgIGZvcmNlVHlwZSh1c2VybmFtZXMsICdhcnJheScpO1xuICAgIGlmICh1c2VybmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduZWRUd2l0Y2hSZXF1ZXN0KCdHRVQnLCBgdXNlcnM/bG9naW49JHt1c2VybmFtZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIFR3aXRjaCBVc2VyIG9iamVjdHMgZm9yIGEgZ2l2ZW4gbGlzdCBvZiB1c2VyIElEcy5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2lsbCB0aHJvdyBhbiBlcnJvciBpZiB1c2VySURzIGlzIG5vdCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0ge1tdc3RyaW5nfSB1c2VySURzIC0gQSBsaXN0IG9mIHVzZXIgSURzIHRvIGxvb2t1cCBvbiBUd2l0Y2guXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8W11IZWxpeFR3aXRjaFVzZXI+fSBSZXNvbHZlcyB3aXRoIGEgbGlzdCBvZiB7QGxpbmsgSGVsaXhUd2l0Y2hVc2VyfVxuICAgKiBvYmplY3RzIGZvciBlYWNoIG9mIHRoZSB1c2VyIElEcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdHdpdGNoQ2xpZW50LmdldFR3aXRjaFVzZXJzQnlJRChbJzEyNjk1NTIxMSddLCAocmVzcG9uc2UpID0+IHtcbiAgICogIGNvbnNvbGUubG9nKHJlc3BvbnNlLnVzZXJzWzBdLmRpc3BsYXlfbmFtZSk7XG4gICAqIH0pO1xuICAgKi9cbiAgZ2V0VHdpdGNoVXNlcnNCeUlEKHVzZXJJRHMpIHtcbiAgICBmb3JjZVR5cGUodXNlcklEcywgJ2FycmF5Jyk7XG4gICAgaWYgKHVzZXJJRHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduZWRUd2l0Y2hIZWxpeFJlcXVlc3QoJ0dFVCcsIGB1c2Vycz9pZD0ke3VzZXJJRHMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vbmV0aXphdGlvblxuICAgKi9cblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgdGhlIGRpZ2l0YWwgZ29vZHMgdGhlIGN1cnJlbnQgdXNlciBoYXMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBKV1QgLSBTaWduZWQgSldULCBhY2Nlc3NpYmxlIGZyb20gc2RrLnVzZXIudHdpdGNoSldUXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8W11FeHRlbnNpb25Hb29kPn0gUmVzb2x2ZXMgd2l0aCBhIGxpc3Qgb2Yge0BsaW5rIEV4dGVuc2lvbkdvb2R9IG9iamVjdHMgZm9yXG4gICAqIGVhY2ggb2YgdGhlIGdvb2RzIHRoZSB1c2VyIGlzIGVudGl0bGVkIHRvLlxuICAgKi9cbiAgZ2V0VXNlckdvb2RzKEpXVCkge1xuICAgIHJldHVybiB0aGlzLnNpZ25lZFR3aXRjaFJlcXVlc3QoJ1BPU1QnLCAnY29tbWVyY2UvdXNlci9nb29kcycsIHt9LCBKV1QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZ1bGZpbGxtZW50IHN0YXR1cyBmb3IgdGhlIHNwZWNpZmllZCByZWNlaXB0cyAocHVyY2hhc2VzKS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IEpXVCAtIFNpZ25lZCBKV1QsIGFjY2Vzc2libGUgZnJvbSBzZGsudXNlci50d2l0Y2hKV1RcbiAgICogQHBhcmFtIHtbXVJlY2VpcHR9IFJlY2VpcHRzIC0gTGlzdCBvZiB7QGxpbmsgUmVjZWlwdH0gb2JqZWN0cyBkZXRhaWxpbmcgd2hpY2ggZ29vZHMgbmVlZCB0byBiZVxuICAgKiB1cGRhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFtdT2JqZWN0Pn0gUmVzb2x2ZXMgd2l0aCBhIGxpc3Qgb2YgcmVzdWx0cywgb25lIGZvciBlYWNoIFJlY2VpcHQgaW4gdGhlXG4gICAqIFJlY2VpcHRzIHBhcmFtZXRlci5cbiAgICovXG4gIHVwZGF0ZUZ1bGZpbGxlZEdvb2RzKEpXVCwgcmVjZWlwdHMpIHtcbiAgICByZXR1cm4gdGhpcy5zaWduZWRUd2l0Y2hSZXF1ZXN0KCdQT1NUJywgJ2NvbW1lcmNlL3VzZXIvZ29vZHMvZnVsZmlsbCcsIHJlY2VpcHRzLCBKV1QpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHdpdGNoLWNsaWVudC5qcyIsIi8qIGdsb2JhbHMgVHdpdGNoICovXG5pbXBvcnQgeyBFTlZJUk9OTUVOVFMsIEN1cnJlbnRFbnZpcm9ubWVudCB9IGZyb20gJy4vdXRpbCc7XG5cbmxldCBQdXNoZXIgPSBudWxsO1xuaWYgKEN1cnJlbnRFbnZpcm9ubWVudCgpICE9PSBFTlZJUk9OTUVOVFMuU0VSVkVSKSB7XG4gIFB1c2hlciA9IHJlcXVpcmUoJ3B1c2hlci1qcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdsb2JhbC1yZXF1aXJlXG59XG5cbi8vIFR3aXRjaE1lc3NlbmdlciBpbXBsZW1lbnRzIHRoZSBiYXNpYyAnbWVzc2VuZ2VyJyBpbnRlcmZhY2UsIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZFxuLy8gZm9yIGFsbCBwdWJzdWIgaW1wbGVtZW50YXRpb25zLiBUaGlzIGlzIHVzZWQgYnkgU0RLIHRvIHByb3ZpZGUgbG93LWxldmVsIGFjY2Vzc1xuLy8gdG8gYSBwdWJzdWIgaW1wbGVtZW50YXRpb24uXG5jbGFzcyBUd2l0Y2hNZXNzZW5nZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNoYW5uZWxJRCA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlbmQgd2lsbCBzZW5kIGEgbWVzc2FnZSB0byBhbGwgY2xpZW50cy5cbiAgICogQHBhcmFtIGlkIHRoZSBleHRlbnNpb24gaWQgb3IgYXBwIGlkIG9mIHRoZSBhcHAgdGhhdHMgc2VuZGluZyB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIGV2ZW50IGFuIGV2ZW50IG5hbWUuIEV2ZW50IG5hbWVzIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBbYS16MC05X10rXG4gICAqIEBwYXJhbSBlaXRoZXIgJ2Jyb2FkY2FzdCcgb3IgJ3doaXNwZXItPG9wYXF1ZS11c2VyLWlkPidcbiAgICogQHBhcmFtIGJvZHkgYSBqc29uIG9iamVjdCB0byBzZW5kXG4gICAqIEBwYXJhbSBjbGllbnQgYSBzdGF0ZS1jbGllbnQgaW5zdGFuY2UuIFVzZWQgdG8gbWFrZSBleHRlcm5hbCBjYWxscy5cbiAgICogVGhlIHR3aXRjaCBtZXNzZW5nZXIgZG9lcyBub3QgbmVlZCB0aGUgY2xpZW50LCBzbyBpdHMgbm90IHNob3duIGluIHRoZSBzaWduYXR1cmVcbiAgICogYmVsb3cuXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG4gIHNlbmQoaWQsIGV2ZW50LCB0YXJnZXQsIGJvZHkpIHtcbiAgICBjb25zdCBkYXRhID0gYm9keSB8fCB7fTtcbiAgICBUd2l0Y2guZXh0LnNlbmQodGFyZ2V0LCAnYXBwbGljYXRpb24vanNvbicsIHtcbiAgICAgIGV2ZW50OiBgJHtDdXJyZW50RW52aXJvbm1lbnQoKS5lbnZpcm9ubWVudH06JHtpZH06JHtldmVudH1gLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuXG4gIC8qKlxuICAgKiBsaXN0ZW4gaXMgdGhlIGxvdyBsZXZlbCBsaXN0ZW5pbmcgaW50ZXJmYWNlLlxuICAgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZCBvciBhcHAgaWQgb2YgdGhlIGFwcCB0aGF0cyBzZW5kaW5nIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gdG9waWMgZWl0aGVyIGBicm9hZGNhc3RgIG9yIGB3aGlzcGVyLTxvcGFxdWUtdXNlci1pZD5gLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBmdW5jdGlvbihib2R5KVxuICAgKiBAcmV0dXJuIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvIHVubGlzdGVuIHRvIHVuYmluZCB0aGUgY2FsbGJhY2suXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG4gIGxpc3RlbihpZCwgdG9waWMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgY2IgPSAodCwgZGF0YXR5cGUsIG1lc3NhZ2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgIGNhbGxiYWNrKHBhcnNlZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVE9ETzogU2lsZW50IGZhaWx1cmU/XG4gICAgICB9XG4gICAgfTtcblxuICAgIFR3aXRjaC5leHQubGlzdGVuKHRvcGljLCBjYik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiB0b3BpYyxcbiAgICAgIGNiXG4gICAgfTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cblxuICAvKipcbiAgICogdW5saXN0ZW4gd2lsbCB1bnJlZ2lzdGVyIGEgbGlzdGVuaW5nIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZCBvciBhcHAgaWQgb2YgdGhlIGFwcCB0aGF0cyBzZW5kaW5nIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gaCB0aGUgaGFuZGxlIHJldHVybmVkIGZyb20gbGlzdGVuXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG4gIHVubGlzdGVuKGlkLCBoKSB7XG4gICAgVHdpdGNoLmV4dC51bmxpc3RlbihoLnRhcmdldCwgaC5jYik7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG59XG5cbi8vIFB1c2hlck1lc3NlbmdlciBhZGhlcmVzIHRvIHRoZSAnbWVzc2VuZ2VyJyBpbnRlcmZhY2UsIGJ1dCB1c2VzIGh0dHBzOi8vcHVzaGVyLmNvbVxuLy8gYXMgYSBwdWJzdWIgbm90aWZpY2F0aW9uIHByb3ZpZGVyLlxuY2xhc3MgUHVzaGVyTWVzc2VuZ2VyIHtcbiAgY29uc3RydWN0b3IoY2gsIG11eHkpIHtcbiAgICB0aGlzLmNsaWVudCA9IG5ldyBQdXNoZXIoJzE4YzI2YzBkMWM3ZmFmYjc4YmEyJywge1xuICAgICAgY2x1c3RlcjogJ3VzMicsXG4gICAgICBlbmNyeXB0ZWQ6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMubXV4eSA9IG11eHk7XG4gICAgdGhpcy5jaGFubmVsSUQgPSAnJztcbiAgfVxuXG4gIHNlbmQoaWQsIGV2ZW50LCB0YXJnZXQsIGJvZHksIGNsaWVudCkge1xuICAgIGNvbnN0IHNjb3BlZEV2ZW50ID0gYCR7Q3VycmVudEVudmlyb25tZW50KCkuZW52aXJvbm1lbnR9OiR7aWR9OiR7ZXZlbnR9YDtcblxuICAgIGNsaWVudC5zaWduZWRSZXF1ZXN0KFxuICAgICAgaWQsXG4gICAgICAnUE9TVCcsXG4gICAgICAncHVzaGVyX2Jyb2FkY2FzdCcsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgZXZlbnQ6IHNjb3BlZEV2ZW50LFxuICAgICAgICB1c2VyX2lkOiB0aGlzLmNoYW5uZWxJRCxcbiAgICAgICAgZGF0YTogYm9keVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbGlzdGVuKGlkLCB0b3BpYywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbCkge1xuICAgICAgY29uc3QgY2hhbm5lbE5hbWUgPSBgdHdpdGNoLnB1YnN1Yi4ke3RoaXMuZXh0ZW5zaW9uSUR9LiR7dGhpcy5jaGFubmVsSUR9YDtcbiAgICAgIHRoaXMuY2hhbm5lbCA9IHRoaXMuY2xpZW50LnN1YnNjcmliZShjaGFubmVsTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2IgPSBtZXNzYWdlID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgY2FsbGJhY2socGFyc2VkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBUT0RPOiBTaWxlbnQgZmFpbHVyZT9cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5jaGFubmVsLmJpbmQodG9waWMsIGNiKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IHRvcGljLFxuICAgICAgY2JcbiAgICB9O1xuICB9XG5cbiAgdW5saXN0ZW4oaWQsIGgpIHtcbiAgICB0aGlzLmNoYW5uZWwudW5iaW5kKGgudGFyZ2V0LCBoLmNiKTtcbiAgfVxufVxuXG4vLyBTZXJ2ZXJNZXNzZW5nZXIgaW1wbGVtZW50cyBhICdtZXNzZW5nZXInIHRoYXQgaXMgYnJvYWRjYXN0LW9ubHkuIEl0IGNhbm5vdFxuLy8gbGlzdGVuIGZvciBtZXNzYWdlcywgYnV0IGlzIGFibGUgdG8gc2VuZCB3aXRoIGEgYmFja2VuZC1zaWduZWQgSldULlxuY2xhc3MgU2VydmVyTWVzc2VuZ2VyIHtcbiAgY29uc3RydWN0b3IoY2gsIG11eHkpIHtcbiAgICB0aGlzLmNoYW5uZWxJRCA9IGNoO1xuICAgIHRoaXMubXV4eSA9IG11eHk7XG4gIH1cblxuICBzZW5kKGlkLCBldmVudCwgdGFyZ2V0LCBib2R5LCBjbGllbnQpIHtcbiAgICBjbGllbnQuc2lnbmVkUmVxdWVzdChcbiAgICAgIGlkLFxuICAgICAgJ1BPU1QnLFxuICAgICAgJ2Jyb2FkY2FzdCcsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHVzZXJfaWQ6IHRoaXMuY2hhbm5lbElELFxuICAgICAgICBkYXRhOiBib2R5XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLG5vLWNvbnNvbGUgKi9cbiAgbGlzdGVuKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NlcnZlci1zaWRlIG1lc3NhZ2UgcmVjZWl2aW5nIGlzIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHVubGlzdGVuKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NlcnZlci1zaWRlIG1lc3NhZ2UgcmVjZWl2aW5nIGlzIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMsbm8tY29uc29sZSAqL1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXNzZW5nZXIoKSB7XG4gIHN3aXRjaCAoQ3VycmVudEVudmlyb25tZW50KCkpIHtcbiAgICBjYXNlIEVOVklST05NRU5UUy5TQU5EQk9YX0RFVjpcbiAgICAgIHJldHVybiBuZXcgUHVzaGVyTWVzc2VuZ2VyKCk7XG4gICAgY2FzZSBFTlZJUk9OTUVOVFMuU0FOREJPWF9UV0lUQ0g6XG4gICAgY2FzZSBFTlZJUk9OTUVOVFMuUFJPRFVDVElPTjpcbiAgICAgIHJldHVybiBuZXcgVHdpdGNoTWVzc2VuZ2VyKCk7XG4gICAgY2FzZSBFTlZJUk9OTUVOVFMuU0VSVkVSOlxuICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJNZXNzZW5nZXIoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGRldGVybWluZSBleGVjdXRpb24gZW52aXJvbm1lbnQuJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbWVzc2VuZ2VyLmpzIiwiLyohXG4gKiBQdXNoZXIgSmF2YVNjcmlwdCBMaWJyYXJ5IHY0LjIuMlxuICogaHR0cHM6Ly9wdXNoZXIuY29tL1xuICpcbiAqIENvcHlyaWdodCAyMDE3LCBQdXNoZXJcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cbiAqL1xuXG4oZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJQdXNoZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiUHVzaGVyXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcblxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cblxuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIHB1c2hlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBwdXNoZXJfMVtcImRlZmF1bHRcIl07XG5cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgQ29sbGVjdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgZGlzcGF0Y2hlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cdHZhciB0aW1lbGluZV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOSk7XG5cdHZhciBsZXZlbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCk7XG5cdHZhciBTdHJhdGVneUJ1aWxkZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxKTtcblx0dmFyIHRpbWVyc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdHZhciBkZWZhdWx0c18xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIERlZmF1bHRDb25maWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzKTtcblx0dmFyIGxvZ2dlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIGZhY3RvcnlfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpO1xuXHR2YXIgdXJsX3N0b3JlXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0dmFyIFB1c2hlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBQdXNoZXIoYXBwX2tleSwgb3B0aW9ucykge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgY2hlY2tBcHBLZXkoYXBwX2tleSk7XG5cdCAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgICAgICAgaWYgKCFvcHRpb25zLmNsdXN0ZXIgJiYgIShvcHRpb25zLndzSG9zdCB8fCBvcHRpb25zLmh0dHBIb3N0KSkge1xuXHQgICAgICAgICAgICB2YXIgc3VmZml4ID0gdXJsX3N0b3JlXzFbXCJkZWZhdWx0XCJdLmJ1aWxkTG9nU3VmZml4KFwiamF2YXNjcmlwdFF1aWNrU3RhcnRcIik7XG5cdCAgICAgICAgICAgIGxvZ2dlcl8xW1wiZGVmYXVsdFwiXS53YXJuKFwiWW91IHNob3VsZCBhbHdheXMgc3BlY2lmeSBhIGNsdXN0ZXIgd2hlbiBjb25uZWN0aW5nLiBcIiArIHN1ZmZpeCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMua2V5ID0gYXBwX2tleTtcblx0ICAgICAgICB0aGlzLmNvbmZpZyA9IENvbGxlY3Rpb25zLmV4dGVuZChEZWZhdWx0Q29uZmlnLmdldEdsb2JhbENvbmZpZygpLCBvcHRpb25zLmNsdXN0ZXIgPyBEZWZhdWx0Q29uZmlnLmdldENsdXN0ZXJDb25maWcob3B0aW9ucy5jbHVzdGVyKSA6IHt9LCBvcHRpb25zKTtcblx0ICAgICAgICB0aGlzLmNoYW5uZWxzID0gZmFjdG9yeV8xW1wiZGVmYXVsdFwiXS5jcmVhdGVDaGFubmVscygpO1xuXHQgICAgICAgIHRoaXMuZ2xvYmFsX2VtaXR0ZXIgPSBuZXcgZGlzcGF0Y2hlcl8xW1wiZGVmYXVsdFwiXSgpO1xuXHQgICAgICAgIHRoaXMuc2Vzc2lvbklEID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMCk7XG5cdCAgICAgICAgdGhpcy50aW1lbGluZSA9IG5ldyB0aW1lbGluZV8xW1wiZGVmYXVsdFwiXSh0aGlzLmtleSwgdGhpcy5zZXNzaW9uSUQsIHtcblx0ICAgICAgICAgICAgY2x1c3RlcjogdGhpcy5jb25maWcuY2x1c3Rlcixcblx0ICAgICAgICAgICAgZmVhdHVyZXM6IFB1c2hlci5nZXRDbGllbnRGZWF0dXJlcygpLFxuXHQgICAgICAgICAgICBwYXJhbXM6IHRoaXMuY29uZmlnLnRpbWVsaW5lUGFyYW1zIHx8IHt9LFxuXHQgICAgICAgICAgICBsaW1pdDogNTAsXG5cdCAgICAgICAgICAgIGxldmVsOiBsZXZlbF8xW1wiZGVmYXVsdFwiXS5JTkZPLFxuXHQgICAgICAgICAgICB2ZXJzaW9uOiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5WRVJTSU9OXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5kaXNhYmxlU3RhdHMpIHtcblx0ICAgICAgICAgICAgdGhpcy50aW1lbGluZVNlbmRlciA9IGZhY3RvcnlfMVtcImRlZmF1bHRcIl0uY3JlYXRlVGltZWxpbmVTZW5kZXIodGhpcy50aW1lbGluZSwge1xuXHQgICAgICAgICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuc3RhdHNIb3N0LFxuXHQgICAgICAgICAgICAgICAgcGF0aDogXCIvdGltZWxpbmUvdjIvXCIgKyBydW50aW1lXzFbXCJkZWZhdWx0XCJdLlRpbWVsaW5lVHJhbnNwb3J0Lm5hbWVcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBnZXRTdHJhdGVneSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgICAgIHZhciBjb25maWcgPSBDb2xsZWN0aW9ucy5leHRlbmQoe30sIF90aGlzLmNvbmZpZywgb3B0aW9ucyk7XG5cdCAgICAgICAgICAgIHJldHVybiBTdHJhdGVneUJ1aWxkZXIuYnVpbGQocnVudGltZV8xW1wiZGVmYXVsdFwiXS5nZXREZWZhdWx0U3RyYXRlZ3koY29uZmlnKSwgY29uZmlnKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGZhY3RvcnlfMVtcImRlZmF1bHRcIl0uY3JlYXRlQ29ubmVjdGlvbk1hbmFnZXIodGhpcy5rZXksIENvbGxlY3Rpb25zLmV4dGVuZCh7IGdldFN0cmF0ZWd5OiBnZXRTdHJhdGVneSxcblx0ICAgICAgICAgICAgdGltZWxpbmU6IHRoaXMudGltZWxpbmUsXG5cdCAgICAgICAgICAgIGFjdGl2aXR5VGltZW91dDogdGhpcy5jb25maWcuYWN0aXZpdHlfdGltZW91dCxcblx0ICAgICAgICAgICAgcG9uZ1RpbWVvdXQ6IHRoaXMuY29uZmlnLnBvbmdfdGltZW91dCxcblx0ICAgICAgICAgICAgdW5hdmFpbGFibGVUaW1lb3V0OiB0aGlzLmNvbmZpZy51bmF2YWlsYWJsZV90aW1lb3V0XG5cdCAgICAgICAgfSwgdGhpcy5jb25maWcsIHsgZW5jcnlwdGVkOiB0aGlzLmlzRW5jcnlwdGVkKCkgfSkpO1xuXHQgICAgICAgIHRoaXMuY29ubmVjdGlvbi5iaW5kKCdjb25uZWN0ZWQnLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLnN1YnNjcmliZUFsbCgpO1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMudGltZWxpbmVTZW5kZXIpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lU2VuZGVyLnNlbmQoX3RoaXMuY29ubmVjdGlvbi5pc0VuY3J5cHRlZCgpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMuY29ubmVjdGlvbi5iaW5kKCdtZXNzYWdlJywgZnVuY3Rpb24gKHBhcmFtcykge1xuXHQgICAgICAgICAgICB2YXIgaW50ZXJuYWwgPSAocGFyYW1zLmV2ZW50LmluZGV4T2YoJ3B1c2hlcl9pbnRlcm5hbDonKSA9PT0gMCk7XG5cdCAgICAgICAgICAgIGlmIChwYXJhbXMuY2hhbm5lbCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBfdGhpcy5jaGFubmVsKHBhcmFtcy5jaGFubmVsKTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaGFubmVsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5oYW5kbGVFdmVudChwYXJhbXMuZXZlbnQsIHBhcmFtcy5kYXRhKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWludGVybmFsKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5nbG9iYWxfZW1pdHRlci5lbWl0KHBhcmFtcy5ldmVudCwgcGFyYW1zLmRhdGEpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5jb25uZWN0aW9uLmJpbmQoJ2Nvbm5lY3RpbmcnLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLmNoYW5uZWxzLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLmNvbm5lY3Rpb24uYmluZCgnZGlzY29ubmVjdGVkJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBfdGhpcy5jaGFubmVscy5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5jb25uZWN0aW9uLmJpbmQoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuXHQgICAgICAgICAgICBsb2dnZXJfMVtcImRlZmF1bHRcIl0ud2FybignRXJyb3InLCBlcnIpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIFB1c2hlci5pbnN0YW5jZXMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLnRpbWVsaW5lLmluZm8oeyBpbnN0YW5jZXM6IFB1c2hlci5pbnN0YW5jZXMubGVuZ3RoIH0pO1xuXHQgICAgICAgIGlmIChQdXNoZXIuaXNSZWFkeSkge1xuXHQgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBQdXNoZXIucmVhZHkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgUHVzaGVyLmlzUmVhZHkgPSB0cnVlO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gUHVzaGVyLmluc3RhbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICAgICAgUHVzaGVyLmluc3RhbmNlc1tpXS5jb25uZWN0KCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFB1c2hlci5sb2cgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChQdXNoZXIubG9nVG9Db25zb2xlICYmICh3aW5kb3cpLmNvbnNvbGUgJiYgKHdpbmRvdykuY29uc29sZS5sb2cpIHtcblx0ICAgICAgICAgICAgKHdpbmRvdykuY29uc29sZS5sb2cobWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFB1c2hlci5nZXRDbGllbnRGZWF0dXJlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMua2V5cyhDb2xsZWN0aW9ucy5maWx0ZXJPYmplY3QoeyBcIndzXCI6IHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uVHJhbnNwb3J0cy53cyB9LCBmdW5jdGlvbiAodCkgeyByZXR1cm4gdC5pc1N1cHBvcnRlZCh7fSk7IH0pKTtcblx0ICAgIH07XG5cdCAgICBQdXNoZXIucHJvdG90eXBlLmNoYW5uZWwgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzLmZpbmQobmFtZSk7XG5cdCAgICB9O1xuXHQgICAgUHVzaGVyLnByb3RvdHlwZS5hbGxDaGFubmVscyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVscy5hbGwoKTtcblx0ICAgIH07XG5cdCAgICBQdXNoZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5jb25uZWN0aW9uLmNvbm5lY3QoKTtcblx0ICAgICAgICBpZiAodGhpcy50aW1lbGluZVNlbmRlcikge1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMudGltZWxpbmVTZW5kZXJUaW1lcikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IHRoaXMuY29ubmVjdGlvbi5pc0VuY3J5cHRlZCgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHRpbWVsaW5lU2VuZGVyID0gdGhpcy50aW1lbGluZVNlbmRlcjtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGltZWxpbmVTZW5kZXJUaW1lciA9IG5ldyB0aW1lcnNfMS5QZXJpb2RpY1RpbWVyKDYwMDAwLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGltZWxpbmVTZW5kZXIuc2VuZChlbmNyeXB0ZWQpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUHVzaGVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgaWYgKHRoaXMudGltZWxpbmVTZW5kZXJUaW1lcikge1xuXHQgICAgICAgICAgICB0aGlzLnRpbWVsaW5lU2VuZGVyVGltZXIuZW5zdXJlQWJvcnRlZCgpO1xuXHQgICAgICAgICAgICB0aGlzLnRpbWVsaW5lU2VuZGVyVGltZXIgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBQdXNoZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoZXZlbnRfbmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcblx0ICAgICAgICB0aGlzLmdsb2JhbF9lbWl0dGVyLmJpbmQoZXZlbnRfbmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIFB1c2hlci5wcm90b3R5cGUudW5iaW5kID0gZnVuY3Rpb24gKGV2ZW50X25hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgdGhpcy5nbG9iYWxfZW1pdHRlci51bmJpbmQoZXZlbnRfbmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIFB1c2hlci5wcm90b3R5cGUuYmluZF9nbG9iYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0ICAgICAgICB0aGlzLmdsb2JhbF9lbWl0dGVyLmJpbmRfZ2xvYmFsKGNhbGxiYWNrKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICBQdXNoZXIucHJvdG90eXBlLnVuYmluZF9nbG9iYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0ICAgICAgICB0aGlzLmdsb2JhbF9lbWl0dGVyLnVuYmluZF9nbG9iYWwoY2FsbGJhY2spO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIFB1c2hlci5wcm90b3R5cGUudW5iaW5kX2FsbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgIHRoaXMuZ2xvYmFsX2VtaXR0ZXIudW5iaW5kX2FsbCgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIFB1c2hlci5wcm90b3R5cGUuc3Vic2NyaWJlQWxsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjaGFubmVsTmFtZTtcblx0ICAgICAgICBmb3IgKGNoYW5uZWxOYW1lIGluIHRoaXMuY2hhbm5lbHMuY2hhbm5lbHMpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY2hhbm5lbHMuY2hhbm5lbHMuaGFzT3duUHJvcGVydHkoY2hhbm5lbE5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZShjaGFubmVsTmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUHVzaGVyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoY2hhbm5lbF9uYW1lKSB7XG5cdCAgICAgICAgdmFyIGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmFkZChjaGFubmVsX25hbWUsIHRoaXMpO1xuXHQgICAgICAgIGlmIChjaGFubmVsLnN1YnNjcmlwdGlvblBlbmRpbmcgJiYgY2hhbm5lbC5zdWJzY3JpcHRpb25DYW5jZWxsZWQpIHtcblx0ICAgICAgICAgICAgY2hhbm5lbC5yZWluc3RhdGVTdWJzY3JpcHRpb24oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoIWNoYW5uZWwuc3Vic2NyaXB0aW9uUGVuZGluZyAmJiB0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT09IFwiY29ubmVjdGVkXCIpIHtcblx0ICAgICAgICAgICAgY2hhbm5lbC5zdWJzY3JpYmUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNoYW5uZWw7XG5cdCAgICB9O1xuXHQgICAgUHVzaGVyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uIChjaGFubmVsX25hbWUpIHtcblx0ICAgICAgICB2YXIgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZmluZChjaGFubmVsX25hbWUpO1xuXHQgICAgICAgIGlmIChjaGFubmVsICYmIGNoYW5uZWwuc3Vic2NyaXB0aW9uUGVuZGluZykge1xuXHQgICAgICAgICAgICBjaGFubmVsLmNhbmNlbFN1YnNjcmlwdGlvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMucmVtb3ZlKGNoYW5uZWxfbmFtZSk7XG5cdCAgICAgICAgICAgIGlmIChjaGFubmVsICYmIHRoaXMuY29ubmVjdGlvbi5zdGF0ZSA9PT0gXCJjb25uZWN0ZWRcIikge1xuXHQgICAgICAgICAgICAgICAgY2hhbm5lbC51bnN1YnNjcmliZSgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFB1c2hlci5wcm90b3R5cGUuc2VuZF9ldmVudCA9IGZ1bmN0aW9uIChldmVudF9uYW1lLCBkYXRhLCBjaGFubmVsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5zZW5kX2V2ZW50KGV2ZW50X25hbWUsIGRhdGEsIGNoYW5uZWwpO1xuXHQgICAgfTtcblx0ICAgIFB1c2hlci5wcm90b3R5cGUuaXNFbmNyeXB0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uZ2V0UHJvdG9jb2woKSA9PT0gXCJodHRwczpcIikge1xuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29uZmlnLmVuY3J5cHRlZCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFB1c2hlci5pbnN0YW5jZXMgPSBbXTtcblx0ICAgIFB1c2hlci5pc1JlYWR5ID0gZmFsc2U7XG5cdCAgICBQdXNoZXIubG9nVG9Db25zb2xlID0gZmFsc2U7XG5cdCAgICBQdXNoZXIuUnVudGltZSA9IHJ1bnRpbWVfMVtcImRlZmF1bHRcIl07XG5cdCAgICBQdXNoZXIuU2NyaXB0UmVjZWl2ZXJzID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5TY3JpcHRSZWNlaXZlcnM7XG5cdCAgICBQdXNoZXIuRGVwZW5kZW5jaWVzUmVjZWl2ZXJzID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5EZXBlbmRlbmNpZXNSZWNlaXZlcnM7XG5cdCAgICBQdXNoZXIuYXV0aF9jYWxsYmFja3MgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLmF1dGhfY2FsbGJhY2tzO1xuXHQgICAgcmV0dXJuIFB1c2hlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQdXNoZXI7XG5cdGZ1bmN0aW9uIGNoZWNrQXBwS2V5KGtleSkge1xuXHQgICAgaWYgKGtleSA9PT0gbnVsbCB8fCBrZXkgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIHRocm93IFwiWW91IG11c3QgcGFzcyB5b3VyIGFwcCBrZXkgd2hlbiB5b3UgaW5zdGFudGlhdGUgUHVzaGVyLlwiO1xuXHQgICAgfVxuXHR9XG5cdHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uc2V0dXAoUHVzaGVyKTtcblxuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGRlcGVuZGVuY2llc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0dmFyIHhocl9hdXRoXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHR2YXIganNvbnBfYXV0aF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cdHZhciBzY3JpcHRfcmVxdWVzdF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG5cdHZhciBqc29ucF9yZXF1ZXN0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblx0dmFyIHNjcmlwdF9yZWNlaXZlcl9mYWN0b3J5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIganNvbnBfdGltZWxpbmVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpO1xuXHR2YXIgdHJhbnNwb3J0c18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdHZhciBuZXRfaW5mb18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG5cdHZhciBkZWZhdWx0X3N0cmF0ZWd5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcblx0dmFyIHRyYW5zcG9ydF9jb25uZWN0aW9uX2luaXRpYWxpemVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcblx0dmFyIGh0dHBfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXHR2YXIgUnVudGltZSA9IHtcblx0ICAgIG5leHRBdXRoQ2FsbGJhY2tJRDogMSxcblx0ICAgIGF1dGhfY2FsbGJhY2tzOiB7fSxcblx0ICAgIFNjcmlwdFJlY2VpdmVyczogc2NyaXB0X3JlY2VpdmVyX2ZhY3RvcnlfMS5TY3JpcHRSZWNlaXZlcnMsXG5cdCAgICBEZXBlbmRlbmNpZXNSZWNlaXZlcnM6IGRlcGVuZGVuY2llc18xLkRlcGVuZGVuY2llc1JlY2VpdmVycyxcblx0ICAgIGdldERlZmF1bHRTdHJhdGVneTogZGVmYXVsdF9zdHJhdGVneV8xW1wiZGVmYXVsdFwiXSxcblx0ICAgIFRyYW5zcG9ydHM6IHRyYW5zcG9ydHNfMVtcImRlZmF1bHRcIl0sXG5cdCAgICB0cmFuc3BvcnRDb25uZWN0aW9uSW5pdGlhbGl6ZXI6IHRyYW5zcG9ydF9jb25uZWN0aW9uX2luaXRpYWxpemVyXzFbXCJkZWZhdWx0XCJdLFxuXHQgICAgSFRUUEZhY3Rvcnk6IGh0dHBfMVtcImRlZmF1bHRcIl0sXG5cdCAgICBUaW1lbGluZVRyYW5zcG9ydDoganNvbnBfdGltZWxpbmVfMVtcImRlZmF1bHRcIl0sXG5cdCAgICBnZXRYSFJBUEk6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gd2luZG93LlhNTEh0dHBSZXF1ZXN0O1xuXHQgICAgfSxcblx0ICAgIGdldFdlYlNvY2tldEFQSTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB3aW5kb3cuV2ViU29ja2V0IHx8IHdpbmRvdy5Nb3pXZWJTb2NrZXQ7XG5cdCAgICB9LFxuXHQgICAgc2V0dXA6IGZ1bmN0aW9uIChQdXNoZXJDbGFzcykge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgd2luZG93LlB1c2hlciA9IFB1c2hlckNsYXNzO1xuXHQgICAgICAgIHZhciBpbml0aWFsaXplT25Eb2N1bWVudEJvZHkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLm9uRG9jdW1lbnRCb2R5KFB1c2hlckNsYXNzLnJlYWR5KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGlmICghd2luZG93LkpTT04pIHtcblx0ICAgICAgICAgICAgZGVwZW5kZW5jaWVzXzEuRGVwZW5kZW5jaWVzLmxvYWQoXCJqc29uMlwiLCB7fSwgaW5pdGlhbGl6ZU9uRG9jdW1lbnRCb2R5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGluaXRpYWxpemVPbkRvY3VtZW50Qm9keSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBnZXREb2N1bWVudDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBkb2N1bWVudDtcblx0ICAgIH0sXG5cdCAgICBnZXRQcm90b2NvbDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmdldERvY3VtZW50KCkubG9jYXRpb24ucHJvdG9jb2w7XG5cdCAgICB9LFxuXHQgICAgZ2V0QXV0aG9yaXplcnM6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4geyBhamF4OiB4aHJfYXV0aF8xW1wiZGVmYXVsdFwiXSwganNvbnA6IGpzb25wX2F1dGhfMVtcImRlZmF1bHRcIl0gfTtcblx0ICAgIH0sXG5cdCAgICBvbkRvY3VtZW50Qm9keTogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuXHQgICAgICAgICAgICBjYWxsYmFjaygpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5vbkRvY3VtZW50Qm9keShjYWxsYmFjayk7XG5cdCAgICAgICAgICAgIH0sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjcmVhdGVKU09OUFJlcXVlc3Q6IGZ1bmN0aW9uICh1cmwsIGRhdGEpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IGpzb25wX3JlcXVlc3RfMVtcImRlZmF1bHRcIl0odXJsLCBkYXRhKTtcblx0ICAgIH0sXG5cdCAgICBjcmVhdGVTY3JpcHRSZXF1ZXN0OiBmdW5jdGlvbiAoc3JjKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBzY3JpcHRfcmVxdWVzdF8xW1wiZGVmYXVsdFwiXShzcmMpO1xuXHQgICAgfSxcblx0ICAgIGdldExvY2FsU3RvcmFnZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjcmVhdGVYSFI6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5nZXRYSFJBUEkoKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVYTUxIdHRwUmVxdWVzdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTWljcm9zb2Z0WEhSKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNyZWF0ZVhNTEh0dHBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcy5nZXRYSFJBUEkoKTtcblx0ICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKCk7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlTWljcm9zb2Z0WEhSOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG5cdCAgICB9LFxuXHQgICAgZ2V0TmV0d29yazogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBuZXRfaW5mb18xLk5ldHdvcms7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlV2ViU29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG5cdCAgICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcy5nZXRXZWJTb2NrZXRBUEkoKTtcblx0ICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHVybCk7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlU29ja2V0UmVxdWVzdDogZnVuY3Rpb24gKG1ldGhvZCwgdXJsKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNYSFJTdXBwb3J0ZWQoKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5IVFRQRmFjdG9yeS5jcmVhdGVYSFIobWV0aG9kLCB1cmwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLmlzWERSU3VwcG9ydGVkKHVybC5pbmRleE9mKFwiaHR0cHM6XCIpID09PSAwKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5IVFRQRmFjdG9yeS5jcmVhdGVYRFIobWV0aG9kLCB1cmwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhyb3cgXCJDcm9zcy1vcmlnaW4gSFRUUCByZXF1ZXN0cyBhcmUgbm90IHN1cHBvcnRlZFwiO1xuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBpc1hIUlN1cHBvcnRlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXMuZ2V0WEhSQVBJKCk7XG5cdCAgICAgICAgcmV0dXJuIEJvb2xlYW4oQ29uc3RydWN0b3IpICYmIChuZXcgQ29uc3RydWN0b3IoKSkud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQ7XG5cdCAgICB9LFxuXHQgICAgaXNYRFJTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChlbmNyeXB0ZWQpIHtcblx0ICAgICAgICB2YXIgcHJvdG9jb2wgPSBlbmNyeXB0ZWQgPyBcImh0dHBzOlwiIDogXCJodHRwOlwiO1xuXHQgICAgICAgIHZhciBkb2N1bWVudFByb3RvY29sID0gdGhpcy5nZXRQcm90b2NvbCgpO1xuXHQgICAgICAgIHJldHVybiBCb29sZWFuKCh3aW5kb3dbJ1hEb21haW5SZXF1ZXN0J10pKSAmJiBkb2N1bWVudFByb3RvY29sID09PSBwcm90b2NvbDtcblx0ICAgIH0sXG5cdCAgICBhZGRVbmxvYWRMaXN0ZW5lcjogZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG5cdCAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwgbGlzdGVuZXIsIGZhbHNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAod2luZG93LmF0dGFjaEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgd2luZG93LmF0dGFjaEV2ZW50KFwib251bmxvYWRcIiwgbGlzdGVuZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW1vdmVVbmxvYWRMaXN0ZW5lcjogZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG5cdCAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwgbGlzdGVuZXIsIGZhbHNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAod2luZG93LmRldGFjaEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgd2luZG93LmRldGFjaEV2ZW50KFwib251bmxvYWRcIiwgbGlzdGVuZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBSdW50aW1lO1xuXG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgc2NyaXB0X3JlY2VpdmVyX2ZhY3RvcnlfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBkZWZhdWx0c18xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIGRlcGVuZGVuY3lfbG9hZGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHRleHBvcnRzLkRlcGVuZGVuY2llc1JlY2VpdmVycyA9IG5ldyBzY3JpcHRfcmVjZWl2ZXJfZmFjdG9yeV8xLlNjcmlwdFJlY2VpdmVyRmFjdG9yeShcIl9wdXNoZXJfZGVwZW5kZW5jaWVzXCIsIFwiUHVzaGVyLkRlcGVuZGVuY2llc1JlY2VpdmVyc1wiKTtcblx0ZXhwb3J0cy5EZXBlbmRlbmNpZXMgPSBuZXcgZGVwZW5kZW5jeV9sb2FkZXJfMVtcImRlZmF1bHRcIl0oe1xuXHQgICAgY2RuX2h0dHA6IGRlZmF1bHRzXzFbXCJkZWZhdWx0XCJdLmNkbl9odHRwLFxuXHQgICAgY2RuX2h0dHBzOiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5jZG5faHR0cHMsXG5cdCAgICB2ZXJzaW9uOiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5WRVJTSU9OLFxuXHQgICAgc3VmZml4OiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5kZXBlbmRlbmN5X3N1ZmZpeCxcblx0ICAgIHJlY2VpdmVyczogZXhwb3J0cy5EZXBlbmRlbmNpZXNSZWNlaXZlcnNcblx0fSk7XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBTY3JpcHRSZWNlaXZlckZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU2NyaXB0UmVjZWl2ZXJGYWN0b3J5KHByZWZpeCwgbmFtZSkge1xuXHQgICAgICAgIHRoaXMubGFzdElkID0gMDtcblx0ICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgfVxuXHQgICAgU2NyaXB0UmVjZWl2ZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0ICAgICAgICB0aGlzLmxhc3RJZCsrO1xuXHQgICAgICAgIHZhciBudW1iZXIgPSB0aGlzLmxhc3RJZDtcblx0ICAgICAgICB2YXIgaWQgPSB0aGlzLnByZWZpeCArIG51bWJlcjtcblx0ICAgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZSArIFwiW1wiICsgbnVtYmVyICsgXCJdXCI7XG5cdCAgICAgICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBjYWxsYmFja1dyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICghY2FsbGVkKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpc1tudW1iZXJdID0gY2FsbGJhY2tXcmFwcGVyO1xuXHQgICAgICAgIHJldHVybiB7IG51bWJlcjogbnVtYmVyLCBpZDogaWQsIG5hbWU6IG5hbWUsIGNhbGxiYWNrOiBjYWxsYmFja1dyYXBwZXIgfTtcblx0ICAgIH07XG5cdCAgICBTY3JpcHRSZWNlaXZlckZhY3RvcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyZWNlaXZlcikge1xuXHQgICAgICAgIGRlbGV0ZSB0aGlzW3JlY2VpdmVyLm51bWJlcl07XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFNjcmlwdFJlY2VpdmVyRmFjdG9yeTtcblx0fSgpKTtcblx0ZXhwb3J0cy5TY3JpcHRSZWNlaXZlckZhY3RvcnkgPSBTY3JpcHRSZWNlaXZlckZhY3Rvcnk7XG5cdGV4cG9ydHMuU2NyaXB0UmVjZWl2ZXJzID0gbmV3IFNjcmlwdFJlY2VpdmVyRmFjdG9yeShcIl9wdXNoZXJfc2NyaXB0X1wiLCBcIlB1c2hlci5TY3JpcHRSZWNlaXZlcnNcIik7XG5cblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBEZWZhdWx0cyA9IHtcblx0ICAgIFZFUlNJT046IFwiNC4yLjJcIixcblx0ICAgIFBST1RPQ09MOiA3LFxuXHQgICAgaG9zdDogJ3dzLnB1c2hlcmFwcC5jb20nLFxuXHQgICAgd3NfcG9ydDogODAsXG5cdCAgICB3c3NfcG9ydDogNDQzLFxuXHQgICAgd3NfcGF0aDogJycsXG5cdCAgICBzb2NranNfaG9zdDogJ3NvY2tqcy5wdXNoZXIuY29tJyxcblx0ICAgIHNvY2tqc19odHRwX3BvcnQ6IDgwLFxuXHQgICAgc29ja2pzX2h0dHBzX3BvcnQ6IDQ0Myxcblx0ICAgIHNvY2tqc19wYXRoOiBcIi9wdXNoZXJcIixcblx0ICAgIHN0YXRzX2hvc3Q6ICdzdGF0cy5wdXNoZXIuY29tJyxcblx0ICAgIGNoYW5uZWxfYXV0aF9lbmRwb2ludDogJy9wdXNoZXIvYXV0aCcsXG5cdCAgICBjaGFubmVsX2F1dGhfdHJhbnNwb3J0OiAnYWpheCcsXG5cdCAgICBhY3Rpdml0eV90aW1lb3V0OiAxMjAwMDAsXG5cdCAgICBwb25nX3RpbWVvdXQ6IDMwMDAwLFxuXHQgICAgdW5hdmFpbGFibGVfdGltZW91dDogMTAwMDAsXG5cdCAgICBjZG5faHR0cDogJ2h0dHA6Ly9qcy5wdXNoZXIuY29tJyxcblx0ICAgIGNkbl9odHRwczogJ2h0dHBzOi8vanMucHVzaGVyLmNvbScsXG5cdCAgICBkZXBlbmRlbmN5X3N1ZmZpeDogJydcblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEZWZhdWx0cztcblxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIHNjcmlwdF9yZWNlaXZlcl9mYWN0b3J5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgcnVudGltZV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIERlcGVuZGVuY3lMb2FkZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRGVwZW5kZW5jeUxvYWRlcihvcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0ICAgICAgICB0aGlzLnJlY2VpdmVycyA9IG9wdGlvbnMucmVjZWl2ZXJzIHx8IHNjcmlwdF9yZWNlaXZlcl9mYWN0b3J5XzEuU2NyaXB0UmVjZWl2ZXJzO1xuXHQgICAgICAgIHRoaXMubG9hZGluZyA9IHt9O1xuXHQgICAgfVxuXHQgICAgRGVwZW5kZW5jeUxvYWRlci5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zLCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgICBpZiAoc2VsZi5sb2FkaW5nW25hbWVdICYmIHNlbGYubG9hZGluZ1tuYW1lXS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHNlbGYubG9hZGluZ1tuYW1lXS5wdXNoKGNhbGxiYWNrKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHNlbGYubG9hZGluZ1tuYW1lXSA9IFtjYWxsYmFja107XG5cdCAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5jcmVhdGVTY3JpcHRSZXF1ZXN0KHNlbGYuZ2V0UGF0aChuYW1lLCBvcHRpb25zKSk7XG5cdCAgICAgICAgICAgIHZhciByZWNlaXZlciA9IHNlbGYucmVjZWl2ZXJzLmNyZWF0ZShmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgIHNlbGYucmVjZWl2ZXJzLnJlbW92ZShyZWNlaXZlcik7XG5cdCAgICAgICAgICAgICAgICBpZiAoc2VsZi5sb2FkaW5nW25hbWVdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYubG9hZGluZ1tuYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5sb2FkaW5nW25hbWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiAod2FzU3VjY2Vzc2Z1bCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc1N1Y2Nlc3NmdWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY2xlYW51cCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0oZXJyb3IsIHN1Y2Nlc3NDYWxsYmFjayk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgcmVxdWVzdC5zZW5kKHJlY2VpdmVyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgRGVwZW5kZW5jeUxvYWRlci5wcm90b3R5cGUuZ2V0Um9vdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIGNkbjtcblx0ICAgICAgICB2YXIgcHJvdG9jb2wgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLmdldERvY3VtZW50KCkubG9jYXRpb24ucHJvdG9jb2w7XG5cdCAgICAgICAgaWYgKChvcHRpb25zICYmIG9wdGlvbnMuZW5jcnlwdGVkKSB8fCBwcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuXHQgICAgICAgICAgICBjZG4gPSB0aGlzLm9wdGlvbnMuY2RuX2h0dHBzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY2RuID0gdGhpcy5vcHRpb25zLmNkbl9odHRwO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY2RuLnJlcGxhY2UoL1xcLyokLywgXCJcIikgKyBcIi9cIiArIHRoaXMub3B0aW9ucy52ZXJzaW9uO1xuXHQgICAgfTtcblx0ICAgIERlcGVuZGVuY3lMb2FkZXIucHJvdG90eXBlLmdldFBhdGggPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmdldFJvb3Qob3B0aW9ucykgKyAnLycgKyBuYW1lICsgdGhpcy5vcHRpb25zLnN1ZmZpeCArICcuanMnO1xuXHQgICAgfTtcblx0ICAgIDtcblx0ICAgIHJldHVybiBEZXBlbmRlbmN5TG9hZGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IERlcGVuZGVuY3lMb2FkZXI7XG5cblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBsb2dnZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgdXJsX3N0b3JlXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0dmFyIGFqYXggPSBmdW5jdGlvbiAoY29udGV4dCwgc29ja2V0SWQsIGNhbGxiYWNrKSB7XG5cdCAgICB2YXIgc2VsZiA9IHRoaXMsIHhocjtcblx0ICAgIHhociA9IHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uY3JlYXRlWEhSKCk7XG5cdCAgICB4aHIub3BlbihcIlBPU1RcIiwgc2VsZi5vcHRpb25zLmF1dGhFbmRwb2ludCwgdHJ1ZSk7XG5cdCAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcblx0ICAgIGZvciAodmFyIGhlYWRlck5hbWUgaW4gdGhpcy5hdXRoT3B0aW9ucy5oZWFkZXJzKSB7XG5cdCAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyTmFtZSwgdGhpcy5hdXRoT3B0aW9ucy5oZWFkZXJzW2hlYWRlck5hbWVdKTtcblx0ICAgIH1cblx0ICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG5cdCAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcblx0ICAgICAgICAgICAgICAgIHZhciBkYXRhLCBwYXJzZWQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSwgJ0pTT04gcmV0dXJuZWQgZnJvbSB3ZWJhcHAgd2FzIGludmFsaWQsIHlldCBzdGF0dXMgY29kZSB3YXMgMjAwLiBEYXRhIHdhczogJyArIHhoci5yZXNwb25zZVRleHQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlLCBkYXRhKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHZhciBzdWZmaXggPSB1cmxfc3RvcmVfMVtcImRlZmF1bHRcIl0uYnVpbGRMb2dTdWZmaXgoXCJhdXRoZW50aWNhdGlvbkVuZHBvaW50XCIpO1xuXHQgICAgICAgICAgICAgICAgbG9nZ2VyXzFbXCJkZWZhdWx0XCJdLndhcm4oKFwiQ291bGRuJ3QgcmV0cmlldmUgYXV0aGVudGljYXRpb24gaW5mby4gXCIgKyB4aHIuc3RhdHVzKSArXG5cdCAgICAgICAgICAgICAgICAgICAgKFwiQ2xpZW50cyBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdG8gam9pbiBwcml2YXRlIG9yIHByZXNlbmNlIGNoYW5uZWxzLiBcIiArIHN1ZmZpeCkpO1xuXHQgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSwgeGhyLnN0YXR1cyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgeGhyLnNlbmQodGhpcy5jb21wb3NlUXVlcnkoc29ja2V0SWQpKTtcblx0ICAgIHJldHVybiB4aHI7XG5cdH07XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gYWpheDtcblxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGNvbGxlY3Rpb25zXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgcHVzaGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHR2YXIgTG9nZ2VyID0ge1xuXHQgICAgZGVidWc6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYXJncyA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghcHVzaGVyXzFbXCJkZWZhdWx0XCJdLmxvZykge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHB1c2hlcl8xW1wiZGVmYXVsdFwiXS5sb2coY29sbGVjdGlvbnNfMS5zdHJpbmdpZnkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG5cdCAgICB9LFxuXHQgICAgd2FybjogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBhcmdzID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1lc3NhZ2UgPSBjb2xsZWN0aW9uc18xLnN0cmluZ2lmeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIGlmIChwdXNoZXJfMVtcImRlZmF1bHRcIl0ubG9nKSB7XG5cdCAgICAgICAgICAgIHB1c2hlcl8xW1wiZGVmYXVsdFwiXS5sb2cobWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCh3aW5kb3cpLmNvbnNvbGUpIHtcblx0ICAgICAgICAgICAgaWYgKCh3aW5kb3cpLmNvbnNvbGUud2Fybikge1xuXHQgICAgICAgICAgICAgICAgKHdpbmRvdykuY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKCh3aW5kb3cpLmNvbnNvbGUubG9nKSB7XG5cdCAgICAgICAgICAgICAgICAod2luZG93KS5jb25zb2xlLmxvZyhtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBMb2dnZXI7XG5cblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBiYXNlNjRfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHR2YXIgdXRpbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQpIHtcblx0ICAgIHZhciBzb3VyY2VzID0gW107XG5cdCAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuXHQgICAgICAgIHNvdXJjZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG5cdCAgICB9XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IHNvdXJjZXNbaV07XG5cdCAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZXh0ZW5zaW9ucykge1xuXHQgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uc1twcm9wZXJ0eV0gJiYgZXh0ZW5zaW9uc1twcm9wZXJ0eV0uY29uc3RydWN0b3IgJiZcblx0ICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNbcHJvcGVydHldLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcblx0ICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eV0gPSBleHRlbmQodGFyZ2V0W3Byb3BlcnR5XSB8fCB7fSwgZXh0ZW5zaW9uc1twcm9wZXJ0eV0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5XSA9IGV4dGVuc2lvbnNbcHJvcGVydHldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRhcmdldDtcblx0fVxuXHRleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDtcblx0ZnVuY3Rpb24gc3RyaW5naWZ5KCkge1xuXHQgICAgdmFyIG0gPSBbXCJQdXNoZXJcIl07XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgICAgICAgIG0ucHVzaChhcmd1bWVudHNbaV0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgbS5wdXNoKHNhZmVKU09OU3RyaW5naWZ5KGFyZ3VtZW50c1tpXSkpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBtLmpvaW4oXCIgOiBcIik7XG5cdH1cblx0ZXhwb3J0cy5zdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG5cdGZ1bmN0aW9uIGFycmF5SW5kZXhPZihhcnJheSwgaXRlbSkge1xuXHQgICAgdmFyIG5hdGl2ZUluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcblx0ICAgIGlmIChhcnJheSA9PT0gbnVsbCkge1xuXHQgICAgICAgIHJldHVybiAtMTtcblx0ICAgIH1cblx0ICAgIGlmIChuYXRpdmVJbmRleE9mICYmIGFycmF5LmluZGV4T2YgPT09IG5hdGl2ZUluZGV4T2YpIHtcblx0ICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtKTtcblx0ICAgIH1cblx0ICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiAtMTtcblx0fVxuXHRleHBvcnRzLmFycmF5SW5kZXhPZiA9IGFycmF5SW5kZXhPZjtcblx0ZnVuY3Rpb24gb2JqZWN0QXBwbHkob2JqZWN0LCBmKSB7XG5cdCAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG5cdCAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcblx0ICAgICAgICAgICAgZihvYmplY3Rba2V5XSwga2V5LCBvYmplY3QpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fVxuXHRleHBvcnRzLm9iamVjdEFwcGx5ID0gb2JqZWN0QXBwbHk7XG5cdGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG5cdCAgICB2YXIga2V5cyA9IFtdO1xuXHQgICAgb2JqZWN0QXBwbHkob2JqZWN0LCBmdW5jdGlvbiAoXywga2V5KSB7XG5cdCAgICAgICAga2V5cy5wdXNoKGtleSk7XG5cdCAgICB9KTtcblx0ICAgIHJldHVybiBrZXlzO1xuXHR9XG5cdGV4cG9ydHMua2V5cyA9IGtleXM7XG5cdGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcblx0ICAgIHZhciB2YWx1ZXMgPSBbXTtcblx0ICAgIG9iamVjdEFwcGx5KG9iamVjdCwgZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuXHQgICAgfSk7XG5cdCAgICByZXR1cm4gdmFsdWVzO1xuXHR9XG5cdGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXHRmdW5jdGlvbiBhcHBseShhcnJheSwgZiwgY29udGV4dCkge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGYuY2FsbChjb250ZXh0IHx8ICh3aW5kb3cpLCBhcnJheVtpXSwgaSwgYXJyYXkpO1xuXHQgICAgfVxuXHR9XG5cdGV4cG9ydHMuYXBwbHkgPSBhcHBseTtcblx0ZnVuY3Rpb24gbWFwKGFycmF5LCBmKSB7XG5cdCAgICB2YXIgcmVzdWx0ID0gW107XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgcmVzdWx0LnB1c2goZihhcnJheVtpXSwgaSwgYXJyYXksIHJlc3VsdCkpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXHRleHBvcnRzLm1hcCA9IG1hcDtcblx0ZnVuY3Rpb24gbWFwT2JqZWN0KG9iamVjdCwgZikge1xuXHQgICAgdmFyIHJlc3VsdCA9IHt9O1xuXHQgICAgb2JqZWN0QXBwbHkob2JqZWN0LCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuXHQgICAgICAgIHJlc3VsdFtrZXldID0gZih2YWx1ZSk7XG5cdCAgICB9KTtcblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdH1cblx0ZXhwb3J0cy5tYXBPYmplY3QgPSBtYXBPYmplY3Q7XG5cdGZ1bmN0aW9uIGZpbHRlcihhcnJheSwgdGVzdCkge1xuXHQgICAgdGVzdCA9IHRlc3QgfHwgZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAhIXZhbHVlOyB9O1xuXHQgICAgdmFyIHJlc3VsdCA9IFtdO1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGlmICh0ZXN0KGFycmF5W2ldLCBpLCBhcnJheSwgcmVzdWx0KSkge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXHRleHBvcnRzLmZpbHRlciA9IGZpbHRlcjtcblx0ZnVuY3Rpb24gZmlsdGVyT2JqZWN0KG9iamVjdCwgdGVzdCkge1xuXHQgICAgdmFyIHJlc3VsdCA9IHt9O1xuXHQgICAgb2JqZWN0QXBwbHkob2JqZWN0LCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuXHQgICAgICAgIGlmICgodGVzdCAmJiB0ZXN0KHZhbHVlLCBrZXksIG9iamVjdCwgcmVzdWx0KSkgfHwgQm9vbGVhbih2YWx1ZSkpIHtcblx0ICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdH1cblx0ZXhwb3J0cy5maWx0ZXJPYmplY3QgPSBmaWx0ZXJPYmplY3Q7XG5cdGZ1bmN0aW9uIGZsYXR0ZW4ob2JqZWN0KSB7XG5cdCAgICB2YXIgcmVzdWx0ID0gW107XG5cdCAgICBvYmplY3RBcHBseShvYmplY3QsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG5cdCAgICAgICAgcmVzdWx0LnB1c2goW2tleSwgdmFsdWVdKTtcblx0ICAgIH0pO1xuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXHRleHBvcnRzLmZsYXR0ZW4gPSBmbGF0dGVuO1xuXHRmdW5jdGlvbiBhbnkoYXJyYXksIHRlc3QpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBpZiAodGVzdChhcnJheVtpXSwgaSwgYXJyYXkpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBmYWxzZTtcblx0fVxuXHRleHBvcnRzLmFueSA9IGFueTtcblx0ZnVuY3Rpb24gYWxsKGFycmF5LCB0ZXN0KSB7XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKCF0ZXN0KGFycmF5W2ldLCBpLCBhcnJheSkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiB0cnVlO1xuXHR9XG5cdGV4cG9ydHMuYWxsID0gYWxsO1xuXHRmdW5jdGlvbiBlbmNvZGVQYXJhbXNPYmplY3QoZGF0YSkge1xuXHQgICAgcmV0dXJuIG1hcE9iamVjdChkYXRhLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdCAgICAgICAgICAgIHZhbHVlID0gc2FmZUpTT05TdHJpbmdpZnkodmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NF8xW1wiZGVmYXVsdFwiXSh2YWx1ZS50b1N0cmluZygpKSk7XG5cdCAgICB9KTtcblx0fVxuXHRleHBvcnRzLmVuY29kZVBhcmFtc09iamVjdCA9IGVuY29kZVBhcmFtc09iamVjdDtcblx0ZnVuY3Rpb24gYnVpbGRRdWVyeVN0cmluZyhkYXRhKSB7XG5cdCAgICB2YXIgcGFyYW1zID0gZmlsdGVyT2JqZWN0KGRhdGEsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuXHQgICAgfSk7XG5cdCAgICB2YXIgcXVlcnkgPSBtYXAoZmxhdHRlbihlbmNvZGVQYXJhbXNPYmplY3QocGFyYW1zKSksIHV0aWxfMVtcImRlZmF1bHRcIl0ubWV0aG9kKFwiam9pblwiLCBcIj1cIikpLmpvaW4oXCImXCIpO1xuXHQgICAgcmV0dXJuIHF1ZXJ5O1xuXHR9XG5cdGV4cG9ydHMuYnVpbGRRdWVyeVN0cmluZyA9IGJ1aWxkUXVlcnlTdHJpbmc7XG5cdGZ1bmN0aW9uIGRlY3ljbGVPYmplY3Qob2JqZWN0KSB7XG5cdCAgICB2YXIgb2JqZWN0cyA9IFtdLCBwYXRocyA9IFtdO1xuXHQgICAgcmV0dXJuIChmdW5jdGlvbiBkZXJleih2YWx1ZSwgcGF0aCkge1xuXHQgICAgICAgIHZhciBpLCBuYW1lLCBudTtcblx0ICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuXHQgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuXHQgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0c1tpXSA9PT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgJHJlZjogcGF0aHNbaV0gfTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBvYmplY3RzLnB1c2godmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcblx0ICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuXHQgICAgICAgICAgICAgICAgICAgIG51ID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG51W2ldID0gZGVyZXoodmFsdWVbaV0sIHBhdGggKyAnWycgKyBpICsgJ10nKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBudSA9IHt9O1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobmFtZSBpbiB2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBuYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVbbmFtZV0gPSBkZXJleih2YWx1ZVtuYW1lXSwgcGF0aCArICdbJyArIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgJ10nKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBudTtcblx0ICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcblx0ICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcblx0ICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgfShvYmplY3QsICckJykpO1xuXHR9XG5cdGV4cG9ydHMuZGVjeWNsZU9iamVjdCA9IGRlY3ljbGVPYmplY3Q7XG5cdGZ1bmN0aW9uIHNhZmVKU09OU3RyaW5naWZ5KHNvdXJjZSkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc291cmNlKTtcblx0ICAgIH1cblx0ICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRlY3ljbGVPYmplY3Qoc291cmNlKSk7XG5cdCAgICB9XG5cdH1cblx0ZXhwb3J0cy5zYWZlSlNPTlN0cmluZ2lmeSA9IHNhZmVKU09OU3RyaW5naWZ5O1xuXG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0ZnVuY3Rpb24gZW5jb2RlKHMpIHtcblx0ICAgIHJldHVybiBidG9hKHV0b2IocykpO1xuXHR9XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZW5jb2RlO1xuXHR2YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblx0dmFyIGI2NGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXHR2YXIgYjY0dGFiID0ge307XG5cdGZvciAodmFyIGkgPSAwLCBsID0gYjY0Y2hhcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICBiNjR0YWJbYjY0Y2hhcnMuY2hhckF0KGkpXSA9IGk7XG5cdH1cblx0dmFyIGNiX3V0b2IgPSBmdW5jdGlvbiAoYykge1xuXHQgICAgdmFyIGNjID0gYy5jaGFyQ29kZUF0KDApO1xuXHQgICAgcmV0dXJuIGNjIDwgMHg4MCA/IGNcblx0ICAgICAgICA6IGNjIDwgMHg4MDAgPyBmcm9tQ2hhckNvZGUoMHhjMCB8IChjYyA+Pj4gNikpICtcblx0ICAgICAgICAgICAgZnJvbUNoYXJDb2RlKDB4ODAgfCAoY2MgJiAweDNmKSlcblx0ICAgICAgICAgICAgOiBmcm9tQ2hhckNvZGUoMHhlMCB8ICgoY2MgPj4+IDEyKSAmIDB4MGYpKSArXG5cdCAgICAgICAgICAgICAgICBmcm9tQ2hhckNvZGUoMHg4MCB8ICgoY2MgPj4+IDYpICYgMHgzZikpICtcblx0ICAgICAgICAgICAgICAgIGZyb21DaGFyQ29kZSgweDgwIHwgKGNjICYgMHgzZikpO1xuXHR9O1xuXHR2YXIgdXRvYiA9IGZ1bmN0aW9uICh1KSB7XG5cdCAgICByZXR1cm4gdS5yZXBsYWNlKC9bXlxceDAwLVxceDdGXS9nLCBjYl91dG9iKTtcblx0fTtcblx0dmFyIGNiX2VuY29kZSA9IGZ1bmN0aW9uIChjY2MpIHtcblx0ICAgIHZhciBwYWRsZW4gPSBbMCwgMiwgMV1bY2NjLmxlbmd0aCAlIDNdO1xuXHQgICAgdmFyIG9yZCA9IGNjYy5jaGFyQ29kZUF0KDApIDw8IDE2XG5cdCAgICAgICAgfCAoKGNjYy5sZW5ndGggPiAxID8gY2NjLmNoYXJDb2RlQXQoMSkgOiAwKSA8PCA4KVxuXHQgICAgICAgIHwgKChjY2MubGVuZ3RoID4gMiA/IGNjYy5jaGFyQ29kZUF0KDIpIDogMCkpO1xuXHQgICAgdmFyIGNoYXJzID0gW1xuXHQgICAgICAgIGI2NGNoYXJzLmNoYXJBdChvcmQgPj4+IDE4KSxcblx0ICAgICAgICBiNjRjaGFycy5jaGFyQXQoKG9yZCA+Pj4gMTIpICYgNjMpLFxuXHQgICAgICAgIHBhZGxlbiA+PSAyID8gJz0nIDogYjY0Y2hhcnMuY2hhckF0KChvcmQgPj4+IDYpICYgNjMpLFxuXHQgICAgICAgIHBhZGxlbiA+PSAxID8gJz0nIDogYjY0Y2hhcnMuY2hhckF0KG9yZCAmIDYzKVxuXHQgICAgXTtcblx0ICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcblx0fTtcblx0dmFyIGJ0b2EgPSAod2luZG93KS5idG9hIHx8IGZ1bmN0aW9uIChiKSB7XG5cdCAgICByZXR1cm4gYi5yZXBsYWNlKC9bXFxzXFxTXXsxLDN9L2csIGNiX2VuY29kZSk7XG5cdH07XG5cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgdGltZXJzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblx0dmFyIFV0aWwgPSB7XG5cdCAgICBub3c6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoRGF0ZS5ub3cpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGRlZmVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0ICAgICAgICByZXR1cm4gbmV3IHRpbWVyc18xLk9uZU9mZlRpbWVyKDAsIGNhbGxiYWNrKTtcblx0ICAgIH0sXG5cdCAgICBtZXRob2Q6IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICAgICAgdmFyIGFyZ3MgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuXHQgICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYm91bmRBcmd1bWVudHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBvYmplY3RbbmFtZV0uYXBwbHkob2JqZWN0LCBib3VuZEFyZ3VtZW50cy5jb25jYXQoYXJndW1lbnRzKSk7XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBVdGlsO1xuXG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuXHQgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0fTtcblx0dmFyIGFic3RyYWN0X3RpbWVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0ZnVuY3Rpb24gY2xlYXJUaW1lb3V0KHRpbWVyKSB7XG5cdCAgICAod2luZG93KS5jbGVhclRpbWVvdXQodGltZXIpO1xuXHR9XG5cdGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwodGltZXIpIHtcblx0ICAgICh3aW5kb3cpLmNsZWFySW50ZXJ2YWwodGltZXIpO1xuXHR9XG5cdHZhciBPbmVPZmZUaW1lciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoT25lT2ZmVGltZXIsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBPbmVPZmZUaW1lcihkZWxheSwgY2FsbGJhY2spIHtcblx0ICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzZXRUaW1lb3V0LCBjbGVhclRpbWVvdXQsIGRlbGF5LCBmdW5jdGlvbiAodGltZXIpIHtcblx0ICAgICAgICAgICAgY2FsbGJhY2soKTtcblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gT25lT2ZmVGltZXI7XG5cdH0oYWJzdHJhY3RfdGltZXJfMVtcImRlZmF1bHRcIl0pKTtcblx0ZXhwb3J0cy5PbmVPZmZUaW1lciA9IE9uZU9mZlRpbWVyO1xuXHR2YXIgUGVyaW9kaWNUaW1lciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoUGVyaW9kaWNUaW1lciwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIFBlcmlvZGljVGltZXIoZGVsYXksIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc2V0SW50ZXJ2YWwsIGNsZWFySW50ZXJ2YWwsIGRlbGF5LCBmdW5jdGlvbiAodGltZXIpIHtcblx0ICAgICAgICAgICAgY2FsbGJhY2soKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRpbWVyO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFBlcmlvZGljVGltZXI7XG5cdH0oYWJzdHJhY3RfdGltZXJfMVtcImRlZmF1bHRcIl0pKTtcblx0ZXhwb3J0cy5QZXJpb2RpY1RpbWVyID0gUGVyaW9kaWNUaW1lcjtcblxuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBUaW1lciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUaW1lcihzZXQsIGNsZWFyLCBkZWxheSwgY2FsbGJhY2spIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHRoaXMuY2xlYXIgPSBjbGVhcjtcblx0ICAgICAgICB0aGlzLnRpbWVyID0gc2V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLnRpbWVyKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy50aW1lciA9IGNhbGxiYWNrKF90aGlzLnRpbWVyKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sIGRlbGF5KTtcblx0ICAgIH1cblx0ICAgIFRpbWVyLnByb3RvdHlwZS5pc1J1bm5pbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudGltZXIgIT09IG51bGw7XG5cdCAgICB9O1xuXHQgICAgVGltZXIucHJvdG90eXBlLmVuc3VyZUFib3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLnRpbWVyKTtcblx0ICAgICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIHJldHVybiBUaW1lcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBUaW1lcjtcblxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciB1cmxTdG9yZSA9IHtcblx0ICAgIGJhc2VVcmw6IFwiaHR0cHM6Ly9wdXNoZXIuY29tXCIsXG5cdCAgICB1cmxzOiB7XG5cdCAgICAgICAgYXV0aGVudGljYXRpb25FbmRwb2ludDoge1xuXHQgICAgICAgICAgICBwYXRoOiBcIi9kb2NzL2F1dGhlbnRpY2F0aW5nX3VzZXJzXCJcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGphdmFzY3JpcHRRdWlja1N0YXJ0OiB7XG5cdCAgICAgICAgICAgIHBhdGg6IFwiL2RvY3MvamF2YXNjcmlwdF9xdWlja19zdGFydFwiXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9O1xuXHR2YXIgYnVpbGRMb2dTdWZmaXggPSBmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICB2YXIgdXJsUHJlZml4ID0gXCJTZWU6XCI7XG5cdCAgICB2YXIgdXJsT2JqID0gdXJsU3RvcmUudXJsc1trZXldO1xuXHQgICAgaWYgKCF1cmxPYmopXG5cdCAgICAgICAgcmV0dXJuIFwiXCI7XG5cdCAgICB2YXIgdXJsO1xuXHQgICAgaWYgKHVybE9iai5mdWxsVXJsKSB7XG5cdCAgICAgICAgdXJsID0gdXJsT2JqLmZ1bGxVcmw7XG5cdCAgICB9XG5cdCAgICBlbHNlIGlmICh1cmxPYmoucGF0aCkge1xuXHQgICAgICAgIHVybCA9IHVybFN0b3JlLmJhc2VVcmwgKyB1cmxPYmoucGF0aDtcblx0ICAgIH1cblx0ICAgIGlmICghdXJsKVxuXHQgICAgICAgIHJldHVybiBcIlwiO1xuXHQgICAgcmV0dXJuIHVybFByZWZpeCArIFwiIFwiICsgdXJsO1xuXHR9O1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IHsgYnVpbGRMb2dTdWZmaXg6IGJ1aWxkTG9nU3VmZml4IH07XG5cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgbG9nZ2VyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHR2YXIganNvbnAgPSBmdW5jdGlvbiAoY29udGV4dCwgc29ja2V0SWQsIGNhbGxiYWNrKSB7XG5cdCAgICBpZiAodGhpcy5hdXRoT3B0aW9ucy5oZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICBsb2dnZXJfMVtcImRlZmF1bHRcIl0ud2FybihcIldhcm5cIiwgXCJUbyBzZW5kIGhlYWRlcnMgd2l0aCB0aGUgYXV0aCByZXF1ZXN0LCB5b3UgbXVzdCB1c2UgQUpBWCwgcmF0aGVyIHRoYW4gSlNPTlAuXCIpO1xuXHQgICAgfVxuXHQgICAgdmFyIGNhbGxiYWNrTmFtZSA9IGNvbnRleHQubmV4dEF1dGhDYWxsYmFja0lELnRvU3RyaW5nKCk7XG5cdCAgICBjb250ZXh0Lm5leHRBdXRoQ2FsbGJhY2tJRCsrO1xuXHQgICAgdmFyIGRvY3VtZW50ID0gY29udGV4dC5nZXREb2N1bWVudCgpO1xuXHQgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdCAgICBjb250ZXh0LmF1dGhfY2FsbGJhY2tzW2NhbGxiYWNrTmFtZV0gPSBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgIGNhbGxiYWNrKGZhbHNlLCBkYXRhKTtcblx0ICAgIH07XG5cdCAgICB2YXIgY2FsbGJhY2tfbmFtZSA9IFwiUHVzaGVyLmF1dGhfY2FsbGJhY2tzWydcIiArIGNhbGxiYWNrTmFtZSArIFwiJ11cIjtcblx0ICAgIHNjcmlwdC5zcmMgPSB0aGlzLm9wdGlvbnMuYXV0aEVuZHBvaW50ICtcblx0ICAgICAgICAnP2NhbGxiYWNrPScgK1xuXHQgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChjYWxsYmFja19uYW1lKSArXG5cdCAgICAgICAgJyYnICtcblx0ICAgICAgICB0aGlzLmNvbXBvc2VRdWVyeShzb2NrZXRJZCk7XG5cdCAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdCAgICBoZWFkLmluc2VydEJlZm9yZShzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCk7XG5cdH07XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0ganNvbnA7XG5cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgU2NyaXB0UmVxdWVzdCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTY3JpcHRSZXF1ZXN0KHNyYykge1xuXHQgICAgICAgIHRoaXMuc3JjID0gc3JjO1xuXHQgICAgfVxuXHQgICAgU2NyaXB0UmVxdWVzdC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChyZWNlaXZlcikge1xuXHQgICAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgICB2YXIgZXJyb3JTdHJpbmcgPSBcIkVycm9yIGxvYWRpbmcgXCIgKyBzZWxmLnNyYztcblx0ICAgICAgICBzZWxmLnNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdCAgICAgICAgc2VsZi5zY3JpcHQuaWQgPSByZWNlaXZlci5pZDtcblx0ICAgICAgICBzZWxmLnNjcmlwdC5zcmMgPSBzZWxmLnNyYztcblx0ICAgICAgICBzZWxmLnNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcblx0ICAgICAgICBzZWxmLnNjcmlwdC5jaGFyc2V0ID0gXCJVVEYtOFwiO1xuXHQgICAgICAgIGlmIChzZWxmLnNjcmlwdC5hZGRFdmVudExpc3RlbmVyKSB7XG5cdCAgICAgICAgICAgIHNlbGYuc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZWNlaXZlci5jYWxsYmFjayhlcnJvclN0cmluZyk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIHNlbGYuc2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJlY2VpdmVyLmNhbGxiYWNrKG51bGwpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgc2VsZi5zY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NyaXB0LnJlYWR5U3RhdGUgPT09ICdsb2FkZWQnIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgc2VsZi5zY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmNhbGxiYWNrKG51bGwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoc2VsZi5zY3JpcHQuYXN5bmMgPT09IHVuZGVmaW5lZCAmJiBkb2N1bWVudC5hdHRhY2hFdmVudCAmJlxuXHQgICAgICAgICAgICAvb3BlcmEvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdCAgICAgICAgICAgIHNlbGYuZXJyb3JTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuXHQgICAgICAgICAgICBzZWxmLmVycm9yU2NyaXB0LmlkID0gcmVjZWl2ZXIuaWQgKyBcIl9lcnJvclwiO1xuXHQgICAgICAgICAgICBzZWxmLmVycm9yU2NyaXB0LnRleHQgPSByZWNlaXZlci5uYW1lICsgXCIoJ1wiICsgZXJyb3JTdHJpbmcgKyBcIicpO1wiO1xuXHQgICAgICAgICAgICBzZWxmLnNjcmlwdC5hc3luYyA9IHNlbGYuZXJyb3JTY3JpcHQuYXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHNlbGYuc2NyaXB0LmFzeW5jID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuXHQgICAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHNlbGYuc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQpO1xuXHQgICAgICAgIGlmIChzZWxmLmVycm9yU2NyaXB0KSB7XG5cdCAgICAgICAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHNlbGYuZXJyb3JTY3JpcHQsIHNlbGYuc2NyaXB0Lm5leHRTaWJsaW5nKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgU2NyaXB0UmVxdWVzdC5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5zY3JpcHQpIHtcblx0ICAgICAgICAgICAgdGhpcy5zY3JpcHQub25sb2FkID0gdGhpcy5zY3JpcHQub25lcnJvciA9IG51bGw7XG5cdCAgICAgICAgICAgIHRoaXMuc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnNjcmlwdCAmJiB0aGlzLnNjcmlwdC5wYXJlbnROb2RlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5lcnJvclNjcmlwdCAmJiB0aGlzLmVycm9yU2NyaXB0LnBhcmVudE5vZGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5lcnJvclNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZXJyb3JTY3JpcHQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnNjcmlwdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5lcnJvclNjcmlwdCA9IG51bGw7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFNjcmlwdFJlcXVlc3Q7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU2NyaXB0UmVxdWVzdDtcblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBDb2xsZWN0aW9ucyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgSlNPTlBSZXF1ZXN0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTT05QUmVxdWVzdCh1cmwsIGRhdGEpIHtcblx0ICAgICAgICB0aGlzLnVybCA9IHVybDtcblx0ICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXHQgICAgfVxuXHQgICAgSlNPTlBSZXF1ZXN0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKHJlY2VpdmVyKSB7XG5cdCAgICAgICAgaWYgKHRoaXMucmVxdWVzdCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBxdWVyeSA9IENvbGxlY3Rpb25zLmJ1aWxkUXVlcnlTdHJpbmcodGhpcy5kYXRhKTtcblx0ICAgICAgICB2YXIgdXJsID0gdGhpcy51cmwgKyBcIi9cIiArIHJlY2VpdmVyLm51bWJlciArIFwiP1wiICsgcXVlcnk7XG5cdCAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5jcmVhdGVTY3JpcHRSZXF1ZXN0KHVybCk7XG5cdCAgICAgICAgdGhpcy5yZXF1ZXN0LnNlbmQocmVjZWl2ZXIpO1xuXHQgICAgfTtcblx0ICAgIEpTT05QUmVxdWVzdC5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XG5cdCAgICAgICAgICAgIHRoaXMucmVxdWVzdC5jbGVhbnVwKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIHJldHVybiBKU09OUFJlcXVlc3Q7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gSlNPTlBSZXF1ZXN0O1xuXG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIHJ1bnRpbWVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBzY3JpcHRfcmVjZWl2ZXJfZmFjdG9yeV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIGdldEFnZW50ID0gZnVuY3Rpb24gKHNlbmRlciwgZW5jcnlwdGVkKSB7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIHNjaGVtZSA9IFwiaHR0cFwiICsgKGVuY3J5cHRlZCA/IFwic1wiIDogXCJcIikgKyBcIjovL1wiO1xuXHQgICAgICAgIHZhciB1cmwgPSBzY2hlbWUgKyAoc2VuZGVyLmhvc3QgfHwgc2VuZGVyLm9wdGlvbnMuaG9zdCkgKyBzZW5kZXIub3B0aW9ucy5wYXRoO1xuXHQgICAgICAgIHZhciByZXF1ZXN0ID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5jcmVhdGVKU09OUFJlcXVlc3QodXJsLCBkYXRhKTtcblx0ICAgICAgICB2YXIgcmVjZWl2ZXIgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLlNjcmlwdFJlY2VpdmVycy5jcmVhdGUoZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcblx0ICAgICAgICAgICAgc2NyaXB0X3JlY2VpdmVyX2ZhY3RvcnlfMS5TY3JpcHRSZWNlaXZlcnMucmVtb3ZlKHJlY2VpdmVyKTtcblx0ICAgICAgICAgICAgcmVxdWVzdC5jbGVhbnVwKCk7XG5cdCAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmhvc3QpIHtcblx0ICAgICAgICAgICAgICAgIHNlbmRlci5ob3N0ID0gcmVzdWx0Lmhvc3Q7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJlcXVlc3Quc2VuZChyZWNlaXZlcik7XG5cdCAgICB9O1xuXHR9O1xuXHR2YXIganNvbnAgPSB7XG5cdCAgICBuYW1lOiAnanNvbnAnLFxuXHQgICAgZ2V0QWdlbnQ6IGdldEFnZW50XG5cdH07XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0ganNvbnA7XG5cblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgdHJhbnNwb3J0c18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cdHZhciB0cmFuc3BvcnRfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpO1xuXHR2YXIgVVJMU2NoZW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpO1xuXHR2YXIgcnVudGltZV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIGRlcGVuZGVuY2llc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIFNvY2tKU1RyYW5zcG9ydCA9IG5ldyB0cmFuc3BvcnRfMVtcImRlZmF1bHRcIl0oe1xuXHQgICAgZmlsZTogXCJzb2NranNcIixcblx0ICAgIHVybHM6IFVSTFNjaGVtZXMuc29ja2pzLFxuXHQgICAgaGFuZGxlc0FjdGl2aXR5Q2hlY2tzOiB0cnVlLFxuXHQgICAgc3VwcG9ydHNQaW5nOiBmYWxzZSxcblx0ICAgIGlzU3VwcG9ydGVkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9LFxuXHQgICAgaXNJbml0aWFsaXplZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB3aW5kb3cuU29ja0pTICE9PSB1bmRlZmluZWQ7XG5cdCAgICB9LFxuXHQgICAgZ2V0U29ja2V0OiBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyB3aW5kb3cuU29ja0pTKHVybCwgbnVsbCwge1xuXHQgICAgICAgICAgICBqc19wYXRoOiBkZXBlbmRlbmNpZXNfMS5EZXBlbmRlbmNpZXMuZ2V0UGF0aChcInNvY2tqc1wiLCB7XG5cdCAgICAgICAgICAgICAgICBlbmNyeXB0ZWQ6IG9wdGlvbnMuZW5jcnlwdGVkXG5cdCAgICAgICAgICAgIH0pLFxuXHQgICAgICAgICAgICBpZ25vcmVfbnVsbF9vcmlnaW46IG9wdGlvbnMuaWdub3JlTnVsbE9yaWdpblxuXHQgICAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIGJlZm9yZU9wZW46IGZ1bmN0aW9uIChzb2NrZXQsIHBhdGgpIHtcblx0ICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG5cdCAgICAgICAgICAgIHBhdGg6IHBhdGhcblx0ICAgICAgICB9KSk7XG5cdCAgICB9XG5cdH0pO1xuXHR2YXIgeGRyQ29uZmlndXJhdGlvbiA9IHtcblx0ICAgIGlzU3VwcG9ydGVkOiBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHtcblx0ICAgICAgICB2YXIgeWVzID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5pc1hEUlN1cHBvcnRlZChlbnZpcm9ubWVudC5lbmNyeXB0ZWQpO1xuXHQgICAgICAgIHJldHVybiB5ZXM7XG5cdCAgICB9XG5cdH07XG5cdHZhciBYRFJTdHJlYW1pbmdUcmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0XzFbXCJkZWZhdWx0XCJdKENvbGxlY3Rpb25zLmV4dGVuZCh7fSwgdHJhbnNwb3J0c18xLnN0cmVhbWluZ0NvbmZpZ3VyYXRpb24sIHhkckNvbmZpZ3VyYXRpb24pKTtcblx0dmFyIFhEUlBvbGxpbmdUcmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0XzFbXCJkZWZhdWx0XCJdKENvbGxlY3Rpb25zLmV4dGVuZCh7fSwgdHJhbnNwb3J0c18xLnBvbGxpbmdDb25maWd1cmF0aW9uLCB4ZHJDb25maWd1cmF0aW9uKSk7XG5cdHRyYW5zcG9ydHNfMVtcImRlZmF1bHRcIl0ueGRyX3N0cmVhbWluZyA9IFhEUlN0cmVhbWluZ1RyYW5zcG9ydDtcblx0dHJhbnNwb3J0c18xW1wiZGVmYXVsdFwiXS54ZHJfcG9sbGluZyA9IFhEUlBvbGxpbmdUcmFuc3BvcnQ7XG5cdHRyYW5zcG9ydHNfMVtcImRlZmF1bHRcIl0uc29ja2pzID0gU29ja0pTVHJhbnNwb3J0O1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IHRyYW5zcG9ydHNfMVtcImRlZmF1bHRcIl07XG5cblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgVVJMU2NoZW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpO1xuXHR2YXIgdHJhbnNwb3J0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIHJ1bnRpbWVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBXU1RyYW5zcG9ydCA9IG5ldyB0cmFuc3BvcnRfMVtcImRlZmF1bHRcIl0oe1xuXHQgICAgdXJsczogVVJMU2NoZW1lcy53cyxcblx0ICAgIGhhbmRsZXNBY3Rpdml0eUNoZWNrczogZmFsc2UsXG5cdCAgICBzdXBwb3J0c1Bpbmc6IGZhbHNlLFxuXHQgICAgaXNJbml0aWFsaXplZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBCb29sZWFuKHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uZ2V0V2ViU29ja2V0QVBJKCkpO1xuXHQgICAgfSxcblx0ICAgIGlzU3VwcG9ydGVkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIEJvb2xlYW4ocnVudGltZV8xW1wiZGVmYXVsdFwiXS5nZXRXZWJTb2NrZXRBUEkoKSk7XG5cdCAgICB9LFxuXHQgICAgZ2V0U29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG5cdCAgICAgICAgcmV0dXJuIHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uY3JlYXRlV2ViU29ja2V0KHVybCk7XG5cdCAgICB9XG5cdH0pO1xuXHR2YXIgaHR0cENvbmZpZ3VyYXRpb24gPSB7XG5cdCAgICB1cmxzOiBVUkxTY2hlbWVzLmh0dHAsXG5cdCAgICBoYW5kbGVzQWN0aXZpdHlDaGVja3M6IGZhbHNlLFxuXHQgICAgc3VwcG9ydHNQaW5nOiB0cnVlLFxuXHQgICAgaXNJbml0aWFsaXplZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHR9O1xuXHRleHBvcnRzLnN0cmVhbWluZ0NvbmZpZ3VyYXRpb24gPSBDb2xsZWN0aW9ucy5leHRlbmQoeyBnZXRTb2NrZXQ6IGZ1bmN0aW9uICh1cmwpIHtcblx0ICAgICAgICByZXR1cm4gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5IVFRQRmFjdG9yeS5jcmVhdGVTdHJlYW1pbmdTb2NrZXQodXJsKTtcblx0ICAgIH1cblx0fSwgaHR0cENvbmZpZ3VyYXRpb24pO1xuXHRleHBvcnRzLnBvbGxpbmdDb25maWd1cmF0aW9uID0gQ29sbGVjdGlvbnMuZXh0ZW5kKHsgZ2V0U29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG5cdCAgICAgICAgcmV0dXJuIHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uSFRUUEZhY3RvcnkuY3JlYXRlUG9sbGluZ1NvY2tldCh1cmwpO1xuXHQgICAgfVxuXHR9LCBodHRwQ29uZmlndXJhdGlvbik7XG5cdHZhciB4aHJDb25maWd1cmF0aW9uID0ge1xuXHQgICAgaXNTdXBwb3J0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5pc1hIUlN1cHBvcnRlZCgpO1xuXHQgICAgfVxuXHR9O1xuXHR2YXIgWEhSU3RyZWFtaW5nVHJhbnNwb3J0ID0gbmV3IHRyYW5zcG9ydF8xW1wiZGVmYXVsdFwiXShDb2xsZWN0aW9ucy5leHRlbmQoe30sIGV4cG9ydHMuc3RyZWFtaW5nQ29uZmlndXJhdGlvbiwgeGhyQ29uZmlndXJhdGlvbikpO1xuXHR2YXIgWEhSUG9sbGluZ1RyYW5zcG9ydCA9IG5ldyB0cmFuc3BvcnRfMVtcImRlZmF1bHRcIl0oQ29sbGVjdGlvbnMuZXh0ZW5kKHt9LCBleHBvcnRzLnBvbGxpbmdDb25maWd1cmF0aW9uLCB4aHJDb25maWd1cmF0aW9uKSk7XG5cdHZhciBUcmFuc3BvcnRzID0ge1xuXHQgICAgd3M6IFdTVHJhbnNwb3J0LFxuXHQgICAgeGhyX3N0cmVhbWluZzogWEhSU3RyZWFtaW5nVHJhbnNwb3J0LFxuXHQgICAgeGhyX3BvbGxpbmc6IFhIUlBvbGxpbmdUcmFuc3BvcnRcblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBUcmFuc3BvcnRzO1xuXG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGRlZmF1bHRzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRmdW5jdGlvbiBnZXRHZW5lcmljVVJMKGJhc2VTY2hlbWUsIHBhcmFtcywgcGF0aCkge1xuXHQgICAgdmFyIHNjaGVtZSA9IGJhc2VTY2hlbWUgKyAocGFyYW1zLmVuY3J5cHRlZCA/IFwic1wiIDogXCJcIik7XG5cdCAgICB2YXIgaG9zdCA9IHBhcmFtcy5lbmNyeXB0ZWQgPyBwYXJhbXMuaG9zdEVuY3J5cHRlZCA6IHBhcmFtcy5ob3N0VW5lbmNyeXB0ZWQ7XG5cdCAgICByZXR1cm4gc2NoZW1lICsgXCI6Ly9cIiArIGhvc3QgKyBwYXRoO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEdlbmVyaWNQYXRoKGtleSwgcXVlcnlTdHJpbmcpIHtcblx0ICAgIHZhciBwYXRoID0gXCIvYXBwL1wiICsga2V5O1xuXHQgICAgdmFyIHF1ZXJ5ID0gXCI/cHJvdG9jb2w9XCIgKyBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5QUk9UT0NPTCArXG5cdCAgICAgICAgXCImY2xpZW50PWpzXCIgK1xuXHQgICAgICAgIFwiJnZlcnNpb249XCIgKyBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5WRVJTSU9OICtcblx0ICAgICAgICAocXVlcnlTdHJpbmcgPyAoXCImXCIgKyBxdWVyeVN0cmluZykgOiBcIlwiKTtcblx0ICAgIHJldHVybiBwYXRoICsgcXVlcnk7XG5cdH1cblx0ZXhwb3J0cy53cyA9IHtcblx0ICAgIGdldEluaXRpYWw6IGZ1bmN0aW9uIChrZXksIHBhcmFtcykge1xuXHQgICAgICAgIHZhciBwYXRoID0gKHBhcmFtcy5odHRwUGF0aCB8fCBcIlwiKSArIGdldEdlbmVyaWNQYXRoKGtleSwgXCJmbGFzaD1mYWxzZVwiKTtcblx0ICAgICAgICByZXR1cm4gZ2V0R2VuZXJpY1VSTChcIndzXCIsIHBhcmFtcywgcGF0aCk7XG5cdCAgICB9XG5cdH07XG5cdGV4cG9ydHMuaHR0cCA9IHtcblx0ICAgIGdldEluaXRpYWw6IGZ1bmN0aW9uIChrZXksIHBhcmFtcykge1xuXHQgICAgICAgIHZhciBwYXRoID0gKHBhcmFtcy5odHRwUGF0aCB8fCBcIi9wdXNoZXJcIikgKyBnZXRHZW5lcmljUGF0aChrZXkpO1xuXHQgICAgICAgIHJldHVybiBnZXRHZW5lcmljVVJMKFwiaHR0cFwiLCBwYXJhbXMsIHBhdGgpO1xuXHQgICAgfVxuXHR9O1xuXHRleHBvcnRzLnNvY2tqcyA9IHtcblx0ICAgIGdldEluaXRpYWw6IGZ1bmN0aW9uIChrZXksIHBhcmFtcykge1xuXHQgICAgICAgIHJldHVybiBnZXRHZW5lcmljVVJMKFwiaHR0cFwiLCBwYXJhbXMsIHBhcmFtcy5odHRwUGF0aCB8fCBcIi9wdXNoZXJcIik7XG5cdCAgICB9LFxuXHQgICAgZ2V0UGF0aDogZnVuY3Rpb24gKGtleSwgcGFyYW1zKSB7XG5cdCAgICAgICAgcmV0dXJuIGdldEdlbmVyaWNQYXRoKGtleSk7XG5cdCAgICB9XG5cdH07XG5cblxuLyoqKi8gfSksXG4vKiAyMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgdHJhbnNwb3J0X2Nvbm5lY3Rpb25fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xuXHR2YXIgVHJhbnNwb3J0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRyYW5zcG9ydChob29rcykge1xuXHQgICAgICAgIHRoaXMuaG9va3MgPSBob29rcztcblx0ICAgIH1cblx0ICAgIFRyYW5zcG9ydC5wcm90b3R5cGUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5ob29rcy5pc1N1cHBvcnRlZChlbnZpcm9ubWVudCk7XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0LnByb3RvdHlwZS5jcmVhdGVDb25uZWN0aW9uID0gZnVuY3Rpb24gKG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IHRyYW5zcG9ydF9jb25uZWN0aW9uXzFbXCJkZWZhdWx0XCJdKHRoaXMuaG9va3MsIG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUcmFuc3BvcnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVHJhbnNwb3J0O1xuXG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuXHQgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0fTtcblx0dmFyIHV0aWxfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHR2YXIgQ29sbGVjdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgZGlzcGF0Y2hlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cdHZhciBsb2dnZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgVHJhbnNwb3J0Q29ubmVjdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoVHJhbnNwb3J0Q29ubmVjdGlvbiwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIFRyYW5zcG9ydENvbm5lY3Rpb24oaG9va3MsIG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpIHtcblx0ICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmluaXRpYWxpemUgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLnRyYW5zcG9ydENvbm5lY3Rpb25Jbml0aWFsaXplcjtcblx0ICAgICAgICB0aGlzLmhvb2tzID0gaG9va3M7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cdCAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0ICAgICAgICB0aGlzLnN0YXRlID0gXCJuZXdcIjtcblx0ICAgICAgICB0aGlzLnRpbWVsaW5lID0gb3B0aW9ucy50aW1lbGluZTtcblx0ICAgICAgICB0aGlzLmFjdGl2aXR5VGltZW91dCA9IG9wdGlvbnMuYWN0aXZpdHlUaW1lb3V0O1xuXHQgICAgICAgIHRoaXMuaWQgPSB0aGlzLnRpbWVsaW5lLmdlbmVyYXRlVW5pcXVlSUQoKTtcblx0ICAgIH1cblx0ICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLmhhbmRsZXNBY3Rpdml0eUNoZWNrcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhvb2tzLmhhbmRsZXNBY3Rpdml0eUNoZWNrcyk7XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuc3VwcG9ydHNQaW5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuaG9va3Muc3VwcG9ydHNQaW5nKTtcblx0ICAgIH07XG5cdCAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgaWYgKHRoaXMuc29ja2V0IHx8IHRoaXMuc3RhdGUgIT09IFwiaW5pdGlhbGl6ZWRcIikge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciB1cmwgPSB0aGlzLmhvb2tzLnVybHMuZ2V0SW5pdGlhbCh0aGlzLmtleSwgdGhpcy5vcHRpb25zKTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICB0aGlzLnNvY2tldCA9IHRoaXMuaG9va3MuZ2V0U29ja2V0KHVybCwgdGhpcy5vcHRpb25zKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgdXRpbF8xW1wiZGVmYXVsdFwiXS5kZWZlcihmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5vbkVycm9yKGUpO1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuY2hhbmdlU3RhdGUoXCJjbG9zZWRcIik7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuYmluZExpc3RlbmVycygpO1xuXHQgICAgICAgIGxvZ2dlcl8xW1wiZGVmYXVsdFwiXS5kZWJ1ZyhcIkNvbm5lY3RpbmdcIiwgeyB0cmFuc3BvcnQ6IHRoaXMubmFtZSwgdXJsOiB1cmwgfSk7XG5cdCAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShcImNvbm5lY3RpbmdcIik7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBcIm9wZW5cIikge1xuXHQgICAgICAgICAgICB1dGlsXzFbXCJkZWZhdWx0XCJdLmRlZmVyKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zb2NrZXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBfdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5waW5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBcIm9wZW5cIiAmJiB0aGlzLnN1cHBvcnRzUGluZygpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuc29ja2V0LnBpbmcoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUub25PcGVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmhvb2tzLmJlZm9yZU9wZW4pIHtcblx0ICAgICAgICAgICAgdGhpcy5ob29rcy5iZWZvcmVPcGVuKHRoaXMuc29ja2V0LCB0aGlzLmhvb2tzLnVybHMuZ2V0UGF0aCh0aGlzLmtleSwgdGhpcy5vcHRpb25zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoXCJvcGVuXCIpO1xuXHQgICAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHVuZGVmaW5lZDtcblx0ICAgIH07XG5cdCAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgeyB0eXBlOiAnV2ViU29ja2V0RXJyb3InLCBlcnJvcjogZXJyb3IgfSk7XG5cdCAgICAgICAgdGhpcy50aW1lbGluZS5lcnJvcih0aGlzLmJ1aWxkVGltZWxpbmVNZXNzYWdlKHsgZXJyb3I6IGVycm9yLnRvU3RyaW5nKCkgfSkpO1xuXHQgICAgfTtcblx0ICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLm9uQ2xvc2UgPSBmdW5jdGlvbiAoY2xvc2VFdmVudCkge1xuXHQgICAgICAgIGlmIChjbG9zZUV2ZW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoXCJjbG9zZWRcIiwge1xuXHQgICAgICAgICAgICAgICAgY29kZTogY2xvc2VFdmVudC5jb2RlLFxuXHQgICAgICAgICAgICAgICAgcmVhc29uOiBjbG9zZUV2ZW50LnJlYXNvbixcblx0ICAgICAgICAgICAgICAgIHdhc0NsZWFuOiBjbG9zZUV2ZW50Lndhc0NsZWFuXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShcImNsb3NlZFwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy51bmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZDtcblx0ICAgIH07XG5cdCAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5vbk1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgICAgIHRoaXMuZW1pdChcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUub25BY3Rpdml0eSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJhY3Rpdml0eVwiKTtcblx0ICAgIH07XG5cdCAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBfdGhpcy5vbk9wZW4oKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgX3RoaXMub25FcnJvcihlcnJvcik7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcblx0ICAgICAgICAgICAgX3RoaXMub25DbG9zZShjbG9zZUV2ZW50KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICAgICAgICAgIF90aGlzLm9uTWVzc2FnZShtZXNzYWdlKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzUGluZygpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uYWN0aXZpdHkgPSBmdW5jdGlvbiAoKSB7IF90aGlzLm9uQWN0aXZpdHkoKTsgfTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUudW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuXHQgICAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNQaW5nKCkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uYWN0aXZpdHkgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuY2hhbmdlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHBhcmFtcykge1xuXHQgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcblx0ICAgICAgICB0aGlzLnRpbWVsaW5lLmluZm8odGhpcy5idWlsZFRpbWVsaW5lTWVzc2FnZSh7XG5cdCAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcblx0ICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcblx0ICAgICAgICB9KSk7XG5cdCAgICAgICAgdGhpcy5lbWl0KHN0YXRlLCBwYXJhbXMpO1xuXHQgICAgfTtcblx0ICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLmJ1aWxkVGltZWxpbmVNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0ICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZXh0ZW5kKHsgY2lkOiB0aGlzLmlkIH0sIG1lc3NhZ2UpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUcmFuc3BvcnRDb25uZWN0aW9uO1xuXHR9KGRpc3BhdGNoZXJfMVtcImRlZmF1bHRcIl0pKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBUcmFuc3BvcnRDb25uZWN0aW9uO1xuXG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIGNhbGxiYWNrX3JlZ2lzdHJ5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0dmFyIERpc3BhdGNoZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRGlzcGF0Y2hlcihmYWlsVGhyb3VnaCkge1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IGNhbGxiYWNrX3JlZ2lzdHJ5XzFbXCJkZWZhdWx0XCJdKCk7XG5cdCAgICAgICAgdGhpcy5nbG9iYWxfY2FsbGJhY2tzID0gW107XG5cdCAgICAgICAgdGhpcy5mYWlsVGhyb3VnaCA9IGZhaWxUaHJvdWdoO1xuXHQgICAgfVxuXHQgICAgRGlzcGF0Y2hlci5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgdGhpcy5jYWxsYmFja3MuYWRkKGV2ZW50TmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIERpc3BhdGNoZXIucHJvdG90eXBlLmJpbmRfZ2xvYmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdGhpcy5nbG9iYWxfY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIERpc3BhdGNoZXIucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgdGhpcy5jYWxsYmFja3MucmVtb3ZlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIERpc3BhdGNoZXIucHJvdG90eXBlLnVuYmluZF9nbG9iYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0ICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZ2xvYmFsX2NhbGxiYWNrcyA9IFtdO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5nbG9iYWxfY2FsbGJhY2tzID0gQ29sbGVjdGlvbnMuZmlsdGVyKHRoaXMuZ2xvYmFsX2NhbGxiYWNrcyB8fCBbXSwgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMgIT09IGNhbGxiYWNrOyB9KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICBEaXNwYXRjaGVyLnByb3RvdHlwZS51bmJpbmRfYWxsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMudW5iaW5kKCk7XG5cdCAgICAgICAgdGhpcy51bmJpbmRfZ2xvYmFsKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgRGlzcGF0Y2hlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGRhdGEpIHtcblx0ICAgICAgICB2YXIgaTtcblx0ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5nbG9iYWxfY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZ2xvYmFsX2NhbGxiYWNrc1tpXShldmVudE5hbWUsIGRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3MuZ2V0KGV2ZW50TmFtZSk7XG5cdCAgICAgICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0uZm4uY2FsbChjYWxsYmFja3NbaV0uY29udGV4dCB8fCAod2luZG93KSwgZGF0YSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5mYWlsVGhyb3VnaCkge1xuXHQgICAgICAgICAgICB0aGlzLmZhaWxUaHJvdWdoKGV2ZW50TmFtZSwgZGF0YSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBEaXNwYXRjaGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IERpc3BhdGNoZXI7XG5cblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgQ29sbGVjdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgQ2FsbGJhY2tSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDYWxsYmFja1JlZ2lzdHJ5KCkge1xuXHQgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuXHQgICAgfVxuXHQgICAgQ2FsbGJhY2tSZWdpc3RyeS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzW3ByZWZpeChuYW1lKV07XG5cdCAgICB9O1xuXHQgICAgQ2FsbGJhY2tSZWdpc3RyeS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgdmFyIHByZWZpeGVkRXZlbnROYW1lID0gcHJlZml4KG5hbWUpO1xuXHQgICAgICAgIHRoaXMuX2NhbGxiYWNrc1twcmVmaXhlZEV2ZW50TmFtZV0gPSB0aGlzLl9jYWxsYmFja3NbcHJlZml4ZWRFdmVudE5hbWVdIHx8IFtdO1xuXHQgICAgICAgIHRoaXMuX2NhbGxiYWNrc1twcmVmaXhlZEV2ZW50TmFtZV0ucHVzaCh7XG5cdCAgICAgICAgICAgIGZuOiBjYWxsYmFjayxcblx0ICAgICAgICAgICAgY29udGV4dDogY29udGV4dFxuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIENhbGxiYWNrUmVnaXN0cnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuXHQgICAgICAgIGlmICghbmFtZSAmJiAhY2FsbGJhY2sgJiYgIWNvbnRleHQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5hbWVzID0gbmFtZSA/IFtwcmVmaXgobmFtZSldIDogQ29sbGVjdGlvbnMua2V5cyh0aGlzLl9jYWxsYmFja3MpO1xuXHQgICAgICAgIGlmIChjYWxsYmFjayB8fCBjb250ZXh0KSB7XG5cdCAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2FsbGJhY2sobmFtZXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsQ2FsbGJhY2tzKG5hbWVzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgQ2FsbGJhY2tSZWdpc3RyeS5wcm90b3R5cGUucmVtb3ZlQ2FsbGJhY2sgPSBmdW5jdGlvbiAobmFtZXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cdCAgICAgICAgQ29sbGVjdGlvbnMuYXBwbHkobmFtZXMsIGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tuYW1lXSA9IENvbGxlY3Rpb25zLmZpbHRlcih0aGlzLl9jYWxsYmFja3NbbmFtZV0gfHwgW10sIGZ1bmN0aW9uIChiaW5kaW5nKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBiaW5kaW5nLmZuKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChjb250ZXh0ICYmIGNvbnRleHQgIT09IGJpbmRpbmcuY29udGV4dCk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fY2FsbGJhY2tzW25hbWVdLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tuYW1lXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sIHRoaXMpO1xuXHQgICAgfTtcblx0ICAgIENhbGxiYWNrUmVnaXN0cnkucHJvdG90eXBlLnJlbW92ZUFsbENhbGxiYWNrcyA9IGZ1bmN0aW9uIChuYW1lcykge1xuXHQgICAgICAgIENvbGxlY3Rpb25zLmFwcGx5KG5hbWVzLCBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzW25hbWVdO1xuXHQgICAgICAgIH0sIHRoaXMpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBDYWxsYmFja1JlZ2lzdHJ5O1xuXHR9KCkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IENhbGxiYWNrUmVnaXN0cnk7XG5cdGZ1bmN0aW9uIHByZWZpeChuYW1lKSB7XG5cdCAgICByZXR1cm4gXCJfXCIgKyBuYW1lO1xuXHR9XG5cblxuLyoqKi8gfSksXG4vKiAyNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG5cdCAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcblx0ICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuXHQgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuXHR9O1xuXHR2YXIgZGlzcGF0Y2hlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cdHZhciBOZXRJbmZvID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcblx0ICAgIF9fZXh0ZW5kcyhOZXRJbmZvLCBfc3VwZXIpO1xuXHQgICAgZnVuY3Rpb24gTmV0SW5mbygpIHtcblx0ICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdvbmxpbmUnKTtcblx0ICAgICAgICAgICAgfSwgZmFsc2UpO1xuXHQgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdvZmZsaW5lJyk7XG5cdCAgICAgICAgICAgIH0sIGZhbHNlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBOZXRJbmZvLnByb3RvdHlwZS5pc09ubGluZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5vbkxpbmUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLm9uTGluZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIE5ldEluZm87XG5cdH0oZGlzcGF0Y2hlcl8xW1wiZGVmYXVsdFwiXSkpO1xuXHRleHBvcnRzLk5ldEluZm8gPSBOZXRJbmZvO1xuXHRleHBvcnRzLk5ldHdvcmsgPSBuZXcgTmV0SW5mbygpO1xuXG5cbi8qKiovIH0pLFxuLyogMjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGdldERlZmF1bHRTdHJhdGVneSA9IGZ1bmN0aW9uIChjb25maWcpIHtcblx0ICAgIHZhciB3c1N0cmF0ZWd5O1xuXHQgICAgaWYgKGNvbmZpZy5lbmNyeXB0ZWQpIHtcblx0ICAgICAgICB3c1N0cmF0ZWd5ID0gW1xuXHQgICAgICAgICAgICBcIjpiZXN0X2Nvbm5lY3RlZF9ldmVyXCIsXG5cdCAgICAgICAgICAgIFwiOndzX2xvb3BcIixcblx0ICAgICAgICAgICAgW1wiOmRlbGF5ZWRcIiwgMjAwMCwgW1wiOmh0dHBfZmFsbGJhY2tfbG9vcFwiXV1cblx0ICAgICAgICBdO1xuXHQgICAgfVxuXHQgICAgZWxzZSB7XG5cdCAgICAgICAgd3NTdHJhdGVneSA9IFtcblx0ICAgICAgICAgICAgXCI6YmVzdF9jb25uZWN0ZWRfZXZlclwiLFxuXHQgICAgICAgICAgICBcIjp3c19sb29wXCIsXG5cdCAgICAgICAgICAgIFtcIjpkZWxheWVkXCIsIDIwMDAsIFtcIjp3c3NfbG9vcFwiXV0sXG5cdCAgICAgICAgICAgIFtcIjpkZWxheWVkXCIsIDUwMDAsIFtcIjpodHRwX2ZhbGxiYWNrX2xvb3BcIl1dXG5cdCAgICAgICAgXTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBbXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcIndzX29wdGlvbnNcIiwge1xuXHQgICAgICAgICAgICAgICAgaG9zdFVuZW5jcnlwdGVkOiBjb25maWcud3NIb3N0ICsgXCI6XCIgKyBjb25maWcud3NQb3J0LFxuXHQgICAgICAgICAgICAgICAgaG9zdEVuY3J5cHRlZDogY29uZmlnLndzSG9zdCArIFwiOlwiICsgY29uZmlnLndzc1BvcnQsXG5cdCAgICAgICAgICAgICAgICBodHRwUGF0aDogY29uZmlnLndzUGF0aFxuXHQgICAgICAgICAgICB9XSxcblx0ICAgICAgICBbXCI6ZGVmXCIsIFwid3NzX29wdGlvbnNcIiwgW1wiOmV4dGVuZFwiLCBcIjp3c19vcHRpb25zXCIsIHtcblx0ICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQ6IHRydWVcblx0ICAgICAgICAgICAgICAgIH1dXSxcblx0ICAgICAgICBbXCI6ZGVmXCIsIFwic29ja2pzX29wdGlvbnNcIiwge1xuXHQgICAgICAgICAgICAgICAgaG9zdFVuZW5jcnlwdGVkOiBjb25maWcuaHR0cEhvc3QgKyBcIjpcIiArIGNvbmZpZy5odHRwUG9ydCxcblx0ICAgICAgICAgICAgICAgIGhvc3RFbmNyeXB0ZWQ6IGNvbmZpZy5odHRwSG9zdCArIFwiOlwiICsgY29uZmlnLmh0dHBzUG9ydCxcblx0ICAgICAgICAgICAgICAgIGh0dHBQYXRoOiBjb25maWcuaHR0cFBhdGhcblx0ICAgICAgICAgICAgfV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcInRpbWVvdXRzXCIsIHtcblx0ICAgICAgICAgICAgICAgIGxvb3A6IHRydWUsXG5cdCAgICAgICAgICAgICAgICB0aW1lb3V0OiAxNTAwMCxcblx0ICAgICAgICAgICAgICAgIHRpbWVvdXRMaW1pdDogNjAwMDBcblx0ICAgICAgICAgICAgfV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcIndzX21hbmFnZXJcIiwgW1wiOnRyYW5zcG9ydF9tYW5hZ2VyXCIsIHtcblx0ICAgICAgICAgICAgICAgICAgICBsaXZlczogMixcblx0ICAgICAgICAgICAgICAgICAgICBtaW5QaW5nRGVsYXk6IDEwMDAwLFxuXHQgICAgICAgICAgICAgICAgICAgIG1heFBpbmdEZWxheTogY29uZmlnLmFjdGl2aXR5X3RpbWVvdXRcblx0ICAgICAgICAgICAgICAgIH1dXSxcblx0ICAgICAgICBbXCI6ZGVmXCIsIFwic3RyZWFtaW5nX21hbmFnZXJcIiwgW1wiOnRyYW5zcG9ydF9tYW5hZ2VyXCIsIHtcblx0ICAgICAgICAgICAgICAgICAgICBsaXZlczogMixcblx0ICAgICAgICAgICAgICAgICAgICBtaW5QaW5nRGVsYXk6IDEwMDAwLFxuXHQgICAgICAgICAgICAgICAgICAgIG1heFBpbmdEZWxheTogY29uZmlnLmFjdGl2aXR5X3RpbWVvdXRcblx0ICAgICAgICAgICAgICAgIH1dXSxcblx0ICAgICAgICBbXCI6ZGVmX3RyYW5zcG9ydFwiLCBcIndzXCIsIFwid3NcIiwgMywgXCI6d3Nfb3B0aW9uc1wiLCBcIjp3c19tYW5hZ2VyXCJdLFxuXHQgICAgICAgIFtcIjpkZWZfdHJhbnNwb3J0XCIsIFwid3NzXCIsIFwid3NcIiwgMywgXCI6d3NzX29wdGlvbnNcIiwgXCI6d3NfbWFuYWdlclwiXSxcblx0ICAgICAgICBbXCI6ZGVmX3RyYW5zcG9ydFwiLCBcInNvY2tqc1wiLCBcInNvY2tqc1wiLCAxLCBcIjpzb2NranNfb3B0aW9uc1wiXSxcblx0ICAgICAgICBbXCI6ZGVmX3RyYW5zcG9ydFwiLCBcInhocl9zdHJlYW1pbmdcIiwgXCJ4aHJfc3RyZWFtaW5nXCIsIDEsIFwiOnNvY2tqc19vcHRpb25zXCIsIFwiOnN0cmVhbWluZ19tYW5hZ2VyXCJdLFxuXHQgICAgICAgIFtcIjpkZWZfdHJhbnNwb3J0XCIsIFwieGRyX3N0cmVhbWluZ1wiLCBcInhkcl9zdHJlYW1pbmdcIiwgMSwgXCI6c29ja2pzX29wdGlvbnNcIiwgXCI6c3RyZWFtaW5nX21hbmFnZXJcIl0sXG5cdCAgICAgICAgW1wiOmRlZl90cmFuc3BvcnRcIiwgXCJ4aHJfcG9sbGluZ1wiLCBcInhocl9wb2xsaW5nXCIsIDEsIFwiOnNvY2tqc19vcHRpb25zXCJdLFxuXHQgICAgICAgIFtcIjpkZWZfdHJhbnNwb3J0XCIsIFwieGRyX3BvbGxpbmdcIiwgXCJ4ZHJfcG9sbGluZ1wiLCAxLCBcIjpzb2NranNfb3B0aW9uc1wiXSxcblx0ICAgICAgICBbXCI6ZGVmXCIsIFwid3NfbG9vcFwiLCBbXCI6c2VxdWVudGlhbFwiLCBcIjp0aW1lb3V0c1wiLCBcIjp3c1wiXV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcIndzc19sb29wXCIsIFtcIjpzZXF1ZW50aWFsXCIsIFwiOnRpbWVvdXRzXCIsIFwiOndzc1wiXV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcInNvY2tqc19sb29wXCIsIFtcIjpzZXF1ZW50aWFsXCIsIFwiOnRpbWVvdXRzXCIsIFwiOnNvY2tqc1wiXV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcInN0cmVhbWluZ19sb29wXCIsIFtcIjpzZXF1ZW50aWFsXCIsIFwiOnRpbWVvdXRzXCIsXG5cdCAgICAgICAgICAgICAgICBbXCI6aWZcIiwgW1wiOmlzX3N1cHBvcnRlZFwiLCBcIjp4aHJfc3RyZWFtaW5nXCJdLFxuXHQgICAgICAgICAgICAgICAgICAgIFwiOnhocl9zdHJlYW1pbmdcIixcblx0ICAgICAgICAgICAgICAgICAgICBcIjp4ZHJfc3RyZWFtaW5nXCJcblx0ICAgICAgICAgICAgICAgIF1cblx0ICAgICAgICAgICAgXV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcInBvbGxpbmdfbG9vcFwiLCBbXCI6c2VxdWVudGlhbFwiLCBcIjp0aW1lb3V0c1wiLFxuXHQgICAgICAgICAgICAgICAgW1wiOmlmXCIsIFtcIjppc19zdXBwb3J0ZWRcIiwgXCI6eGhyX3BvbGxpbmdcIl0sXG5cdCAgICAgICAgICAgICAgICAgICAgXCI6eGhyX3BvbGxpbmdcIixcblx0ICAgICAgICAgICAgICAgICAgICBcIjp4ZHJfcG9sbGluZ1wiXG5cdCAgICAgICAgICAgICAgICBdXG5cdCAgICAgICAgICAgIF1dLFxuXHQgICAgICAgIFtcIjpkZWZcIiwgXCJodHRwX2xvb3BcIiwgW1wiOmlmXCIsIFtcIjppc19zdXBwb3J0ZWRcIiwgXCI6c3RyZWFtaW5nX2xvb3BcIl0sIFtcblx0ICAgICAgICAgICAgICAgICAgICBcIjpiZXN0X2Nvbm5lY3RlZF9ldmVyXCIsXG5cdCAgICAgICAgICAgICAgICAgICAgXCI6c3RyZWFtaW5nX2xvb3BcIixcblx0ICAgICAgICAgICAgICAgICAgICBbXCI6ZGVsYXllZFwiLCA0MDAwLCBbXCI6cG9sbGluZ19sb29wXCJdXVxuXHQgICAgICAgICAgICAgICAgXSwgW1xuXHQgICAgICAgICAgICAgICAgICAgIFwiOnBvbGxpbmdfbG9vcFwiXG5cdCAgICAgICAgICAgICAgICBdXV0sXG5cdCAgICAgICAgW1wiOmRlZlwiLCBcImh0dHBfZmFsbGJhY2tfbG9vcFwiLFxuXHQgICAgICAgICAgICBbXCI6aWZcIiwgW1wiOmlzX3N1cHBvcnRlZFwiLCBcIjpodHRwX2xvb3BcIl0sIFtcblx0ICAgICAgICAgICAgICAgICAgICBcIjpodHRwX2xvb3BcIlxuXHQgICAgICAgICAgICAgICAgXSwgW1xuXHQgICAgICAgICAgICAgICAgICAgIFwiOnNvY2tqc19sb29wXCJcblx0ICAgICAgICAgICAgICAgIF1dXG5cdCAgICAgICAgXSxcblx0ICAgICAgICBbXCI6ZGVmXCIsIFwic3RyYXRlZ3lcIixcblx0ICAgICAgICAgICAgW1wiOmNhY2hlZFwiLCAxODAwMDAwLFxuXHQgICAgICAgICAgICAgICAgW1wiOmZpcnN0X2Nvbm5lY3RlZFwiLFxuXHQgICAgICAgICAgICAgICAgICAgIFtcIjppZlwiLCBbXCI6aXNfc3VwcG9ydGVkXCIsIFwiOndzXCJdLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB3c1N0cmF0ZWd5LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBcIjpodHRwX2ZhbGxiYWNrX2xvb3BcIlxuXHQgICAgICAgICAgICAgICAgICAgIF1cblx0ICAgICAgICAgICAgICAgIF1cblx0ICAgICAgICAgICAgXVxuXHQgICAgICAgIF1cblx0ICAgIF07XG5cdH07XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0RGVmYXVsdFN0cmF0ZWd5O1xuXG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGRlcGVuZGVuY2llc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0ZnVuY3Rpb24gZGVmYXVsdF8xKCkge1xuXHQgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgc2VsZi50aW1lbGluZS5pbmZvKHNlbGYuYnVpbGRUaW1lbGluZU1lc3NhZ2Uoe1xuXHQgICAgICAgIHRyYW5zcG9ydDogc2VsZi5uYW1lICsgKHNlbGYub3B0aW9ucy5lbmNyeXB0ZWQgPyBcInNcIiA6IFwiXCIpXG5cdCAgICB9KSk7XG5cdCAgICBpZiAoc2VsZi5ob29rcy5pc0luaXRpYWxpemVkKCkpIHtcblx0ICAgICAgICBzZWxmLmNoYW5nZVN0YXRlKFwiaW5pdGlhbGl6ZWRcIik7XG5cdCAgICB9XG5cdCAgICBlbHNlIGlmIChzZWxmLmhvb2tzLmZpbGUpIHtcblx0ICAgICAgICBzZWxmLmNoYW5nZVN0YXRlKFwiaW5pdGlhbGl6aW5nXCIpO1xuXHQgICAgICAgIGRlcGVuZGVuY2llc18xLkRlcGVuZGVuY2llcy5sb2FkKHNlbGYuaG9va3MuZmlsZSwgeyBlbmNyeXB0ZWQ6IHNlbGYub3B0aW9ucy5lbmNyeXB0ZWQgfSwgZnVuY3Rpb24gKGVycm9yLCBjYWxsYmFjaykge1xuXHQgICAgICAgICAgICBpZiAoc2VsZi5ob29rcy5pc0luaXRpYWxpemVkKCkpIHtcblx0ICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlU3RhdGUoXCJpbml0aWFsaXplZFwiKTtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkVycm9yKGVycm9yKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHNlbGYub25DbG9zZSgpO1xuXHQgICAgICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICBzZWxmLm9uQ2xvc2UoKTtcblx0ICAgIH1cblx0fVxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IGRlZmF1bHRfMTtcblxuXG4vKioqLyB9KSxcbi8qIDI5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBodHRwX3hkb21haW5fcmVxdWVzdF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XG5cdHZhciBodHRwXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKTtcblx0aHR0cF8xW1wiZGVmYXVsdFwiXS5jcmVhdGVYRFIgPSBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcblx0ICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlcXVlc3QoaHR0cF94ZG9tYWluX3JlcXVlc3RfMVtcImRlZmF1bHRcIl0sIG1ldGhvZCwgdXJsKTtcblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBodHRwXzFbXCJkZWZhdWx0XCJdO1xuXG5cbi8qKiovIH0pLFxuLyogMzAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIEVycm9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xuXHR2YXIgaG9va3MgPSB7XG5cdCAgICBnZXRSZXF1ZXN0OiBmdW5jdGlvbiAoc29ja2V0KSB7XG5cdCAgICAgICAgdmFyIHhkciA9IG5ldyB3aW5kb3cuWERvbWFpblJlcXVlc3QoKTtcblx0ICAgICAgICB4ZHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBzb2NrZXQuZW1pdChcImVycm9yXCIsIG5ldyBFcnJvcnMuUmVxdWVzdFRpbWVkT3V0KCkpO1xuXHQgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHhkci5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgc29ja2V0LmVtaXQoXCJlcnJvclwiLCBlKTtcblx0ICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB4ZHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHhkci5yZXNwb25zZVRleHQgJiYgeGRyLnJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICBzb2NrZXQub25DaHVuaygyMDAsIHhkci5yZXNwb25zZVRleHQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB4ZHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAoeGRyLnJlc3BvbnNlVGV4dCAmJiB4ZHIucmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgIHNvY2tldC5vbkNodW5rKDIwMCwgeGRyLnJlc3BvbnNlVGV4dCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc29ja2V0LmVtaXQoXCJmaW5pc2hlZFwiLCAyMDApO1xuXHQgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHJldHVybiB4ZHI7XG5cdCAgICB9LFxuXHQgICAgYWJvcnRSZXF1ZXN0OiBmdW5jdGlvbiAoeGRyKSB7XG5cdCAgICAgICAgeGRyLm9udGltZW91dCA9IHhkci5vbmVycm9yID0geGRyLm9ucHJvZ3Jlc3MgPSB4ZHIub25sb2FkID0gbnVsbDtcblx0ICAgICAgICB4ZHIuYWJvcnQoKTtcblx0ICAgIH1cblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBob29rcztcblxuXG4vKioqLyB9KSxcbi8qIDMxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcblx0ICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuXHQgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG5cdCAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG5cdH07XG5cdHZhciBCYWRFdmVudE5hbWUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuXHQgICAgX19leHRlbmRzKEJhZEV2ZW50TmFtZSwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIEJhZEV2ZW50TmFtZSgpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBCYWRFdmVudE5hbWU7XG5cdH0oRXJyb3IpKTtcblx0ZXhwb3J0cy5CYWRFdmVudE5hbWUgPSBCYWRFdmVudE5hbWU7XG5cdHZhciBSZXF1ZXN0VGltZWRPdXQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuXHQgICAgX19leHRlbmRzKFJlcXVlc3RUaW1lZE91dCwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIFJlcXVlc3RUaW1lZE91dCgpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBSZXF1ZXN0VGltZWRPdXQ7XG5cdH0oRXJyb3IpKTtcblx0ZXhwb3J0cy5SZXF1ZXN0VGltZWRPdXQgPSBSZXF1ZXN0VGltZWRPdXQ7XG5cdHZhciBUcmFuc3BvcnRQcmlvcml0eVRvb0xvdyA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoVHJhbnNwb3J0UHJpb3JpdHlUb29Mb3csIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBUcmFuc3BvcnRQcmlvcml0eVRvb0xvdygpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUcmFuc3BvcnRQcmlvcml0eVRvb0xvdztcblx0fShFcnJvcikpO1xuXHRleHBvcnRzLlRyYW5zcG9ydFByaW9yaXR5VG9vTG93ID0gVHJhbnNwb3J0UHJpb3JpdHlUb29Mb3c7XG5cdHZhciBUcmFuc3BvcnRDbG9zZWQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuXHQgICAgX19leHRlbmRzKFRyYW5zcG9ydENsb3NlZCwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIFRyYW5zcG9ydENsb3NlZCgpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUcmFuc3BvcnRDbG9zZWQ7XG5cdH0oRXJyb3IpKTtcblx0ZXhwb3J0cy5UcmFuc3BvcnRDbG9zZWQgPSBUcmFuc3BvcnRDbG9zZWQ7XG5cdHZhciBVbnN1cHBvcnRlZFRyYW5zcG9ydCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoVW5zdXBwb3J0ZWRUcmFuc3BvcnQsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBVbnN1cHBvcnRlZFRyYW5zcG9ydCgpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBVbnN1cHBvcnRlZFRyYW5zcG9ydDtcblx0fShFcnJvcikpO1xuXHRleHBvcnRzLlVuc3VwcG9ydGVkVHJhbnNwb3J0ID0gVW5zdXBwb3J0ZWRUcmFuc3BvcnQ7XG5cdHZhciBVbnN1cHBvcnRlZFN0cmF0ZWd5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcblx0ICAgIF9fZXh0ZW5kcyhVbnN1cHBvcnRlZFN0cmF0ZWd5LCBfc3VwZXIpO1xuXHQgICAgZnVuY3Rpb24gVW5zdXBwb3J0ZWRTdHJhdGVneSgpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBVbnN1cHBvcnRlZFN0cmF0ZWd5O1xuXHR9KEVycm9yKSk7XG5cdGV4cG9ydHMuVW5zdXBwb3J0ZWRTdHJhdGVneSA9IFVuc3VwcG9ydGVkU3RyYXRlZ3k7XG5cblxuLyoqKi8gfSksXG4vKiAzMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgaHR0cF9yZXF1ZXN0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTtcblx0dmFyIGh0dHBfc29ja2V0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTtcblx0dmFyIGh0dHBfc3RyZWFtaW5nX3NvY2tldF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdHZhciBodHRwX3BvbGxpbmdfc29ja2V0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3KTtcblx0dmFyIGh0dHBfeGhyX3JlcXVlc3RfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xuXHR2YXIgSFRUUCA9IHtcblx0ICAgIGNyZWF0ZVN0cmVhbWluZ1NvY2tldDogZnVuY3Rpb24gKHVybCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvY2tldChodHRwX3N0cmVhbWluZ19zb2NrZXRfMVtcImRlZmF1bHRcIl0sIHVybCk7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlUG9sbGluZ1NvY2tldDogZnVuY3Rpb24gKHVybCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvY2tldChodHRwX3BvbGxpbmdfc29ja2V0XzFbXCJkZWZhdWx0XCJdLCB1cmwpO1xuXHQgICAgfSxcblx0ICAgIGNyZWF0ZVNvY2tldDogZnVuY3Rpb24gKGhvb2tzLCB1cmwpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IGh0dHBfc29ja2V0XzFbXCJkZWZhdWx0XCJdKGhvb2tzLCB1cmwpO1xuXHQgICAgfSxcblx0ICAgIGNyZWF0ZVhIUjogZnVuY3Rpb24gKG1ldGhvZCwgdXJsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVxdWVzdChodHRwX3hocl9yZXF1ZXN0XzFbXCJkZWZhdWx0XCJdLCBtZXRob2QsIHVybCk7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlUmVxdWVzdDogZnVuY3Rpb24gKGhvb2tzLCBtZXRob2QsIHVybCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgaHR0cF9yZXF1ZXN0XzFbXCJkZWZhdWx0XCJdKGhvb2tzLCBtZXRob2QsIHVybCk7XG5cdCAgICB9XG5cdH07XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gSFRUUDtcblxuXG4vKioqLyB9KSxcbi8qIDMzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcblx0ICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuXHQgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG5cdCAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG5cdH07XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgZGlzcGF0Y2hlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cdHZhciBNQVhfQlVGRkVSX0xFTkdUSCA9IDI1NiAqIDEwMjQ7XG5cdHZhciBIVFRQUmVxdWVzdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoSFRUUFJlcXVlc3QsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBIVFRQUmVxdWVzdChob29rcywgbWV0aG9kLCB1cmwpIHtcblx0ICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmhvb2tzID0gaG9va3M7XG5cdCAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG5cdCAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cdCAgICB9XG5cdCAgICBIVFRQUmVxdWVzdC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAocGF5bG9hZCkge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XG5cdCAgICAgICAgdGhpcy54aHIgPSB0aGlzLmhvb2tzLmdldFJlcXVlc3QodGhpcyk7XG5cdCAgICAgICAgdGhpcy51bmxvYWRlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgX3RoaXMuY2xvc2UoKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uYWRkVW5sb2FkTGlzdGVuZXIodGhpcy51bmxvYWRlcik7XG5cdCAgICAgICAgdGhpcy54aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpO1xuXHQgICAgICAgIGlmICh0aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKSB7XG5cdCAgICAgICAgICAgIHRoaXMueGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnhoci5zZW5kKHBheWxvYWQpO1xuXHQgICAgfTtcblx0ICAgIEhUVFBSZXF1ZXN0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy51bmxvYWRlcikge1xuXHQgICAgICAgICAgICBydW50aW1lXzFbXCJkZWZhdWx0XCJdLnJlbW92ZVVubG9hZExpc3RlbmVyKHRoaXMudW5sb2FkZXIpO1xuXHQgICAgICAgICAgICB0aGlzLnVubG9hZGVyID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMueGhyKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaG9va3MuYWJvcnRSZXF1ZXN0KHRoaXMueGhyKTtcblx0ICAgICAgICAgICAgdGhpcy54aHIgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBIVFRQUmVxdWVzdC5wcm90b3R5cGUub25DaHVuayA9IGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEpIHtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLmFkdmFuY2VCdWZmZXIoZGF0YSk7XG5cdCAgICAgICAgICAgIGlmIChjaHVuaykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiY2h1bmtcIiwgeyBzdGF0dXM6IHN0YXR1cywgZGF0YTogY2h1bmsgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5pc0J1ZmZlclRvb0xvbmcoZGF0YSkpIHtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KFwiYnVmZmVyX3Rvb19sb25nXCIpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBIVFRQUmVxdWVzdC5wcm90b3R5cGUuYWR2YW5jZUJ1ZmZlciA9IGZ1bmN0aW9uIChidWZmZXIpIHtcblx0ICAgICAgICB2YXIgdW5yZWFkRGF0YSA9IGJ1ZmZlci5zbGljZSh0aGlzLnBvc2l0aW9uKTtcblx0ICAgICAgICB2YXIgZW5kT2ZMaW5lUG9zaXRpb24gPSB1bnJlYWREYXRhLmluZGV4T2YoXCJcXG5cIik7XG5cdCAgICAgICAgaWYgKGVuZE9mTGluZVBvc2l0aW9uICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnBvc2l0aW9uICs9IGVuZE9mTGluZVBvc2l0aW9uICsgMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHVucmVhZERhdGEuc2xpY2UoMCwgZW5kT2ZMaW5lUG9zaXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIEhUVFBSZXF1ZXN0LnByb3RvdHlwZS5pc0J1ZmZlclRvb0xvbmcgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24gPT09IGJ1ZmZlci5sZW5ndGggJiYgYnVmZmVyLmxlbmd0aCA+IE1BWF9CVUZGRVJfTEVOR1RIO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBIVFRQUmVxdWVzdDtcblx0fShkaXNwYXRjaGVyXzFbXCJkZWZhdWx0XCJdKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gSFRUUFJlcXVlc3Q7XG5cblxuLyoqKi8gfSksXG4vKiAzNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgc3RhdGVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzUpO1xuXHR2YXIgdXRpbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgYXV0b0luY3JlbWVudCA9IDE7XG5cdHZhciBIVFRQU29ja2V0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEhUVFBTb2NrZXQoaG9va3MsIHVybCkge1xuXHQgICAgICAgIHRoaXMuaG9va3MgPSBob29rcztcblx0ICAgICAgICB0aGlzLnNlc3Npb24gPSByYW5kb21OdW1iZXIoMTAwMCkgKyBcIi9cIiArIHJhbmRvbVN0cmluZyg4KTtcblx0ICAgICAgICB0aGlzLmxvY2F0aW9uID0gZ2V0TG9jYXRpb24odXJsKTtcblx0ICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBzdGF0ZV8xW1wiZGVmYXVsdFwiXS5DT05ORUNUSU5HO1xuXHQgICAgICAgIHRoaXMub3BlblN0cmVhbSgpO1xuXHQgICAgfVxuXHQgICAgSFRUUFNvY2tldC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFJhdyhKU09OLnN0cmluZ2lmeShbcGF5bG9hZF0pKTtcblx0ICAgIH07XG5cdCAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5waW5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuaG9va3Muc2VuZEhlYXJ0YmVhdCh0aGlzKTtcblx0ICAgIH07XG5cdCAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjb2RlLCByZWFzb24pIHtcblx0ICAgICAgICB0aGlzLm9uQ2xvc2UoY29kZSwgcmVhc29uLCB0cnVlKTtcblx0ICAgIH07XG5cdCAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5zZW5kUmF3ID0gZnVuY3Rpb24gKHBheWxvYWQpIHtcblx0ICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBzdGF0ZV8xW1wiZGVmYXVsdFwiXS5PUEVOKSB7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBydW50aW1lXzFbXCJkZWZhdWx0XCJdLmNyZWF0ZVNvY2tldFJlcXVlc3QoXCJQT1NUXCIsIGdldFVuaXF1ZVVSTChnZXRTZW5kVVJMKHRoaXMubG9jYXRpb24sIHRoaXMuc2Vzc2lvbikpKS5zdGFydChwYXlsb2FkKTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSFRUUFNvY2tldC5wcm90b3R5cGUucmVjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY2xvc2VTdHJlYW0oKTtcblx0ICAgICAgICB0aGlzLm9wZW5TdHJlYW0oKTtcblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5vbkNsb3NlID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbiwgd2FzQ2xlYW4pIHtcblx0ICAgICAgICB0aGlzLmNsb3NlU3RyZWFtKCk7XG5cdCAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gc3RhdGVfMVtcImRlZmF1bHRcIl0uQ0xPU0VEO1xuXHQgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcblx0ICAgICAgICAgICAgdGhpcy5vbmNsb3NlKHtcblx0ICAgICAgICAgICAgICAgIGNvZGU6IGNvZGUsXG5cdCAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbixcblx0ICAgICAgICAgICAgICAgIHdhc0NsZWFuOiB3YXNDbGVhblxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSFRUUFNvY2tldC5wcm90b3R5cGUub25DaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuXHQgICAgICAgIGlmIChjaHVuay5zdGF0dXMgIT09IDIwMCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHN0YXRlXzFbXCJkZWZhdWx0XCJdLk9QRU4pIHtcblx0ICAgICAgICAgICAgdGhpcy5vbkFjdGl2aXR5KCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBwYXlsb2FkO1xuXHQgICAgICAgIHZhciB0eXBlID0gY2h1bmsuZGF0YS5zbGljZSgwLCAxKTtcblx0ICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAnbyc6XG5cdCAgICAgICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShjaHVuay5kYXRhLnNsaWNlKDEpIHx8ICd7fScpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5vbk9wZW4ocGF5bG9hZCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnYSc6XG5cdCAgICAgICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShjaHVuay5kYXRhLnNsaWNlKDEpIHx8ICdbXScpO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkV2ZW50KHBheWxvYWRbaV0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgJ20nOlxuXHQgICAgICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoY2h1bmsuZGF0YS5zbGljZSgxKSB8fCAnbnVsbCcpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5vbkV2ZW50KHBheWxvYWQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgJ2gnOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5ob29rcy5vbkhlYXJ0YmVhdCh0aGlzKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICdjJzpcblx0ICAgICAgICAgICAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGNodW5rLmRhdGEuc2xpY2UoMSkgfHwgJ1tdJyk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2UocGF5bG9hZFswXSwgcGF5bG9hZFsxXSwgdHJ1ZSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSFRUUFNvY2tldC5wcm90b3R5cGUub25PcGVuID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBzdGF0ZV8xW1wiZGVmYXVsdFwiXS5DT05ORUNUSU5HKSB7XG5cdCAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaG9zdG5hbWUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb24uYmFzZSA9IHJlcGxhY2VIb3N0KHRoaXMubG9jYXRpb24uYmFzZSwgb3B0aW9ucy5ob3N0bmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gc3RhdGVfMVtcImRlZmF1bHRcIl0uT1BFTjtcblx0ICAgICAgICAgICAgaWYgKHRoaXMub25vcGVuKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLm9uQ2xvc2UoMTAwNiwgXCJTZXJ2ZXIgbG9zdCBzZXNzaW9uXCIsIHRydWUpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5vbkV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gc3RhdGVfMVtcImRlZmF1bHRcIl0uT1BFTiAmJiB0aGlzLm9ubWVzc2FnZSkge1xuXHQgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZSh7IGRhdGE6IGV2ZW50IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5vbkFjdGl2aXR5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLm9uYWN0aXZpdHkpIHtcblx0ICAgICAgICAgICAgdGhpcy5vbmFjdGl2aXR5KCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICBpZiAodGhpcy5vbmVycm9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMub25lcnJvcihlcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLm9wZW5TdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICB0aGlzLnN0cmVhbSA9IHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uY3JlYXRlU29ja2V0UmVxdWVzdChcIlBPU1RcIiwgZ2V0VW5pcXVlVVJMKHRoaXMuaG9va3MuZ2V0UmVjZWl2ZVVSTCh0aGlzLmxvY2F0aW9uLCB0aGlzLnNlc3Npb24pKSk7XG5cdCAgICAgICAgdGhpcy5zdHJlYW0uYmluZChcImNodW5rXCIsIGZ1bmN0aW9uIChjaHVuaykge1xuXHQgICAgICAgICAgICBfdGhpcy5vbkNodW5rKGNodW5rKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLnN0cmVhbS5iaW5kKFwiZmluaXNoZWRcIiwgZnVuY3Rpb24gKHN0YXR1cykge1xuXHQgICAgICAgICAgICBfdGhpcy5ob29rcy5vbkZpbmlzaGVkKF90aGlzLCBzdGF0dXMpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMuc3RyZWFtLmJpbmQoXCJidWZmZXJfdG9vX2xvbmdcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBfdGhpcy5yZWNvbm5lY3QoKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICB0aGlzLnN0cmVhbS5zdGFydCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgdXRpbF8xW1wiZGVmYXVsdFwiXS5kZWZlcihmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5vbkVycm9yKGVycm9yKTtcblx0ICAgICAgICAgICAgICAgIF90aGlzLm9uQ2xvc2UoMTAwNiwgXCJDb3VsZCBub3Qgc3RhcnQgc3RyZWFtaW5nXCIsIGZhbHNlKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLmNsb3NlU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnN0cmVhbSkge1xuXHQgICAgICAgICAgICB0aGlzLnN0cmVhbS51bmJpbmRfYWxsKCk7XG5cdCAgICAgICAgICAgIHRoaXMuc3RyZWFtLmNsb3NlKCk7XG5cdCAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIEhUVFBTb2NrZXQ7XG5cdH0oKSk7XG5cdGZ1bmN0aW9uIGdldExvY2F0aW9uKHVybCkge1xuXHQgICAgdmFyIHBhcnRzID0gLyhbXlxcP10qKVxcLyooXFw/Py4qKS8uZXhlYyh1cmwpO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgICBiYXNlOiBwYXJ0c1sxXSxcblx0ICAgICAgICBxdWVyeVN0cmluZzogcGFydHNbMl1cblx0ICAgIH07XG5cdH1cblx0ZnVuY3Rpb24gZ2V0U2VuZFVSTCh1cmwsIHNlc3Npb24pIHtcblx0ICAgIHJldHVybiB1cmwuYmFzZSArIFwiL1wiICsgc2Vzc2lvbiArIFwiL3hocl9zZW5kXCI7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0VW5pcXVlVVJMKHVybCkge1xuXHQgICAgdmFyIHNlcGFyYXRvciA9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSkgPyBcIj9cIiA6IFwiJlwiO1xuXHQgICAgcmV0dXJuIHVybCArIHNlcGFyYXRvciArIFwidD1cIiArICgrbmV3IERhdGUoKSkgKyBcIiZuPVwiICsgYXV0b0luY3JlbWVudCsrO1xuXHR9XG5cdGZ1bmN0aW9uIHJlcGxhY2VIb3N0KHVybCwgaG9zdG5hbWUpIHtcblx0ICAgIHZhciB1cmxQYXJ0cyA9IC8oaHR0cHM/OlxcL1xcLykoW15cXC86XSspKChcXC98Oik/LiopLy5leGVjKHVybCk7XG5cdCAgICByZXR1cm4gdXJsUGFydHNbMV0gKyBob3N0bmFtZSArIHVybFBhcnRzWzNdO1xuXHR9XG5cdGZ1bmN0aW9uIHJhbmRvbU51bWJlcihtYXgpIHtcblx0ICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpO1xuXHR9XG5cdGZ1bmN0aW9uIHJhbmRvbVN0cmluZyhsZW5ndGgpIHtcblx0ICAgIHZhciByZXN1bHQgPSBbXTtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICByZXN1bHQucHVzaChyYW5kb21OdW1iZXIoMzIpLnRvU3RyaW5nKDMyKSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xuXHR9XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gSFRUUFNvY2tldDtcblxuXG4vKioqLyB9KSxcbi8qIDM1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBTdGF0ZTtcblx0KGZ1bmN0aW9uIChTdGF0ZSkge1xuXHQgICAgU3RhdGVbU3RhdGVbXCJDT05ORUNUSU5HXCJdID0gMF0gPSBcIkNPTk5FQ1RJTkdcIjtcblx0ICAgIFN0YXRlW1N0YXRlW1wiT1BFTlwiXSA9IDFdID0gXCJPUEVOXCI7XG5cdCAgICBTdGF0ZVtTdGF0ZVtcIkNMT1NFRFwiXSA9IDNdID0gXCJDTE9TRURcIjtcblx0fSkoU3RhdGUgfHwgKFN0YXRlID0ge30pKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBTdGF0ZTtcblxuXG4vKioqLyB9KSxcbi8qIDM2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBob29rcyA9IHtcblx0ICAgIGdldFJlY2VpdmVVUkw6IGZ1bmN0aW9uICh1cmwsIHNlc3Npb24pIHtcblx0ICAgICAgICByZXR1cm4gdXJsLmJhc2UgKyBcIi9cIiArIHNlc3Npb24gKyBcIi94aHJfc3RyZWFtaW5nXCIgKyB1cmwucXVlcnlTdHJpbmc7XG5cdCAgICB9LFxuXHQgICAgb25IZWFydGJlYXQ6IGZ1bmN0aW9uIChzb2NrZXQpIHtcblx0ICAgICAgICBzb2NrZXQuc2VuZFJhdyhcIltdXCIpO1xuXHQgICAgfSxcblx0ICAgIHNlbmRIZWFydGJlYXQ6IGZ1bmN0aW9uIChzb2NrZXQpIHtcblx0ICAgICAgICBzb2NrZXQuc2VuZFJhdyhcIltdXCIpO1xuXHQgICAgfSxcblx0ICAgIG9uRmluaXNoZWQ6IGZ1bmN0aW9uIChzb2NrZXQsIHN0YXR1cykge1xuXHQgICAgICAgIHNvY2tldC5vbkNsb3NlKDEwMDYsIFwiQ29ubmVjdGlvbiBpbnRlcnJ1cHRlZCAoXCIgKyBzdGF0dXMgKyBcIilcIiwgZmFsc2UpO1xuXHQgICAgfVxuXHR9O1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IGhvb2tzO1xuXG5cbi8qKiovIH0pLFxuLyogMzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGhvb2tzID0ge1xuXHQgICAgZ2V0UmVjZWl2ZVVSTDogZnVuY3Rpb24gKHVybCwgc2Vzc2lvbikge1xuXHQgICAgICAgIHJldHVybiB1cmwuYmFzZSArIFwiL1wiICsgc2Vzc2lvbiArIFwiL3hoclwiICsgdXJsLnF1ZXJ5U3RyaW5nO1xuXHQgICAgfSxcblx0ICAgIG9uSGVhcnRiZWF0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICB9LFxuXHQgICAgc2VuZEhlYXJ0YmVhdDogZnVuY3Rpb24gKHNvY2tldCkge1xuXHQgICAgICAgIHNvY2tldC5zZW5kUmF3KFwiW11cIik7XG5cdCAgICB9LFxuXHQgICAgb25GaW5pc2hlZDogZnVuY3Rpb24gKHNvY2tldCwgc3RhdHVzKSB7XG5cdCAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG5cdCAgICAgICAgICAgIHNvY2tldC5yZWNvbm5lY3QoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHNvY2tldC5vbkNsb3NlKDEwMDYsIFwiQ29ubmVjdGlvbiBpbnRlcnJ1cHRlZCAoXCIgKyBzdGF0dXMgKyBcIilcIiwgZmFsc2UpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBob29rcztcblxuXG4vKioqLyB9KSxcbi8qIDM4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgaG9va3MgPSB7XG5cdCAgICBnZXRSZXF1ZXN0OiBmdW5jdGlvbiAoc29ja2V0KSB7XG5cdCAgICAgICAgdmFyIENvbnN0cnVjdG9yID0gcnVudGltZV8xW1wiZGVmYXVsdFwiXS5nZXRYSFJBUEkoKTtcblx0ICAgICAgICB2YXIgeGhyID0gbmV3IENvbnN0cnVjdG9yKCk7XG5cdCAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG5cdCAgICAgICAgICAgICAgICBjYXNlIDM6XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5yZXNwb25zZVRleHQgJiYgeGhyLnJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5vbkNodW5rKHhoci5zdGF0dXMsIHhoci5yZXNwb25zZVRleHQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgNDpcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVGV4dCAmJiB4aHIucmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0Lm9uQ2h1bmsoeGhyLnN0YXR1cywgeGhyLnJlc3BvbnNlVGV4dCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHNvY2tldC5lbWl0KFwiZmluaXNoZWRcIiwgeGhyLnN0YXR1cyk7XG5cdCAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHJldHVybiB4aHI7XG5cdCAgICB9LFxuXHQgICAgYWJvcnRSZXF1ZXN0OiBmdW5jdGlvbiAoeGhyKSB7XG5cdCAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cdCAgICAgICAgeGhyLmFib3J0KCk7XG5cdCAgICB9XG5cdH07XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaG9va3M7XG5cblxuLyoqKi8gfSksXG4vKiAzOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgQ29sbGVjdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgdXRpbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBsZXZlbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCk7XG5cdHZhciBUaW1lbGluZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUaW1lbGluZShrZXksIHNlc3Npb24sIG9wdGlvbnMpIHtcblx0ICAgICAgICB0aGlzLmtleSA9IGtleTtcblx0ICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuZXZlbnRzID0gW107XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICAgICAgICB0aGlzLnNlbnQgPSAwO1xuXHQgICAgICAgIHRoaXMudW5pcXVlSUQgPSAwO1xuXHQgICAgfVxuXHQgICAgVGltZWxpbmUucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChsZXZlbCwgZXZlbnQpIHtcblx0ICAgICAgICBpZiAobGV2ZWwgPD0gdGhpcy5vcHRpb25zLmxldmVsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2goQ29sbGVjdGlvbnMuZXh0ZW5kKHt9LCBldmVudCwgeyB0aW1lc3RhbXA6IHV0aWxfMVtcImRlZmF1bHRcIl0ubm93KCkgfSkpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbWl0ICYmIHRoaXMuZXZlbnRzLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5saW1pdCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuc2hpZnQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUaW1lbGluZS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICB0aGlzLmxvZyhsZXZlbF8xW1wiZGVmYXVsdFwiXS5FUlJPUiwgZXZlbnQpO1xuXHQgICAgfTtcblx0ICAgIFRpbWVsaW5lLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgdGhpcy5sb2cobGV2ZWxfMVtcImRlZmF1bHRcIl0uSU5GTywgZXZlbnQpO1xuXHQgICAgfTtcblx0ICAgIFRpbWVsaW5lLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgIHRoaXMubG9nKGxldmVsXzFbXCJkZWZhdWx0XCJdLkRFQlVHLCBldmVudCk7XG5cdCAgICB9O1xuXHQgICAgVGltZWxpbmUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzLmxlbmd0aCA9PT0gMDtcblx0ICAgIH07XG5cdCAgICBUaW1lbGluZS5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChzZW5kZm4sIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICB2YXIgZGF0YSA9IENvbGxlY3Rpb25zLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcblx0ICAgICAgICAgICAgYnVuZGxlOiB0aGlzLnNlbnQgKyAxLFxuXHQgICAgICAgICAgICBrZXk6IHRoaXMua2V5LFxuXHQgICAgICAgICAgICBsaWI6IFwianNcIixcblx0ICAgICAgICAgICAgdmVyc2lvbjogdGhpcy5vcHRpb25zLnZlcnNpb24sXG5cdCAgICAgICAgICAgIGNsdXN0ZXI6IHRoaXMub3B0aW9ucy5jbHVzdGVyLFxuXHQgICAgICAgICAgICBmZWF0dXJlczogdGhpcy5vcHRpb25zLmZlYXR1cmVzLFxuXHQgICAgICAgICAgICB0aW1lbGluZTogdGhpcy5ldmVudHNcblx0ICAgICAgICB9LCB0aGlzLm9wdGlvbnMucGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuXHQgICAgICAgIHNlbmRmbihkYXRhLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkge1xuXHQgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5zZW50Kys7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfTtcblx0ICAgIFRpbWVsaW5lLnByb3RvdHlwZS5nZW5lcmF0ZVVuaXF1ZUlEID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMudW5pcXVlSUQrKztcblx0ICAgICAgICByZXR1cm4gdGhpcy51bmlxdWVJRDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVGltZWxpbmU7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVGltZWxpbmU7XG5cblxuLyoqKi8gfSksXG4vKiA0MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgVGltZWxpbmVMZXZlbDtcblx0KGZ1bmN0aW9uIChUaW1lbGluZUxldmVsKSB7XG5cdCAgICBUaW1lbGluZUxldmVsW1RpbWVsaW5lTGV2ZWxbXCJFUlJPUlwiXSA9IDNdID0gXCJFUlJPUlwiO1xuXHQgICAgVGltZWxpbmVMZXZlbFtUaW1lbGluZUxldmVsW1wiSU5GT1wiXSA9IDZdID0gXCJJTkZPXCI7XG5cdCAgICBUaW1lbGluZUxldmVsW1RpbWVsaW5lTGV2ZWxbXCJERUJVR1wiXSA9IDddID0gXCJERUJVR1wiO1xuXHR9KShUaW1lbGluZUxldmVsIHx8IChUaW1lbGluZUxldmVsID0ge30pKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBUaW1lbGluZUxldmVsO1xuXG5cbi8qKiovIH0pLFxuLyogNDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIHV0aWxfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHR2YXIgdHJhbnNwb3J0X21hbmFnZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpO1xuXHR2YXIgRXJyb3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMSk7XG5cdHZhciB0cmFuc3BvcnRfc3RyYXRlZ3lfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNTYpO1xuXHR2YXIgc2VxdWVudGlhbF9zdHJhdGVneV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nyk7XG5cdHZhciBiZXN0X2Nvbm5lY3RlZF9ldmVyX3N0cmF0ZWd5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4KTtcblx0dmFyIGNhY2hlZF9zdHJhdGVneV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OSk7XG5cdHZhciBkZWxheWVkX3N0cmF0ZWd5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwKTtcblx0dmFyIGlmX3N0cmF0ZWd5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKTtcblx0dmFyIGZpcnN0X2Nvbm5lY3RlZF9zdHJhdGVneV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mik7XG5cdHZhciBydW50aW1lXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgVHJhbnNwb3J0cyA9IHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uVHJhbnNwb3J0cztcblx0ZXhwb3J0cy5idWlsZCA9IGZ1bmN0aW9uIChzY2hlbWUsIG9wdGlvbnMpIHtcblx0ICAgIHZhciBjb250ZXh0ID0gQ29sbGVjdGlvbnMuZXh0ZW5kKHt9LCBnbG9iYWxDb250ZXh0LCBvcHRpb25zKTtcblx0ICAgIHJldHVybiBldmFsdWF0ZShzY2hlbWUsIGNvbnRleHQpWzFdLnN0cmF0ZWd5O1xuXHR9O1xuXHR2YXIgVW5zdXBwb3J0ZWRTdHJhdGVneSA9IHtcblx0ICAgIGlzU3VwcG9ydGVkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChfLCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBkZWZlcnJlZCA9IHV0aWxfMVtcImRlZmF1bHRcIl0uZGVmZXIoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3JzLlVuc3VwcG9ydGVkU3RyYXRlZ3koKSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIGRlZmVycmVkLmVuc3VyZUFib3J0ZWQoKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKCkgeyB9XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0fTtcblx0ZnVuY3Rpb24gcmV0dXJuV2l0aE9yaWdpbmFsQ29udGV4dChmKSB7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQpIHtcblx0ICAgICAgICByZXR1cm4gW2YuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgY29udGV4dF07XG5cdCAgICB9O1xuXHR9XG5cdHZhciBnbG9iYWxDb250ZXh0ID0ge1xuXHQgICAgZXh0ZW5kOiBmdW5jdGlvbiAoY29udGV4dCwgZmlyc3QsIHNlY29uZCkge1xuXHQgICAgICAgIHJldHVybiBbQ29sbGVjdGlvbnMuZXh0ZW5kKHt9LCBmaXJzdCwgc2Vjb25kKSwgY29udGV4dF07XG5cdCAgICB9LFxuXHQgICAgZGVmOiBmdW5jdGlvbiAoY29udGV4dCwgbmFtZSwgdmFsdWUpIHtcblx0ICAgICAgICBpZiAoY29udGV4dFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHRocm93IFwiUmVkZWZpbmluZyBzeW1ib2wgXCIgKyBuYW1lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb250ZXh0W25hbWVdID0gdmFsdWU7XG5cdCAgICAgICAgcmV0dXJuIFt1bmRlZmluZWQsIGNvbnRleHRdO1xuXHQgICAgfSxcblx0ICAgIGRlZl90cmFuc3BvcnQ6IGZ1bmN0aW9uIChjb250ZXh0LCBuYW1lLCB0eXBlLCBwcmlvcml0eSwgb3B0aW9ucywgbWFuYWdlcikge1xuXHQgICAgICAgIHZhciB0cmFuc3BvcnRDbGFzcyA9IFRyYW5zcG9ydHNbdHlwZV07XG5cdCAgICAgICAgaWYgKCF0cmFuc3BvcnRDbGFzcykge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3JzLlVuc3VwcG9ydGVkVHJhbnNwb3J0KHR5cGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgZW5hYmxlZCA9ICghY29udGV4dC5lbmFibGVkVHJhbnNwb3J0cyB8fFxuXHQgICAgICAgICAgICBDb2xsZWN0aW9ucy5hcnJheUluZGV4T2YoY29udGV4dC5lbmFibGVkVHJhbnNwb3J0cywgbmFtZSkgIT09IC0xKSAmJlxuXHQgICAgICAgICAgICAoIWNvbnRleHQuZGlzYWJsZWRUcmFuc3BvcnRzIHx8XG5cdCAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5hcnJheUluZGV4T2YoY29udGV4dC5kaXNhYmxlZFRyYW5zcG9ydHMsIG5hbWUpID09PSAtMSk7XG5cdCAgICAgICAgdmFyIHRyYW5zcG9ydDtcblx0ICAgICAgICBpZiAoZW5hYmxlZCkge1xuXHQgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0X3N0cmF0ZWd5XzFbXCJkZWZhdWx0XCJdKG5hbWUsIHByaW9yaXR5LCBtYW5hZ2VyID8gbWFuYWdlci5nZXRBc3Npc3RhbnQodHJhbnNwb3J0Q2xhc3MpIDogdHJhbnNwb3J0Q2xhc3MsIENvbGxlY3Rpb25zLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAgICBrZXk6IGNvbnRleHQua2V5LFxuXHQgICAgICAgICAgICAgICAgZW5jcnlwdGVkOiBjb250ZXh0LmVuY3J5cHRlZCxcblx0ICAgICAgICAgICAgICAgIHRpbWVsaW5lOiBjb250ZXh0LnRpbWVsaW5lLFxuXHQgICAgICAgICAgICAgICAgaWdub3JlTnVsbE9yaWdpbjogY29udGV4dC5pZ25vcmVOdWxsT3JpZ2luXG5cdCAgICAgICAgICAgIH0sIG9wdGlvbnMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRyYW5zcG9ydCA9IFVuc3VwcG9ydGVkU3RyYXRlZ3k7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBuZXdDb250ZXh0ID0gY29udGV4dC5kZWYoY29udGV4dCwgbmFtZSwgdHJhbnNwb3J0KVsxXTtcblx0ICAgICAgICBuZXdDb250ZXh0LlRyYW5zcG9ydHMgPSBjb250ZXh0LlRyYW5zcG9ydHMgfHwge307XG5cdCAgICAgICAgbmV3Q29udGV4dC5UcmFuc3BvcnRzW25hbWVdID0gdHJhbnNwb3J0O1xuXHQgICAgICAgIHJldHVybiBbdW5kZWZpbmVkLCBuZXdDb250ZXh0XTtcblx0ICAgIH0sXG5cdCAgICB0cmFuc3BvcnRfbWFuYWdlcjogcmV0dXJuV2l0aE9yaWdpbmFsQ29udGV4dChmdW5jdGlvbiAoXywgb3B0aW9ucykge1xuXHQgICAgICAgIHJldHVybiBuZXcgdHJhbnNwb3J0X21hbmFnZXJfMVtcImRlZmF1bHRcIl0ob3B0aW9ucyk7XG5cdCAgICB9KSxcblx0ICAgIHNlcXVlbnRpYWw6IHJldHVybldpdGhPcmlnaW5hbENvbnRleHQoZnVuY3Rpb24gKF8sIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBzZXF1ZW50aWFsX3N0cmF0ZWd5XzFbXCJkZWZhdWx0XCJdKHN0cmF0ZWdpZXMsIG9wdGlvbnMpO1xuXHQgICAgfSksXG5cdCAgICBjYWNoZWQ6IHJldHVybldpdGhPcmlnaW5hbENvbnRleHQoZnVuY3Rpb24gKGNvbnRleHQsIHR0bCwgc3RyYXRlZ3kpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IGNhY2hlZF9zdHJhdGVneV8xW1wiZGVmYXVsdFwiXShzdHJhdGVneSwgY29udGV4dC5UcmFuc3BvcnRzLCB7XG5cdCAgICAgICAgICAgIHR0bDogdHRsLFxuXHQgICAgICAgICAgICB0aW1lbGluZTogY29udGV4dC50aW1lbGluZSxcblx0ICAgICAgICAgICAgZW5jcnlwdGVkOiBjb250ZXh0LmVuY3J5cHRlZFxuXHQgICAgICAgIH0pO1xuXHQgICAgfSksXG5cdCAgICBmaXJzdF9jb25uZWN0ZWQ6IHJldHVybldpdGhPcmlnaW5hbENvbnRleHQoZnVuY3Rpb24gKF8sIHN0cmF0ZWd5KSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBmaXJzdF9jb25uZWN0ZWRfc3RyYXRlZ3lfMVtcImRlZmF1bHRcIl0oc3RyYXRlZ3kpO1xuXHQgICAgfSksXG5cdCAgICBiZXN0X2Nvbm5lY3RlZF9ldmVyOiByZXR1cm5XaXRoT3JpZ2luYWxDb250ZXh0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBiZXN0X2Nvbm5lY3RlZF9ldmVyX3N0cmF0ZWd5XzFbXCJkZWZhdWx0XCJdKHN0cmF0ZWdpZXMpO1xuXHQgICAgfSksXG5cdCAgICBkZWxheWVkOiByZXR1cm5XaXRoT3JpZ2luYWxDb250ZXh0KGZ1bmN0aW9uIChfLCBkZWxheSwgc3RyYXRlZ3kpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IGRlbGF5ZWRfc3RyYXRlZ3lfMVtcImRlZmF1bHRcIl0oc3RyYXRlZ3ksIHsgZGVsYXk6IGRlbGF5IH0pO1xuXHQgICAgfSksXG5cdCAgICBcImlmXCI6IHJldHVybldpdGhPcmlnaW5hbENvbnRleHQoZnVuY3Rpb24gKF8sIHRlc3QsIHRydWVCcmFuY2gsIGZhbHNlQnJhbmNoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBpZl9zdHJhdGVneV8xW1wiZGVmYXVsdFwiXSh0ZXN0LCB0cnVlQnJhbmNoLCBmYWxzZUJyYW5jaCk7XG5cdCAgICB9KSxcblx0ICAgIGlzX3N1cHBvcnRlZDogcmV0dXJuV2l0aE9yaWdpbmFsQ29udGV4dChmdW5jdGlvbiAoXywgc3RyYXRlZ3kpIHtcblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3kuaXNTdXBwb3J0ZWQoKTtcblx0ICAgICAgICB9O1xuXHQgICAgfSlcblx0fTtcblx0ZnVuY3Rpb24gaXNTeW1ib2woZXhwcmVzc2lvbikge1xuXHQgICAgcmV0dXJuICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIikgJiYgZXhwcmVzc2lvbi5jaGFyQXQoMCkgPT09IFwiOlwiO1xuXHR9XG5cdGZ1bmN0aW9uIGdldFN5bWJvbFZhbHVlKGV4cHJlc3Npb24sIGNvbnRleHQpIHtcblx0ICAgIHJldHVybiBjb250ZXh0W2V4cHJlc3Npb24uc2xpY2UoMSldO1xuXHR9XG5cdGZ1bmN0aW9uIGV2YWx1YXRlTGlzdE9mRXhwcmVzc2lvbnMoZXhwcmVzc2lvbnMsIGNvbnRleHQpIHtcblx0ICAgIGlmIChleHByZXNzaW9ucy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICByZXR1cm4gW1tdLCBjb250ZXh0XTtcblx0ICAgIH1cblx0ICAgIHZhciBoZWFkID0gZXZhbHVhdGUoZXhwcmVzc2lvbnNbMF0sIGNvbnRleHQpO1xuXHQgICAgdmFyIHRhaWwgPSBldmFsdWF0ZUxpc3RPZkV4cHJlc3Npb25zKGV4cHJlc3Npb25zLnNsaWNlKDEpLCBoZWFkWzFdKTtcblx0ICAgIHJldHVybiBbW2hlYWRbMF1dLmNvbmNhdCh0YWlsWzBdKSwgdGFpbFsxXV07XG5cdH1cblx0ZnVuY3Rpb24gZXZhbHVhdGVTdHJpbmcoZXhwcmVzc2lvbiwgY29udGV4dCkge1xuXHQgICAgaWYgKCFpc1N5bWJvbChleHByZXNzaW9uKSkge1xuXHQgICAgICAgIHJldHVybiBbZXhwcmVzc2lvbiwgY29udGV4dF07XG5cdCAgICB9XG5cdCAgICB2YXIgdmFsdWUgPSBnZXRTeW1ib2xWYWx1ZShleHByZXNzaW9uLCBjb250ZXh0KTtcblx0ICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdGhyb3cgXCJVbmRlZmluZWQgc3ltYm9sIFwiICsgZXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBbdmFsdWUsIGNvbnRleHRdO1xuXHR9XG5cdGZ1bmN0aW9uIGV2YWx1YXRlQXJyYXkoZXhwcmVzc2lvbiwgY29udGV4dCkge1xuXHQgICAgaWYgKGlzU3ltYm9sKGV4cHJlc3Npb25bMF0pKSB7XG5cdCAgICAgICAgdmFyIGYgPSBnZXRTeW1ib2xWYWx1ZShleHByZXNzaW9uWzBdLCBjb250ZXh0KTtcblx0ICAgICAgICBpZiAoZXhwcmVzc2lvbi5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBcIkNhbGxpbmcgbm9uLWZ1bmN0aW9uIFwiICsgZXhwcmVzc2lvblswXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgYXJncyA9IFtDb2xsZWN0aW9ucy5leHRlbmQoe30sIGNvbnRleHQpXS5jb25jYXQoQ29sbGVjdGlvbnMubWFwKGV4cHJlc3Npb24uc2xpY2UoMSksIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZShhcmcsIENvbGxlY3Rpb25zLmV4dGVuZCh7fSwgY29udGV4dCkpWzBdO1xuXHQgICAgICAgICAgICB9KSk7XG5cdCAgICAgICAgICAgIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFtmLCBjb250ZXh0XTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gZXZhbHVhdGVMaXN0T2ZFeHByZXNzaW9ucyhleHByZXNzaW9uLCBjb250ZXh0KTtcblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBldmFsdWF0ZShleHByZXNzaW9uLCBjb250ZXh0KSB7XG5cdCAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgICByZXR1cm4gZXZhbHVhdGVTdHJpbmcoZXhwcmVzc2lvbiwgY29udGV4dCk7XG5cdCAgICB9XG5cdCAgICBlbHNlIGlmICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gXCJvYmplY3RcIikge1xuXHQgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwcmVzc2lvbi5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUFycmF5KGV4cHJlc3Npb24sIGNvbnRleHQpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBbZXhwcmVzc2lvbiwgY29udGV4dF07XG5cdH1cblxuXG4vKioqLyB9KSxcbi8qIDQyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBmYWN0b3J5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKTtcblx0dmFyIFRyYW5zcG9ydE1hbmFnZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVHJhbnNwb3J0TWFuYWdlcihvcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICAgICAgICB0aGlzLmxpdmVzTGVmdCA9IHRoaXMub3B0aW9ucy5saXZlcyB8fCBJbmZpbml0eTtcblx0ICAgIH1cblx0ICAgIFRyYW5zcG9ydE1hbmFnZXIucHJvdG90eXBlLmdldEFzc2lzdGFudCA9IGZ1bmN0aW9uICh0cmFuc3BvcnQpIHtcblx0ICAgICAgICByZXR1cm4gZmFjdG9yeV8xW1wiZGVmYXVsdFwiXS5jcmVhdGVBc3Npc3RhbnRUb1RoZVRyYW5zcG9ydE1hbmFnZXIodGhpcywgdHJhbnNwb3J0LCB7XG5cdCAgICAgICAgICAgIG1pblBpbmdEZWxheTogdGhpcy5vcHRpb25zLm1pblBpbmdEZWxheSxcblx0ICAgICAgICAgICAgbWF4UGluZ0RlbGF5OiB0aGlzLm9wdGlvbnMubWF4UGluZ0RlbGF5XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgVHJhbnNwb3J0TWFuYWdlci5wcm90b3R5cGUuaXNBbGl2ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5saXZlc0xlZnQgPiAwO1xuXHQgICAgfTtcblx0ICAgIFRyYW5zcG9ydE1hbmFnZXIucHJvdG90eXBlLnJlcG9ydERlYXRoID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMubGl2ZXNMZWZ0IC09IDE7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRyYW5zcG9ydE1hbmFnZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVHJhbnNwb3J0TWFuYWdlcjtcblxuXG4vKioqLyB9KSxcbi8qIDQzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBhc3Npc3RhbnRfdG9fdGhlX3RyYW5zcG9ydF9tYW5hZ2VyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblx0dmFyIGhhbmRzaGFrZV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG5cdHZhciBwdXNoZXJfYXV0aG9yaXplcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCk7XG5cdHZhciB0aW1lbGluZV9zZW5kZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpO1xuXHR2YXIgcHJlc2VuY2VfY2hhbm5lbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MCk7XG5cdHZhciBwcml2YXRlX2NoYW5uZWxfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNTEpO1xuXHR2YXIgY2hhbm5lbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7XG5cdHZhciBjb25uZWN0aW9uX21hbmFnZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNTQpO1xuXHR2YXIgY2hhbm5lbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUpO1xuXHR2YXIgRmFjdG9yeSA9IHtcblx0ICAgIGNyZWF0ZUNoYW5uZWxzOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBjaGFubmVsc18xW1wiZGVmYXVsdFwiXSgpO1xuXHQgICAgfSxcblx0ICAgIGNyZWF0ZUNvbm5lY3Rpb25NYW5hZ2VyOiBmdW5jdGlvbiAoa2V5LCBvcHRpb25zKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBjb25uZWN0aW9uX21hbmFnZXJfMVtcImRlZmF1bHRcIl0oa2V5LCBvcHRpb25zKTtcblx0ICAgIH0sXG5cdCAgICBjcmVhdGVDaGFubmVsOiBmdW5jdGlvbiAobmFtZSwgcHVzaGVyKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBjaGFubmVsXzFbXCJkZWZhdWx0XCJdKG5hbWUsIHB1c2hlcik7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlUHJpdmF0ZUNoYW5uZWw6IGZ1bmN0aW9uIChuYW1lLCBwdXNoZXIpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IHByaXZhdGVfY2hhbm5lbF8xW1wiZGVmYXVsdFwiXShuYW1lLCBwdXNoZXIpO1xuXHQgICAgfSxcblx0ICAgIGNyZWF0ZVByZXNlbmNlQ2hhbm5lbDogZnVuY3Rpb24gKG5hbWUsIHB1c2hlcikge1xuXHQgICAgICAgIHJldHVybiBuZXcgcHJlc2VuY2VfY2hhbm5lbF8xW1wiZGVmYXVsdFwiXShuYW1lLCBwdXNoZXIpO1xuXHQgICAgfSxcblx0ICAgIGNyZWF0ZVRpbWVsaW5lU2VuZGVyOiBmdW5jdGlvbiAodGltZWxpbmUsIG9wdGlvbnMpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IHRpbWVsaW5lX3NlbmRlcl8xW1wiZGVmYXVsdFwiXSh0aW1lbGluZSwgb3B0aW9ucyk7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlQXV0aG9yaXplcjogZnVuY3Rpb24gKGNoYW5uZWwsIG9wdGlvbnMpIHtcblx0ICAgICAgICBpZiAob3B0aW9ucy5hdXRob3JpemVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmF1dGhvcml6ZXIoY2hhbm5lbCwgb3B0aW9ucyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuZXcgcHVzaGVyX2F1dGhvcml6ZXJfMVtcImRlZmF1bHRcIl0oY2hhbm5lbCwgb3B0aW9ucyk7XG5cdCAgICB9LFxuXHQgICAgY3JlYXRlSGFuZHNoYWtlOiBmdW5jdGlvbiAodHJhbnNwb3J0LCBjYWxsYmFjaykge1xuXHQgICAgICAgIHJldHVybiBuZXcgaGFuZHNoYWtlXzFbXCJkZWZhdWx0XCJdKHRyYW5zcG9ydCwgY2FsbGJhY2spO1xuXHQgICAgfSxcblx0ICAgIGNyZWF0ZUFzc2lzdGFudFRvVGhlVHJhbnNwb3J0TWFuYWdlcjogZnVuY3Rpb24gKG1hbmFnZXIsIHRyYW5zcG9ydCwgb3B0aW9ucykge1xuXHQgICAgICAgIHJldHVybiBuZXcgYXNzaXN0YW50X3RvX3RoZV90cmFuc3BvcnRfbWFuYWdlcl8xW1wiZGVmYXVsdFwiXShtYW5hZ2VyLCB0cmFuc3BvcnQsIG9wdGlvbnMpO1xuXHQgICAgfVxuXHR9O1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IEZhY3Rvcnk7XG5cblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgdXRpbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBDb2xsZWN0aW9ucyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciBBc3Npc3RhbnRUb1RoZVRyYW5zcG9ydE1hbmFnZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyKG1hbmFnZXIsIHRyYW5zcG9ydCwgb3B0aW9ucykge1xuXHQgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG5cdCAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG5cdCAgICAgICAgdGhpcy5taW5QaW5nRGVsYXkgPSBvcHRpb25zLm1pblBpbmdEZWxheTtcblx0ICAgICAgICB0aGlzLm1heFBpbmdEZWxheSA9IG9wdGlvbnMubWF4UGluZ0RlbGF5O1xuXHQgICAgICAgIHRoaXMucGluZ0RlbGF5ID0gdW5kZWZpbmVkO1xuXHQgICAgfVxuXHQgICAgQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGVDb25uZWN0aW9uID0gZnVuY3Rpb24gKG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIG9wdGlvbnMgPSBDb2xsZWN0aW9ucy5leHRlbmQoe30sIG9wdGlvbnMsIHtcblx0ICAgICAgICAgICAgYWN0aXZpdHlUaW1lb3V0OiB0aGlzLnBpbmdEZWxheVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHZhciBjb25uZWN0aW9uID0gdGhpcy50cmFuc3BvcnQuY3JlYXRlQ29ubmVjdGlvbihuYW1lLCBwcmlvcml0eSwga2V5LCBvcHRpb25zKTtcblx0ICAgICAgICB2YXIgb3BlblRpbWVzdGFtcCA9IG51bGw7XG5cdCAgICAgICAgdmFyIG9uT3BlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgY29ubmVjdGlvbi51bmJpbmQoXCJvcGVuXCIsIG9uT3Blbik7XG5cdCAgICAgICAgICAgIGNvbm5lY3Rpb24uYmluZChcImNsb3NlZFwiLCBvbkNsb3NlZCk7XG5cdCAgICAgICAgICAgIG9wZW5UaW1lc3RhbXAgPSB1dGlsXzFbXCJkZWZhdWx0XCJdLm5vdygpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgdmFyIG9uQ2xvc2VkID0gZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcblx0ICAgICAgICAgICAgY29ubmVjdGlvbi51bmJpbmQoXCJjbG9zZWRcIiwgb25DbG9zZWQpO1xuXHQgICAgICAgICAgICBpZiAoY2xvc2VFdmVudC5jb2RlID09PSAxMDAyIHx8IGNsb3NlRXZlbnQuY29kZSA9PT0gMTAwMykge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5yZXBvcnREZWF0aCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKCFjbG9zZUV2ZW50Lndhc0NsZWFuICYmIG9wZW5UaW1lc3RhbXApIHtcblx0ICAgICAgICAgICAgICAgIHZhciBsaWZlc3BhbiA9IHV0aWxfMVtcImRlZmF1bHRcIl0ubm93KCkgLSBvcGVuVGltZXN0YW1wO1xuXHQgICAgICAgICAgICAgICAgaWYgKGxpZmVzcGFuIDwgMiAqIF90aGlzLm1heFBpbmdEZWxheSkge1xuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIucmVwb3J0RGVhdGgoKTtcblx0ICAgICAgICAgICAgICAgICAgICBfdGhpcy5waW5nRGVsYXkgPSBNYXRoLm1heChsaWZlc3BhbiAvIDIsIF90aGlzLm1pblBpbmdEZWxheSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbm5lY3Rpb24uYmluZChcIm9wZW5cIiwgb25PcGVuKTtcblx0ICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcblx0ICAgIH07XG5cdCAgICBBc3Npc3RhbnRUb1RoZVRyYW5zcG9ydE1hbmFnZXIucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKGVudmlyb25tZW50KSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5pc0FsaXZlKCkgJiYgdGhpcy50cmFuc3BvcnQuaXNTdXBwb3J0ZWQoZW52aXJvbm1lbnQpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBBc3Npc3RhbnRUb1RoZVRyYW5zcG9ydE1hbmFnZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyO1xuXG5cbi8qKiovIH0pLFxuLyogNDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIFByb3RvY29sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nik7XG5cdHZhciBjb25uZWN0aW9uXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KTtcblx0dmFyIEhhbmRzaGFrZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBIYW5kc2hha2UodHJhbnNwb3J0LCBjYWxsYmFjaykge1xuXHQgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcblx0ICAgICAgICB0aGlzLmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgIH1cblx0ICAgIEhhbmRzaGFrZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy51bmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuXHQgICAgfTtcblx0ICAgIEhhbmRzaGFrZS5wcm90b3R5cGUuYmluZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHRoaXMub25NZXNzYWdlID0gZnVuY3Rpb24gKG0pIHtcblx0ICAgICAgICAgICAgX3RoaXMudW5iaW5kTGlzdGVuZXJzKCk7XG5cdCAgICAgICAgICAgIHZhciByZXN1bHQ7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBQcm90b2NvbC5wcm9jZXNzSGFuZHNoYWtlKG0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5maW5pc2goXCJlcnJvclwiLCB7IGVycm9yOiBlIH0pO1xuXHQgICAgICAgICAgICAgICAgX3RoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09IFwiY29ubmVjdGVkXCIpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLmZpbmlzaChcImNvbm5lY3RlZFwiLCB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogbmV3IGNvbm5lY3Rpb25fMVtcImRlZmF1bHRcIl0ocmVzdWx0LmlkLCBfdGhpcy50cmFuc3BvcnQpLFxuXHQgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5VGltZW91dDogcmVzdWx0LmFjdGl2aXR5VGltZW91dFxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5maW5pc2gocmVzdWx0LmFjdGlvbiwgeyBlcnJvcjogcmVzdWx0LmVycm9yIH0pO1xuXHQgICAgICAgICAgICAgICAgX3RoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMub25DbG9zZWQgPSBmdW5jdGlvbiAoY2xvc2VFdmVudCkge1xuXHQgICAgICAgICAgICBfdGhpcy51bmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgICAgICAgICAgdmFyIGFjdGlvbiA9IFByb3RvY29sLmdldENsb3NlQWN0aW9uKGNsb3NlRXZlbnQpIHx8IFwiYmFja29mZlwiO1xuXHQgICAgICAgICAgICB2YXIgZXJyb3IgPSBQcm90b2NvbC5nZXRDbG9zZUVycm9yKGNsb3NlRXZlbnQpO1xuXHQgICAgICAgICAgICBfdGhpcy5maW5pc2goYWN0aW9uLCB7IGVycm9yOiBlcnJvciB9KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMudHJhbnNwb3J0LmJpbmQoXCJtZXNzYWdlXCIsIHRoaXMub25NZXNzYWdlKTtcblx0ICAgICAgICB0aGlzLnRyYW5zcG9ydC5iaW5kKFwiY2xvc2VkXCIsIHRoaXMub25DbG9zZWQpO1xuXHQgICAgfTtcblx0ICAgIEhhbmRzaGFrZS5wcm90b3R5cGUudW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMudHJhbnNwb3J0LnVuYmluZChcIm1lc3NhZ2VcIiwgdGhpcy5vbk1lc3NhZ2UpO1xuXHQgICAgICAgIHRoaXMudHJhbnNwb3J0LnVuYmluZChcImNsb3NlZFwiLCB0aGlzLm9uQ2xvc2VkKTtcblx0ICAgIH07XG5cdCAgICBIYW5kc2hha2UucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChhY3Rpb24sIHBhcmFtcykge1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2soQ29sbGVjdGlvbnMuZXh0ZW5kKHsgdHJhbnNwb3J0OiB0aGlzLnRyYW5zcG9ydCwgYWN0aW9uOiBhY3Rpb24gfSwgcGFyYW1zKSk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIEhhbmRzaGFrZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBIYW5kc2hha2U7XG5cblxuLyoqKi8gfSksXG4vKiA0NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRleHBvcnRzLmRlY29kZU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpO1xuXHQgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBwYXJhbXMuZGF0YSA9IEpTT04ucGFyc2UocGFyYW1zLmRhdGEpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcGFyYW1zO1xuXHQgICAgfVxuXHQgICAgY2F0Y2ggKGUpIHtcblx0ICAgICAgICB0aHJvdyB7IHR5cGU6ICdNZXNzYWdlUGFyc2VFcnJvcicsIGVycm9yOiBlLCBkYXRhOiBtZXNzYWdlLmRhdGEgfTtcblx0ICAgIH1cblx0fTtcblx0ZXhwb3J0cy5lbmNvZGVNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0ICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcblx0fTtcblx0ZXhwb3J0cy5wcm9jZXNzSGFuZHNoYWtlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0ICAgIG1lc3NhZ2UgPSBleHBvcnRzLmRlY29kZU1lc3NhZ2UobWVzc2FnZSk7XG5cdCAgICBpZiAobWVzc2FnZS5ldmVudCA9PT0gXCJwdXNoZXI6Y29ubmVjdGlvbl9lc3RhYmxpc2hlZFwiKSB7XG5cdCAgICAgICAgaWYgKCFtZXNzYWdlLmRhdGEuYWN0aXZpdHlfdGltZW91dCkge1xuXHQgICAgICAgICAgICB0aHJvdyBcIk5vIGFjdGl2aXR5IHRpbWVvdXQgc3BlY2lmaWVkIGluIGhhbmRzaGFrZVwiO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBhY3Rpb246IFwiY29ubmVjdGVkXCIsXG5cdCAgICAgICAgICAgIGlkOiBtZXNzYWdlLmRhdGEuc29ja2V0X2lkLFxuXHQgICAgICAgICAgICBhY3Rpdml0eVRpbWVvdXQ6IG1lc3NhZ2UuZGF0YS5hY3Rpdml0eV90aW1lb3V0ICogMTAwMFxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cdCAgICBlbHNlIGlmIChtZXNzYWdlLmV2ZW50ID09PSBcInB1c2hlcjplcnJvclwiKSB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmdldENsb3NlQWN0aW9uKG1lc3NhZ2UuZGF0YSksXG5cdCAgICAgICAgICAgIGVycm9yOiB0aGlzLmdldENsb3NlRXJyb3IobWVzc2FnZS5kYXRhKVxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICB0aHJvdyBcIkludmFsaWQgaGFuZHNoYWtlXCI7XG5cdCAgICB9XG5cdH07XG5cdGV4cG9ydHMuZ2V0Q2xvc2VBY3Rpb24gPSBmdW5jdGlvbiAoY2xvc2VFdmVudCkge1xuXHQgICAgaWYgKGNsb3NlRXZlbnQuY29kZSA8IDQwMDApIHtcblx0ICAgICAgICBpZiAoY2xvc2VFdmVudC5jb2RlID49IDEwMDIgJiYgY2xvc2VFdmVudC5jb2RlIDw9IDEwMDQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFwiYmFja29mZlwiO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgZWxzZSBpZiAoY2xvc2VFdmVudC5jb2RlID09PSA0MDAwKSB7XG5cdCAgICAgICAgcmV0dXJuIFwic3NsX29ubHlcIjtcblx0ICAgIH1cblx0ICAgIGVsc2UgaWYgKGNsb3NlRXZlbnQuY29kZSA8IDQxMDApIHtcblx0ICAgICAgICByZXR1cm4gXCJyZWZ1c2VkXCI7XG5cdCAgICB9XG5cdCAgICBlbHNlIGlmIChjbG9zZUV2ZW50LmNvZGUgPCA0MjAwKSB7XG5cdCAgICAgICAgcmV0dXJuIFwiYmFja29mZlwiO1xuXHQgICAgfVxuXHQgICAgZWxzZSBpZiAoY2xvc2VFdmVudC5jb2RlIDwgNDMwMCkge1xuXHQgICAgICAgIHJldHVybiBcInJldHJ5XCI7XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gXCJyZWZ1c2VkXCI7XG5cdCAgICB9XG5cdH07XG5cdGV4cG9ydHMuZ2V0Q2xvc2VFcnJvciA9IGZ1bmN0aW9uIChjbG9zZUV2ZW50KSB7XG5cdCAgICBpZiAoY2xvc2VFdmVudC5jb2RlICE9PSAxMDAwICYmIGNsb3NlRXZlbnQuY29kZSAhPT0gMTAwMSkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdQdXNoZXJFcnJvcicsXG5cdCAgICAgICAgICAgIGRhdGE6IHtcblx0ICAgICAgICAgICAgICAgIGNvZGU6IGNsb3NlRXZlbnQuY29kZSxcblx0ICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNsb3NlRXZlbnQucmVhc29uIHx8IGNsb3NlRXZlbnQubWVzc2FnZVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHR9O1xuXG5cbi8qKiovIH0pLFxuLyogNDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuXHQgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0fTtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIGRpc3BhdGNoZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpO1xuXHR2YXIgUHJvdG9jb2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2KTtcblx0dmFyIGxvZ2dlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIENvbm5lY3Rpb24gPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuXHQgICAgX19leHRlbmRzKENvbm5lY3Rpb24sIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBDb25uZWN0aW9uKGlkLCB0cmFuc3BvcnQpIHtcblx0ICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG5cdCAgICAgICAgdGhpcy5hY3Rpdml0eVRpbWVvdXQgPSB0cmFuc3BvcnQuYWN0aXZpdHlUaW1lb3V0O1xuXHQgICAgICAgIHRoaXMuYmluZExpc3RlbmVycygpO1xuXHQgICAgfVxuXHQgICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuaGFuZGxlc0FjdGl2aXR5Q2hlY2tzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5oYW5kbGVzQWN0aXZpdHlDaGVja3MoKTtcblx0ICAgIH07XG5cdCAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc2VuZChkYXRhKTtcblx0ICAgIH07XG5cdCAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kX2V2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGRhdGEsIGNoYW5uZWwpIHtcblx0ICAgICAgICB2YXIgbWVzc2FnZSA9IHsgZXZlbnQ6IG5hbWUsIGRhdGE6IGRhdGEgfTtcblx0ICAgICAgICBpZiAoY2hhbm5lbCkge1xuXHQgICAgICAgICAgICBtZXNzYWdlLmNoYW5uZWwgPSBjaGFubmVsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBsb2dnZXJfMVtcImRlZmF1bHRcIl0uZGVidWcoJ0V2ZW50IHNlbnQnLCBtZXNzYWdlKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFByb3RvY29sLmVuY29kZU1lc3NhZ2UobWVzc2FnZSkpO1xuXHQgICAgfTtcblx0ICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnBpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0LnN1cHBvcnRzUGluZygpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBpbmcoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuc2VuZF9ldmVudCgncHVzaGVyOnBpbmcnLCB7fSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG5cdCAgICB9O1xuXHQgICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuYmluZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB7XG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uIChtKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZTtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFByb3RvY29sLmRlY29kZU1lc3NhZ2UobSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Vycm9yJywge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTWVzc2FnZVBhcnNlRXJyb3InLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbS5kYXRhXG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbG9nZ2VyXzFbXCJkZWZhdWx0XCJdLmRlYnVnKCdFdmVudCByZWNkJywgbWVzc2FnZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLmV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3B1c2hlcjplcnJvcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdlcnJvcicsIHsgdHlwZTogJ1B1c2hlckVycm9yJywgZGF0YTogbWVzc2FnZS5kYXRhIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3B1c2hlcjpwaW5nJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoXCJwaW5nXCIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3B1c2hlcjpwb25nJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoXCJwb25nXCIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgYWN0aXZpdHk6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoXCJhY3Rpdml0eVwiKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuZW1pdChcImVycm9yXCIsIHsgdHlwZTogXCJXZWJTb2NrZXRFcnJvclwiLCBlcnJvcjogZXJyb3IgfSk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNsb3NlZDogZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcblx0ICAgICAgICAgICAgICAgIHVuYmluZExpc3RlbmVycygpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNsb3NlRXZlbnQgJiYgY2xvc2VFdmVudC5jb2RlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlQ2xvc2VFdmVudChjbG9zZUV2ZW50KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zcG9ydCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KFwiY2xvc2VkXCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB2YXIgdW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBDb2xsZWN0aW9ucy5vYmplY3RBcHBseShsaXN0ZW5lcnMsIGZ1bmN0aW9uIChsaXN0ZW5lciwgZXZlbnQpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zcG9ydC51bmJpbmQoZXZlbnQsIGxpc3RlbmVyKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBDb2xsZWN0aW9ucy5vYmplY3RBcHBseShsaXN0ZW5lcnMsIGZ1bmN0aW9uIChsaXN0ZW5lciwgZXZlbnQpIHtcblx0ICAgICAgICAgICAgX3RoaXMudHJhbnNwb3J0LmJpbmQoZXZlbnQsIGxpc3RlbmVyKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5oYW5kbGVDbG9zZUV2ZW50ID0gZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcblx0ICAgICAgICB2YXIgYWN0aW9uID0gUHJvdG9jb2wuZ2V0Q2xvc2VBY3Rpb24oY2xvc2VFdmVudCk7XG5cdCAgICAgICAgdmFyIGVycm9yID0gUHJvdG9jb2wuZ2V0Q2xvc2VFcnJvcihjbG9zZUV2ZW50KTtcblx0ICAgICAgICBpZiAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGFjdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLmVtaXQoYWN0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIENvbm5lY3Rpb247XG5cdH0oZGlzcGF0Y2hlcl8xW1wiZGVmYXVsdFwiXSkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbm5lY3Rpb247XG5cblxuLyoqKi8gfSksXG4vKiA0OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgcnVudGltZV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIFB1c2hlckF1dGhvcml6ZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUHVzaGVyQXV0aG9yaXplcihjaGFubmVsLCBvcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblx0ICAgICAgICB2YXIgYXV0aFRyYW5zcG9ydCA9IG9wdGlvbnMuYXV0aFRyYW5zcG9ydDtcblx0ICAgICAgICBpZiAodHlwZW9mIHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uZ2V0QXV0aG9yaXplcnMoKVthdXRoVHJhbnNwb3J0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHQgICAgICAgICAgICB0aHJvdyBcIidcIiArIGF1dGhUcmFuc3BvcnQgKyBcIicgaXMgbm90IGEgcmVjb2duaXplZCBhdXRoIHRyYW5zcG9ydFwiO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnR5cGUgPSBhdXRoVHJhbnNwb3J0O1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdCAgICAgICAgdGhpcy5hdXRoT3B0aW9ucyA9IChvcHRpb25zIHx8IHt9KS5hdXRoIHx8IHt9O1xuXHQgICAgfVxuXHQgICAgUHVzaGVyQXV0aG9yaXplci5wcm90b3R5cGUuY29tcG9zZVF1ZXJ5ID0gZnVuY3Rpb24gKHNvY2tldElkKSB7XG5cdCAgICAgICAgdmFyIHF1ZXJ5ID0gJ3NvY2tldF9pZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNvY2tldElkKSArXG5cdCAgICAgICAgICAgICcmY2hhbm5lbF9uYW1lPScgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5jaGFubmVsLm5hbWUpO1xuXHQgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5hdXRoT3B0aW9ucy5wYXJhbXMpIHtcblx0ICAgICAgICAgICAgcXVlcnkgKz0gXCImXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmF1dGhPcHRpb25zLnBhcmFtc1tpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBxdWVyeTtcblx0ICAgIH07XG5cdCAgICBQdXNoZXJBdXRob3JpemVyLnByb3RvdHlwZS5hdXRob3JpemUgPSBmdW5jdGlvbiAoc29ja2V0SWQsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgUHVzaGVyQXV0aG9yaXplci5hdXRob3JpemVycyA9IFB1c2hlckF1dGhvcml6ZXIuYXV0aG9yaXplcnMgfHwgcnVudGltZV8xW1wiZGVmYXVsdFwiXS5nZXRBdXRob3JpemVycygpO1xuXHQgICAgICAgIHJldHVybiBQdXNoZXJBdXRob3JpemVyLmF1dGhvcml6ZXJzW3RoaXMudHlwZV0uY2FsbCh0aGlzLCBydW50aW1lXzFbXCJkZWZhdWx0XCJdLCBzb2NrZXRJZCwgY2FsbGJhY2spO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBQdXNoZXJBdXRob3JpemVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IFB1c2hlckF1dGhvcml6ZXI7XG5cblxuLyoqKi8gfSksXG4vKiA0OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgcnVudGltZV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIFRpbWVsaW5lU2VuZGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRpbWVsaW5lU2VuZGVyKHRpbWVsaW5lLCBvcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy50aW1lbGluZSA9IHRpbWVsaW5lO1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgICB9XG5cdCAgICBUaW1lbGluZVNlbmRlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChlbmNyeXB0ZWQsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudGltZWxpbmUuaXNFbXB0eSgpKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy50aW1lbGluZS5zZW5kKHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uVGltZWxpbmVUcmFuc3BvcnQuZ2V0QWdlbnQodGhpcywgZW5jcnlwdGVkKSwgY2FsbGJhY2spO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUaW1lbGluZVNlbmRlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBUaW1lbGluZVNlbmRlcjtcblxuXG4vKioqLyB9KSxcbi8qIDUwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcblx0ICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuXHQgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG5cdCAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG5cdH07XG5cdHZhciBwcml2YXRlX2NoYW5uZWxfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNTEpO1xuXHR2YXIgbG9nZ2VyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHR2YXIgbWVtYmVyc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Myk7XG5cdHZhciB1cmxfc3RvcmVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXHR2YXIgUHJlc2VuY2VDaGFubmVsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcblx0ICAgIF9fZXh0ZW5kcyhQcmVzZW5jZUNoYW5uZWwsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBQcmVzZW5jZUNoYW5uZWwobmFtZSwgcHVzaGVyKSB7XG5cdCAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbmFtZSwgcHVzaGVyKTtcblx0ICAgICAgICB0aGlzLm1lbWJlcnMgPSBuZXcgbWVtYmVyc18xW1wiZGVmYXVsdFwiXSgpO1xuXHQgICAgfVxuXHQgICAgUHJlc2VuY2VDaGFubmVsLnByb3RvdHlwZS5hdXRob3JpemUgPSBmdW5jdGlvbiAoc29ja2V0SWQsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICBfc3VwZXIucHJvdG90eXBlLmF1dGhvcml6ZS5jYWxsKHRoaXMsIHNvY2tldElkLCBmdW5jdGlvbiAoZXJyb3IsIGF1dGhEYXRhKSB7XG5cdCAgICAgICAgICAgIGlmICghZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChhdXRoRGF0YS5jaGFubmVsX2RhdGEgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBzdWZmaXggPSB1cmxfc3RvcmVfMVtcImRlZmF1bHRcIl0uYnVpbGRMb2dTdWZmaXgoXCJhdXRoZW50aWNhdGlvbkVuZHBvaW50XCIpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxvZ2dlcl8xW1wiZGVmYXVsdFwiXS53YXJuKChcIkludmFsaWQgYXV0aCByZXNwb25zZSBmb3IgY2hhbm5lbCAnXCIgKyBfdGhpcy5uYW1lICsgXCInLFwiKSArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIChcImV4cGVjdGVkICdjaGFubmVsX2RhdGEnIGZpZWxkLiBcIiArIHN1ZmZpeCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKFwiSW52YWxpZCBhdXRoIHJlc3BvbnNlXCIpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhciBjaGFubmVsRGF0YSA9IEpTT04ucGFyc2UoYXV0aERhdGEuY2hhbm5lbF9kYXRhKTtcblx0ICAgICAgICAgICAgICAgIF90aGlzLm1lbWJlcnMuc2V0TXlJRChjaGFubmVsRGF0YS51c2VyX2lkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgYXV0aERhdGEpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIFByZXNlbmNlQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcblx0ICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIGNhc2UgXCJwdXNoZXJfaW50ZXJuYWw6c3Vic2NyaXB0aW9uX3N1Y2NlZWRlZFwiOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25QZW5kaW5nID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uQ2FuY2VsbGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoZXIudW5zdWJzY3JpYmUodGhpcy5uYW1lKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubWVtYmVycy5vblN1YnNjcmlwdGlvbihkYXRhKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJwdXNoZXI6c3Vic2NyaXB0aW9uX3N1Y2NlZWRlZFwiLCB0aGlzLm1lbWJlcnMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgXCJwdXNoZXJfaW50ZXJuYWw6bWVtYmVyX2FkZGVkXCI6XG5cdCAgICAgICAgICAgICAgICB2YXIgYWRkZWRNZW1iZXIgPSB0aGlzLm1lbWJlcnMuYWRkTWVtYmVyKGRhdGEpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdwdXNoZXI6bWVtYmVyX2FkZGVkJywgYWRkZWRNZW1iZXIpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgXCJwdXNoZXJfaW50ZXJuYWw6bWVtYmVyX3JlbW92ZWRcIjpcblx0ICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTWVtYmVyID0gdGhpcy5tZW1iZXJzLnJlbW92ZU1lbWJlcihkYXRhKTtcblx0ICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTWVtYmVyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdwdXNoZXI6bWVtYmVyX3JlbW92ZWQnLCByZW1vdmVkTWVtYmVyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcHJpdmF0ZV9jaGFubmVsXzFbXCJkZWZhdWx0XCJdLnByb3RvdHlwZS5oYW5kbGVFdmVudC5jYWxsKHRoaXMsIGV2ZW50LCBkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUHJlc2VuY2VDaGFubmVsLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMubWVtYmVycy5yZXNldCgpO1xuXHQgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzY29ubmVjdC5jYWxsKHRoaXMpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBQcmVzZW5jZUNoYW5uZWw7XG5cdH0ocHJpdmF0ZV9jaGFubmVsXzFbXCJkZWZhdWx0XCJdKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUHJlc2VuY2VDaGFubmVsO1xuXG5cbi8qKiovIH0pLFxuLyogNTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuXHQgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0fTtcblx0dmFyIGZhY3RvcnlfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpO1xuXHR2YXIgY2hhbm5lbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7XG5cdHZhciBQcml2YXRlQ2hhbm5lbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoUHJpdmF0ZUNoYW5uZWwsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBQcml2YXRlQ2hhbm5lbCgpIHtcblx0ICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICAgIFByaXZhdGVDaGFubmVsLnByb3RvdHlwZS5hdXRob3JpemUgPSBmdW5jdGlvbiAoc29ja2V0SWQsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIGF1dGhvcml6ZXIgPSBmYWN0b3J5XzFbXCJkZWZhdWx0XCJdLmNyZWF0ZUF1dGhvcml6ZXIodGhpcywgdGhpcy5wdXNoZXIuY29uZmlnKTtcblx0ICAgICAgICByZXR1cm4gYXV0aG9yaXplci5hdXRob3JpemUoc29ja2V0SWQsIGNhbGxiYWNrKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gUHJpdmF0ZUNoYW5uZWw7XG5cdH0oY2hhbm5lbF8xW1wiZGVmYXVsdFwiXSkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IFByaXZhdGVDaGFubmVsO1xuXG5cbi8qKiovIH0pLFxuLyogNTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuXHQgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0fTtcblx0dmFyIGRpc3BhdGNoZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpO1xuXHR2YXIgRXJyb3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMSk7XG5cdHZhciBsb2dnZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cdHZhciBDaGFubmVsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcblx0ICAgIF9fZXh0ZW5kcyhDaGFubmVsLCBfc3VwZXIpO1xuXHQgICAgZnVuY3Rpb24gQ2hhbm5lbChuYW1lLCBwdXNoZXIpIHtcblx0ICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcblx0ICAgICAgICAgICAgbG9nZ2VyXzFbXCJkZWZhdWx0XCJdLmRlYnVnKCdObyBjYWxsYmFja3Mgb24gJyArIG5hbWUgKyAnIGZvciAnICsgZXZlbnQpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy5wdXNoZXIgPSBwdXNoZXI7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpYmVkID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25QZW5kaW5nID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25DYW5jZWxsZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIENoYW5uZWwucHJvdG90eXBlLmF1dGhvcml6ZSA9IGZ1bmN0aW9uIChzb2NrZXRJZCwgY2FsbGJhY2spIHtcblx0ICAgICAgICByZXR1cm4gY2FsbGJhY2soZmFsc2UsIHt9KTtcblx0ICAgIH07XG5cdCAgICBDaGFubmVsLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG5cdCAgICAgICAgaWYgKGV2ZW50LmluZGV4T2YoXCJjbGllbnQtXCIpICE9PSAwKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcnMuQmFkRXZlbnROYW1lKFwiRXZlbnQgJ1wiICsgZXZlbnQgKyBcIicgZG9lcyBub3Qgc3RhcnQgd2l0aCAnY2xpZW50LSdcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnB1c2hlci5zZW5kX2V2ZW50KGV2ZW50LCBkYXRhLCB0aGlzLm5hbWUpO1xuXHQgICAgfTtcblx0ICAgIENoYW5uZWwucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpYmVkID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25QZW5kaW5nID0gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcblx0ICAgICAgICBpZiAoZXZlbnQuaW5kZXhPZihcInB1c2hlcl9pbnRlcm5hbDpcIikgPT09IDApIHtcblx0ICAgICAgICAgICAgaWYgKGV2ZW50ID09PSBcInB1c2hlcl9pbnRlcm5hbDpzdWJzY3JpcHRpb25fc3VjY2VlZGVkXCIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGVuZGluZyA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkNhbmNlbGxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaGVyLnVuc3Vic2NyaWJlKHRoaXMubmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJwdXNoZXI6c3Vic2NyaXB0aW9uX3N1Y2NlZWRlZFwiLCBkYXRhKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KGV2ZW50LCBkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgQ2hhbm5lbC5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlZCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGVuZGluZyA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25DYW5jZWxsZWQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmF1dGhvcml6ZSh0aGlzLnB1c2hlci5jb25uZWN0aW9uLnNvY2tldF9pZCwgZnVuY3Rpb24gKGVycm9yLCBkYXRhKSB7XG5cdCAgICAgICAgICAgIGlmIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlRXZlbnQoJ3B1c2hlcjpzdWJzY3JpcHRpb25fZXJyb3InLCBkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnB1c2hlci5zZW5kX2V2ZW50KCdwdXNoZXI6c3Vic2NyaWJlJywge1xuXHQgICAgICAgICAgICAgICAgICAgIGF1dGg6IGRhdGEuYXV0aCxcblx0ICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2RhdGE6IGRhdGEuY2hhbm5lbF9kYXRhLFxuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IF90aGlzLm5hbWVcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgQ2hhbm5lbC5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpYmVkID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5wdXNoZXIuc2VuZF9ldmVudCgncHVzaGVyOnVuc3Vic2NyaWJlJywge1xuXHQgICAgICAgICAgICBjaGFubmVsOiB0aGlzLm5hbWVcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICBDaGFubmVsLnByb3RvdHlwZS5jYW5jZWxTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25DYW5jZWxsZWQgPSB0cnVlO1xuXHQgICAgfTtcblx0ICAgIENoYW5uZWwucHJvdG90eXBlLnJlaW5zdGF0ZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkNhbmNlbGxlZCA9IGZhbHNlO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBDaGFubmVsO1xuXHR9KGRpc3BhdGNoZXJfMVtcImRlZmF1bHRcIl0pKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBDaGFubmVsO1xuXG5cbi8qKiovIH0pLFxuLyogNTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIE1lbWJlcnMgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTWVtYmVycygpIHtcblx0ICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICB9XG5cdCAgICBNZW1iZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMubWVtYmVycywgaWQpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICBpZDogaWQsXG5cdCAgICAgICAgICAgICAgICBpbmZvOiB0aGlzLm1lbWJlcnNbaWRdXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgTWVtYmVycy5wcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgQ29sbGVjdGlvbnMub2JqZWN0QXBwbHkodGhpcy5tZW1iZXJzLCBmdW5jdGlvbiAobWVtYmVyLCBpZCkge1xuXHQgICAgICAgICAgICBjYWxsYmFjayhfdGhpcy5nZXQoaWQpKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICBNZW1iZXJzLnByb3RvdHlwZS5zZXRNeUlEID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgdGhpcy5teUlEID0gaWQ7XG5cdCAgICB9O1xuXHQgICAgTWVtYmVycy5wcm90b3R5cGUub25TdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uRGF0YSkge1xuXHQgICAgICAgIHRoaXMubWVtYmVycyA9IHN1YnNjcmlwdGlvbkRhdGEucHJlc2VuY2UuaGFzaDtcblx0ICAgICAgICB0aGlzLmNvdW50ID0gc3Vic2NyaXB0aW9uRGF0YS5wcmVzZW5jZS5jb3VudDtcblx0ICAgICAgICB0aGlzLm1lID0gdGhpcy5nZXQodGhpcy5teUlEKTtcblx0ICAgIH07XG5cdCAgICBNZW1iZXJzLnByb3RvdHlwZS5hZGRNZW1iZXIgPSBmdW5jdGlvbiAobWVtYmVyRGF0YSkge1xuXHQgICAgICAgIGlmICh0aGlzLmdldChtZW1iZXJEYXRhLnVzZXJfaWQpID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY291bnQrKztcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5tZW1iZXJzW21lbWJlckRhdGEudXNlcl9pZF0gPSBtZW1iZXJEYXRhLnVzZXJfaW5mbztcblx0ICAgICAgICByZXR1cm4gdGhpcy5nZXQobWVtYmVyRGF0YS51c2VyX2lkKTtcblx0ICAgIH07XG5cdCAgICBNZW1iZXJzLnByb3RvdHlwZS5yZW1vdmVNZW1iZXIgPSBmdW5jdGlvbiAobWVtYmVyRGF0YSkge1xuXHQgICAgICAgIHZhciBtZW1iZXIgPSB0aGlzLmdldChtZW1iZXJEYXRhLnVzZXJfaWQpO1xuXHQgICAgICAgIGlmIChtZW1iZXIpIHtcblx0ICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVtYmVyc1ttZW1iZXJEYXRhLnVzZXJfaWRdO1xuXHQgICAgICAgICAgICB0aGlzLmNvdW50LS07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBtZW1iZXI7XG5cdCAgICB9O1xuXHQgICAgTWVtYmVycy5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5tZW1iZXJzID0ge307XG5cdCAgICAgICAgdGhpcy5jb3VudCA9IDA7XG5cdCAgICAgICAgdGhpcy5teUlEID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1lID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gTWVtYmVycztcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBNZW1iZXJzO1xuXG5cbi8qKiovIH0pLFxuLyogNTQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuXHQgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG5cdCAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0fTtcblx0dmFyIGRpc3BhdGNoZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpO1xuXHR2YXIgdGltZXJzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblx0dmFyIGxvZ2dlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIHJ1bnRpbWVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBDb25uZWN0aW9uTWFuYWdlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG5cdCAgICBfX2V4dGVuZHMoQ29ubmVjdGlvbk1hbmFnZXIsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBDb25uZWN0aW9uTWFuYWdlcihrZXksIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgICAgICAgdGhpcy5zdGF0ZSA9IFwiaW5pdGlhbGl6ZWRcIjtcblx0ICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZW5jcnlwdGVkID0gISFvcHRpb25zLmVuY3J5cHRlZDtcblx0ICAgICAgICB0aGlzLnRpbWVsaW5lID0gdGhpcy5vcHRpb25zLnRpbWVsaW5lO1xuXHQgICAgICAgIHRoaXMuY29ubmVjdGlvbkNhbGxiYWNrcyA9IHRoaXMuYnVpbGRDb25uZWN0aW9uQ2FsbGJhY2tzKCk7XG5cdCAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrcyA9IHRoaXMuYnVpbGRFcnJvckNhbGxiYWNrcygpO1xuXHQgICAgICAgIHRoaXMuaGFuZHNoYWtlQ2FsbGJhY2tzID0gdGhpcy5idWlsZEhhbmRzaGFrZUNhbGxiYWNrcyh0aGlzLmVycm9yQ2FsbGJhY2tzKTtcblx0ICAgICAgICB2YXIgTmV0d29yayA9IHJ1bnRpbWVfMVtcImRlZmF1bHRcIl0uZ2V0TmV0d29yaygpO1xuXHQgICAgICAgIE5ldHdvcmsuYmluZChcIm9ubGluZVwiLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lLmluZm8oeyBuZXRpbmZvOiBcIm9ubGluZVwiIH0pO1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMuc3RhdGUgPT09IFwiY29ubmVjdGluZ1wiIHx8IF90aGlzLnN0YXRlID09PSBcInVuYXZhaWxhYmxlXCIpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnJldHJ5SW4oMCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgICBOZXR3b3JrLmJpbmQoXCJvZmZsaW5lXCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgX3RoaXMudGltZWxpbmUuaW5mbyh7IG5ldGluZm86IFwib2ZmbGluZVwiIH0pO1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbikge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuc2VuZEFjdGl2aXR5Q2hlY2soKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMudXBkYXRlU3RyYXRlZ3koKTtcblx0ICAgIH1cblx0ICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24gfHwgdGhpcy5ydW5uZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRoaXMuc3RyYXRlZ3kuaXNTdXBwb3J0ZWQoKSkge1xuXHQgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKFwiZmFpbGVkXCIpO1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMudXBkYXRlU3RhdGUoXCJjb25uZWN0aW5nXCIpO1xuXHQgICAgICAgIHRoaXMuc3RhcnRDb25uZWN0aW5nKCk7XG5cdCAgICAgICAgdGhpcy5zZXRVbmF2YWlsYWJsZVRpbWVyKCk7XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5zZW5kKGRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2VuZF9ldmVudCA9IGZ1bmN0aW9uIChuYW1lLCBkYXRhLCBjaGFubmVsKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnNlbmRfZXZlbnQobmFtZSwgZGF0YSwgY2hhbm5lbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIDtcblx0ICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuZGlzY29ubmVjdEludGVybmFsbHkoKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuXHQgICAgfTtcblx0ICAgIDtcblx0ICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5pc0VuY3J5cHRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0ZWQ7XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnN0YXJ0Q29ubmVjdGluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChlcnJvciwgaGFuZHNoYWtlKSB7XG5cdCAgICAgICAgICAgIGlmIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMucnVubmVyID0gX3RoaXMuc3RyYXRlZ3kuY29ubmVjdCgwLCBjYWxsYmFjayk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaGFuZHNoYWtlLmFjdGlvbiA9PT0gXCJlcnJvclwiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdChcImVycm9yXCIsIHsgdHlwZTogXCJIYW5kc2hha2VFcnJvclwiLCBlcnJvcjogaGFuZHNoYWtlLmVycm9yIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lLmVycm9yKHsgaGFuZHNoYWtlRXJyb3I6IGhhbmRzaGFrZS5lcnJvciB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLmFib3J0Q29ubmVjdGluZygpO1xuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLmhhbmRzaGFrZUNhbGxiYWNrc1toYW5kc2hha2UuYWN0aW9uXShoYW5kc2hha2UpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLnJ1bm5lciA9IHRoaXMuc3RyYXRlZ3kuY29ubmVjdCgwLCBjYWxsYmFjayk7XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmFib3J0Q29ubmVjdGluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5ydW5uZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5ydW5uZXIuYWJvcnQoKTtcblx0ICAgICAgICAgICAgdGhpcy5ydW5uZXIgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuZGlzY29ubmVjdEludGVybmFsbHkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5hYm9ydENvbm5lY3RpbmcoKTtcblx0ICAgICAgICB0aGlzLmNsZWFyUmV0cnlUaW1lcigpO1xuXHQgICAgICAgIHRoaXMuY2xlYXJVbmF2YWlsYWJsZVRpbWVyKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuXHQgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMuYWJhbmRvbkNvbm5lY3Rpb24oKTtcblx0ICAgICAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUudXBkYXRlU3RyYXRlZ3kgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdHJhdGVneSA9IHRoaXMub3B0aW9ucy5nZXRTdHJhdGVneSh7XG5cdCAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG5cdCAgICAgICAgICAgIHRpbWVsaW5lOiB0aGlzLnRpbWVsaW5lLFxuXHQgICAgICAgICAgICBlbmNyeXB0ZWQ6IHRoaXMuZW5jcnlwdGVkXG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnJldHJ5SW4gPSBmdW5jdGlvbiAoZGVsYXkpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHRoaXMudGltZWxpbmUuaW5mbyh7IGFjdGlvbjogXCJyZXRyeVwiLCBkZWxheTogZGVsYXkgfSk7XG5cdCAgICAgICAgaWYgKGRlbGF5ID4gMCkge1xuXHQgICAgICAgICAgICB0aGlzLmVtaXQoXCJjb25uZWN0aW5nX2luXCIsIE1hdGgucm91bmQoZGVsYXkgLyAxMDAwKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMucmV0cnlUaW1lciA9IG5ldyB0aW1lcnNfMS5PbmVPZmZUaW1lcihkZWxheSB8fCAwLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLmRpc2Nvbm5lY3RJbnRlcm5hbGx5KCk7XG5cdCAgICAgICAgICAgIF90aGlzLmNvbm5lY3QoKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuY2xlYXJSZXRyeVRpbWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLnJldHJ5VGltZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcblx0ICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnNldFVuYXZhaWxhYmxlVGltZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICB0aGlzLnVuYXZhaWxhYmxlVGltZXIgPSBuZXcgdGltZXJzXzEuT25lT2ZmVGltZXIodGhpcy5vcHRpb25zLnVuYXZhaWxhYmxlVGltZW91dCwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBfdGhpcy51cGRhdGVTdGF0ZShcInVuYXZhaWxhYmxlXCIpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIDtcblx0ICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5jbGVhclVuYXZhaWxhYmxlVGltZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudW5hdmFpbGFibGVUaW1lcikge1xuXHQgICAgICAgICAgICB0aGlzLnVuYXZhaWxhYmxlVGltZXIuZW5zdXJlQWJvcnRlZCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2VuZEFjdGl2aXR5Q2hlY2sgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICB0aGlzLnN0b3BBY3Rpdml0eUNoZWNrKCk7XG5cdCAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBpbmcoKTtcblx0ICAgICAgICB0aGlzLmFjdGl2aXR5VGltZXIgPSBuZXcgdGltZXJzXzEuT25lT2ZmVGltZXIodGhpcy5vcHRpb25zLnBvbmdUaW1lb3V0LCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lLmVycm9yKHsgcG9uZ190aW1lZF9vdXQ6IF90aGlzLm9wdGlvbnMucG9uZ1RpbWVvdXQgfSk7XG5cdCAgICAgICAgICAgIF90aGlzLnJldHJ5SW4oMCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWN0aXZpdHlDaGVjayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHRoaXMuc3RvcEFjdGl2aXR5Q2hlY2soKTtcblx0ICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uICYmICF0aGlzLmNvbm5lY3Rpb24uaGFuZGxlc0FjdGl2aXR5Q2hlY2tzKCkpIHtcblx0ICAgICAgICAgICAgdGhpcy5hY3Rpdml0eVRpbWVyID0gbmV3IHRpbWVyc18xLk9uZU9mZlRpbWVyKHRoaXMuYWN0aXZpdHlUaW1lb3V0LCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5zZW5kQWN0aXZpdHlDaGVjaygpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnN0b3BBY3Rpdml0eUNoZWNrID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmFjdGl2aXR5VGltZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5hY3Rpdml0eVRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmJ1aWxkQ29ubmVjdGlvbkNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5yZXNldEFjdGl2aXR5Q2hlY2soKTtcblx0ICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcGluZzogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuc2VuZF9ldmVudCgncHVzaGVyOnBvbmcnLCB7fSk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGFjdGl2aXR5OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5yZXNldEFjdGl2aXR5Q2hlY2soKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuZW1pdChcImVycm9yXCIsIHsgdHlwZTogXCJXZWJTb2NrZXRFcnJvclwiLCBlcnJvcjogZXJyb3IgfSk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNsb3NlZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuYWJhbmRvbkNvbm5lY3Rpb24oKTtcblx0ICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zaG91bGRSZXRyeSgpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgX3RoaXMucmV0cnlJbigxMDAwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmJ1aWxkSGFuZHNoYWtlQ2FsbGJhY2tzID0gZnVuY3Rpb24gKGVycm9yQ2FsbGJhY2tzKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZXh0ZW5kKHt9LCBlcnJvckNhbGxiYWNrcywge1xuXHQgICAgICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uIChoYW5kc2hha2UpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLmFjdGl2aXR5VGltZW91dCA9IE1hdGgubWluKF90aGlzLm9wdGlvbnMuYWN0aXZpdHlUaW1lb3V0LCBoYW5kc2hha2UuYWN0aXZpdHlUaW1lb3V0LCBoYW5kc2hha2UuY29ubmVjdGlvbi5hY3Rpdml0eVRpbWVvdXQgfHwgSW5maW5pdHkpO1xuXHQgICAgICAgICAgICAgICAgX3RoaXMuY2xlYXJVbmF2YWlsYWJsZVRpbWVyKCk7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5zZXRDb25uZWN0aW9uKGhhbmRzaGFrZS5jb25uZWN0aW9uKTtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnNvY2tldF9pZCA9IF90aGlzLmNvbm5lY3Rpb24uaWQ7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVTdGF0ZShcImNvbm5lY3RlZFwiLCB7IHNvY2tldF9pZDogX3RoaXMuc29ja2V0X2lkIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgO1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmJ1aWxkRXJyb3JDYWxsYmFja3MgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICB2YXIgd2l0aEVycm9yRW1pdHRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3VsdCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoXCJlcnJvclwiLCB7IHR5cGU6IFwiV2ViU29ja2V0RXJyb3JcIiwgZXJyb3I6IHJlc3VsdC5lcnJvciB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBzc2xfb25seTogd2l0aEVycm9yRW1pdHRlZChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5lbmNyeXB0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlU3RyYXRlZ3koKTtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnJldHJ5SW4oMCk7XG5cdCAgICAgICAgICAgIH0pLFxuXHQgICAgICAgICAgICByZWZ1c2VkOiB3aXRoRXJyb3JFbWl0dGVkKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgfSksXG5cdCAgICAgICAgICAgIGJhY2tvZmY6IHdpdGhFcnJvckVtaXR0ZWQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgX3RoaXMucmV0cnlJbigxMDAwKTtcblx0ICAgICAgICAgICAgfSksXG5cdCAgICAgICAgICAgIHJldHJ5OiB3aXRoRXJyb3JFbWl0dGVkKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLnJldHJ5SW4oMCk7XG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICA7XG5cdCAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2V0Q29ubmVjdGlvbiA9IGZ1bmN0aW9uIChjb25uZWN0aW9uKSB7XG5cdCAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblx0ICAgICAgICBmb3IgKHZhciBldmVudCBpbiB0aGlzLmNvbm5lY3Rpb25DYWxsYmFja3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmJpbmQoZXZlbnQsIHRoaXMuY29ubmVjdGlvbkNhbGxiYWNrc1tldmVudF0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnJlc2V0QWN0aXZpdHlDaGVjaygpO1xuXHQgICAgfTtcblx0ICAgIDtcblx0ICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5hYmFuZG9uQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc3RvcEFjdGl2aXR5Q2hlY2soKTtcblx0ICAgICAgICBmb3IgKHZhciBldmVudCBpbiB0aGlzLmNvbm5lY3Rpb25DYWxsYmFja3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnVuYmluZChldmVudCwgdGhpcy5jb25uZWN0aW9uQ2FsbGJhY2tzW2V2ZW50XSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uO1xuXHQgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG5cdCAgICB9O1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZVN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlLCBkYXRhKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzU3RhdGUgPSB0aGlzLnN0YXRlO1xuXHQgICAgICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcblx0ICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gbmV3U3RhdGUpIHtcblx0ICAgICAgICAgICAgdmFyIG5ld1N0YXRlRGVzY3JpcHRpb24gPSBuZXdTdGF0ZTtcblx0ICAgICAgICAgICAgaWYgKG5ld1N0YXRlRGVzY3JpcHRpb24gPT09IFwiY29ubmVjdGVkXCIpIHtcblx0ICAgICAgICAgICAgICAgIG5ld1N0YXRlRGVzY3JpcHRpb24gKz0gXCIgd2l0aCBuZXcgc29ja2V0IElEIFwiICsgZGF0YS5zb2NrZXRfaWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbG9nZ2VyXzFbXCJkZWZhdWx0XCJdLmRlYnVnKCdTdGF0ZSBjaGFuZ2VkJywgcHJldmlvdXNTdGF0ZSArICcgLT4gJyArIG5ld1N0YXRlRGVzY3JpcHRpb24pO1xuXHQgICAgICAgICAgICB0aGlzLnRpbWVsaW5lLmluZm8oeyBzdGF0ZTogbmV3U3RhdGUsIHBhcmFtczogZGF0YSB9KTtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZV9jaGFuZ2UnLCB7IHByZXZpb3VzOiBwcmV2aW91c1N0YXRlLCBjdXJyZW50OiBuZXdTdGF0ZSB9KTtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KG5ld1N0YXRlLCBkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnNob3VsZFJldHJ5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBcImNvbm5lY3RpbmdcIiB8fCB0aGlzLnN0YXRlID09PSBcImNvbm5lY3RlZFwiO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBDb25uZWN0aW9uTWFuYWdlcjtcblx0fShkaXNwYXRjaGVyXzFbXCJkZWZhdWx0XCJdKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQ29ubmVjdGlvbk1hbmFnZXI7XG5cblxuLyoqKi8gfSksXG4vKiA1NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgQ29sbGVjdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgZmFjdG9yeV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Myk7XG5cdHZhciBDaGFubmVscyA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDaGFubmVscygpIHtcblx0ICAgICAgICB0aGlzLmNoYW5uZWxzID0ge307XG5cdCAgICB9XG5cdCAgICBDaGFubmVscy5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5hbWUsIHB1c2hlcikge1xuXHQgICAgICAgIGlmICghdGhpcy5jaGFubmVsc1tuYW1lXSkge1xuXHQgICAgICAgICAgICB0aGlzLmNoYW5uZWxzW25hbWVdID0gY3JlYXRlQ2hhbm5lbChuYW1lLCBwdXNoZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tuYW1lXTtcblx0ICAgIH07XG5cdCAgICBDaGFubmVscy5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy52YWx1ZXModGhpcy5jaGFubmVscyk7XG5cdCAgICB9O1xuXHQgICAgQ2hhbm5lbHMucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzW25hbWVdO1xuXHQgICAgfTtcblx0ICAgIENoYW5uZWxzLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgICAgIHZhciBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tuYW1lXTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5jaGFubmVsc1tuYW1lXTtcblx0ICAgICAgICByZXR1cm4gY2hhbm5lbDtcblx0ICAgIH07XG5cdCAgICBDaGFubmVscy5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBDb2xsZWN0aW9ucy5vYmplY3RBcHBseSh0aGlzLmNoYW5uZWxzLCBmdW5jdGlvbiAoY2hhbm5lbCkge1xuXHQgICAgICAgICAgICBjaGFubmVsLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gQ2hhbm5lbHM7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQ2hhbm5lbHM7XG5cdGZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWwobmFtZSwgcHVzaGVyKSB7XG5cdCAgICBpZiAobmFtZS5pbmRleE9mKCdwcml2YXRlLScpID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhY3RvcnlfMVtcImRlZmF1bHRcIl0uY3JlYXRlUHJpdmF0ZUNoYW5uZWwobmFtZSwgcHVzaGVyKTtcblx0ICAgIH1cblx0ICAgIGVsc2UgaWYgKG5hbWUuaW5kZXhPZigncHJlc2VuY2UtJykgPT09IDApIHtcblx0ICAgICAgICByZXR1cm4gZmFjdG9yeV8xW1wiZGVmYXVsdFwiXS5jcmVhdGVQcmVzZW5jZUNoYW5uZWwobmFtZSwgcHVzaGVyKTtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBmYWN0b3J5XzFbXCJkZWZhdWx0XCJdLmNyZWF0ZUNoYW5uZWwobmFtZSwgcHVzaGVyKTtcblx0ICAgIH1cblx0fVxuXG5cbi8qKiovIH0pLFxuLyogNTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIGZhY3RvcnlfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpO1xuXHR2YXIgdXRpbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBFcnJvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIFRyYW5zcG9ydFN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRyYW5zcG9ydFN0cmF0ZWd5KG5hbWUsIHByaW9yaXR5LCB0cmFuc3BvcnQsIG9wdGlvbnMpIHtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTtcblx0ICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDtcblx0ICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgICAgfVxuXHQgICAgVHJhbnNwb3J0U3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5pc1N1cHBvcnRlZCh7XG5cdCAgICAgICAgICAgIGVuY3J5cHRlZDogdGhpcy5vcHRpb25zLmVuY3J5cHRlZFxuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIFRyYW5zcG9ydFN0cmF0ZWd5LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG1pblByaW9yaXR5LCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdCAgICAgICAgaWYgKCF0aGlzLmlzU3VwcG9ydGVkKCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWxBdHRlbXB0KG5ldyBFcnJvcnMuVW5zdXBwb3J0ZWRTdHJhdGVneSgpLCBjYWxsYmFjayk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMucHJpb3JpdHkgPCBtaW5Qcmlvcml0eSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbEF0dGVtcHQobmV3IEVycm9ycy5UcmFuc3BvcnRQcmlvcml0eVRvb0xvdygpLCBjYWxsYmFjayk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjb25uZWN0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgdHJhbnNwb3J0ID0gdGhpcy50cmFuc3BvcnQuY3JlYXRlQ29ubmVjdGlvbih0aGlzLm5hbWUsIHRoaXMucHJpb3JpdHksIHRoaXMub3B0aW9ucy5rZXksIHRoaXMub3B0aW9ucyk7XG5cdCAgICAgICAgdmFyIGhhbmRzaGFrZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIG9uSW5pdGlhbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRyYW5zcG9ydC51bmJpbmQoXCJpbml0aWFsaXplZFwiLCBvbkluaXRpYWxpemVkKTtcblx0ICAgICAgICAgICAgdHJhbnNwb3J0LmNvbm5lY3QoKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHZhciBvbk9wZW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGhhbmRzaGFrZSA9IGZhY3RvcnlfMVtcImRlZmF1bHRcIl0uY3JlYXRlSGFuZHNoYWtlKHRyYW5zcG9ydCwgZnVuY3Rpb24gKHJlc3VsdCkge1xuXHQgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHVuYmluZExpc3RlbmVycygpO1xuXHQgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB2YXIgb25FcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgICAgICB1bmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgdmFyIG9uQ2xvc2VkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB1bmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRUcmFuc3BvcnQ7XG5cdCAgICAgICAgICAgIHNlcmlhbGl6ZWRUcmFuc3BvcnQgPSBDb2xsZWN0aW9ucy5zYWZlSlNPTlN0cmluZ2lmeSh0cmFuc3BvcnQpO1xuXHQgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3JzLlRyYW5zcG9ydENsb3NlZChzZXJpYWxpemVkVHJhbnNwb3J0KSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB2YXIgdW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0cmFuc3BvcnQudW5iaW5kKFwiaW5pdGlhbGl6ZWRcIiwgb25Jbml0aWFsaXplZCk7XG5cdCAgICAgICAgICAgIHRyYW5zcG9ydC51bmJpbmQoXCJvcGVuXCIsIG9uT3Blbik7XG5cdCAgICAgICAgICAgIHRyYW5zcG9ydC51bmJpbmQoXCJlcnJvclwiLCBvbkVycm9yKTtcblx0ICAgICAgICAgICAgdHJhbnNwb3J0LnVuYmluZChcImNsb3NlZFwiLCBvbkNsb3NlZCk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0cmFuc3BvcnQuYmluZChcImluaXRpYWxpemVkXCIsIG9uSW5pdGlhbGl6ZWQpO1xuXHQgICAgICAgIHRyYW5zcG9ydC5iaW5kKFwib3BlblwiLCBvbk9wZW4pO1xuXHQgICAgICAgIHRyYW5zcG9ydC5iaW5kKFwiZXJyb3JcIiwgb25FcnJvcik7XG5cdCAgICAgICAgdHJhbnNwb3J0LmJpbmQoXCJjbG9zZWRcIiwgb25DbG9zZWQpO1xuXHQgICAgICAgIHRyYW5zcG9ydC5pbml0aWFsaXplKCk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB1bmJpbmRMaXN0ZW5lcnMoKTtcblx0ICAgICAgICAgICAgICAgIGlmIChoYW5kc2hha2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UuY2xvc2UoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBmb3JjZU1pblByaW9yaXR5OiBmdW5jdGlvbiAocCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcmlvcml0eSA8IHApIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZHNoYWtlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5jbG9zZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVHJhbnNwb3J0U3RyYXRlZ3k7XG5cdH0oKSk7XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVHJhbnNwb3J0U3RyYXRlZ3k7XG5cdGZ1bmN0aW9uIGZhaWxBdHRlbXB0KGVycm9yLCBjYWxsYmFjaykge1xuXHQgICAgdXRpbF8xW1wiZGVmYXVsdFwiXS5kZWZlcihmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuXHQgICAgfSk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7IH0sXG5cdCAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKCkgeyB9XG5cdCAgICB9O1xuXHR9XG5cblxuLyoqKi8gfSksXG4vKiA1NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgQ29sbGVjdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgdXRpbF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciB0aW1lcnNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHR2YXIgU2VxdWVudGlhbFN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNlcXVlbnRpYWxTdHJhdGVneShzdHJhdGVnaWVzLCBvcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy5zdHJhdGVnaWVzID0gc3RyYXRlZ2llcztcblx0ICAgICAgICB0aGlzLmxvb3AgPSBCb29sZWFuKG9wdGlvbnMubG9vcCk7XG5cdCAgICAgICAgdGhpcy5mYWlsRmFzdCA9IEJvb2xlYW4ob3B0aW9ucy5mYWlsRmFzdCk7XG5cdCAgICAgICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0O1xuXHQgICAgICAgIHRoaXMudGltZW91dExpbWl0ID0gb3B0aW9ucy50aW1lb3V0TGltaXQ7XG5cdCAgICB9XG5cdCAgICBTZXF1ZW50aWFsU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5hbnkodGhpcy5zdHJhdGVnaWVzLCB1dGlsXzFbXCJkZWZhdWx0XCJdLm1ldGhvZChcImlzU3VwcG9ydGVkXCIpKTtcblx0ICAgIH07XG5cdCAgICBTZXF1ZW50aWFsU3RyYXRlZ3kucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAobWluUHJpb3JpdHksIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0ICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHRoaXMuc3RyYXRlZ2llcztcblx0ICAgICAgICB2YXIgY3VycmVudCA9IDA7XG5cdCAgICAgICAgdmFyIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQ7XG5cdCAgICAgICAgdmFyIHJ1bm5lciA9IG51bGw7XG5cdCAgICAgICAgdmFyIHRyeU5leHRTdHJhdGVneSA9IGZ1bmN0aW9uIChlcnJvciwgaGFuZHNoYWtlKSB7XG5cdCAgICAgICAgICAgIGlmIChoYW5kc2hha2UpIHtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGhhbmRzaGFrZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudCArIDE7XG5cdCAgICAgICAgICAgICAgICBpZiAoX3RoaXMubG9vcCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50ICUgc3RyYXRlZ2llcy5sZW5ndGg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA8IHN0cmF0ZWdpZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgKiAyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMudGltZW91dExpbWl0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gTWF0aC5taW4odGltZW91dCwgX3RoaXMudGltZW91dExpbWl0KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBydW5uZXIgPSBfdGhpcy50cnlTdHJhdGVneShzdHJhdGVnaWVzW2N1cnJlbnRdLCBtaW5Qcmlvcml0eSwgeyB0aW1lb3V0OiB0aW1lb3V0LCBmYWlsRmFzdDogX3RoaXMuZmFpbEZhc3QgfSwgdHJ5TmV4dFN0cmF0ZWd5KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBydW5uZXIgPSB0aGlzLnRyeVN0cmF0ZWd5KHN0cmF0ZWdpZXNbY3VycmVudF0sIG1pblByaW9yaXR5LCB7IHRpbWVvdXQ6IHRpbWVvdXQsIGZhaWxGYXN0OiB0aGlzLmZhaWxGYXN0IH0sIHRyeU5leHRTdHJhdGVneSk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJ1bm5lci5hYm9ydCgpO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBmb3JjZU1pblByaW9yaXR5OiBmdW5jdGlvbiAocCkge1xuXHQgICAgICAgICAgICAgICAgbWluUHJpb3JpdHkgPSBwO1xuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bm5lcikge1xuXHQgICAgICAgICAgICAgICAgICAgIHJ1bm5lci5mb3JjZU1pblByaW9yaXR5KHApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBTZXF1ZW50aWFsU3RyYXRlZ3kucHJvdG90eXBlLnRyeVN0cmF0ZWd5ID0gZnVuY3Rpb24gKHN0cmF0ZWd5LCBtaW5Qcmlvcml0eSwgb3B0aW9ucywgY2FsbGJhY2spIHtcblx0ICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuXHQgICAgICAgIHZhciBydW5uZXIgPSBudWxsO1xuXHQgICAgICAgIGlmIChvcHRpb25zLnRpbWVvdXQgPiAwKSB7XG5cdCAgICAgICAgICAgIHRpbWVyID0gbmV3IHRpbWVyc18xLk9uZU9mZlRpbWVyKG9wdGlvbnMudGltZW91dCwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcnVubmVyLmFib3J0KCk7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJ1bm5lciA9IHN0cmF0ZWd5LmNvbm5lY3QobWluUHJpb3JpdHksIGZ1bmN0aW9uIChlcnJvciwgaGFuZHNoYWtlKSB7XG5cdCAgICAgICAgICAgIGlmIChlcnJvciAmJiB0aW1lciAmJiB0aW1lci5pc1J1bm5pbmcoKSAmJiAhb3B0aW9ucy5mYWlsRmFzdCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0aW1lcikge1xuXHQgICAgICAgICAgICAgICAgdGltZXIuZW5zdXJlQWJvcnRlZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCBoYW5kc2hha2UpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGltZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aW1lci5lbnN1cmVBYm9ydGVkKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBydW5uZXIuYWJvcnQoKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKHApIHtcblx0ICAgICAgICAgICAgICAgIHJ1bm5lci5mb3JjZU1pblByaW9yaXR5KHApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gU2VxdWVudGlhbFN0cmF0ZWd5O1xuXHR9KCkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IFNlcXVlbnRpYWxTdHJhdGVneTtcblxuXG4vKioqLyB9KSxcbi8qIDU4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciBDb2xsZWN0aW9ucyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciB1dGlsXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblx0dmFyIEJlc3RDb25uZWN0ZWRFdmVyU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQmVzdENvbm5lY3RlZEV2ZXJTdHJhdGVneShzdHJhdGVnaWVzKSB7XG5cdCAgICAgICAgdGhpcy5zdHJhdGVnaWVzID0gc3RyYXRlZ2llcztcblx0ICAgIH1cblx0ICAgIEJlc3RDb25uZWN0ZWRFdmVyU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5hbnkodGhpcy5zdHJhdGVnaWVzLCB1dGlsXzFbXCJkZWZhdWx0XCJdLm1ldGhvZChcImlzU3VwcG9ydGVkXCIpKTtcblx0ICAgIH07XG5cdCAgICBCZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG1pblByaW9yaXR5LCBjYWxsYmFjaykge1xuXHQgICAgICAgIHJldHVybiBjb25uZWN0KHRoaXMuc3RyYXRlZ2llcywgbWluUHJpb3JpdHksIGZ1bmN0aW9uIChpLCBydW5uZXJzKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyb3IsIGhhbmRzaGFrZSkge1xuXHQgICAgICAgICAgICAgICAgcnVubmVyc1tpXS5lcnJvciA9IGVycm9yO1xuXHQgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJ1bm5lcnNGYWlsZWQocnVubmVycykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmFwcGx5KHJ1bm5lcnMsIGZ1bmN0aW9uIChydW5uZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBydW5uZXIuZm9yY2VNaW5Qcmlvcml0eShoYW5kc2hha2UudHJhbnNwb3J0LnByaW9yaXR5KTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaGFuZHNoYWtlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gQmVzdENvbm5lY3RlZEV2ZXJTdHJhdGVneTtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBCZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5O1xuXHRmdW5jdGlvbiBjb25uZWN0KHN0cmF0ZWdpZXMsIG1pblByaW9yaXR5LCBjYWxsYmFja0J1aWxkZXIpIHtcblx0ICAgIHZhciBydW5uZXJzID0gQ29sbGVjdGlvbnMubWFwKHN0cmF0ZWdpZXMsIGZ1bmN0aW9uIChzdHJhdGVneSwgaSwgXywgcnMpIHtcblx0ICAgICAgICByZXR1cm4gc3RyYXRlZ3kuY29ubmVjdChtaW5Qcmlvcml0eSwgY2FsbGJhY2tCdWlsZGVyKGksIHJzKSk7XG5cdCAgICB9KTtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgQ29sbGVjdGlvbnMuYXBwbHkocnVubmVycywgYWJvcnRSdW5uZXIpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKHApIHtcblx0ICAgICAgICAgICAgQ29sbGVjdGlvbnMuYXBwbHkocnVubmVycywgZnVuY3Rpb24gKHJ1bm5lcikge1xuXHQgICAgICAgICAgICAgICAgcnVubmVyLmZvcmNlTWluUHJpb3JpdHkocCk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdH1cblx0ZnVuY3Rpb24gYWxsUnVubmVyc0ZhaWxlZChydW5uZXJzKSB7XG5cdCAgICByZXR1cm4gQ29sbGVjdGlvbnMuYWxsKHJ1bm5lcnMsIGZ1bmN0aW9uIChydW5uZXIpIHtcblx0ICAgICAgICByZXR1cm4gQm9vbGVhbihydW5uZXIuZXJyb3IpO1xuXHQgICAgfSk7XG5cdH1cblx0ZnVuY3Rpb24gYWJvcnRSdW5uZXIocnVubmVyKSB7XG5cdCAgICBpZiAoIXJ1bm5lci5lcnJvciAmJiAhcnVubmVyLmFib3J0ZWQpIHtcblx0ICAgICAgICBydW5uZXIuYWJvcnQoKTtcblx0ICAgICAgICBydW5uZXIuYWJvcnRlZCA9IHRydWU7XG5cdCAgICB9XG5cdH1cblxuXG4vKioqLyB9KSxcbi8qIDU5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciB1dGlsXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblx0dmFyIHJ1bnRpbWVfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBzZXF1ZW50aWFsX3N0cmF0ZWd5XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KTtcblx0dmFyIENvbGxlY3Rpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIENhY2hlZFN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENhY2hlZFN0cmF0ZWd5KHN0cmF0ZWd5LCB0cmFuc3BvcnRzLCBvcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuXHQgICAgICAgIHRoaXMudHJhbnNwb3J0cyA9IHRyYW5zcG9ydHM7XG5cdCAgICAgICAgdGhpcy50dGwgPSBvcHRpb25zLnR0bCB8fCAxODAwICogMTAwMDtcblx0ICAgICAgICB0aGlzLmVuY3J5cHRlZCA9IG9wdGlvbnMuZW5jcnlwdGVkO1xuXHQgICAgICAgIHRoaXMudGltZWxpbmUgPSBvcHRpb25zLnRpbWVsaW5lO1xuXHQgICAgfVxuXHQgICAgQ2FjaGVkU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnN0cmF0ZWd5LmlzU3VwcG9ydGVkKCk7XG5cdCAgICB9O1xuXHQgICAgQ2FjaGVkU3RyYXRlZ3kucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAobWluUHJpb3JpdHksIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIGVuY3J5cHRlZCA9IHRoaXMuZW5jcnlwdGVkO1xuXHQgICAgICAgIHZhciBpbmZvID0gZmV0Y2hUcmFuc3BvcnRDYWNoZShlbmNyeXB0ZWQpO1xuXHQgICAgICAgIHZhciBzdHJhdGVnaWVzID0gW3RoaXMuc3RyYXRlZ3ldO1xuXHQgICAgICAgIGlmIChpbmZvICYmIGluZm8udGltZXN0YW1wICsgdGhpcy50dGwgPj0gdXRpbF8xW1wiZGVmYXVsdFwiXS5ub3coKSkge1xuXHQgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gdGhpcy50cmFuc3BvcnRzW2luZm8udHJhbnNwb3J0XTtcblx0ICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aW1lbGluZS5pbmZvKHtcblx0ICAgICAgICAgICAgICAgICAgICBjYWNoZWQ6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0OiBpbmZvLnRyYW5zcG9ydCxcblx0ICAgICAgICAgICAgICAgICAgICBsYXRlbmN5OiBpbmZvLmxhdGVuY3lcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgc3RyYXRlZ2llcy5wdXNoKG5ldyBzZXF1ZW50aWFsX3N0cmF0ZWd5XzFbXCJkZWZhdWx0XCJdKFt0cmFuc3BvcnRdLCB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGltZW91dDogaW5mby5sYXRlbmN5ICogMiArIDEwMDAsXG5cdCAgICAgICAgICAgICAgICAgICAgZmFpbEZhc3Q6IHRydWVcblx0ICAgICAgICAgICAgICAgIH0pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgc3RhcnRUaW1lc3RhbXAgPSB1dGlsXzFbXCJkZWZhdWx0XCJdLm5vdygpO1xuXHQgICAgICAgIHZhciBydW5uZXIgPSBzdHJhdGVnaWVzLnBvcCgpLmNvbm5lY3QobWluUHJpb3JpdHksIGZ1bmN0aW9uIGNiKGVycm9yLCBoYW5kc2hha2UpIHtcblx0ICAgICAgICAgICAgaWYgKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICBmbHVzaFRyYW5zcG9ydENhY2hlKGVuY3J5cHRlZCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RyYXRlZ2llcy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXAgPSB1dGlsXzFbXCJkZWZhdWx0XCJdLm5vdygpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJ1bm5lciA9IHN0cmF0ZWdpZXMucG9wKCkuY29ubmVjdChtaW5Qcmlvcml0eSwgY2IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgc3RvcmVUcmFuc3BvcnRDYWNoZShlbmNyeXB0ZWQsIGhhbmRzaGFrZS50cmFuc3BvcnQubmFtZSwgdXRpbF8xW1wiZGVmYXVsdFwiXS5ub3coKSAtIHN0YXJ0VGltZXN0YW1wKTtcblx0ICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGhhbmRzaGFrZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcnVubmVyLmFib3J0KCk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGZvcmNlTWluUHJpb3JpdHk6IGZ1bmN0aW9uIChwKSB7XG5cdCAgICAgICAgICAgICAgICBtaW5Qcmlvcml0eSA9IHA7XG5cdCAgICAgICAgICAgICAgICBpZiAocnVubmVyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcnVubmVyLmZvcmNlTWluUHJpb3JpdHkocCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBDYWNoZWRTdHJhdGVneTtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBDYWNoZWRTdHJhdGVneTtcblx0ZnVuY3Rpb24gZ2V0VHJhbnNwb3J0Q2FjaGVLZXkoZW5jcnlwdGVkKSB7XG5cdCAgICByZXR1cm4gXCJwdXNoZXJUcmFuc3BvcnRcIiArIChlbmNyeXB0ZWQgPyBcIkVuY3J5cHRlZFwiIDogXCJVbmVuY3J5cHRlZFwiKTtcblx0fVxuXHRmdW5jdGlvbiBmZXRjaFRyYW5zcG9ydENhY2hlKGVuY3J5cHRlZCkge1xuXHQgICAgdmFyIHN0b3JhZ2UgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLmdldExvY2FsU3RvcmFnZSgpO1xuXHQgICAgaWYgKHN0b3JhZ2UpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICB2YXIgc2VyaWFsaXplZENhY2hlID0gc3RvcmFnZVtnZXRUcmFuc3BvcnRDYWNoZUtleShlbmNyeXB0ZWQpXTtcblx0ICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZWRDYWNoZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VyaWFsaXplZENhY2hlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICBmbHVzaFRyYW5zcG9ydENhY2hlKGVuY3J5cHRlZCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIG51bGw7XG5cdH1cblx0ZnVuY3Rpb24gc3RvcmVUcmFuc3BvcnRDYWNoZShlbmNyeXB0ZWQsIHRyYW5zcG9ydCwgbGF0ZW5jeSkge1xuXHQgICAgdmFyIHN0b3JhZ2UgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLmdldExvY2FsU3RvcmFnZSgpO1xuXHQgICAgaWYgKHN0b3JhZ2UpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBzdG9yYWdlW2dldFRyYW5zcG9ydENhY2hlS2V5KGVuY3J5cHRlZCldID0gQ29sbGVjdGlvbnMuc2FmZUpTT05TdHJpbmdpZnkoe1xuXHQgICAgICAgICAgICAgICAgdGltZXN0YW1wOiB1dGlsXzFbXCJkZWZhdWx0XCJdLm5vdygpLFxuXHQgICAgICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsXG5cdCAgICAgICAgICAgICAgICBsYXRlbmN5OiBsYXRlbmN5XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZSkge1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBmbHVzaFRyYW5zcG9ydENhY2hlKGVuY3J5cHRlZCkge1xuXHQgICAgdmFyIHN0b3JhZ2UgPSBydW50aW1lXzFbXCJkZWZhdWx0XCJdLmdldExvY2FsU3RvcmFnZSgpO1xuXHQgICAgaWYgKHN0b3JhZ2UpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBkZWxldGUgc3RvcmFnZVtnZXRUcmFuc3BvcnRDYWNoZUtleShlbmNyeXB0ZWQpXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2F0Y2ggKGUpIHtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdH1cblxuXG4vKioqLyB9KSxcbi8qIDYwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdHZhciB0aW1lcnNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHR2YXIgRGVsYXllZFN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIERlbGF5ZWRTdHJhdGVneShzdHJhdGVneSwgX2EpIHtcblx0ICAgICAgICB2YXIgbnVtYmVyID0gX2EuZGVsYXk7XG5cdCAgICAgICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IHsgZGVsYXk6IG51bWJlciB9O1xuXHQgICAgfVxuXHQgICAgRGVsYXllZFN0cmF0ZWd5LnByb3RvdHlwZS5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5zdHJhdGVneS5pc1N1cHBvcnRlZCgpO1xuXHQgICAgfTtcblx0ICAgIERlbGF5ZWRTdHJhdGVneS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uIChtaW5Qcmlvcml0eSwgY2FsbGJhY2spIHtcblx0ICAgICAgICB2YXIgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5O1xuXHQgICAgICAgIHZhciBydW5uZXI7XG5cdCAgICAgICAgdmFyIHRpbWVyID0gbmV3IHRpbWVyc18xLk9uZU9mZlRpbWVyKHRoaXMub3B0aW9ucy5kZWxheSwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBydW5uZXIgPSBzdHJhdGVneS5jb25uZWN0KG1pblByaW9yaXR5LCBjYWxsYmFjayk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcblx0ICAgICAgICAgICAgICAgIGlmIChydW5uZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBydW5uZXIuYWJvcnQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKHApIHtcblx0ICAgICAgICAgICAgICAgIG1pblByaW9yaXR5ID0gcDtcblx0ICAgICAgICAgICAgICAgIGlmIChydW5uZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBydW5uZXIuZm9yY2VNaW5Qcmlvcml0eShwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIERlbGF5ZWRTdHJhdGVneTtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEZWxheWVkU3RyYXRlZ3k7XG5cblxuLyoqKi8gfSksXG4vKiA2MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgSWZTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJZlN0cmF0ZWd5KHRlc3QsIHRydWVCcmFuY2gsIGZhbHNlQnJhbmNoKSB7XG5cdCAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcblx0ICAgICAgICB0aGlzLnRydWVCcmFuY2ggPSB0cnVlQnJhbmNoO1xuXHQgICAgICAgIHRoaXMuZmFsc2VCcmFuY2ggPSBmYWxzZUJyYW5jaDtcblx0ICAgIH1cblx0ICAgIElmU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBicmFuY2ggPSB0aGlzLnRlc3QoKSA/IHRoaXMudHJ1ZUJyYW5jaCA6IHRoaXMuZmFsc2VCcmFuY2g7XG5cdCAgICAgICAgcmV0dXJuIGJyYW5jaC5pc1N1cHBvcnRlZCgpO1xuXHQgICAgfTtcblx0ICAgIElmU3RyYXRlZ3kucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAobWluUHJpb3JpdHksIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIGJyYW5jaCA9IHRoaXMudGVzdCgpID8gdGhpcy50cnVlQnJhbmNoIDogdGhpcy5mYWxzZUJyYW5jaDtcblx0ICAgICAgICByZXR1cm4gYnJhbmNoLmNvbm5lY3QobWluUHJpb3JpdHksIGNhbGxiYWNrKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gSWZTdHJhdGVneTtcblx0fSgpKTtcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBJZlN0cmF0ZWd5O1xuXG5cbi8qKiovIH0pLFxuLyogNjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIEZpcnN0Q29ubmVjdGVkU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRmlyc3RDb25uZWN0ZWRTdHJhdGVneShzdHJhdGVneSkge1xuXHQgICAgICAgIHRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcblx0ICAgIH1cblx0ICAgIEZpcnN0Q29ubmVjdGVkU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnN0cmF0ZWd5LmlzU3VwcG9ydGVkKCk7XG5cdCAgICB9O1xuXHQgICAgRmlyc3RDb25uZWN0ZWRTdHJhdGVneS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uIChtaW5Qcmlvcml0eSwgY2FsbGJhY2spIHtcblx0ICAgICAgICB2YXIgcnVubmVyID0gdGhpcy5zdHJhdGVneS5jb25uZWN0KG1pblByaW9yaXR5LCBmdW5jdGlvbiAoZXJyb3IsIGhhbmRzaGFrZSkge1xuXHQgICAgICAgICAgICBpZiAoaGFuZHNoYWtlKSB7XG5cdCAgICAgICAgICAgICAgICBydW5uZXIuYWJvcnQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgaGFuZHNoYWtlKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gcnVubmVyO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBGaXJzdENvbm5lY3RlZFN0cmF0ZWd5O1xuXHR9KCkpO1xuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IEZpcnN0Q29ubmVjdGVkU3RyYXRlZ3k7XG5cblxuLyoqKi8gfSksXG4vKiA2MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHR2YXIgZGVmYXVsdHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cdGV4cG9ydHMuZ2V0R2xvYmFsQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgICB3c0hvc3Q6IGRlZmF1bHRzXzFbXCJkZWZhdWx0XCJdLmhvc3QsXG5cdCAgICAgICAgd3NQb3J0OiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS53c19wb3J0LFxuXHQgICAgICAgIHdzc1BvcnQ6IGRlZmF1bHRzXzFbXCJkZWZhdWx0XCJdLndzc19wb3J0LFxuXHQgICAgICAgIHdzUGF0aDogZGVmYXVsdHNfMVtcImRlZmF1bHRcIl0ud3NfcGF0aCxcblx0ICAgICAgICBodHRwSG9zdDogZGVmYXVsdHNfMVtcImRlZmF1bHRcIl0uc29ja2pzX2hvc3QsXG5cdCAgICAgICAgaHR0cFBvcnQ6IGRlZmF1bHRzXzFbXCJkZWZhdWx0XCJdLnNvY2tqc19odHRwX3BvcnQsXG5cdCAgICAgICAgaHR0cHNQb3J0OiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5zb2NranNfaHR0cHNfcG9ydCxcblx0ICAgICAgICBodHRwUGF0aDogZGVmYXVsdHNfMVtcImRlZmF1bHRcIl0uc29ja2pzX3BhdGgsXG5cdCAgICAgICAgc3RhdHNIb3N0OiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS5zdGF0c19ob3N0LFxuXHQgICAgICAgIGF1dGhFbmRwb2ludDogZGVmYXVsdHNfMVtcImRlZmF1bHRcIl0uY2hhbm5lbF9hdXRoX2VuZHBvaW50LFxuXHQgICAgICAgIGF1dGhUcmFuc3BvcnQ6IGRlZmF1bHRzXzFbXCJkZWZhdWx0XCJdLmNoYW5uZWxfYXV0aF90cmFuc3BvcnQsXG5cdCAgICAgICAgYWN0aXZpdHlfdGltZW91dDogZGVmYXVsdHNfMVtcImRlZmF1bHRcIl0uYWN0aXZpdHlfdGltZW91dCxcblx0ICAgICAgICBwb25nX3RpbWVvdXQ6IGRlZmF1bHRzXzFbXCJkZWZhdWx0XCJdLnBvbmdfdGltZW91dCxcblx0ICAgICAgICB1bmF2YWlsYWJsZV90aW1lb3V0OiBkZWZhdWx0c18xW1wiZGVmYXVsdFwiXS51bmF2YWlsYWJsZV90aW1lb3V0XG5cdCAgICB9O1xuXHR9O1xuXHRleHBvcnRzLmdldENsdXN0ZXJDb25maWcgPSBmdW5jdGlvbiAoY2x1c3Rlck5hbWUpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgICAgd3NIb3N0OiBcIndzLVwiICsgY2x1c3Rlck5hbWUgKyBcIi5wdXNoZXIuY29tXCIsXG5cdCAgICAgICAgaHR0cEhvc3Q6IFwic29ja2pzLVwiICsgY2x1c3Rlck5hbWUgKyBcIi5wdXNoZXIuY29tXCJcblx0ICAgIH07XG5cdH07XG5cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pXG59KTtcbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wdXNoZXItanMvZGlzdC93ZWIvcHVzaGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJpbXBvcnQgeyBldmVudFBhdHRlcm5NYXRjaCwgQ3VycmVudEVudmlyb25tZW50LCBmb3JjZVR5cGUsIGNvbnNvbGVQcmludCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgRXh0IGZyb20gJy4vdHdpdGNoLWV4dCc7XG5cbi8qKlxuICogVGhlIE11eHkgRXh0ZW5zaW9ucyBTREssIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBNdXh5J3MgRXh0ZW5zaW9uIEJhY2tlbmQgU2VydmljZS5cbiAqXG4gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjcmVhdGVkIHRocm91Z2ggdGhlIGdsb2JhbCBgTXV4eWAgb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGVhc2lseVxuICogaW50ZXJhY3Qgd2l0aCBNdXh5J3MgRXh0ZW5zaW9uIEJhY2tlbmQgU2VydmljZS4gSXQgaW5jbHVkZXMgZnVuY3Rpb25hbGl0eSB0byBhZ2dyZWdhdGVcbiAqIGFuZCBwZXJzaXN0IHVzZXIgZGF0YSwgc2V0IGV4dGVuc2lvbiBjb25maWd1cmF0aW9uLCBzZW5kIGFuYWx5dGljcyBldmVudHMgYW5kIGF1dGhlbnRpY2F0ZVxuICogYnJvYWRjYXN0ZXJzIGFjcm9zcyBzZXJ2ZXJzIGFuZCBhcHBsaWNhdGlvbnMuXG4gKlxuICogVG8gYmVnaW4gdXNpbmcgdGhlIFNESywgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGJ5IGNhbGxpbmcgYGNvbnN0IHNkayA9IE11eHkuU0RLKClgLlxuICpcbiAqICoqTm90ZSBmb3IgT3ZlcmxheSBBcHAgRGV2ZWxvcGVyczoqKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIE11eHkgU0RLIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91IHRoYXQgaXMgbmFtZXNwYWNlZCB0byB5b3VyXG4gKiBhcHAgaWQuIFlvdSBjYW4gYWNjZXNzIGl0IGluIGFueSBhcHAgdGhhdCBpbXBvcnRzIEFwcE1peGluIGFzIGB0aGlzLm11eHkuPG1ldGhvZD5gLiBUaGVcbiAqIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93IGJlaGF2ZSBzaW1pbGFybHkgdG8gaG93IHRoZXkgd291bGQgaW4gYW4gZXh0ZW5zaW9uIGNvbnRleHQsIGhvd2V2ZXJcbiAqIGFsbCBkYXRhIGlzIGV4Y2x1c2l2ZSB0byB5b3VyIGFwcC4gRGlmZmVyZW5jZXMgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cyB0byB0aGUgaW5kaXZpZHVhbFxuICogbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIHtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3IoaWRlbnRpZmllciwgY2xpZW50LCB1c2VyLCBtZXNzZW5nZXIsIGFuYWx5dGljcywgbG9hZFByb21pc2UsIFNLVXMpIHtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHRoaXMubG9hZFByb21pc2UgPSBsb2FkUHJvbWlzZTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGluc3RhbmNlIGlkZW50aWZpZXIuIEVpdGhlciB0aGUgZXh0ZW5zaW9uIG9yIGFwcCBJRC5cbiAgICAgKiBAcHVibGljXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhY2tlbmQgc3RhdGUgY2xpZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge0NsaWVudH1cbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhY2tlbmQgZXZlbnQgbWVzc2VuZ2VyIGNsaWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtNZXNzZW5nZXJ9XG4gICAgICpcbiAgICAgKi9cbiAgICB0aGlzLm1lc3NlbmdlciA9IG1lc3NlbmdlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYWNrZW5kIGFuYWx5dGljcyBjbGllbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7QW5hbHl0aWNzfVxuICAgICAqXG4gICAgICovXG4gICAgdGhpcy5hbmFseXRpY3MgPSBhbmFseXRpY3M7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgVXNlciBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgZXh0ZW5zaW9uIHVzZXIuXG4gICAgICogQHB1YmxpY1xuICAgICAqIEB0eXBlIHtVc2VyfVxuICAgICAqL1xuICAgIHRoaXMudXNlciA9IHVzZXI7XG5cbiAgICAvKipcbiAgICAgKiBTS1VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvZHVjdHMgb2ZmZXJlZCBpbiB0aGUgZXh0ZW5zaW9uLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuU0tVcyA9IFNLVXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgb25jZSB0aGlzIFNESyBpbnN0YW5jZSBpcyByZWFkeSBmb3IgdXNlLlxuICAgKiBXaWxsIHJlamVjdCBpZiBhbiBlcnJvciBvY2N1cnMgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBiYWNrZW5kIHNlcnZlci5cbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHNkayA9IG5ldyBNdXh5LlNESygpO1xuICAgKiBzZGsubG9hZGVkKCkudGhlbigoKSA9PiB7XG4gICAqICAgc2RrLnNlbmQoJ0hlbGxvIFdvcmxkJyk7XG4gICAqIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKGVycik7XG4gICAqIH0pO1xuICAgKi9cbiAgbG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmxvYWRQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGEgQWNjdW11bGF0aW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgZnJvbSB7QGxpbmsgZ2V0QWNjdW11bGF0ZURhdGF9LlxuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBBY2N1bXVsYXRlRGF0YVxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbGF0ZXN0IEEgVW5peCB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50bHkgcG9zdGVkIEpTT04gYmxvYi5cbiAgICpcbiAgICogQHByb3BlcnR5IHtPYmplY3RbXX0gZGF0YSBBcnJheSBvZiBhbGwgSlNPTiBibG9iIHBheWxvYWRzIHBvc3RlZCB0byB0aGlzIGlkZW50aWZpZXIuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLm9ic2VydmVkIEEgVW5peCB0aW1lc3RhbXAgb2Ygd2hlbiB0aGlzIHBheWxvYWQgd2FzIHJlY2VpdmVkLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YS5jaGFubmVsX2lkIFRoZSBpZCBvZiB0aGUgY2hhbm5lbCB0aGlzIHBheWxvYWQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAqIChlaXRoZXIgdGhlIHZpZXdlciB3YXMgd2F0Y2hpbmcgdGhlIGNoYW5uZWwsIG9yIHRoZSBhcHAvc2VydmVyIHdhcyBhdXRoZWQgd2l0aCB0aGlzIGNoYW5uZWwpLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YS5vcGFxdWVfdXNlcl9pZCBUd2l0Y2gncyBPcGFxdWUgVXNlciBJRCByZXByZXNlbnRpbmcgdGhlIHNlbmRlclxuICAgKiBvZiB0aGUgcGF5bG9hZC4gVGhpcyB3aWxsIGFsd2F5cyBiZSBzZXQgYW5kIGNhbiBiZSB1c2VkIHdpdGggVHdpdGNoJ3MgcHViL3N1YiBzeXN0ZW0gdG9cbiAgICogd2hpc3BlciBldmVudHMgdG8gYSBwYXJ0aWN1bGFyIHZpZXdlci5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGEudXNlcl9pZCBJZiB0aGUgdmlld2VyIGhhcyBjaG9zZW4gdG8gc2hhcmUgdGhlaXIgaWRlbnRpdHkgd2l0aCB0aGVcbiAgICogZXh0ZW5zaW9uLCB0aGlzIGZpZWxkIHdpbGwgaG9sZCB0aGUgdmlld2VyJ3MgYWN0dWFsIFR3aXRjaCBJRC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuZGF0YSBUaGUgYWN0dWFsIEpTT04gYmxvYiBwYXlsb2FkIGFzIHNlbnQgdG8gdGhlIGFjY3VtdWxhdGUgZW5kcG9pbnQuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBhY2N1bXVsYXRlZCB1c2VyIGRhdGEgZm9yIGEgZ2l2ZW4gaWQgcmVjZWl2ZWQgYnkgdGhlIGJhY2tlbmQgc2luY2Ugc3RhcnQuXG4gICAqXG4gICAqIEJyb2FkY2FzdGVyLW9ubHkgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgYWNjdW11bGF0aW9uSUQgaXMgbm90IGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWNjdW11bGF0aW9uSUQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgYWNjdW11bGF0ZWQgZGF0YSB0byBmZXRjaC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gQSBVbml4IHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgb2YgdGhlIGVhcmxpZXN0IGFjY3VtdWxhdGlvblxuICAgKiByZWNvcmQgdG8gZmV0Y2guXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QWNjdW11bGF0ZURhdGE+fSBSZXNvbHZlcyB3aXRoIHJlcXVlc3RlZCBhY2N1bXVsYXRpb24gZGF0YSBvblxuICAgKiBzZXJ2ZXIgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG9uZU1pbnV0ZUFnbyA9IChuZXcgRGF0ZSgpLmdldFRpbWUoKSkgLSAoMTAwMCAqIDYwKTtcbiAgICogc2RrLmdldEFjY3VtdWxhdGlvbignYXdlc29tZW5lc3NfbGV2ZWwnLCBvbmVNaW51dGVBZ28pLnRoZW4oKHJlc3ApID0+IHtcbiAgICogICBjb25zb2xlLmxvZyhgJHtyZXNwLmRhdGEubGVuZ3RofTogJHtyZXNwLmxhdGVzdH1gKTtcbiAgICogICBjb25zb2xlLmxvZyhyZXNwLmRhdGEpOyAvLyBBIGxpc3Qgb2YgYWxsIGFjY3VtdWxhdGUgdmFsdWVzIHNpbmNlIG9uZU1pbnV0ZUFnby5cbiAgICogfSk7XG4gICAqL1xuICBnZXRBY2N1bXVsYXRlRGF0YShhY2N1bXVsYXRpb25JRCwgc3RhcnQpIHtcbiAgICBmb3JjZVR5cGUoYWNjdW11bGF0aW9uSUQsICdzdHJpbmcnKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0QWNjdW11bGF0aW9uKHRoaXMuaWRlbnRpZmllciwgYWNjdW11bGF0aW9uSUQsIHN0YXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0QWNjdW11bGF0ZURhdGEgaW5zdGVhZC5cbiAgICovXG4gIGdldEFjY3VtdWxhdGlvbihhY2N1bXVsYXRpb25JRCwgc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY2N1bXVsYXRlRGF0YShhY2N1bXVsYXRpb25JRCwgc3RhcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGRhdGEgdG8gYmUgYWNjdW11bGF0ZWQgYnkgdGhlIHNlcnZlci5cbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2N1bXVsYXRpb25JRCAtIFRoZSBpZGVudGlmaWVyIHRoYXQgdGhpcyBkYXR1bSBpcyBhY2N1bXVsYXRlZCB3aXRoLlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEFueSBKU09OIHNlcmlhbGl6YWJsZSBKYXZhU2NyaXB0IG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gV2lsbCByZXNvbHZlIG9uIHN1Y2Nlc3NmdWwgc2VydmVyLXNlbmQuIFJlamVjdHMgb24gZmFpbHVyZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2RrLmFjY3VtdWxhdGUoJ2F3ZXNvbWVuZXNzX2xldmVsJywge1xuICAgKiAgIGF3ZXNvbWVuZXNzX2xldmVsOiB7XG4gICAqICAgICBncmVhdDogMTAsXG4gICAqICAgICBnb29kOiAyLjUsXG4gICAqICAgICBwb29yOiAnZGFuaydcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgYWNjdW11bGF0ZShhY2N1bXVsYXRpb25JRCwgZGF0YSkge1xuICAgIGZvcmNlVHlwZShhY2N1bXVsYXRpb25JRCwgJ3N0cmluZycpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hY2N1bXVsYXRlKHRoaXMuaWRlbnRpZmllciwgYWNjdW11bGF0aW9uSUQsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXIgVm90aW5nXG4gICAqL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgZnJvbSB7QGxpbmsgZ2V0Vm90ZURhdGF9LlxuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBWb3RlRGF0YVxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gY291bnQgLSBUaGUgdG90YWwgbnVtYmVyIG9mIHZvdGVzIHJlY2VpdmVkIGZvciB0aGlzIHZvdGUgaWRlbnRpZmllci5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IG1lYW4gLSBUaGUgYXZlcmFnZSBvZiBhbGwgdm90ZXMgcmVjZWl2ZWQgZm9yIHRoaXMgaWRlbnRpZmllci5cbiAgICogQHByb3BlcnR5IHtudW1iZXJbXX0gc3BlY2lmaWMgLSBUaGUgbnVtYmVyIG9mIHZvdGVzIGNhc3QgZm9yIHRoZSBzcGVjaWZpYyB2YWx1ZXMgWzAtNF0uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdGRkZXYgLSBBcHByb3hpbWF0ZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIGFsbCB2b3RlcyByZWNlaXZlZCBmb3JcbiAgICogdGhpcyBpZGVudGlmaWVyLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc3VtIC0gVGhlIHN1bSBvZiBhbGwgdm90ZXMgcmVjZWl2ZWQgZm9yIHRoaXMgaWRlbnRpZmllci5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHZvdGUgLSBJZiB0aGUgdXNlciBoYXMgYSB2b3RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkZW50aWZlciwgdGhlXG4gICAqIGN1cnJlbnQgdmFsdWUgZm9yIHRoaXMgdXNlci4gTm90IHNldCBpZiBubyB2b3RlIGhhcyBiZWVuIHJlY2VpdmVkLlxuICAgKi9cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY3VycmVudCBzdG9yZWQgdm90ZSBkYXRhIGZvciBhIGdpdmVuIHZvdGUgaWRlbnRpZmllci5cbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdm90ZUlEIGlzIG5vdCBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZvdGVJRCAtIFRoZSBpZGVudGlmZXIgdG8gZmV0Y2ggYXNzb2NpYXRlZCB2b3RlIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vm90ZURhdGE+fSBSZXNvbHZlcyB3aXRoIHJlcXVlc3RlZCB2b3RlIGRhdGEgb24gc2VydmVyIHJlc3BvbnNlLiBSZWplY3RzIG9uXG4gICAqIHNlcnZlciBlcnJvci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2RrLmdldFZvdGVEYXRhKCdwb2xsLW51bWJlci0xJykudGhlbigodm90ZURhdGEpID0+IHtcbiAgICogICBjb25zb2xlLmxvZyh2b3RlRGF0YS5zdW0pO1xuICAgKiB9KTtcbiAgICovXG4gIGdldFZvdGVEYXRhKHZvdGVJRCkge1xuICAgIGZvcmNlVHlwZSh2b3RlSUQsICdzdHJpbmcnKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0Vm90ZXModGhpcy5pZGVudGlmaWVyLCB2b3RlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhIHVzZXIgdm90ZSBhc3NvY2lhdGVkIHdpdGggYSB2b3RlIGlkZW50aWZpZXIuXG4gICAqIEBhc3luY1xuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBXaWxsIHRocm93IGFuIGVycm9yIGlmIGB2b3RlSURgIGlzIG5vdCBhIHN0cmluZyBvciBpZiBgdmFsdWVgIGlzIG5vdFxuICAgKiBhIE51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZvdGVJRCAtIFRoZSBpZGVudGlmZXIgdG8gZmV0Y2ggYXNzb2NpYXRlZCB2b3RlIGRhdGEuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIEFueSBudW1lcmljIHZhbHVlIHRvIHJlcHJlc2VudCB0aGlzIHVzZXIncyB2b3RlLiBOb3RlIHRoYXQgb25seVxuICAgKiB2YWx1ZXMgb2YgMC01IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGBzcGVjaWZpY2AgZmllbGQgcmV0dXJuZWQgZnJvbSBgZ2V0Vm90ZURhdGFgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBXaWxsIHJlc29sdmUgb24gc3VjY2Vzc2Z1bCBzZXJ2ZXItc2VuZC4gUmVqZWN0cyBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsudm90ZSgncG9sbC1udW1iZXItMScsIDEpO1xuICAgKi9cbiAgdm90ZSh2b3RlSUQsIHZhbHVlKSB7XG4gICAgZm9yY2VUeXBlKHZvdGVJRCwgJ3N0cmluZycpO1xuICAgIGZvcmNlVHlwZSh2YWx1ZSwgJ251bWJlcicpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnZvdGUodGhpcy5pZGVudGlmaWVyLCB2b3RlSUQsIHsgdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBSYW5raW5nXG4gICAqL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgZnJvbSB7QGxpbmsgZ2V0UmFua0RhdGF9LlxuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0W119IFJhbmtEYXRhXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXkgLSBBIHNpbmdsZSBrZXkgYXMgc2VudCB0byB0aGUgcmFua2luZyBlbmRwb2ludCBmb3IgdGhpcyBpZGVudGlmaWVyLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2NvcmUgLSBUaGUgbnVtYmVyIG9mIHVzZXJzIHdobyBoYXZlIHNlbnQgdGhpcyBga2V5YCBmb3IgdGhpcyBpZGVudGlmaWVyLlxuICAgKi9cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY3VycmVudCByYW5rZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHJhbmsgaWRlbnRpZmllci5cbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgcmFua0lEIGlzIG5vdCBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhbmtJRCAtIFRoZSBpZGVudGlmaWVyIHRvIGZldGNoIGFzc29jaWF0ZWQgcmFuayBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJhbmtEYXRhPn0gUmVzb2x2ZXMgd2l0aCByZXF1ZXN0ZWQgcmFuayBkYXRhIG9uIHNlcnZlciByZXNwb25zZS4gUmVqZWN0c1xuICAgKiBvbiBzZXJ2ZXIgZXJyb3IuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNkay5nZXRSYW5rRGF0YSgnZmF2b3JpdGVfY29sb3InKS50aGVuKChjb2xvcnMpID0+IHtcbiAgICogICBpZiAoY29sb3JzLmxlbmd0aCA+IDApIHtcbiAgICogICAgIGNvbG9ycy5mb3JFYWNoKChjb2xvcikgPT4ge1xuICAgKiAgICAgICBjb25zb2xlLmxvZyhgJHtjb2xvci5rZXl9OiAke2NvbG9yLnNjb3JlfWApO1xuICAgKiAgICAgfSk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGdldFJhbmtEYXRhKHJhbmtJRCkge1xuICAgIGZvcmNlVHlwZShyYW5rSUQsICdzdHJpbmcnKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKGFjY2VwdCwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNsaWVudFxuICAgICAgICAuZ2V0UmFuayh0aGlzLmlkZW50aWZpZXIsIHJhbmtJRClcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgYWNjZXB0KGRhdGEuZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCB1c2VyIHJhbmsgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSByYW5rIGlkZW50aWZpZXIuXG4gICAqIEBhc3luY1xuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBXaWxsIHRocm93IGFuIGVycm9yIGlmIHJhbmtJRCBvciB2YWx1ZSBhcmUgbm90IHN0cmluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYW5rSUQgLSBUaGUgaWRlbnRpZmVyIHRvIGZldGNoIGFzc29jaWF0ZWQgcmFuayBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBbnkgc3RyaW5nIHZhbHVlIHRvIHJlcHJlc2VudCB0aGlzIHVzZXIncyByYW5rIGRhdGEuIFdpbGwgYmUgcmV0dXJuZWRcbiAgICogYXMgdGhlIGBrZXlgIGZpZWxkIHdoZW4gcmFuayBkYXRhIGlzIHJlcXVlc3RlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgdXNlcnNGYXZvcml0ZUNvbG9yID0gJ3JlYmVjY2FwdXJwbGUnO1xuICAgKiB0aGlzLm11eHkucmFuaygnZmF2b3JpdGVfY29sb3InLCB1c2Vyc0Zhdm9yaXRlQ29sb3IpO1xuICAgKi9cbiAgcmFuayhyYW5rSUQsIHZhbHVlKSB7XG4gICAgZm9yY2VUeXBlKHJhbmtJRCwgJ3N0cmluZycpO1xuICAgIGZvcmNlVHlwZSh2YWx1ZSwgJ3N0cmluZycpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJhbmsodGhpcy5pZGVudGlmaWVyLCByYW5rSUQsIHsga2V5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcmFuayBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmFuayBpZGVudGlmaWVyLlxuICAgKlxuICAgKiBCcm9hZGNhc3Rlci1vbmx5IGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBhc3luY1xuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBXaWxsIHRocm93IGFuIGVycm9yIGlmIHJhbmtJRCBpcyBub3QgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYW5rSUQgLSBUaGUgaWRlbnRpZmVyIHRvIGZldGNoIGFzc29jaWF0ZWQgcmFuayBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBXaWxsIHJlc29sdmUgb24gc3VjY2Vzcy4gUmVqZWN0cyBvbiBmYWlsdXJlLlxuICAgKi9cbiAgY2xlYXJSYW5rRGF0YShyYW5rSUQpIHtcbiAgICBmb3JjZVR5cGUocmFua0lELCAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZVJhbmsodGhpcy5pZGVudGlmaWVyLCByYW5rSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgaW4gMS4wLjAuIFVzZSBnZXRSYW5rRGF0YSBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0UmFua2luZ0RhdGEocmFua0lEKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmFua0RhdGEocmFua0lEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDEuMC4wLiBVc2UgY2xlYXJSYW5rRGF0YSBpbnN0ZWFkLlxuICAgKi9cbiAgY2xlYXJSYW5raW5nKHJhbmtJRCkge1xuICAgIHJldHVybiB0aGlzLmNsZWFyUmFua2luZyhyYW5rSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXIgU3RhdGVcbiAgICovXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNoYW5uZWwgc3BlY2lmaWMgdmlld2VyLXNwZWNpZmljIHN0YXRlIHRvIGEgSlMgb2JqZWN0LCB0aGlzIGNhbiBiZSBjYWxsZWQgYnlcbiAgICogYW55IHZpZXdlci5cbiAgICogRnV0dXJlIGNhbGxzIHRvIHtAbGluayBnZXRBbGxTdGF0ZX0gYnkgKip0aGlzKiogdXNlciB3aWxsIGhhdmUgYSBjbG9uZSBvZiB0aGlzIG9iamVjdCBpbiB0aGVcbiAgICogYHZpZXdlcmAgZmllbGQuXG4gICAqIEBhc3luY1xuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIC0gQSBjb21wbGV0ZSBKUyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHZpZXdlciBzdGF0ZS5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gV2lsbCByZXNvbHZlIG9uIHN1Y2Nlc3NmdWwgc2VydmVyLXNlbmQuIFJlamVjdHMgb24gZmFpbHVyZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2RrLnNldFZpZXdlclN0YXRlKHtcbiAgICogICBmYXZvcml0ZV9tb3ZpZTogJ0phd3M6IFRoZSBSZXZlbmdlJ1xuICAgKiB9KS50aGVuKCgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnVmlld2VyIHN0YXRlIHNhdmVkIScpO1xuICAgKiB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAqICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHNhdmluZyB2aWV3ZXIgc3RhdGU6ICR7ZXJyfWApO1xuICAgKiB9KTtcbiAgICovXG4gIHNldFZpZXdlclN0YXRlKHN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldFZpZXdlclN0YXRlKHRoaXMuaWRlbnRpZmllciwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4dGVuc2lvbiB3aWRlIHZpZXdlci1zcGVjaWZpYyBzdGF0ZSB0byBhIEpTIG9iamVjdCwgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGFueSB2aWV3ZXIuXG4gICAqIEZ1dHVyZSBjYWxscyB0byB7QGxpbmsgZ2V0QWxsU3RhdGV9IGJ5ICoqdGhpcyoqIHVzZXIgd2lsbCBoYXZlIGEgY2xvbmUgb2YgdGhpcyBvYmplY3QgaW4gdGhlXG4gICAqIGBleHRlbnNpb25fdmlld2VyYCBmaWVsZC5cbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgLSBBIGNvbXBsZXRlIEpTIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdmlld2VyIHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBXaWxsIHJlc29sdmUgb24gc3VjY2Vzc2Z1bCBzZXJ2ZXItc2VuZC4gUmVqZWN0cyBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsuc2V0RXh0ZW5zaW9uVmlld2VyU3RhdGUoe1xuICAgKiAgIGZhdm9yaXRlX21vdmllOiAnSmF3czogVGhlIFJldmVuZ2UnXG4gICAqIH0pLnRoZW4oKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdWaWV3ZXIgc3RhdGUgc2F2ZWQhJyk7XG4gICAqIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKGBGYWlsZWQgc2F2aW5nIHZpZXdlciBzdGF0ZTogJHtlcnJ9YCk7XG4gICAqIH0pO1xuICAgKi9cbiAgc2V0RXh0ZW5zaW9uVmlld2VyU3RhdGUoc3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0RXh0ZW5zaW9uVmlld2VyU3RhdGUodGhpcy5pZGVudGlmaWVyLCBzdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY2hhbm5lbC1zcGVjaWZpYyBzdGF0ZSB0byBhIEpTIG9iamVjdC4gRnV0dXJlIGNhbGxzIHRvIHtAbGluayBnZXRBbGxTdGF0ZX0gYnkgKiphbnkqKlxuICAgKiB1c2VyIG9uIHRoaXMgY2hhbm5lbCB3aWxsIGhhdmUgYSBjbG9uZSBvZiB0aGlzIG9iamVjdCBpbiB0aGUgYGNoYW5uZWxgIGZpZWxkLlxuICAgKlxuICAgKiBCcm9hZGNhc3Rlci1vbmx5IGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBhc3luY1xuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIC0gQSBjb21wbGV0ZSBKUyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFdpbGwgcmVzb2x2ZSBvbiBzdWNjZXNzZnVsIHNlcnZlci1zZW5kLiBSZWplY3RzIG9uIGZhaWx1cmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNkay5zZXRDaGFubmVsU3RhdGUoe1xuICAgKiAgIGJyb2FkY2FzdGVyc19tb29kOiAnc2FuZ3VpbmUsIG15IGJyb3RoZXInLFxuICAgKiAgIGNoYXRzX21vb2Q6ICdrcmV5Z2FzbSdcbiAgICogfSkudGhlbigoKSA9PiB7XG4gICAqICAgLy8gTGV0IHZpZXdlcnMga25vdyB0aGF0IG5ldyBjaGFubmVsIHN0YXRlIGlzIGF2YWlsYWJsZS5cbiAgICogfSkuY2F0Y2goKGVycikgPT4ge1xuICAgKiAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCBzYXZpbmcgY2hhbm5lbCBzdGF0ZTogJHtlcnJ9YCk7XG4gICAqIH0pO1xuICAgKi9cbiAgc2V0Q2hhbm5lbFN0YXRlKHN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldENoYW5uZWxTdGF0ZSh0aGlzLmlkZW50aWZpZXIsIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgZnJvbSB7QGxpbmsgZ2V0QWxsU3RhdGV9LlxuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBBbGxTdGF0ZVxuICAgKlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gZXh0ZW5zaW9uIC0gQSBzdGF0ZSBvYmplY3Qgb25seSBzZXR0YWJsZSBieSB0aGUgZXh0ZW5zaW9uIGl0c2VsZi5cbiAgICogVW5pdmVyc2FsIGZvciBhbGwgY2hhbm5lbHMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjaGFubmVsIC0gQSBzdGF0ZSBvYmplY3Qgb25seSBzZXR0YWJsZSBieSBhIGJyb2FkY2FzdGVyLiBVbml2ZXJzYWwgZm9yIGFsbFxuICAgKiB2aWV3ZXJzIG9mIHRoZSBzYW1lIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2aWV3ZXIgLSBBIHN0YXRlIG9iamVjdCBzZXR0YWJsZSBieSBlYWNoIHZpZXdlci4gU3BlY2lmaWMgdG8gdGhlIHZpZXdlciBvZlxuICAgKiBhIGdpdmVuIGNoYW5uZWwuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdCBhcyBzZXQgZm9yIHRoZSBjdXJyZW50IGV4dGVuc2lvbiwgY2hhbm5lbCBhbmRcbiAgICogdmlld2VyIGNvbWJpbmF0aW9uLlxuICAgKiBAYXN5bmNcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QWxsU3RhdGU+fSBSZXNvbHZlcyBvbiBzdWNjZXNzZnVsIHNlcnZlciByZXF1ZXN0IHdpdGggYSBwb3B1bGF0ZWQgQWxsU3RhdGVcbiAgICogb2JqZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsuZ2V0QWxsU3RhdGUoKS50aGVuKChzdGF0ZSkgPT4ge1xuICAgKiAgIGlmIChzdGF0ZS5jaGFubmVsLmJyb2FkY2FzdGVyc19tb29kKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyhgQnJvYWRjYXN0ZXIgc2V0IHRoZWlyIG1vb2QgYXM6ICR7c3RhdGUuY2hhbm5lbC5icm9hZGNhc3RlcnNfbW9vZH1gKTtcbiAgICogICB9XG4gICAqICAgaWYgKHN0YXRlLnZpZXdlci5mYXZvcml0ZV9tb3ZpZSkge1xuICAgKiAgICAgY29uc29sZS5sb2coYEJ1dCB5b3VyIGZhdm9yaXRlIG1vdmllIGlzOiAke3N0YXRlLnZpZXdlci5mYXZvcml0ZV9tb3ZpZX1gKTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgZ2V0QWxsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFN0YXRlKHRoaXMuaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiBTdG9yZVxuICAgKi9cblxuICAvKipcbiAgICogVGhlIEpTT04gc3RvcmUgaXMgdXNlZCBzaW1pbGFybHkgdG8gdGhlIGNoYW5uZWwgc3RhdGUsIGluIHRoYXQgYSBicm9hZGNhc3RlciBjYW4gdXNlIGl0IHRvXG4gICAqIHN0b3JlIGFyYml0cmFyeSBKU09OIGRhdGEgdGhhdCBpcyBhY2Nlc3NpYmxlIHRvIGFsbCB2aWV3ZXJzLiBUaGUgc3RvcmVkIGRhdGEgaXMgc3BlY2lmaWMgdG9cbiAgICogYSBwYXJ0aWN1bGFyIGNoYW5uZWwgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBieSB2aWV3ZXJzIG9mIGEgZGlmZmVyZW50IGNoYW5uZWwuXG4gICAqXG4gICAqIFVubGlrZSBjaGFubmVsIHN0YXRlIGhvd2V2ZXIsIGVhY2ggY2hhbm5lbCBjYW4gaGF2ZSBzZXZlcmFsIEpTT04gc3RvcmVzLCBhY2Nlc3NlZCBieSBkaWZmZXJlbnRcbiAgICoga2V5cy4gVGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2gga2V5IG11c3QgYmUgdW5kZXIgMktCLCBidXQgdGhlcmUgaXMgbm8gbGltaXQgdG8gdGhlIG51bWJlclxuICAgKiBvZiBrZXlzIGluIHVzZS5cbiAgICpcbiAgICogQWxzbywgd2hlbiBwdXNoaW5nIG5ldyBkYXRhIHRvIHRoZSBKU09OIHN0b3JlLCBhIG1lc3NlbmdlciBldmVudCBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgdG8gYWxsXG4gICAqIGFjdGl2ZSB2aWV3ZXJzIG9mIHRoZSBhc3NvY2lhdGVkIGNoYW5uZWwgYW5kIHRoZSBicm9hZGNhc3RlcidzIGxpdmUgYW5kIGNvbmZpZyBwYWdlcy4gVGhpc1xuICAgKiBldmVudCB3aWxsIGhhdmUgdGhlIGZvcm1hdCBganNvbl9zdG9yZV91cGRhdGU6JHtrZXl9YC4gU2VlIHtAbGluayBsaXN0ZW59IGZvciBkZXRhaWxzIG9uXG4gICAqIHJlY2VpdmluZyB0aGlzIGV2ZW50LlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBrZXkgaXMgcHJvdmlkZWQgYnV0IGlzIG5vdCBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc/fSBrZXkgLSBUaGUgbG9va3VwIGtleSBmb3IgZGF0YSBpbiB0aGUgSlNPTiBzdG9yZS4gVXNlcyAnZGVmYXVsdCcgaWYgbm8gdmFsdWVcbiAgICogaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gUmVzb2x2ZXMgd2l0aCB0aGUgc3RvcmVkIEpTT04gcGFyc2VkIHRvIGEgSlMgT2JqZWN0IGFzc29jaWF0ZWQgd2l0aFxuICAgKiB0aGUga2V5LiBSZWplY3RzIG9uIHNlcnZlciBlcnJvciBvciBpZiB0aGUga2V5IGhhcyBubyBhc3NvY2lhdGVkIGRhdGEuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNkay5nZXRKU09OU3RvcmUoJ2Jhc2VjYW1wJykudGhlbigoYmFzZWNhbXApID0+IHtcbiAgICogICBpZiAoYmFzZWNhbXAgJiYgYmFzZWNhbXAudGFua3MpIHtcbiAgICogICAgIGRlcGxveShiYXNlY2FtcC50YW5rcyk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGdldEpTT05TdG9yZShrZXkpIHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBmb3JjZVR5cGUoa2V5LCAnc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEpTT05TdG9yZSh0aGlzLmlkZW50aWZpZXIsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVHdvLUZhY3RvciBBdXRoXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byB2YWxpZGF0ZSBhIGJyb2FkY2FzdGVyJ3MgUElOIHdpdGggTXV4eSdzIFR3by1GYWN0b3IgYXV0aCBzeXN0ZW0uIEZvciB0aGlzIHRvIHdvcmssXG4gICAqIHRoZSBicm9hZGNhc3RlciBtdXN0IGhhdmUgaW5pdGlhdGVkIGEgVHdvLUZhY3RvciByZXF1ZXN0IGZvciB0aGlzIGNoYW5uZWwgd2l0aGluIHRoZSBhdXRoXG4gICAqIHdpbmRvdy5cbiAgICpcbiAgICogQnJvYWRjYXN0ZXItb25seSBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBgcGluYCBpcyBub3QgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwaW4gLSBUaGUgYnJvYWRjYXN0ZXIncyBQSU4gdG8gdmFsaWRhdGUgdGhlIGFzc29jaWF0ZWQgYXV0aCB0b2tlbi5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgaWYgdGhlIGF1dGggdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUElOIGNhbiBub3cgYmUgdXNlZCB0byBtYWtlXG4gICAqIHJlcXVlc3RzIG9uIGJlaGFsZiBvZiB0aGlzIGJyb2FkY2FzdGVyLCByZWplY3RzIHdpdGggYW4gZXJyb3Igb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsudmFsaWRhdGVDb2RlKCdNVVhZJykudGhlbigoKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ1ZhbGlkYXRlZCEgR28gZ28gZ28hJyk7XG4gICAqIH0pO1xuICAgKi9cbiAgdmFsaWRhdGVDb2RlKHBpbikge1xuICAgIGZvcmNlVHlwZShwaW4sICdzdHJpbmcnKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmFsaWRhdGVDb2RlKHRoaXMuaWRlbnRpZmllciwgcGluKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBicm9hZGNhc3RlciBoYXMgdmFsaWRhdGVkIGFuIGF1dGggdG9rZW4gaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gSXQgZG9lc1xuICAgKiBub3QgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQSU4gdXNlZCBvciBhdXRoIHRva2VuIHRoYXQgaXMgdmFsaWQuXG4gICAqXG4gICAqIEJyb2FkY2FzdGVyLW9ubHkgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdD59XG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXhpc3RzIC0gVHJ1ZSBpZiBhbiBhdXRoIHRva2VuIGhhcyBiZWVuIHZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsucGluVG9rZW5FeGlzdHMoKS50aGVuKChyZXNwKSA9PiB7XG4gICAqICAgaWYgKCFyZXNwLmV4aXN0cykge1xuICAgKiAgICAgc2hvd0Jyb2FkY2FzdGVyUElOSW5wdXQoKTtcbiAgICogICB9IGVsc2Uge1xuICAgKiAgICAgY29uc29sZS5sb2coJ0FscmVhZHkgYXV0aG9yaXplZCcpO1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqL1xuICBwaW5Ub2tlbkV4aXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucGluVG9rZW5FeGlzdHModGhpcy5pZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIGFsbCBhdXRoIHRva2VucyBldmVyIGdlbmVyYXRlZCBmb3IgdGhpcyBjaGFubmVsIGFuZCBpZGVudGlmaWVyLiBBZnRlciBjYWxsaW5nIHRoaXNcbiAgICogbWV0aG9kLCB0b2tlbnMgY3VycmVudGx5IGluIHVzZSBieSBleHRlcm5hbCBhcHBzIHdpbGwgY2Vhc2UgdG8gZnVuY3Rpb24uXG4gICAqXG4gICAqIEJyb2FkY2FzdGVyLW9ubHkgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBzdWNlc3MsIHJlamVjdHMgd2l0aCBhbiBlcnJvciBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNkay5yZXZva2VBbGxQSU5Db2RlcygpLnRoZW4oKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdObyBtb3JlIGRhdGEgY29taW5nIGluIScpO1xuICAgKiB9KTtcbiAgICovXG4gIHJldm9rZUFsbFBJTkNvZGVzKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXZva2VBbGxQSU5Db2Rlcyh0aGlzLmlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IFN5c3RlbVxuICAgKi9cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCBsaXN0ZW5pbmcgY2xpZW50cy4gQW5kIHZpZXdlcnMgb3IgYnJvYWRjYXRlcnMgbGlzdGVuaW5nIGZvciB0aGVcbiAgICogZXZlbnQgbmFtZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQuIFNlZSB7QGxpbmsgbGlzdGVufSBmb3IgcmVjZWl2aW5nIGV2ZW50cy5cbiAgICpcbiAgICogQnJvYWRjYXN0ZXItb25seSBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEFuIGV2ZW50IG5hbWUsIGluIHRoZSBmb3JtIFthLXowLTlfXStcbiAgICogQHBhcmFtIHtzdHJpbmd8Kn0gdXNlcklEIC0gQW4gb3B0aW9uYWwgb3BhcXVlIHVzZXIgaWQsIHVzZWQgdG8gbGltaXQgdGhlXG4gICAqIHNjb3BlIG9mIHNlbmQgdG8gdGhhdCB1c2VyIG9ubHkuXG4gICAqIEBwYXJhbSB7Kn0gW2RhdGFdIC0gQW55IEpTT04gc2VyaWFsaXphYmxlIHByaW1pdGl2ZSB0byBzZW5kIHRvIGFsbCB2aWV3ZXJzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsuc2VuZCgnbmV3X3NvbmcnLCB7XG4gICAqICAgYXJ0aXN0OiAnQ2VsaW5lIERpb24nLFxuICAgKiAgIHRpdGxlOiAnTXkgSGVhcnQgV2lsbCBHbyBPbicsXG4gICAqICAgYWxidW06ICdMZXRcXCdzIFRhbGsgQWJvdXQgTG92ZScsXG4gICAqICAgeWVhcjogMTk5N1xuICAgKiB9KTtcbiAgICovXG4gIHNlbmQoZXZlbnQsIHVzZXJJRCwgZGF0YSkge1xuICAgIGZvcmNlVHlwZShldmVudCwgJ3N0cmluZycpO1xuICAgIGxldCB0YXJnZXQgPSAnYnJvYWRjYXN0JztcbiAgICBsZXQgcmVhbERhdGEgPSBkYXRhO1xuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZWFsRGF0YSA9IHVzZXJJRDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gYHdoaXNwZXItJHt1c2VySUR9YDtcbiAgICB9XG5cbiAgICB0aGlzLm1lc3Nlbmdlci5zZW5kKHRoaXMuaWRlbnRpZmllciwgZXZlbnQsIHRhcmdldCwgcmVhbERhdGEsIHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBsaXN0ZW4gZm9yIGV2ZW50cy4gSW4gZ2VuZXJhbCwgZXZlbnRzIGFyZSBuYW1lZCBpbiB0aGUgZm9ybVxuICAgKiBgZXZlbnRbOmlkZW50aWZpZXJdYCwgd2hlcmUgdGhlIGlkZW50aWZpZXIgaXMgdGhlIGBldmVudGAgcGFyYW1ldGVyIHRvIHtAbGluayBzZW5kfS5cbiAgICpcbiAgICogWW91IGNhbiBsaXN0ZW4gdG8gd2lsZGNhcmRzIGJ5IHVzaW5nICogaW5zdGVhZCBvZiBhbiBldmVudCBvciBpZGVudGlmaWVyIG5hbWUuXG4gICAqXG4gICAqIFNvbWUgbWV0aG9kcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2VuZCBzcGVjaWFsIG5hbWVzcGFjZWQgZXZlbnRzLiBTZWUge0BsaW5rIHZvdGV9IGFuZFxuICAgKiB7QGxpbmsgZ2V0SlNPTlN0b3JlfSBmb3IgZXhhbXBsZXMuXG4gICAqXG4gICAqIFlvdSBjYW4gbGlzdGVuIGZvciB0aGVzZSBldmVudHMgYnkgdXNpbmcgYHZvdGVfdXBkYXRlOm5leHRfZ2FtZWAgb3IgYHZvdGVfdXBkYXRlOipgXG4gICAqIHRvIHJlY2VpdmUgdm90ZSB1cGRhdGVzIGZvciBzcGVjaWZpY2FsbHkgdGhlIGBuZXh0X2dhbWVgIHZvdGUgaWQsIG9yIGFsbCB2b3RlXG4gICAqIHVwZGF0ZXMgcmVzcGVjdGl2ZWx5LlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGluRXZlbnQgLSBUaGUgZXZlbnQgbmFtZSB0byBsaXN0ZW4gb24uIE1heSBpbmNsdWRlIHdpbGRjYXJkcyBgKmAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBpblVzZXJJRCAtIEFuIG9wdGlvbmFsIG9wYXF1ZSB1c2VyIGlkLCB1c2VkIHRvIGxpbWl0XG4gICAqIHRoZSBzY29wZSBvZiB0aGlzIGxpc3RlbiB0byB0aGF0IHVzZXIgb25seS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2luQ2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aXRoIHRoZSBzaWduYXR1cmUgYGZ1bmN0aW9uKGJvZHksIGV2ZW50bmFtZSlgLlxuICAgKiBUaGlzIGNhbGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgbWVzc2FnZSBib2R5IGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSBgZXZlbnRgIHBhcmFtZXRlclxuICAgKiB0byB7QGxpbmsgc2VuZH0gYXMgdGhlIHNlY29uZC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSBBIGxpc3RlbmVyIGhhbmRsZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BzZWUgdW5saXN0ZW59IHRvIHVuYmluZFxuICAgKiB0aGlzIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZGsubGlzdGVuKCduZXdfc29uZycsICh0cmFjaykgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKGAke3RyYWNrLmFydGlzdH0gLSB7dHJhY2sudGl0bGV9ICgke3RyYWNrLnllYXJ9KWApO1xuICAgKiB9KTtcbiAgICovXG4gIGxpc3RlbihpbkV2ZW50LCBpblVzZXJJRCwgaW5DYWxsYmFjaykge1xuICAgIGNvbnN0IHJlYWxFdmVudCA9IGAke0N1cnJlbnRFbnZpcm9ubWVudCgpLmVudmlyb25tZW50fToke3RoaXMuaWRlbnRpZmllcn06JHtpbkV2ZW50fWA7XG5cbiAgICBsZXQgbCA9ICdicm9hZGNhc3QnO1xuICAgIGxldCBjYWxsYmFjayA9IGluQ2FsbGJhY2s7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBsID0gYHdoaXNwZXItJHtpblVzZXJJRH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IGluVXNlcklEO1xuICAgIH1cblxuICAgIGNvbnN0IGNiID0gbXNnID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFByb2R1Y3Rpb24gbWVzc2FnZXMgbWF5IGJlIHVucHJlZml4ZWQuXG4gICAgICAgIGlmIChDdXJyZW50RW52aXJvbm1lbnQoKS5lbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgaWYgKGV2ZW50UGF0dGVybk1hdGNoKG1zZy5ldmVudCwgYCR7dGhpcy5pZGVudGlmaWVyfToke2luRXZlbnR9YCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEV2ZW50ID0gbXNnLmV2ZW50XG4gICAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAuam9pbignOicpO1xuICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEsIHRydW5jYXRlZEV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRQYXR0ZXJuTWF0Y2gobXNnLmV2ZW50LCByZWFsRXZlbnQpKSB7XG4gICAgICAgICAgLy8gQ29uc3VtZXJzIG9mIHRoZSBTREsgb25seSBldmVyIGludGVyYWN0IHdpdGggZXZlbnRzXG4gICAgICAgICAgLy8gd2l0aG91dCB0aGUgYXBwLWlkIG9yIGV4dGVuc2lvbi1pZCBwcmVmaXguXG4gICAgICAgICAgY29uc3QgdHJ1bmNhdGVkRXZlbnQgPSBtc2cuZXZlbnRcbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAuc2xpY2UoMilcbiAgICAgICAgICAgIC5qb2luKCc6Jyk7XG4gICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEsIHRydW5jYXRlZEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGZhaWwgc2lsZW50bHk/XG4gICAgICAgIGNvbnNvbGVQcmludChlcnIsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubWVzc2VuZ2VyLmxpc3Rlbih0aGlzLmlkZW50aWZpZXIsIGwsIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJpbmRzIGEgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQgc3lzdGVtLlxuICAgKlxuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZSAtIEFuIGV2ZW50IGhhbmRsZSBhcyByZXR1cm5lZCBmcm9tIHtAc2VlIGxpc3Rlbn0uXG4gICAqL1xuICB1bmxpc3RlbihoYW5kbGUpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzZW5nZXIudW5saXN0ZW4odGhpcy5pZGVudGlmaWVyLCBoYW5kbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuYWx5dGljc1xuICAgKi9cblxuICAvKipcbiAgICogU2VuZHMgYW4gYXJiaXRyYXJ5IGV2ZW50IHRvIHRoZSBhbmFseXRpY3MgYmFja2VuZC5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWU9MV0gLSBBIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWw9JyddIC0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBldmVudC5cbiAgICovXG4gIHNlbmRBbmFseXRpY3NFdmVudChuYW1lLCB2YWx1ZSA9IDEsIGxhYmVsID0gJycpIHtcbiAgICB0aGlzLmFuYWx5dGljcy5zZW5kRXZlbnQodGhpcy5pZGVudGlmaWVyLCBuYW1lLCB2YWx1ZSwgbGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vbmV0aXphdGlvblxuICAgKi9cblxuICAvKipcbiAgICogQmVnaW5zIHRoZSBwdXJjaGFzZSBmbG93IGZvciBhIGdpdmVuIHByb2R1Y3QncyBTS1UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgU0tVIG9mIHRoZSBkaWdpdGFsIGdvb2QgdGhhdCB0aGUgdXNlciBoYXMgaW5kaWNhdGVkIHRoZXkgd2FudCB0byBidXkuXG4gICAqL1xuICBiZWdpblB1cmNoYXNlKHNrdSkge1xuICAgIGlmICh0aGlzLlNLVXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JlZ2luUHVyY2hhc2UoKSBjYW5ub3QgYmUgdXNlZCB1bmxlc3MgU0tVcyBhcmUgcHJvdmlkZWQuJyk7XG4gICAgfVxuICAgIGZvcmNlVHlwZShza3UsICdzdHJpbmcnKTtcbiAgICByZXR1cm4gRXh0LmJlZ2luUHVyY2hhc2Uoc2t1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHByaWNlIGZvciBlYWNoIGl0ZW0gb2ZmZXJlZC5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggdGhlIFNLVSBjb2RlcyBhcyBrZXlzLlxuICAgKi9cbiAgZ2V0UHJpY2VzKCkge1xuICAgIGlmICh0aGlzLlNLVXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFByaWNlcygpIGNhbm5vdCBiZSB1c2VkIHVubGVzcyBTS1VzIGFyZSBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgRXh0LmdldFByaWNlcyhwcmljZXMgPT4ge1xuICAgICAgICByZXNvbHZlKHByaWNlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gZW50aXRsZW1lbnRzIG5lZWQgdG8gYmUgcmVsb2FkZWQsIGkuZS4gYWZ0ZXIgYVxuICAgKiBwdXJjaGFzZSBoYXMgYmVlbiBtYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIHVwZGF0ZSB1c2VyIGVudGl0bGVtZW50cy5cbiAgICovXG4gIG9uUmVsb2FkRW50aXRsZW1lbnRzKGNiKSB7XG4gICAgaWYgKHRoaXMuU0tVcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb25SZWxvYWRFbnRpdGxlbWVudHMoKSBjYW5ub3QgYmUgdXNlZCB1bmxlc3MgU0tVcyBhcmUgcHJvdmlkZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBFeHQub25SZWxvYWRFbnRpdGxlbWVudHMoY2IpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2RrLmpzIiwiLyoqXG4gKiBTdG9yZXMgZmllbGRzIHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgZXh0ZW5zaW9uIHVzZXIsIGVpdGhlciBhIHZpZXdlciBvciB0aGUgYnJvYWRjYXN0ZXIuXG4gKiBUaGVzZSBmaWVsZHMgYXJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgU0RLLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyIHtcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIGN1cnJlbnQgdXNlcidzIHJvbGUgb24gVHdpdGNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNoYW5uZWwgYmVpbmdcbiAgICogdmlld2VkLiBNYXkgYmUgXCJ2aWV3ZXJcIiBpZiB0aGUgdXNlciBpcyBzaW1wbHkgdmlld2luZyB0aGUgY2hhbm5lbCwgXCJtb2RlcmF0b3JcIlxuICAgKiBpZiB0aGUgdXNlciBpcyBhIG1vZGVyYXRvciBvZiB0aGUgY2hhbm5lbCBvciBcImJyb2FkY2FzdGVyXCIgaWYgdGhlIHVzZXIgaXMgYWxzb1xuICAgKiB0aGUgYnJvYWRjYXN0ZXIgb2YgdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBzaW5jZSAxLjAuM1xuICAgKi9cbiAgc3RhdGljIGdldCBSb2xlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgVmlld2VyOiAndmlld2VyJyxcbiAgICAgIEJyb2FkY2FzdGVyOiAnYnJvYWRjYXN0ZXInLFxuICAgICAgTW9kZXJhdG9yOiAnbW9kZXJhdG9yJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgdmlkZW8gbW9kZSBmb3IgdGhlIGN1cnJlbnQgdXNlci4gVGhpcyBtYXkgYmUgXCJkZWZhdWx0XCIgZm9yIHRoZSBkZWZhdWx0XG4gICAqIHdpbmRvd2VkIHZpZXdpbmcgZXhwZXJpZW5jZSBvbiBUd2l0Y2gsIFwiZnVsbHNjcmVlblwiIGZvciB0aGUgZnVsbHNjcmVlbiwgdmlkZW8tb25seVxuICAgKiBtb2RlIG9yIFwidGhlYXRyZVwiIGZvciB0aGUgdmlkZW8gZnVsbCB3aW5kb3ctd2lkdGguXG4gICAqXG4gICAqIEBzaW5jZSAxLjAuM1xuICAgKi9cbiAgc3RhdGljIGdldCBWaWRlb01vZGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBEZWZhdWx0OiAnZGVmYXVsdCcsXG4gICAgICBGdWxsc2NyZWVuOiAnZnVsbHNjcmVlbicsXG4gICAgICBUaGVhdHJlOiAndGhlYXRyZSdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKiBAcGFyYW0ge09iamVjdH0gYXV0aCAtIEFuIGF1dGggdG9rZW4gdXNhYmxlIGJ5IHRoaXMgdXNlciBmb3IgYmFja2VuZCByZXF1ZXN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF1dGgpIHtcbiAgICAvKipcbiAgICAgKiBjaGFubmVsSUQgaG9sZHMgdGhlIG51bWVyaWMgaWQgb2YgdGhlIGNoYW5uZWwgdGhlIHVzZXIgaXMgY3VycmVudGx5IHdhdGNoaW5nLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmNoYW5uZWxJRCA9IGF1dGguY2hhbm5lbElkO1xuXG4gICAgLyoqXG4gICAgICogdHdpdGNoSldUIGhvbGRzIHRoZSByYXcgSldUIHJlc3BvbnNlIGZyb20gdGhlIFR3aXRjaCBFeHRlbnNpb24gU0RLLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnR3aXRjaEpXVCA9IGF1dGgudG9rZW47XG5cbiAgICAvKipcbiAgICAgKiB0d2l0Y2hPcGFxdWVJRCBpcyBhIFR3aXRjaCBnZW5lcmF0ZWQgSUQgdGhhdCB3aWxsIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXNcbiAgICAgKiB1c2VyIChpZiB0aGV5IGFyZSBsb2dnZWQgaW4pLCBidXQgZG9lcyBub3QgZ2l2ZSB1cyBhY2Nlc3MgdG8gdGhlaXIgVHdpdGNoIElELlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR3aXRjaE9wYXF1ZUlEID0gYXV0aC51c2VySWQ7XG5cbiAgICAvKipcbiAgICAgKiB0d2l0Y2hJRCBpcyB0aGlzIHZpZXdlcidzIGFjdHVhbCBUd2l0Y2ggSUQuIFVzZWQgdG8gY29vcmRpbmF0ZSBhY2Nlc3MgdG9cbiAgICAgKiBvdGhlciBUd2l0Y2ggc2VydmljZXMgYW5kIGFjcm9zcyB0aGUgVHdpdGNoIHVuaXZlcnNlLiBPbmx5IHNldCBpZiB0aGUgdXNlclxuICAgICAqIGdyYW50cyBhY2Nlc3MsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge251bGx8c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHdpdGNoSUQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogcmVnaXN0ZXJlZFdpdGhNdXh5IHdpbGwgYmUgdHJ1ZSBpZiB0aGUgdXNlciBoYXMgYW4gYWN0aXZlIG11eHkgYWNjb3VudC5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMucmVnaXN0ZXJlZFdpdGhNdXh5ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBtdXh5SUQgaXMgdGhpcyB2aWV3ZXIncyBJRCBvbiBNdXh5LiBOdWxsIGlmIHRoZSB1c2VyIGhhcyBub3QgYXV0aGVudGljYXRlZCB3aXRoXG4gICAgICogTXV4eSBvciBpcyBub3Qgc2hhcmluZyB0aGVpciBUd2l0Y2ggSUQgd2l0aCB0aGUgZXh0ZW5zaW9uLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge251bGx8c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubXV4eUlEID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIHZpc3VhbGl6YXRpb25JRCBpcyBhIHVuaXF1ZSB1c2VyIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgdXNlclxuICAgICAqIG9uIE11eHkncyBhLm11eHkuaW8gc3ViZG9tYWluLiBUaGlzIGlzIHVzZWQgZm9yIHRoaW5ncyBsaWtlIGFsZXJ0cyBhbmRcbiAgICAgKiBjaGVlciB2aXN1YWxpemF0aW9ucywgYnV0IGlzIG5vdCBnZW5lcmFsbHkgdXNlZnVsLiBFbXB0eSBzdHJpbmcgaWZcbiAgICAgKiBgcmVnaXN0ZXJlZFdpdGhNdXh5YCBpcyBmYWxzZS5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy52aXN1YWxpemF0aW9uSUQgPSAnJztcblxuICAgIC8qKlxuICAgICAqIHJvbGUgaXMgdGhlIGN1cnJlbnQgdXNlcidzIHJvbGUgaW4gdGhlIGV4dGVuc2lvbi4gTWF5IGJlIG9uZSBvZiB7QGxpbmsgUm9sZXN9LlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnJvbGUgPSBVc2VyLlJvbGVzLlZpZXdlcjtcblxuICAgIC8qKlxuICAgICAqIGlwIGlzIHRoZSBjdXJyZW50IHVzZXIncyBJUCBhZGRyZXNzLiBNYXkgYmUgYW4gZW1wdHkgc3RyaW5nIGlmIHVuZGV0ZWN0YWJsZS5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pcCA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogZ2FtZSBpcyB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbCdzIGdhbWUgYXMgc2V0IGJ5IHRoZSBicm9hZGNhc3Rlci5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5nYW1lID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBVc2VyJ3MgY3VycmVudCB2aWRlbyBtb2RlLiBPbmUgb2Yge0BsaW5rIFZpZGVvTW9kZXN9LlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnZpZGVvTW9kZSA9IFVzZXIuVmlkZW9Nb2Rlcy5EZWZhdWx0O1xuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB2aWRlbyBiaXRyYXRlLiBOdWxsIGlmIG5vIHZpZGVvIG9yIHVua25vd24uXG4gICAgICpcbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAdHlwZSB7bnVsbHxudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5iaXRyYXRlID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdmlkZW8gbGF0ZW5jeS4gTnVsbCBpZiBubyB2aWRlbyBvciB1bmtub3duLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQHR5cGUge251bGx8bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubGF0ZW5jeSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJ1ZmZlciBzaXplIG9mIHRoZSB2aWV3ZXIncyBwbGF5ZXIuIE51bGwgaWYgbm8gdmlkZW8gb3IgdW5rbm93bi5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEB0eXBlIHtudWxsfG51bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG5cbiAgICAvLyBJZiB0aGUgdXNlciBoYXMgYXV0aG9yaXplZCBhbiBleHRlbnNpb24gdG8gc2VlIHRoZWlyIFR3aXRjaCBJRCwgaXQgd2lsbCBiZVxuICAgIC8vIGhpZGRlbiBpbiB0aGUgSldUIHBheWxvYWQuXG4gICAgdGhpcy5leHRyYWN0SldUSW5mbyhhdXRoLnRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBwYXJzZSB0aGUgcHJvdmlkZWQgSldUIGFuZCBwZXJzaXN0IGFueSBmb3VuZCBpbmZvcm1hdGlvbiBpbiBzdG9yZS5cbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBqd3QgLSBUaGUgYXV0aCBKV1QgdG9rZW4gYXMgcmV0dXJuZWQgZnJvbSB0aGUgYXV0aCBoYXJuZXNzLlxuICAgKi9cbiAgZXh0cmFjdEpXVEluZm8oand0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwbGl0VG9rZW4gPSBqd3Quc3BsaXQoJy4nKTtcbiAgICAgIGlmIChzcGxpdFRva2VuLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBjb25zdCB0b2tlbiA9IEpTT04ucGFyc2Uod2luZG93LmF0b2Ioc3BsaXRUb2tlblsxXSkpO1xuICAgICAgICB0aGlzLnJvbGUgPSB0b2tlbi5yb2xlO1xuICAgICAgICBpZiAodG9rZW4udXNlcl9pZCkge1xuICAgICAgICAgIHRoaXMudHdpdGNoSUQgPSB0b2tlbi51c2VyX2lkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBTaWxlbnRseSBmYWlsIChlbmZvcmNlbWVudCBvZiBUd2l0Y2ggSUQgaXMgZG9uZSBleHRlcm5hbGx5KS5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBleHRlbnNpb24gdXNlciBpcyBhbm9ueW1vdXMuXG4gICAqIFR3aXRjaCBkZWZpbmVzIGFuIGFub255bW91cyB1c2VyIGFzIG9uZSB3aG8gaXMgbm90IGxvZ2dlZCBpbiB0byB0aGUgY2hhbm5lbFxuICAgKiBwYWdlIHJ1bm5pbmcgdGhpcyBleHRlbnNpb24sIG9yIG9uZSB3aG8gaGFzIG5vdCBvcHRlZC1pbiB0byBzaGFyaW5nXG4gICAqIGF1dGggaW5mb3JtYXRpb24gd2l0aCB0aGlzIGV4dGVuc2lvbi5cbiAgICogQHNpbmNlIDEuMC4wXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHVzZXIgaXMgbm90IGxvZ2dlZCBpbiB0byBUd2l0Y2ggb3IgaGFzIG5vdCBncmFudGVkXG4gICAqIGFjY2VzcyB0byB0aGVpciBUd2l0Y2ggSUQuXG4gICAqL1xuICBhbm9ueW1vdXMoKSB7XG4gICAgcmV0dXJuICF0aGlzLnR3aXRjaE9wYXF1ZUlEIHx8IHRoaXMudHdpdGNoT3BhcXVlSURbMF0gIT09ICdVJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgdmFsdWVzIGZyb20gYSBuZXcgYXV0aCB0b2tlbiBpbiB0aGUgbG9jYWwgc3RvcmUuXG4gICAqIEBzaW5jZSAxLjAuMFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYXV0aCAtIEFuIGF1dGggSldUIHdpdGggdXBkYXRlZCB1c2VyIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgdXBkYXRlQXV0aChhdXRoKSB7XG4gICAgdGhpcy50d2l0Y2hKV1QgPSBhdXRoLnRva2VuO1xuICAgIHRoaXMuZXh0cmFjdEpXVEluZm8oYXV0aC50b2tlbik7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91c2VyLmpzIiwibW9kdWxlLmV4cG9ydHMgPSB7XCJuYW1lXCI6XCJAbXV4eS9leHRlbnNpb25zLWpzXCIsXCJhdXRob3JcIjpcIk11eHksIEluYy5cIixcInZlcnNpb25cIjpcIjEuMS4wXCIsXCJkZXNjcmlwdGlvblwiOlwiUHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gTXV4eSdzIHBvd2VyZnVsIGJhY2tlbmQgYXJjaGl0ZWN0dXJlIGZvciBUd2l0Y2ggZXh0ZW5zaW9ucy5cIixcImxpY2Vuc2VcIjpcIklTQ1wiLFwibWFpblwiOlwiZGlzdC9tdXh5LWV4dGVuc2lvbnMuanNcIixcIm1vZHVsZVwiOlwic3JjL2luZGV4LmpzXCIsXCJyZXBvc2l0b3J5XCI6XCJodHRwczovL2dpdGh1Yi5jb20vbXV4eS9leHRlbnNpb25zLWpzXCIsXCJzY3JpcHRzXCI6e1wiZGV2XCI6XCIuL25vZGVfbW9kdWxlcy93ZWJwYWNrLWRldi1zZXJ2ZXIvYmluL3dlYnBhY2stZGV2LXNlcnZlci5qc1wiLFwiYnVpbGRcIjpcIndlYnBhY2tcIixcInRlc3RcIjpcIk5PREVfRU5WPXRlc3Rpbmcga2FybWEgc3RhcnRcIixcInRlc3Q6d2F0Y2hcIjpcIk5PREVfRU5WPXRlc3Rpbmcga2FybWEgc3RhcnRcIixcImRvY3NcIjpcImVzZG9jXCIsXCJwcmVwdWJsaXNoXCI6XCJucG0gcnVuIGJ1aWxkXCJ9LFwiZGV2RGVwZW5kZW5jaWVzXCI6e1wiYmFiZWwtY29yZVwiOlwiXjYuMjYuMFwiLFwiYmFiZWwtZXNsaW50XCI6XCJeNy4yLjNcIixcImJhYmVsLWxvYWRlclwiOlwiXjcuMS4yXCIsXCJiYWJlbC1wbHVnaW4taXN0YW5idWxcIjpcIl40LjEuNFwiLFwiYmFiZWwtcGx1Z2luLWxvZGFzaFwiOlwiXjMuMi4xMVwiLFwiYmFiZWwtcGx1Z2luLXRyYW5zZm9ybS1lczIwMTUtc2hvcnRoYW5kLXByb3BlcnRpZXNcIjpcIl42LjI0LjFcIixcImJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcnVudGltZVwiOlwiXjYuMjMuMFwiLFwiYmFiZWwtcHJlc2V0LWVzMjAxNVwiOlwiXjYuMjQuMVwiLFwiYmFiZWwtcHJlc2V0LXN0YWdlLTJcIjpcIl42LjI0LjFcIixcImNoYWlcIjpcIl40LjEuMlwiLFwiZXNkb2NcIjpcIl4xLjAuMVwiLFwiZXNkb2MtZWNtYXNjcmlwdC1wcm9wb3NhbC1wbHVnaW5cIjpcIl4xLjAuMFwiLFwiZXNkb2Mtbm9kZVwiOlwiXjEuMC4yXCIsXCJlc2RvYy1wdWJsaXNoLWh0bWwtcGx1Z2luXCI6XCJeMS4xLjBcIixcImVzZG9jLXN0YW5kYXJkLXBsdWdpblwiOlwiXjEuMC4wXCIsXCJlc2xpbnRcIjpcIl40LjUuMFwiLFwiZXNsaW50LWNvbmZpZy1haXJibmJcIjpcIl4xNS4xLjBcIixcImVzbGludC1jb25maWctYWlyYm5iLWJhc2VcIjpcIl4xMS4zLjJcIixcImVzbGludC1mcmllbmRseS1mb3JtYXR0ZXJcIjpcIl4zLjAuMFwiLFwiZXNsaW50LWxvYWRlclwiOlwiXjEuOS4wXCIsXCJlc2xpbnQtcGx1Z2luLWltcG9ydFwiOlwiXjIuNy4wXCIsXCJlc2xpbnQtcGx1Z2luLWpzeC1hMTF5XCI6XCJeNi4wLjJcIixcImVzbGludC1wbHVnaW4tcmVhY3RcIjpcIl43LjMuMFwiLFwia2FybWFcIjpcIl4xLjcuMVwiLFwia2FybWEtYmFiZWwtcHJlcHJvY2Vzc29yXCI6XCJeNi4wLjFcIixcImthcm1hLWNoYWlcIjpcIl4wLjEuMFwiLFwia2FybWEtY2hhaS1hcy1wcm9taXNlZFwiOlwiXjAuMS4yXCIsXCJrYXJtYS1jaHJvbWUtbGF1bmNoZXJcIjpcIl4yLjIuMFwiLFwia2FybWEtbW9jaGFcIjpcIl4xLjMuMFwiLFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjpcIl4yLjIuNFwiLFwia2FybWEtc2lub25cIjpcIl4xLjAuNVwiLFwia2FybWEtd2VicGFja1wiOlwiXjIuMC40XCIsXCJsb2Rhc2hcIjpcIl40LjE3LjRcIixcIm1vY2hhXCI6XCJeMy41LjNcIixcInByZXR0aWVyXCI6XCJeMS42LjFcIixcInNpbm9uXCI6XCJeMy4yLjFcIixcIndlYnBhY2tcIjpcIl4zLjUuNVwiLFwid2VicGFjay1kZXYtc2VydmVyXCI6XCJeMi43LjFcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJiYXNlLTY0XCI6XCJeMC4xLjBcIixcInBhcnNlLWhlYWRlcnNcIjpcIl4yLjAuMVwiLFwicHVzaGVyLWpzXCI6XCJeNC4xLjBcIn19XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9wYWNrYWdlLmpzb25cbi8vIG1vZHVsZSBpZCA9IDEyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=